1. 程式人生 > >Android系統之G-sersor除錯

Android系統之G-sersor除錯



----------------------------------------------------------------------------------------------------------------gsensor原理:
gsensor的作用是測量重力在x,y,z3個方向的分量。重力是1G=9.8。在gsensordriver打印出的x,y,z值就是gsensor對3個分量經ADC轉換後的原始值。
故在HAL層中,對其會做一個轉換。xx=9.8*(x/(2的n次方)),n為ADC的位數。dmard10為10bitADC,故2的n次方為4*256=1024。而d06是7bit。
----------------------------------------------------------------------------------------------------------------本文主要從gsensor的驅動層、HAL層、上層校準APK的新增三方面來闡述gsensor除錯的簡單方法。----------------------------------------------------------------------------------------------------------------1,驅動層:
檔案路徑:\lichee\linux-3.4\drivers\gsensor
驅動層是關鍵,有沒有資料上報,是著整個gsensor是否能正常工作的基礎。a),確保驅動模組已經載入(預設編譯為模組方式)
$adbshell
進入小機
$lsmod檢視是否gsensor對應的模組。
若沒有載入,則通過cat/proc/kmsg>gsensor.log檢視開機log中載入失敗原因進行分析。b),利用getevent檢視驅動是否有資料上報。
$adbshell
進入小機
$getevent-p列出所有的input裝置,檢視對應的event0還是event1$getevent/dev/input/event1檢視資料是否連續不斷上報?若沒有資料上報,則分析驅動,列印report處上報的值。
通常出現以上問題,常為I2C通訊失敗,在軟體端可以通過驅動log看出。
此時先檢查I2C地址是否正確,然後重點檢查硬體I2C是否連好,可能是由於虛焊或者晶片損壞導致。c),輔助檢視gsensor屬性,獲取gsensor裝置名
$adbshell進入小機
$cd/sys/devices/sw_device/gsensor(檔案目錄不盡相同,可從驅動檔案中獲知實際路徑)$cat即可獲取gsensorname
通常還有其他的屬性可以輔助檢視,以詳細瞭解gsensor的狀態,如enable、delay等屬性。
----------------------------------------------------------------------------------------------------------------2,HAL層
檔案路徑:\android\device\softwinner\common\hardware\libsensors

Gsensor除錯方法-Allwinner
2
HAL主要是處理驅動層上報的資料,並對資料進行轉換,由1024的DA值轉換為1g。此部分需要修改較少,僅注意在相容時,加入對新增gsensor的支援即可。HAL層與驅動層的結口為delay和enable。
gsensor.cfg存放在小機的system/usr/gsensor.cfg,用於記錄各gsensor的x,y,z軸的方向。除錯時,直接adbpull出來之後修改對應的gsensor方向,再adbpush進去,重啟即可生效。
----------------------------------------------------------------------------------------------------------------3,上層新增校準APK檔案路徑:/system/app
/system/lib
上層新增校準的APK具體實現方法可參考原廠提供的檔案。一般包括APK以及對應的庫檔案。
設定選項中新增校準APK後,最重要的一點是如何通過APK判斷gsensor的報點是否準確,以及gsensor的x、y、z軸判定。a),報點是否準確
通常不經過校準的gsensor都不是非常準的,即使在小機介面能左右旋轉畫面,一定需要通過報點數值進行判定。
一般通過APK檢視的預設的x、y、z值分別在自己的方向上為9.8附近的值即可滿足校準的需求。若值為9.8的4倍或者1/2倍或者N倍,均可相應的通過驅動或者HAL進行一個修改及補償。b),gsensor的x、y、z軸判定
當數值準確時,此時應該判斷以及修改gsensor的方向,此點非常重要,一旦沒有調好會導致整個gsensor的功能失效,前面所有的工作也將失去意義。
評判gsensor的方向一定不能從介面旋轉正確來作為標準,需要參考標準座標系(符合右手定則)。
何為標準座標系:平板水平放置在桌面上,正面面對自己。此時Z軸應該為+值,且值為9.8左右,x、y軸應該為0值左右。
平行於身體的為x軸,左邊不動,右邊擡起時,x軸的數值應該由0開始增大,直到垂直時為+9.8左右。垂直於身體的為y軸,下邊不動,上邊擡起時,y中的數值應該由0開始增大,直到垂直時為+9.8左右。在輔助功能,先關閉“自動旋轉螢幕”功能,安裝SensorMoniter.apk,通過以上動作進行操作。若有不符合以上情況的,則相應的修改gsensor.cfg調整x、y軸的位置以及正負值,直到滿足為止。然後水平放置,點選校準,此時gsensor可以正常工作。
----------------------------------------------------------------------------------------------------------------4,移植gsensor涉及的幾部分a),驅動,相容列表
b),HAL層對gsensor的支援c),上層新增校準APKd),配置sys_config.fex檔案
e),增加recovery功能,即恢復出廠設定後也能儲存校準檔案f),gsensor.cfg檔案
----------------------------------------------------------------------------------------------------------------

NOTE:各種小問題集錦
1,gsensor沒有校準,導致旋轉緩慢。
2,gsensor水平放置的時候z軸為-9.8附近的值,導致需要垂直操作才能旋轉(正常情況下45°即可旋轉)。3,沒有參考標準座標系,只通過小機介面的方向來判斷x、y軸的值。導致玩神廟逃亡的時候,前後搖擺對應左右搖擺,此需要修改framework層,設定ro.sw.hwrotation。----|device目錄下的wing_k70.mk檔案新增:ro.sf.rotation=180
----|frameworks/base/core/java/android/hardware/SystemSensorManager.java修改如下:
----|if(SystemProperties.getInt("ro.sf.hwrotation",0)==180)//defaultvalueis270;foradaptgsensorrotationsetas180for720D
4,搞不清x、y軸如何判定,以及是否需要對調。
5,沒有生成校準檔案。可能是由於沒有許可權或者是丟失了APK對應的庫檔案。
6,da311待機喚醒時概率性不報點,由於待機後,gsensor模組斷電,喚醒後暫存器會重新初始化,但是時序受到干擾,導致有些暫存器的值發生變化,導致不報點。修改對應的驅動檔案中的變化的暫存器即可。
7,dmard10、dmard06不管校準不校準都會出現一個現象,即x/y軸的數值上報抖動,導致玩一些遊戲(競技摩托)時候會左右偏,不穩定。原因是報點不穩,在驅動read_xyz函式中加入濾波功能。效果好很多。d10的抖動受到喇叭聲音的影響很大,是由於IC內部對聲音噪點的抗干擾的能力很弱,暫時不能解決。
8,da311系統重啟時,概率性出現detect函式失敗,導致檢測不到da311gsensor。由於暫存器中分兩頁,在切頁過程中出現問題,因此detect讀之前,做一次wirte切頁操作。
9,軟體正常,但是有些gsensor校準之後,報點仍然出現問題,此時晶片損壞的概率比較大,屬於不良晶片。10,除錯時發現gsensor報點x,y,z軸均為0,除錯發現gsensor.cfg中沒有對應gsensor的配置導致,加上即可。