---恢复内容开始---
一、input输入子系统框架分析
概述:该部分从整体上介绍了Input输入子系统的结构框架,有助于读者从宏观上对input输入子系统进行把控。
本节重点:
a、输入子系统的框架结构
b、各层对应的文件位置
c、输入子系统的事件处理机制
d、输入子系统的驱动层基本操作流程
e、输入子系统的驱动层常用函数
本节难点:
a、输入子系统的事件处理机制
b、输入子系统驱动工作流程
1、初识Linux输入子系统
linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EVentHandle)、输入子系统核心层(inputCore)和输入子系统设备驱动层。
对于输入子系统设备驱动层而言,主要是实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。
对于核心层而言,为设备驱动层提供了规范和接口,设备驱动层只需要关心如何驱动硬件并获得硬件数据(比如按下的按键),然后调用核心层提供的接口,核心层会将数据自动提交给事件处理层。对于事件处理而言,则是用户编程的接口(既设备节点),并处理驱动层提交的数据。
对于Linux输入子系统的框架结构如下图1所示:
linux输入子系统框架结构
2、输入子系统各层文件
/dev/input目录下显示的是已经注册在内核中的设备编程接口,用户通过open这些设备文件来打开不同的输入设备进行硬件操作。
事件处理层为不同硬件类型提供了用户访问及处理接口。例如当我们打开设备/dev/input/mice时,会调用到事件处理层的Mouse Handler来处理输入事件,这也使得设备驱动层无需关心设备文件的操作,因为Mouse Handler已经有了对应事件处理的方法。
输入子系统由内核代码drivers/input/input.c构成,它的存在屏蔽了用户到设备驱动的交互细节,为设备驱动层和事件处理层提供了相互通信的统一界面。
图2 linux输入子系统事件处理机制
作为输入设备的驱动开发者,需要做以下几步:
a、在驱动加载模块中,设置你的input设备支持的事件类型(一个设备可以选择一个或者多个事件类型上报给输入子系统),如 EV_SYN 0x00 同步事件、EV_KEY 0x01 按键事件、EV_REL 0x02 相对坐标等;
b、注册中断处理函数,例如键盘设备需要编写按键的抬起、放下,触摸屏设备需要编写按下、抬起、绝对移动,鼠标设备需要编写单击、抬起、相对移动,并且需要在必要的时候提交硬件数据(键值/坐标/状态等等)
c、将输入设备注册到输入子系统中
Linux输入子系统提供了设备驱动层上报输入事件的函数,在include/linux/input.h中:
void input_sync(struct input_dev *dev);
参考自https://blog.csdn.net/ielife/article/details/7798952,如有侵权,请告知