MSM8909+Android5.1.1键盘驱动------概述

MSM8909+Android5.1.1键盘驱动------概述

 

       采用SN7326带智能指扫描的键盘扩展芯片,通过I2C接口来读取其状态寄存器的值就可知道是单按键还是多按键按下,可知道具体是哪个按键按下。然后键盘驱动调用input_event()上报linux的扫描码,比如KEY_RIGHT,然后传递给android框架层,流程如下图:

MSM8909+Android5.1.1键盘驱动------概述_第1张图片

图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

 

你可能感兴趣的:(MSM8909+Android5.1.1键盘驱动------概述)