

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