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

时间: 2024-07-28 23:41:48

MSM8909+Android5.1.1键盘驱动------概述的相关文章

MSM8909+Android5.1.1键盘驱动---sn7326介绍

1.     Sn7326概述 SN7326是一款带智能自扫描的键盘扩展芯片,支持多达8*8个按键.按下/松开按键的动作被编码成一个字节的数据存入到按键事件寄存器(key event register)中,主控制器可通过I2C串行总线读取按键事件寄存器. SN7326具有去抖动功能,在任何按键按下时中断输出引脚会置低,为降低功耗,在没有按键动作时SN7326自动进入低功耗模式. SN7326的主要特性 (1)   2.4V到5.5V的工作电压 (2)   400kHz的I2C串行接口 (3)  

MSM8909+Android5.1.1 SPI驱动开发(PSAM部分)

MSM8909+Android5.1.1SPI驱动开发(PSAM部分) 1.     PSAM部分的硬件设计 图1 CS   片选信号 SCK  时钟信号 MISO 主设备的数据输入.从设备的数据输出脚 MOSI 主设备的数据输出.从设备的数据输入脚 2.     PSAM部分软件设计 图2 (1)  PSAM应用 这部分只需要调用API函数即可. (2)  PSAM API API的主要工作就是给M0上电.设置SPI读写模式.设置SPI读写的每字节的位数.SPI的工作频率等. (3)  SPI

【驱动】USB驱动实例·串口驱动·键盘驱动【转】

转自:http://www.cnblogs.com/lcw/p/3159370.html Preface USB体系支持多种类型的设备. 在 Linux内核,所有的USB设备都使用 usb_driver结构描述. 对于不同类型的 USB设备,内核使用传统的设备驱动模型建立设备驱动描述,然后映射到 USB设备驱动,最终完成特定类型的 USB设备驱动 USB驱动·入门:http://infohacker.blog.51cto.com/6751239/1226257 USB串口驱动 USB串口驱动关键

(55)Linux驱动开发之一驱动概述

驱动概述 驱动用在哪里?非标准类设备的编写和标准类设备的驱动移植. 驱动实际上是随着linux内核相伴而生的.某段代码能够控制我们的硬件去工作,去动,这段代码就称为我们的驱动代码. 技术只是一种手段,一种技巧,我们应该利用技术去搞出产品. 5.1.1_2.什么是驱动1_2 5.1.1.1.理解驱动的概念 (1)驱动一词的字面意思 (2)物理上的驱动 (3)硬件中的驱动 (4)linux内核驱动.软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序.(本质上是电力

删除、卸载虚拟机之后键盘驱动无效,黄色感叹号

最近,有朋友的电脑脑突然出现只要一按键盘就无反应,可电脑其他的程序还在运行,只是键盘鼠标无任何反应.而且重启以后不动键盘,鼠标可以做任何操作.使用360系统修复后没有解决问题.查看设备管理器,发现键盘驱动显示黄色叹号!后来重装驱动,显示"驱动不存在,错误代码39",卸载之后还是依然.后来终于在网上找到了解决方法,为大家附上. 键盘驱动出现黄色感叹号解决方法: 出现问题的原因可能是因为删除虚拟机的时候导致了注册表出错,解决方法修改注册表: 打开注册表regedit: 找到 :HKEY_L

Linux GPIO键盘驱动开发记录_OMAPL138

Linux GPIO键盘驱动开发记录_OMAPL138 Linux基本配置完毕了,这几天开始着手Linux驱动的开发,从一个最简单的键盘驱动开始,逐步的了解开发驱动的过程有哪些.看了一下Linux3.3内核文件下的driver目录,点开里面的C文件,感觉底层的Linux驱动机制还是很复杂的,还需要一段漫长时间的学习.现在开发的也不能说是叫做驱动,也只能说是驱动的应用,我们学习驱动也从应用逐步开始,往里面深入吧. 0.开发准备 内核源文件(当时我们编译内核时候的目录,很重要,编译驱动的时候需要依赖

USB设备驱动概述

USB设备驱动 ·  17.1 USB总线协议 ·  17.1.1 USB设备简介 ·  17.1.2 USB连接拓扑结构 ·  17.1.3 USB通信的流程 ·  17.1.4 USB四种传输模式 ·  17.2.1 观察USB设备的工具 ·  17.2.2 USB设备请求 ·  17.2.3 设备描述符 ·  17.2.4 配置描述符 ·  17.2.5 接口描述符 ·  17.2.6 端点描述符 ·  17.3.1 功能驱动与物理总线驱动 ·  17.3.2 构造USB请求包 ·  17

USB驱动——键盘驱动(控制传输)

本文以 usbkbd.c 为例,分析 usb 键盘驱动程序. static int __init usb_kbd_init(void) { int result = usb_register(&usb_kbd_driver); if (result == 0) printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" DRIVER_DESC "\n"); return result;

进阶项目(12)PS2键盘驱动程序设计讲解

写在前面的话 我们从小就开始接触电脑,曾经多么羡慕那些在键盘上洋洋洒洒的人,手指轻柔的飞舞,刻画出一章章美丽的篇幅…那么作为工程师的我们,同样拥有着属于我们的情怀.如果曾经的向往变成我们喜欢的玩具:如果曾经的神秘变成我们夜以继日的痴迷.那么,一切又将如何?梦翼师兄携手大家一起来欣赏.来品味. 项目需求 设计一个ps2键盘的接口驱动电路. 原理分析 ps2的接口如下图所示: 其中,1是数据线DATA: 2是预留N/C: 3是GND: 4是VCC(+5V): 5是时钟信号线CLK: 6是预留N/C: