Linux输入子系统学习笔记
1、 linux输入子系统的整体框架
Linux输入子系统将输入驱动抽象为三层:事件处理层、核心层、设备驱动层。应用程序只需要跟事件处理层打交道,核心层是负责管理输入设备,并将消息在事件处理层和设备驱动层之间传递。Linux输入子系统整体框架如图所示。
2、 涉及的重要数据结构
(1) 驱动程的数据结构struct input_dev
用途:
驱动程input设备的基本数据结构,驱动的主体,需要完成的大部分工作围绕它进行,每个struct input_dev代表一个输入设备。
位置:
Linux/input.h
数据结构的分配和初始化:
在具体的设备驱动中分配和填充具体的设备结构。
(2) 事件处理层的数据结构struct input_handler
用途:
每个handler代表一种处理事件的方式,允许多个handler共存。
位置:
Linux/input.h
数据结构的分配和初始化:
在event handler层定义具体的struct input_handler。
(3) 数据结构stuct input_handle
用途:
用来创建驱动层struct input_dev和struct input_handler链表的链表项结构,使事件处理层和驱动层产生联系。
位置:
Linux/input.h
数据结构的分配和初始化:
Event Handler层中分配,包含在evdev.c/tsdev.c等中。
(4) 内核统一使用的数据结构struct input_event
用途:
它是所有输入事件传送的载体,输入系统的事件都包装成该结构体传送给用户空间。
位置:
Linux/input.h
具体定义如下:
structinput_event {
structtimeval time; /* 时间戳 */
__u16type; /* 事件类型*/
__u16code; /* 事件代码 */
__s32value; /* 事件值,如坐标的偏移值 */
};
type:如EV_KEY,键盘、EV_REL,相对坐标、EV_ABS,绝对坐标等
code:如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码值0~127为键盘上的按键代码,0x110~0x116为鼠标上按键代码(在input.h中有详细定义)。
value:如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0。
3、 输入设备节点操作示意图
以下是用户空间操作输入设备的一个示意图,其中蓝色部分为input设备的公共处理,紫色部分evdev中的相关操作。