详解Linux输入子系统框架的原理

  介绍

这期内容当中小编将会给大家带来有关详解Linux输入子系统框架的原理,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>输入输入子系统框架

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

一个输入事件,如鼠标移动,键盘按键按下,操纵杆的移动等等通过输入驱动程序→输入核心→事件处理程序→用户空间到达用户空间传给应用程序。

详解Linux输入子系统框架的原理

【注意】键盘。c不会在/dev/输入下产生节点,而是作为ttyn终端(不包括串口终端)的输入。

<>强驱动层

对于输入子系统设备驱动层而言,主要实现对硬件设备的读写访问,中断设置,并把硬件产生的事件转换为核心层定义的规范提交给事件处理层。将底层的硬件输入转化为统一事件形式,想输入核心(输入核心)汇报。

<强>输入子系统核心层

对于核心层而言,为设备驱动层提供了规范和接口。设备驱动层只要关心如何驱动硬件并获得硬件数据(例如按下的按键数据),然后调用核心层提供的接口,核心层会自动把数据提交给事件处理层。它承上启下为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理,在/Proc下产生相应的设备信息。

<强>事件处理层

对于事件处理层而言,则是用户编程的接口(设备节点),并处理驱动层提交的数据处理。主要是和用户空间交互(Linux中在用户空间将所有的设备都当作文件来处理,由于在一般的驱动程序中都有提供傻瓜接口,以及在/dev下生成相应的设备文件点头,这些操作在输入子系统中由事件处理层完成)。

/dev/输入目录下显示的是已经注册在内核中的设备编程接口,用户通过开放这些设备文件来打开不同的输入设备进行硬件操作。

事件处理层为不同硬件类型提供了用户访问及处理接口。例如当我们打开设备/dev/输入/老鼠时,会调用到事件处理层的鼠标处理程序来处理输入事件,这也使得设备驱动层无需关心设备文件的操作,因为鼠标处理程序已经有了对应事件处理的方法。

输入子系统由内核代码司机/输入/输入。c构成,它的存在屏蔽了用户到设备驱动的交互细节,为设备驱动层和事件处理层提供了相互通信的统一界面。

详解Linux输入子系统框架的原理

由上图可知输入子系统核心层提供的支持以及如何上报事件到输入事件驱动程序。

作为输入设备的驱动开发者,需要做以下几步:

    <李>在驱动加载模块中,设置你的输入设备支持的事件类型李 <>李注册中断处理函数,例如键盘设备需要编写按键的抬起,放的下,触摸屏设备需要编写按下,抬起,绝对移动,鼠标设备需要编写单击,抬起,相对移动,并且需要在必要的时候提交硬件数据(键值/坐标/状态等等) <李>将输入设备注册到输入子系统中李

///////////////////////////////////////////////////////////////////分割线/////////////////////////////////////////////////////////////////////////////////

输入核心提供了底层输入设备驱动程序所需的API,如分配/释放一个输入设备:

struct input_dev * input_allocate_device(空白);
空白input_free_device (struct input_dev * dev);

/* *   * input_allocate_device -新输入设备分配内存   *   *返回准备struct input_dev或NULL。   *   *注意:使用input_free_device()设备,没有自由   *注册;应该用于已经input_unregister_device ()   *注册设备。   */struct input_dev * input_allocate_device(空白)   {   struct input_dev *开发;/*分配一个input_dev结构体,并初始化为0 */dev=kzalloc (sizeof (struct input_dev), GFP_KERNEL);   如果(dev) {   dev→开发。类型=,input_dev_type;/*初始化设备的类型*/dev→开发。类=,input_class;/*设置为输入设备类*/device_initialize(及开发→dev);/*初始化装置结构*/mutex_init(及开发→互斥);/*初始化互斥锁*/spin_lock_init(和dev→event_lock);/*初始化事件自旋锁*/INIT_LIST_HEAD(和dev→h_list);/*初始化链表*/INIT_LIST_HEAD(及开发→节点);/*初始化链表*/__module_get (THIS_MODULE);/*模块引用技术加1 */}      返回开发;   }

详解Linux输入子系统框架的原理