input输入子系统分析

---恢复内容开始---

一、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,如有侵权,请告知

posted @ 2018-12-04 21:54  ZQ_One  阅读(212)  评论(0编辑  收藏  举报