一、 文档概述
本文档主要描述安卓系统中如何添加按键驱动及其映射,有任何不当之处,欢迎指正。
二、 安卓按键驱动原理
安卓系统中,实体按键的识别通常有如下几个过程:
Linux驱动层中,通常把按键输入驱动设计为输入子系统框架中。输入子系统通常由驱动层、输入子系统核心、事件处理层三部分组成。当实体按键被按下时,Linux驱动层的接收到按键输入中断,进行识别,获取对应的按键扫描码scanKeycode(所有按键的扫描码定义在input.h文件中),输入子系统将该扫描码通过事件方式上报至用户空间。在用户空间中,设备驱动都是以文件形式体现出来,即在/dev/input中的具体设备文件,安卓系统中通过线程不断读取该设备文件判断是否有键值上报。
然后将上报的键值进行处理,将驱动定义的按键扫描码scanKeycode根据按键布局文件qwerty.kl映射成按键码标签KeyCodeLabel。 这里的qwerty.kl安卓系统中默认按键布局文件,该文件为linux驱动层及安卓按键定义的连接,将驱动层中的扫描码转换为安卓系统中的按键定义。
最后通过查找KEYCODES[]数组,得到KeyCodeLabel字符串对应的KeyCode值,该KeyCode值为安卓系统中的按键码。
因此,为了让实体按键输入能够被安卓系统所识别,我们需要编写按键输入驱动及其对应的按键布局文件。
三、 具体步骤
这里采用的是CubieBoard2(即树莓派3)开发板,电路及源码均采用该开发板配套原理图及代码。这里我们需要添加的是T9的键盘,共12个按键。
添加实体按键的步骤如下:
1、 选定按键设计方案
一般情况下,嵌入式开发板添加按键有以下形式:
1) GPIO扫描的方式
这种方式通过扫描GPIO的状态来判断按键是否被按下,一般有GPIO对应一个按键或者矩阵键盘两种方式。这种通过GPIO扫描的方式较为原始,需要自己在程序逻辑中实现扫描的操作,开发周期较长。
2) KEYPAD接口
由于芯片的集成度较高、功能较为齐全,一些芯片内部集成了矩阵键盘的扫描逻辑,可以按照接口规范连接键盘即可,驱动编写的方式也比较简单。
3) AD接口
这种方式是因为芯片内部集成了数模转换模块,需要设计按键的电路,达到在总电压一定的情况下,按下不同的按键,AD接口识别到不同的电压,然后通过按键与电压值的匹配,识别当前按下的是哪个按键,这种方式对于外部电路的要求较高。
根据以上的几种方式,结合CubieBoard2的实际情况,该开发板上的A20芯片有对应的keypad接口,但是没有引出具体接口;AD接口部分已设计了总的供应电压,只需连接按键电路部分即可;鉴于GPIO扫描的方式较为复杂,这里采用AD接口的方案。
1、 电路设计
1) 开发板的AD接口
开发板上的AD接口电路如下:
主控芯片A20的LRADC0接口通过100k电阻上拉,并引至U15上的PIN41接口。可以看出,开发板上已提供电压进行上拉,只需要在外部键盘电路上进行电阻搭配,连接至U15-PIN41,达到每个按键按下时,LRADC0处采集到不同的电压即可。
1) 外接键盘电路设计
根据A20的芯片手册说明,A20内置的LRADC是6位的AD转换器,支持的电压输入范围为0至2V。因此将电路设计如下:
这里将每个按键按下的电压间隔设置为0.15V,电阻可根据实际调试的效果进行微调。
1、 按键驱动源码
这里把按键输入设计为输入子系统的设备,输入子系统的框架比较清晰,运用起来较为简单,只需实现对应的接口即可。主要为:模块加载函数swkbd_init()、模块卸载函数swkbd_exit()、中断函数sw_isr_key()。
其中,模块加载函数负责进行输入设备初始化及注册,中断申请等操作;
卸载函数负责进行释放中断、解注册输入设备;
中断函数用于在按键按下时,读取当前电压,进行键值映射,并将按键事件进行上报。
中断函数中按键映射关系如下:
具体可参考源代码:\lichee\linux-3.4\drivers\input\keyboard\sw-keyboard.c
4、 修改映射源码
按键映射文件位置:\android42\device\softwinner\smfy-super3\sw-keyboard.kl
修改后的文件内容如下:
5、 按键驱动编译
编译前需要修改Kconfig及Makefile文件。
其源码位置在:lichee/linux-3.4/drivers/input/keyboard/
在终端中输入make menuconfig,进入[Device Driver]à[Input device support]à[Keyboards],选中[sofrwinner KEYBOARD SUPPORT],将该模块直接编译进系统中。
重新编译整个系统,包括linux内核及安卓系统。下载后测试即可看到按键效果。
四、 参考文档
http://blog.csdn.net/acm2008/article/details/7065546
http://www.cnblogs.com/myblesh/articles/2367648.html
http://www.2cto.com/kf/201312/265650.html
http://blog.csdn.net/louiswangbing/article/details/6610953
http://blog.csdn.net/a345017062/article/details/6417929