Linux输入子系统学习笔记

Linux输入子系统学习笔记


1、 linux输入子系统的整体框架

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中的相关操作。

Linux输入子系统学习笔记