【驱动】input子系统全面分析

初识linux输入子系统

  linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。

input输入子系统框架分析

  输入子系统由输入子系统核心层( Input Core ),驱动层和事件处理层(Event Handler)三部份组成。

  一个输入事件,如鼠标移动,,键盘按键按下,joystick的移动等等通过 input driver -> Input core -> Event handler -> userspace 到达用户空间传给应用程序。

1.系统核心层

  主要功能

2.handler层(事件处理层)

  handler层是纯软件层,包含不同的解决方案,如键盘,鼠标,游戏手柄等,但是没有设计到硬件方面的操作

  对于不同的解决方案,都包含一个名为input_handler的结构体,该结构体内含的主要成员如下

    .id_table   一个存放该handler所支持的设备id的表(其实内部存放的是EV_xxx事件,用于判断device是否支持该事件)

    .fops     该handler的file_operation

    .connect   连接该handler跟所支持device的函数

    .disconnect  断开该连接

    .event    事件处理函数,让device调用

    h_list    也是一个链表,该链表保存着该handler到所支持的所有device的中间站:handle结构体的指针

3.device层(驱动层)

  device是纯硬件操作层,包含不同的硬件接口处理,如gpio等

  对于每种不同的具体硬件操作,都对应着不同的input_dev结构体

  该结构体内部也包含着一个h_list

4:input_handler_list和input_device_list

  对于handler和device,分别用链表input_handler_list和input_device_list进行维护,

  当handler或者device增加或减少的时候,分别往这两链表增加或删除节点。

5.input子系统框架图

input子系统调用过程分析

  1.当外部应用程序需要调用输入子系统的open函数时,会先通过主设备号进入到核心层,然后通过次设备号进入handler层,再调用.fops内的open函数返回fd;

  2.当外部应用程序需要调用输入子系统的read函数时,会通过返回的fd调用.fop内的read函数,然后休眠,等待被.event函数唤醒

  3.当外部中断到达的时候,会先确定中断事件,然后用input_event上报事件,再通过h_list里面的所有handle调用对应的handler中的.event函数,对read进行唤醒,然后在read中返回(也就是当device有多个对应的handler的时候,input_event会向所有的handler上报事件)

  4.当需要加入新的handler时,需要先构建handler结构体,然后调用input_register_handler对该handler进行注册

  input_register_handler的内部实现:往input_handler_list加入新增的handler节点,然后对input_device_list的所有结点(也就是所有的device)进行遍历,通过.id_table查看该device是否支持该handler,对支持的device调用.connect,一一地构建input_handle结构体,连接handler跟device

  5.当需要加入新的device时,需要先构建input_dev结构体,然后调用input_register_device对该input_dev进行注册

  

  input_register_dev的内部实现:往input_device_list加入新增的device节点,然后对input_handler_list的所有结点(也就是所有的handler)进行遍历,通过handler 的.id_table查看该handler是否支持该device,对支持的device调用该handler的.connect,一一地构建input_handle结构体,连接handler跟device

  在输入子系统框架下,我们一般的编写驱动也就是对device部分进行编写(分配input_dev并配置,驱动入口,出口,中断时进行中断判断,然后上报事件等),然后对该device的input_dev进行注册

Input输入子系统数据结构分析input_dev

  input_dev 这是input设备基本的设备结构,每个input驱动程序中都必须分配初始化这样一个结构,成员比较多

  (1)有以下几个数组:

unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; //事件支持的类型// 下面是每种类型支持的编码 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //按键 unsigned long relbit[BITS_TO_LONGS(REL_CNT)];unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //绝对坐标,其中触摸屏驱动使用的就是这个 unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; 君子当权积福,小人仗势欺人。

【驱动】input子系统全面分析

相关文章:

你感兴趣的文章:

标签云: