采用SN7326带智能指扫描的键盘扩展芯片,通过I2C接口来读取其状态寄存器的值就可知道是单按键还是多按键按下,可知道具体是哪个按键按下。然后键盘驱动调用input_event()上报linux的扫描码,比如KEY_RIGHT,然后传递给android框架层,流程如下图:
图1
下面介绍要实现键盘驱动所涉及的主要方方面面
1. Input子系统
Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。输入子系统由核心层(Input Core)、驱动层和事件处理层(EventHandler)三部份组成。一个输入事件,如鼠标移动,键盘按键按下,joystick的移动等等通过
input driver -> Input core -> Eventhandler -> userspace 到达用户空间传给应用程序。
图2
除了input driver部分,其他的内核已经写好,基本不需要修改,所以我们需要写一个I2C input driver。
2. Linux内核I2C设备驱动
因为我们是通过基于I2C接口的sn7326芯片来扫描按键的,所以需要写I2C设备驱动。
Linux内核I2C设备驱动包含3层[10],分别是:I2C总线驱动(I2C core)、I2C控制器驱动(I2C adapter)及I2C设备的驱动(I2C driver)。I2C总线驱动主要实现对I2C总线及控制器和设备驱动的管理。这部分代码为通用部分,Linux内核已经完善,不需要改动。I2C控制器驱动跟硬件相关,主要是构造一个与I2C总线层接口的数据结构,并通过接口函数向I2C总线注册一个控制器。同时,实现对I2C控制器中断的处理函数,完成I2C设备具体功能的实现。I2C设备驱动主要是构造一个与I2C总线层接口的数据结构,通过接口函数向I2C总线层注册一个I2C设备驱动。同时构造一个与用户层接口的数据结构,通过接口函数向内核注册一个字符型设备。
我们这里是要开发一个I2C设备驱动。
3. 按键硬件码、Linux扫描码和android的键盘码
3.1 按键硬件码
硬件码是我的命名,就是指按下按键时,最初的按键标识编码值,这个和具体的按键设计、采用的键盘扩展IC芯片的设计相关,比如sn7326
图3
这里的映射表就是硬件码值。
3.2 Linux扫描码
扫描码是LinuxInput系统中规定的码值,好比PC键盘上每个键的键值。都是数字。在设备上输入一下命令后,按键可以探测到得到每个按键的扫描码Code.
Linux的扫描码在\kernel\include\uapi\linux\input.h定义,比如: /* *Keys and buttons * *Most of the keys/buttons are modeled after USB HUT 1.12 *(see http://www.usb.org/developers/hidpage). *Abbreviations in the comments: * AC- Application Control * AL- Application Launch Button * SC- System Control */ #define KEY_RESERVED 0 #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 #define KEY_3 4 #define KEY_4 5 #define KEY_5 6 #define KEY_6 7 #define KEY_7 8 #define KEY_8 9 #define KEY_9 10 #define KEY_0 11
3.3 Android的键盘码
Android也定义了一套码,叫作键盘码,通过一个/system/usr/keylayout/来将两套码对应起来。这里用的是sn7326.kl。(如果没有其它*.kl,则是默认的qwerty.kl)
/frameworks/base/data/keyboards/Generic.kl定义,比如:
# # Generic key layout file for fullalphabetic US English PC style external keyboards. # # This file is intentionally very genericand is intended to support a broad rang of keyboards. # Do not edit the generic key layout tosupport a specific keyboard; instead, create # a new key layout file with the requiredkeyboard configuration. # key 1 ESCAPE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0
参考http://blog.csdn.net/kangear/article/details/12110951