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. 已知项目有风险,作为项目经理接还是不接?
  2. linux nohup命令
  3. 设置最大值_变频器用远传压力表控制恒压供水参数设置
  4. JavaScript | 用户定义函数的一些示例
  5. Python学习笔记-猜数字游戏(学习语法)
  6. 两个git库之间迁移_从一个git仓库迁移代码到另一个git仓库(亲测有效版)(转)...
  7. 考试系统(用xml文件模拟数据库)
  8. oracle 密码管理,【转载】Oracle密码管理五大要点(一)
  9. yum [Errno 256] No more mirrors to try 解决方法
  10. wsdl2java生成客户端代码_利用wsdl2java工具生成webservice的客户端代码
  11. 运维自动化之ansible playbook安装mysql
  12. java插桩-javaassist
  13. flutter在IOS上的登录实现——QQ登录、微信登录、自动识别手机号一键登录、apple登录
  14. 方根法公式_方根的简易算法
  15. 后台获取访问端的真实ip地址
  16. 64个 360 评估的提问样例
  17. 《写给大家看的设计书》《写给大家看的色彩书》《点石成金》《形式感》学习笔记
  18. 收藏!程序员必备的软件开发工具大全!(附高速下载地址)
  19. LoRaWAN协议-Class A类设备分析
  20. 2020下半年新机最新消息_2020年下半年最期待的手机盘点

热门文章

  1. Camera persist使用手册之log使用技巧
  2. android camera API1调用camera HAL3流程学习总结
  3. 2个YUV视频 拼接技术
  4. linux调度器(十)——调度器/proc信息解读
  5. php单列模式_PHP单例模式详解及实例代码
  6. 1.5.2 Prime Palindromes 回文质数(构造回文)
  7. c++结构体学习笔记!
  8. 【PAT B1019/A1069】数字黑洞
  9. codeforces Roud499Div2 B和C
  10. n阶方阵的蛇形排列java_排列组合的模板算法