要想弄明白世界的本质,就要追根溯源;代码也是一样的道理;
最近调试几个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 };
三、针对模块校准:
匹配完了,在stk3x1x.c中的probe函数中就可以解析相应的设备树了;需要修改其实就是看看原理图,针对原理图上的管脚进行相应的修改,并根据probe函数中解析设备树的函数来对dts进行修改;其实所做的驱动就是差不多这些了;但重要的是框架还有相应的节点分析;
下来,我们来分析进入probe函数之后的流程;
下一篇:http://www.cnblogs.com/linhaostudy/p/8304017.html