分享

安卓添加按键驱动

 兰宝888 2018-04-04

一、     文档概述

本文档主要描述安卓系统中如何添加按键驱动及其映射,有任何不当之处,欢迎指正。

二、     安卓按键驱动原理

安卓系统中,实体按键的识别通常有如下几个过程:


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内核及安卓系统。下载后测试即可看到按键效果。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多