MSM8909+Android5.1.1键盘驱动------概述
采用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