input子系统详解,按键如何上报

2017-05-11 17:07

在键盘驱动代码分析的笔记中,接触到了input子系统.键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动 ..

在键盘驱动代码分析的笔记中,接触到了input子系统.键盘驱动,键盘驱动将检测到的所有按键都上报给了input子系统。Input子系统是所有I/O设备驱动的中间层,为上层提供了一个统一的界面。例如,在终端系统中,我们不需要去管有多少个键盘,多少个鼠标。它只要从input子系统中去取对应的事件(按键,鼠标移位等)就可以了。今天就对input子系统做一个详尽的分析.

下面的代码是基于linux kernel 2.6.25.分析的代码主要位于kernel2.6.25/drivers/input下面.

二:使用input子系统的例子

在内核自带的文档Documentation/input/input-programming.txt中。有一个使用input子系统的例子,并附带相应的说明。以此为例分析如下:

#include

#include

#include

#include

#include

static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)

{

input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) & 1);

input_sync(&button_dev);

}

static int __init button_init(void)

{

if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL)) {

printk(KERN_ERR "button.c: Can't allocate irq %d\n", button_irq);

return -EBUSY;

}

button_dev.evbit[0] = BIT(EV_KEY);

button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);

input_set_capability(button_dev, EV_KEY, BTN_1);

input_register_device(&button_dev);

}

static void __exit button_exit(void)

{

input_unregister_device(&button_dev);

free_irq(BUTTON_IRQ, button_interrupt);

}

module_init(button_init);

module_exit(button_exit);

这个示例module代码还是比较简单,在初始化函数里注册了一个中断处理例程。然后注册了一个input device.在中断处理程序里,将接收到的按键上报给input子系统。

文档的作者在之后的分析里又对这个module作了优化。主要是在注册中断处理的时序上。在修改过后的代码里,为inputdevice定义了open函数,在open的时候再去注册中断处理例程。具体的信息请自行参考这篇文档。在资料缺乏的情况下,kernel自带的文档就是剖析kernel相关知识的最好资料.

文档的作者还分析了几个api函数。列举如下:

1):set_bit(EV_KEY, button_dev.evbit);

set_bit(BTN_0, button_dev.keybit);

分别用来设置设备所产生的事件以及上报的按键值。Struct iput_dev中有两个成员,一个是evbit.一个是keybit.分别用表示设备所支持的动作和按键类型。

2): input_register_device(&button_dev);

用来注册一个input device.

3): input_report_key()

用于给上层上报一个按键动作

4): input_sync()

用来告诉上层,本次的事件已经完成了.

5): NBITS(x) - returns the length of a bitfield array in longs for x bits

LONG(x)  - returns the index in the array in longs for bit x

BIT(x)   - returns the index in a long for bit x

这几个宏在input子系统中经常用到。上面的英文解释已经很清楚了。

android 按键上报流程,input子系统详解,按键如何上报相关推荐

  1. driver: Linux设备模型之input子系统详解

    本节从整体上讲解了输入子系统的框架结构.有助于读者从整体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识能够找准方向,明白原理. 本节重点: 输入子系统的框架结构 各层对应内核中的 ...

  2. Linux input 子系统详解

    1. 模块概述 1.1.相关资料和代码研究 drivers/input/ include/uapi/linux/input-event-codes.h 2. 模块功能 linux核心的输入框架 3. ...

  3. Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)

       本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 上篇文章<<Android中measure过程.WRAP_CONTENT详解以及xml布局文 ...

  4. linux abs函数怎么用,Linux输入子系统详解

    原标题:Linux输入子系统详解 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注. 导读 linux输入子系统由驱动层.输入子系统核心.事件处理层三部分组成.一个输入事件,如 ...

  5. android任务 进程 线程详解,Android任务、进程、线程详解

    singleTop模式,基本上于standard分歧,仅正在请求的Activity反好位于栈顶时,无所区别.此时,配放成singleTop的Activity,不再会构制新的实例加入到Task栈外,而是 ...

  6. Android  Doze and App Standby模式详解

    Android  Doze and App Standby模式详解 来源:腾云阁 https://www.qcloud.com/community Optimizing for Doze and Ap ...

  7. 深入理解Android(一):Gradle详解

    http://www.infoq.com/cn/articles/android-in-depth-gradle/ http://www.infoq.com/cn/articles/android-i ...

  8. 《Android 网络开发与应用实战详解》——1.3节搭建Android应用开发环境

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第1章,第1.3节搭建Android应用开发环境,作者 王东华,更多章节内容可以访问云栖社区"异步社区&qu ...

  9. 《Android 网络开发与应用实战详解》——2.3节Android系统架构

    本节书摘来自异步社区<Android 网络开发与应用实战详解>一书中的第2章,第2.3节Android系统架构,作者 王东华,更多章节内容可以访问云栖社区"异步社区"公 ...

  10. Android Binder框架实现之Parcel详解之基本数据的读写

       Android Binder框架实现之Parcel详解之基本数据的读写 Android Binder框架实现目录: Android Binder框架实现之Binder的设计思想 Android ...

最新文章

  1. python5_python5
  2. cocos2d-x游戏实例(27)-简易动作游戏(5)
  3. 过去一年25个amazing node.js 开源项目(2018版本)
  4. 常用负载均衡策略分析
  5. jquery.rotate.js 转盘抽奖示例
  6. 基于springboot的家政服务网站
  7. 在发送邮件HTML中,CSS等问题
  8. BASH脚本基础:使用md5sum命令生成消息摘要指纹与验证
  9. java 判断是不是昨天、今天、明天
  10. Python模块——标准库\开源模块\自定义模块
  11. A1008. 数列特征
  12. Ass代理转实模/Convert ass proxy to model
  13. Auditbeat日志审计方案
  14. 入门级,Hadoop详情教程(一)
  15. Outlook2007設置未讀郵件為紅色
  16. Final Cut Pro X Guru: Motion Graphics in Motion and After Effects Final Cut Pro X Guru:运动和After Effe
  17. QT QGraphicsItem飞舞的蝴蝶
  18. 2008年北京奥运会:出现可能性极高的十句话
  19. 树莓派4B arm平台aarch64 pip安装pytorch
  20. java实现三宫格及其扩展_使用css伪类before/after实现 正方形三宫格、正方形六宫格、正方形九宫格...

热门文章

  1. tcpdump高级过滤
  2. DPDK学习1 -- DPDK环境搭建和测试helloword
  3. JUnit for Android入门2 JUnit断言
  4. 中国土壤全磷含量空间分布数据
  5. Spark 堆外内存
  6. list的一些常见用法总结(实用干货收藏)
  7. python numpy模块玩转矩阵与科学计算
  8. mysql数据库隔离级别 实现原理_MySQL事务及Spring隔离级别实现原理详解
  9. 字符串函数---atof()函数详解及实现
  10. 如何搜mac_今日头条号权重怎么查?如何提高头条号权重?看完这篇你就懂了