摘 要:文章對(duì)Android平臺(tái)下光距離傳感器驅(qū)動(dòng)層作研究和設(shè)計(jì),同時(shí)針對(duì)目前光距離傳感器存在的問(wèn)題,提出一種數(shù)據(jù)優(yōu)化算法,旨在提高數(shù)據(jù)的可靠性,改善目前存在的問(wèn)題。通過(guò)實(shí)驗(yàn)數(shù)據(jù)對(duì)比數(shù)據(jù)優(yōu)化前后光距離傳感器上報(bào)到上層的數(shù)據(jù),同時(shí)結(jié)合用戶(hù)體驗(yàn)得出結(jié)論。
關(guān)鍵詞:光距離傳感器;驅(qū)動(dòng)層;數(shù)據(jù)優(yōu)化算法;可靠性
光距離傳感器是智能手機(jī)最基本的傳感器之一,其中距離傳感器主要應(yīng)用于接打電話滅屏和智能防誤觸場(chǎng)景,光線傳感器主要是為了實(shí)現(xiàn)自動(dòng)亮度調(diào)節(jié)功能,使得lcd背光亮度能夠根據(jù)周?chē)h(huán)境光線強(qiáng)度自動(dòng)調(diào)節(jié)[1]。正是由于這些基本功能平時(shí)用戶(hù)用的最多,因此如何最大限度地保證用戶(hù)體驗(yàn)成為目前光距離傳感器驅(qū)動(dòng)不斷優(yōu)化的目的,而這其中最關(guān)鍵的問(wèn)題就是如何提高傳感器數(shù)據(jù)的可靠性。手機(jī)出廠一致性、觸摸屏表面污漬、手機(jī)貼膜、外界強(qiáng)光等因素都會(huì)影響距離傳感器工作,現(xiàn)實(shí)生活中我們經(jīng)常遇到由于手機(jī)膜貼歪了或距離傳感器上方的觸摸屏有污漬就導(dǎo)致距離傳感器工作不正常。光線傳感器對(duì)光的感知靈敏度非常高,有時(shí)手機(jī)可能只是轉(zhuǎn)動(dòng)一個(gè)角度就使得光感值變化,導(dǎo)致光感值跳動(dòng)非??欤踔?xí)?dǎo)致背光亮度不穩(wěn)定。為解決這些問(wèn)題,文章擬通過(guò)對(duì)光距離二合一傳感器驅(qū)動(dòng)的研究設(shè)計(jì),提出在驅(qū)動(dòng)層的數(shù)據(jù)優(yōu)化算法,提高數(shù)據(jù)的可靠性。
1 光距離傳感器工作原理
光距離傳感器依照光學(xué)原理,通過(guò)接收和發(fā)送相關(guān)光線,實(shí)現(xiàn)對(duì)周邊環(huán)境光線強(qiáng)度的檢測(cè)和物體靠近和遠(yuǎn)離狀態(tài)的檢測(cè)。光距離傳感器是光線傳感器和距離傳感器二合一傳感器,一般采用兩個(gè)光電二極管采集光的數(shù)據(jù),第一個(gè)光電二極管用來(lái)接收可見(jiàn)光和紅外光,第二個(gè)光電二極管用來(lái)接收紅外光[2],然后通過(guò)模數(shù)器轉(zhuǎn)換為數(shù)字信號(hào)。光距離傳感器接收到數(shù)字信號(hào)后,會(huì)根據(jù)芯片寄存器設(shè)置好的上下限閾值來(lái)判定是否觸發(fā)中斷,同時(shí)更新中斷狀態(tài)寄存器的值。軟件收到中斷信號(hào)后,會(huì)讀取中斷狀態(tài)寄存器的值,判斷是光傳感器觸發(fā)的中斷還是距離傳感器觸發(fā)的中斷。光線距離傳感器一般都裝在手機(jī)上方位置,選擇埋在觸摸屏下面。
2 光距離傳感器驅(qū)動(dòng)層研究設(shè)計(jì)
傳感器驅(qū)動(dòng)模塊的設(shè)計(jì)主要是完成驅(qū)動(dòng)層和硬件抽象層兩部分開(kāi)發(fā)設(shè)計(jì)。本文以光距離傳感器為例,基于I2C總線完成對(duì)驅(qū)動(dòng)層的設(shè)計(jì)。一般基于I2C總線驅(qū)動(dòng)的工作必須實(shí)現(xiàn)以下兩個(gè)結(jié)構(gòu)體的回調(diào)函數(shù)。通過(guò)實(shí)現(xiàn)結(jié)構(gòu)體i2c_driver的回調(diào)函數(shù)來(lái)實(shí)現(xiàn)驅(qū)動(dòng)的加載與卸載、睡眠與喚醒;通過(guò)實(shí)現(xiàn)結(jié)構(gòu)體file_operations回調(diào)函數(shù)來(lái)實(shí)現(xiàn)對(duì)設(shè)備的打開(kāi)與關(guān)閉、校準(zhǔn)與補(bǔ)償?shù)?。根?jù)傳感器的工作目的,還必須實(shí)現(xiàn)數(shù)據(jù)的采集與上報(bào)。
2.1 傳感器驅(qū)動(dòng)工作流程
手機(jī)開(kāi)機(jī)啟動(dòng),設(shè)備與驅(qū)動(dòng)開(kāi)始匹配,然后加載驅(qū)動(dòng)進(jìn)內(nèi)核,加載過(guò)程通過(guò)probe()函數(shù)完成內(nèi)存申請(qǐng)分配,設(shè)備樹(shù)解析,GPIO引腳配置,設(shè)備注冊(cè)等工作;應(yīng)用打開(kāi)傳感器,系統(tǒng)調(diào)用接口最終通過(guò)虛擬文件系統(tǒng)調(diào)用驅(qū)動(dòng)層file_operations結(jié)構(gòu)體回調(diào)函數(shù)來(lái)實(shí)現(xiàn)對(duì)設(shè)備的打開(kāi),然后傳感器開(kāi)始采集數(shù)據(jù)并上報(bào)到內(nèi)核緩沖區(qū)等待硬件抽象層來(lái)取。
2.2 數(shù)據(jù)采集與上報(bào)
傳感器驅(qū)動(dòng)采集數(shù)據(jù)主要有中斷機(jī)制采集數(shù)據(jù)和定時(shí)輪詢(xún)機(jī)制采集數(shù)據(jù)兩者方式。文章以ltr559光線距離二合一傳感器為例,研究設(shè)計(jì)距離傳感器使用中斷機(jī)制采集數(shù)據(jù),光線傳感器使用定時(shí)輪詢(xún)機(jī)制采集數(shù)據(jù)。
(1)中斷機(jī)制采集數(shù)據(jù):距離傳感器內(nèi)部有上下限閥值寄存器,當(dāng)紅外二極管接收到的繞射值大于上限閥值或者小于下限閥值則內(nèi)部觸發(fā)中斷,通過(guò)之前申請(qǐng)的GPIO中斷腳傳給控制芯片,驅(qū)使軟件去讀狀態(tài)寄存器的值,以此判斷是距離傳感器還是光線傳感器發(fā)生中斷,然后調(diào)用驅(qū)動(dòng)對(duì)應(yīng)的中斷處理函數(shù)采集數(shù)據(jù)并且上報(bào)。Linux中斷分為頂半步和底半步兩部分,頂半步只完成比較緊急的部分,大部分工作都是由底半步完成[3]。通過(guò)request_irq()函數(shù)在頂半步申請(qǐng)和設(shè)置中斷,然后底半步調(diào)度工作隊(duì)列,最后由綁定的工作函數(shù)采集數(shù)據(jù)和上報(bào)數(shù)據(jù)。
(2)定時(shí)輪詢(xún)采集數(shù)據(jù):在probe()函數(shù)中初始化一個(gè)高精度定時(shí)器,且設(shè)置了到期時(shí)間和到期執(zhí)行函數(shù)。內(nèi)核定時(shí)器并不是周期運(yùn)行,它在超時(shí)后自動(dòng)銷(xiāo)毀。因此,為了實(shí)現(xiàn)周期輪詢(xún),設(shè)計(jì)在定時(shí)器執(zhí)行函數(shù)返回前再次激活定時(shí)器,在內(nèi)核定時(shí)器執(zhí)行函數(shù)里調(diào)用工作隊(duì)列,最后在工作隊(duì)列處理函數(shù)中實(shí)現(xiàn)對(duì)硬件的訪問(wèn)。設(shè)定的定時(shí)時(shí)間到期后,執(zhí)行對(duì)應(yīng)工作綁定的執(zhí)行函數(shù),讀取傳感器寄存器的數(shù)據(jù),然后上報(bào)到input子系統(tǒng)。
2.3 Input子系統(tǒng)數(shù)據(jù)上報(bào)
input子系統(tǒng)分三層,最上一層是事件處理層,中間是核心層,底層是驅(qū)動(dòng)層。驅(qū)動(dòng)層把事件上報(bào)到核心層,然后核心層對(duì)事件進(jìn)行分發(fā),傳到事件處理層,最后把事件放到事件緩沖區(qū)中,等待用戶(hù)進(jìn)程來(lái)取。
3 驅(qū)動(dòng)層數(shù)據(jù)優(yōu)化算法
針對(duì)傳感器數(shù)據(jù)可靠性的問(wèn)題,目前一般的方法是在驅(qū)動(dòng)層添加校準(zhǔn)模塊來(lái)優(yōu)化。這種方法只是解決了出廠一致性的問(wèn)題,對(duì)于一些實(shí)時(shí)的環(huán)境因素沒(méi)有考慮在內(nèi)?;谶@種情況,本文在校準(zhǔn)的基礎(chǔ)上,添加一個(gè)快速校準(zhǔn)算法,保證每次傳感器開(kāi)啟的時(shí)候都會(huì)校準(zhǔn)一次。同時(shí)還在驅(qū)動(dòng)層添加數(shù)據(jù)優(yōu)化算法,如防抖動(dòng)算法,只上報(bào)那些有用的數(shù)據(jù)。在一定程度省電的同時(shí)也保證數(shù)據(jù)不會(huì)因?yàn)閭鞲衅鬟^(guò)于靈敏或者環(huán)境變化而導(dǎo)致數(shù)據(jù)跳動(dòng)太快。為提高傳感器數(shù)據(jù)的可靠性,研究一種改進(jìn)型設(shè)計(jì)方案,具體數(shù)據(jù)流程框圖如圖1所示。
(1)快速校準(zhǔn)算法:在采集數(shù)據(jù)之前進(jìn)行校準(zhǔn),并在此基礎(chǔ)上加一個(gè)快速校準(zhǔn)算法,保證每次距離傳感器工作時(shí),都針對(duì)當(dāng)時(shí)傳感器周邊環(huán)境狀況重新進(jìn)行一次校準(zhǔn),得到與當(dāng)時(shí)環(huán)境相符合的上下限閥值,即實(shí)時(shí)上下限閥值。此算法的核心思想就是通過(guò)對(duì)比出廠預(yù)設(shè)、校準(zhǔn)后和快速校準(zhǔn)后的上下限閥值,選取一個(gè)更加符合實(shí)時(shí)情況的值來(lái)設(shè)定觸發(fā)中斷的范圍。由于A/D轉(zhuǎn)換經(jīng)常會(huì)出現(xiàn)數(shù)據(jù)不穩(wěn)定的情況,因此有必要采用常用的濾波算法來(lái)對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。由于快速校準(zhǔn)要求時(shí)間短,所以選取直接求平均值的方法得到距離傳感器的繞射值。具體校準(zhǔn)和快速校準(zhǔn)算法流程如圖2所示。
(2)防抖動(dòng)算法:光線傳感器對(duì)光線非常敏感,手機(jī)稍微一個(gè)小角度的轉(zhuǎn)動(dòng)也會(huì)引起光感值的變化,這樣帶來(lái)兩個(gè)問(wèn)題。一是上報(bào)的光感值變化非??欤斐蓴?shù)據(jù)跳動(dòng)太快,背光亮度都來(lái)不及變化;二是上報(bào)的數(shù)據(jù)太多而且很多都沒(méi)有用,直接帶來(lái)一定程度上的功耗問(wèn)題。針對(duì)這種情況,在采集傳感器數(shù)據(jù)之后對(duì)數(shù)據(jù)做優(yōu)化處理是很有必要的。具體優(yōu)化算法如圖3所示。
4 實(shí)驗(yàn)對(duì)比數(shù)據(jù)分析
(1)通過(guò)命令getevent查看不同場(chǎng)景下距離傳感器上報(bào)的數(shù)據(jù)如表1所示。
表格說(shuō)明:特殊場(chǎng)景是指距離傳感器上方觸摸屏有污漬、水滴、灰塵或者有貼膜遮擋的情況。由表1實(shí)驗(yàn)測(cè)試結(jié)果可知,未加入快速校準(zhǔn)算法之前,距離傳感器只能在常規(guī)場(chǎng)景下正常工作,而對(duì)于上述特殊場(chǎng)景一直報(bào)接近,工作不正常,直接導(dǎo)致接打電話一直滅屏的情況發(fā)生。添加快速校準(zhǔn)算法之后,在常規(guī)和特殊場(chǎng)景下都能正常工作。
(2)通過(guò)命令getevent查看優(yōu)化前后光線傳感器上報(bào)的數(shù)據(jù)如表2所示。
表格說(shuō)明:由表2測(cè)試結(jié)果可知,未加防抖動(dòng)算法之前光線傳感器在相同時(shí)間內(nèi)上報(bào)的光感值非常多且變化不是很大,優(yōu)化后只上報(bào)有效的值,上報(bào)值數(shù)量減少,在一定程度上減小了功耗。
(3)通過(guò)示波器測(cè)量?jī)?yōu)化前后數(shù)據(jù)變化如圖4、圖5所示。
對(duì)比兩者工作電流可以發(fā)現(xiàn),未優(yōu)化前電流波動(dòng)大,上報(bào)數(shù)據(jù)所需電流大約是25mA。優(yōu)化后電流波動(dòng)小,上報(bào)數(shù)據(jù)所需電流大約是20mA,因此在一定程度上減小了功耗。
5 結(jié)束語(yǔ)
文章在Android平臺(tái)下對(duì)光距離傳感器驅(qū)動(dòng)層進(jìn)行研究和設(shè)計(jì),同時(shí)為提高驅(qū)動(dòng)層上報(bào)數(shù)據(jù)的可靠性以解決當(dāng)前光距離傳感器在智能手機(jī)中容易出現(xiàn)的問(wèn)題,在驅(qū)動(dòng)層對(duì)數(shù)據(jù)做優(yōu)化處理。實(shí)驗(yàn)結(jié)果表明,在以上設(shè)計(jì)的基礎(chǔ)上,距離傳感器可以在貼膜遮擋和觸摸屏上有水漬等情況下正常工作,光線傳感器上報(bào)數(shù)據(jù)的變化速度正常且自動(dòng)背光亮度調(diào)節(jié)功能體驗(yàn)效果良好,并無(wú)lcd背光跳變太快、不穩(wěn)定的情況。
參考文獻(xiàn)
[1]田明.手機(jī)中應(yīng)用的傳感器[J].黑龍江科技信息,2013,17(28):39-40.
[2]陳建彬,陶一瑋,陳君偉.智能手機(jī)P-sensor問(wèn)題分析與改善[J].移動(dòng)通信,2014,42(21):91-93.
[3]宋寶華.Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解[M].北京:機(jī)械工業(yè)出版社,2015:
227-250.
[4]王春紅.基于Android系統(tǒng)的傳感器設(shè)計(jì)[J].湖南農(nóng)機(jī),2013,40(7):140-142.
[5]王秀敏,張麒,李婷婷.Android平臺(tái)下多路傾角傳感器驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)[J].儀表技術(shù)與傳感器,2013,50(9):18-20.
[6]李永壯,李昌新,王歡.基于Android光線傳感器的實(shí)現(xiàn)及數(shù)據(jù)優(yōu)化算法[J].西安郵電學(xué)院學(xué)報(bào),2012,24(4):75-78.
作者簡(jiǎn)介:段志杰(1992-),男,重慶郵電大學(xué)通信與信息工程學(xué)院碩士研究生,主要研究方向:智能終端與軟件。