要想弄明白世界的本質,就要追根溯源;代碼也是一樣的道理; 最近調試幾個sensor驅動,alps sensor驅動、compass sensor驅動、G-sensor驅動都是一樣的架構; 一、基於input子系統的sensor架構: 由圖上可知,input子系統上的sensor是由三個子系統構成: ...
要想弄明白世界的本質,就要追根溯源;代碼也是一樣的道理;
最近調試幾個sensor驅動,alps sensor驅動、compass sensor驅動、G-sensor驅動都是一樣的架構;
一、基於input子系統的sensor架構:
由圖上可知,input子系統上的sensor是由三個子系統構成:
1、input子系統(負責上報給設備節點數據);
2、I2C子系統負責sensor driver與sensor感測器進行通信;
3、xSensor driver則是對不同sensor做的特定的驅動(不同驅動不同代碼,主要是硬體初始化的不同和採集數據上的方式不同,這些供應商已經寫好);
二、xsensor驅動設計:
由sensor驅動在系統中的層次,上有Input core,下有I2C,驅動需要通過I2C採集信息,並準確及時的上報數據至input core。驅動上報的數據,是被input core管理並被上層使用的,應符合input core和上層應用框架的要求;
下麵以stk3311(drivers/input/misc)為例:
1、makefile和kconfig文件是否已經增加,生成的.config文件中是否有相應的配置:
從剛開始的kernel log中module_init增加列印函數(註意kernel列印級別)或者是在out/target/product/msm8909_512/obj/KERNEL_OBJ/drivers/input/misc目錄下找到編譯生成的stk3x1x.o的二進位文件;
由於Android是直接按make bootimage來編譯內核生成boot.img,所以沒有像linux那樣make menuconfig之後調用mconf.c那樣的圖形界面;但.config文件依舊會生成在out目錄下;
所以我們只需要配置相應的晶元類型:
這裡有幾個文件,但不能確定make bootimage時把哪個文件複製為了.config文件;
所以可以從AndroidBoard.mk(device/qcom/msm8909_512)文件中確定相應的內核配置文件:(詳情可見:http://blog.csdn.net/mr_raptor/article/details/30113417)
修改配置文件:
CONFIG_SENSORS_STK3X1X=y可以從stk3x1x.c目錄下的Makefile中確定;
2、DTS上的適配:
使用Device Tree後,驅動需要與.dts中描述的設備結點進行匹配,從而引發驅動的probe()函數執行。對於platform_driver而言,需要添加一個OF匹配表:
1 static struct of_device_id stk_match_table[] = {
2 { .compatible = "stk,stk3x1x", },
3 { },
4 };
5
6 static struct i2c_driver stk_ps_driver =
7 {
8 .driver = {
9 .name = DEVICE_NAME,
10 .owner = THIS_MODULE,
11 .of_match_table = stk_match_table,
12 },
13 .probe = stk3x1x_probe,
14 .remove = stk3x1x_remove,
15 .id_table = stk_ps_id,
16 };
將結構體of_device_id匹配上,即可進入驅動函數中的probe函數;
由於msm8909沒有適配stk3x1x的設備樹,所以在其他文件里中查找,在msm8610-qrd-skuab.dtsi中有:
117 stk@48 { 118 compatible = "stk,stk3x1x"; 119 reg = <0x48>; 120 interrupt-parent = <&msmgpio>; 121 interrupts = <80 0x2>; 122 vdd-supply = <&pm8110_l19>; 123 vio-supply = <&pm8110_l14>; 124 stk,irq-gpio = <&msmgpio 80 0x02>; 125 stk,transmittance = <340>; 126 stk,state-reg = <0x00>; 127 stk,psctrl-reg = <0x71>; 128 stk,alsctrl-reg = <0x38>; 129 stk,ledctrl-reg = <0xFF>; 130 stk,wait-reg = <0x07>; 131 stk,ps-thdh = <150>; 132 stk,ps-thdl = <100>; 133 stk,use-fir; 134 };
於是在硬體匹配msm8909-qrd-skua.dtsi:
205 stk@48 { //stk3x1x sensor 206 compatible = "stk,stk3x1x"; 207 reg = <0x48>; 208 interrupt-parent = <&msm_gpio>; 209 interrupts = <80 0x2>; 210 vdd-supply = <&pm8909_l17>; 211 vio-supply = <&pm8909_l6>; 212 stk,irq-gpio = <&msm_gpio 35 0x02>; 213 stk,transmittance = <340>; 214 stk,state-reg = <0x00>; 215 stk,psctrl-reg = <0x71>; 216 stk,alsctrl-reg = <0x38>; 217 stk,ledctrl-reg = <0xFF>; 218 stk,wait-reg = <0x07>; 219 stk,ps-thdh = <150>; 220 stk,ps-thdl = <100>; 221 stk,use-fir; 222 };
三、針對模塊校準:
sensor會對於供應商有一些對於的校準庫,也就是HAL,HAL根據以上的驅動介面來對sensor感測器來獲取更為精確的數據; 直接把配置文件放在/system/vendor/etc目錄和HAL文件放在板上的/system/vendor/libs上就行了;![](https://images2017.cnblogs.com/blog/811006/201801/811006-20180118193620303-67295882.png)
匹配完了,在stk3x1x.c中的probe函數中就可以解析相應的設備樹了;需要修改其實就是看看原理圖,針對原理圖上的管腳進行相應的修改,並根據probe函數中解析設備樹的函數來對dts進行修改;其實所做的驅動就是差不多這些了;但重要的是框架還有相應的節點分析;
下來,我們來分析進入probe函數之後的流程;
下一篇:http://www.cnblogs.com/linhaostudy/p/8304017.html