基于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上就行了;

匹配完了,在stk3x1x.c中的probe函数中就可以解析相应的设备树了;需要修改其实就是看看原理图,针对原理图上的管脚进行相应的修改,并根据probe函数中解析设备树的函数来对dts进行修改;其实所做的驱动就是差不多这些了;但重要的是框架还有相应的节点分析;

下来,我们来分析进入probe函数之后的流程;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏高性能服务器开发

(八)高性能服务器架构设计总结1——以flamigo服务器代码为例

这篇文章算是对这个系列的一个系统性地总结。我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序。

1182
来自专栏游戏杂谈

liunx下查看服务器硬件信息

今天安装了9台Linux服务器,型号完全不一样(有DELL、HP和IBM服务器),又懒得去对清单,如何在Linux下cpu的个数和核数呢?另外,nginx的cp...

3882
来自专栏用户2442861的专栏

java处理高并发高负载类网站的优化方法

    一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S(主-从)...

1952
来自专栏风火数据

高级Java研发师在解决大数据问题上的一些技巧

众所周知, Java 在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,...

862
来自专栏FreeBuf

看我如何在Weblogic里捡一个XXE(CVE-2018-3246)

前几天空间被CVE-2018-2894刷屏,大家也都在研究和复现这个漏洞,正好我们安全团队也在玩这个漏洞,那大家就一起来玩咯。 本次的重点是复现,上传websh...

1113
来自专栏13blog.site

Intellij IDEA debug模式下项目启动慢/无法启动的事件解决过程记录

项目无法启动了 简单的介绍一下事件过程:周一的早上,收到前端同事抛过来的一个任务,说是一个接口无法正常返回数据,于是就让他把参数发过来,我想试着在本地重现一下并...

8067
来自专栏大魏分享(微信公众号:david-share)

API的计量与限速 | 将一个Web API纳入API管理 |API Management学习第二篇

在本文中,我们将针对:API Management学习第一篇中编写的Restful API,进行纳管。

1165
来自专栏大闲人柴毛毛

java处理高并发高负载类网站的优化方法

一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。   ...

4826
来自专栏Guangdong Qi

黑技术之百度网盘大文件下载直奔主题

2025
来自专栏deed博客

天天酷跑破解版制作教程

1575

扫码关注云+社区