今天一个小项目终于尘埃落定,虽然本人在其中从事的工作很简单,但是还是颇有一些心得想跟大家分享一下。
首先我们需要了解一下linux内核中驱动为何能被编译进内核,在这里有两个很重要的文件不得不提:Kconfig和Makefile。其中Kconfig是分布在各目录的,这些Kconfig文件构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单,这就是我们使用make menuconfig后产生的配置菜单,此菜单包含多层,每个层次都由各个目录中的Kconfig产生的。用户根据自己的需求来选择如何编译内核,然后执行Makefile时就会根据.config的结果来实现内核的编译。编译的过程是通过Kbuild系统来完成的。具体过程自行查阅资料,说多无益。
通过上面的了解我们可以清晰的知道,当我们需要进行驱动添加或者移植的时候需要怎样去做了。如果此处还不理解,你要知道你真的很菜。不过还好你有耐心看下去的话就很容易的上手了。
首先我们需要在Kconfig中添加文件的模块名称,这里可以参考Kconfig内部的其他模块的配置情况,当然这里要清楚我们的配置会影响到我们的模块的加载方式是默认加载的还是需要动态加载。这让我们想到我们平时在配置的时候的选择。是不是有点兴奋呢?只要我们添加上之后,以后使用这个内核的人就能看到并能够自主的选择了。
然后,我们在Makefile中添加本模块对应的文件,注意此处的文件模块的名称和模块的文件类型。相信你懂的……此处还有时会看到if($(xxx),y),此处的判断就是根据.config进行判断的。而在Android中的.config文件可能会有所不同……其实也不是Android特有的了……
最后我们就开始写自己的驱动了……
但是有时候我们在编译的过程中,会出现编译不生效的问题。此时我们需要把编译的目标文件全部删除掉之后重新编译。特别是内核的文件,此处还是很有意思的……本人可能会在后续的文章里添加此部分的内容。敬请期待!!!!
下面来讲解下触摸屏。
触摸屏按照XXX分,有xxxx、xxxx自行查找……
先简单介绍下吧……本人认为触摸屏和其它设备有区别的地方也就在对寄存器的设置部分了。因为Android会在framework/base/server/input文件夹中实现对输入设备提供服务。所以我们通过研究EventHub.cpp文件发现区别设备的依据也就是在寄存器位 的设置上。因此我们在驱动中也主要在此处做文章,而上报事件的读取是在InputReader.cpp文件中实现的,因此我们在上报的过程中也要注意一下就OK了。
InputReader.cpp中针对触摸屏分成两种事件进行处理,SingleTouchInputMappe及多点触摸MultiTouchInputMapper。这两个类都是继承TouchInputMapper,由syncTouch处理最终的触摸屏动作的发送。对于触摸屏中设备的注册和上报以及参数的含意可以参考相关博文。此处推荐http://blog.csdn.net/andyhuabing/article/details/7085725
就具体情况而言,我们需要注意的地方主要有这么三个:一个是设备的总线,设备的连接方式以及设备的消抖处理。
连接方式
连接方式此处主要介绍GPIO方式,此种方式较为简单,主要是通过linux/gpio.h文件中提供的api完成对标签的声明和将GPIO映射成IRQ中断。
总线
此处主要是指采用IIC总线方式,主要是采用IIC在linux本身自带的驱动架构。i2c_add_driver()和i2c_del_driver().
消抖
此处网上能查到很多方法,本人推荐可以使用在中断中延时的方式。
输入技术信息:
Android的输入子系统支持多种不同类型的设备,包括键盘,操纵杆、轨迹球、鼠标和触摸屏。下面简单介绍下输入设备驱动中的触摸屏设备驱动的编写。
输入设备配置文件
Input Device Configure 文件(.idc 文件)包含对不同设备的配置参数,并因此影响输入设备的行为。
由于系统默认是对标准的输入设备进行支持的,因此对于这部分设备来讲的话idc文件是没有必要的,此类设备包括标准的物理设备像HID键盘和鼠标。但是对于一些内嵌的输入设备,特别是触摸屏就需要IDC文件来描述他们的行为。
原因:
Android会根据linux内核输入设备驱动的上报事件的事件类型和参数来自动的检测和配置大部分的输入设备。本部分不再举例赘述。
定位:
输入设备配置文件通过USB产品、产品的id或者通过输入设备的名称来定位。配置文件一般会在device目录下的产品配置文件中描述,本人就不再拿代码举例,因为公司的原因……在此处需要注意的问题是对device.type的配置很可能是导致你设备不能成功的原因。然而怎样才能生效呢?
在android中是通过mmm frameworks/base/tools/validatekeymaps使得配置文件生效的。Install: out/host/linux-x86/bin/validatekeymaps。
Keymap Validation Tool
Usage:
validatekeymaps [*.kl] [*.kcm] [*.idc] [virtualkeys.*] [...]
Validates the specified key layouts, key character maps,
input device configurations, or virtual key definitions.
这时候我们就可以对工具进行使用了。