linux输入子系统(设备驱动与事件驱动)

本文详细介绍了Linux输入子系统如何统一处理不同类型的输入设备,如鼠标,以及输入子系统的结构,包括事件驱动和设备驱动。事件驱动作为标准接口与应用程序交互,设备驱动负责与底层硬件通信。通过input_dev、input_handle和input_handler三个关键结构体,阐述了它们之间的关联以及驱动层和事件处理层的交互流程,以触摸屏驱动为例,展示了用户获取输入事件的完整过程。
摘要由CSDN通过智能技术生成
内核的输入子系统是为了对分散的、多种不同类别的输入设备(如键盘、鼠标、轨迹球、操纵杆、辊轮、触摸屏、加速计和手写板)进行统一处理的驱动。输入子系统带来了如下好处: 

•     统一了物理形态各异的相似的输入设备的处理功能。例如,各种鼠标,不论PS/2、USB,还是蓝牙,都被同样处理。 

•     提供了用于分发输入报告给用户应用程序的简单的事件(event)接口。你的驱动不必创建、管理/dev 节点以及相关的访问方法。因此它能很方便的调用输入API 以发送鼠标移动、键盘按键,或触摸事件给用户空间。X Windows 这样的应用程序能够无缝地运行于输入子系统提供的 event 接口之上。 

•     抽取出了输入驱动的通用部分,简化了驱动,并提供了一致性。例如,输入子系统提供了一个底层驱动(成为 serio)的集合,支持对串口和键盘控制器等硬件输入设备的问。

 输入子系统包括一前一后运行的两类驱动:事件驱动和设备驱动。事件驱动负责和应用程序的接口,而设备驱动负责和底层输入设备的通信。鼠标事件产生者 mousedev,是前者的实例;而 PS/2 鼠标驱动是后者的实例。事件驱动和设备驱动都可以利用输入子系统的高效、可重用的核心提供的服务。

事件驱动是标准的,对所有的输入类都是可用的,所以你更可能的是实现设备驱动而不是事件驱动。你的设备驱动可以利用一个已经存在的、合适的事件驱动通过输入核心和事件驱动是标准的,对所有的输入类都是可用的,所以你更可能的是实现设备驱动而不是事件驱动。你的设备驱动可以利用一个已经存在的、合适的事件驱动通过输入核心和用户应用程序接口(/dev/input/eventX)。

下面使用网上摘抄的两篇文章说明input_devinput_handle、input_handler这三者是怎么联系起来的,以触摸屏驱动为例。

首先看下这三个结构体是如何联系的,原文地址http://bbs.ustc.edu.cn/cgi/bbstcon?board=Kernel&file=M.1179398612.A

输入子系统的3层间的联系是很简单的,驱动层的核心结构为struct input_dev: 
struct input_dev { 
    ... 
    struct list_head        h_list; 
    ... 
}; 
在input_register_device时就会将input_dev与input_handle联系起来; 
所谓联系就是将有关的input_handle链入以input_dev中h_list为Hash头的链中; 

而事件处理层的核心结构是struct input_handler: 
struct input_handler { 
    ... 
    struct list_head        h_list; 
    ... 
}; 
在input_register_handler时同样会将input_handler与input_handle联系起来, 
所谓联系就是将有关的input_handle链入以input_handler中h_list为Hash头的链中; 

由上可见input_handle即是一个用于关联驱动层input_dev和事件处理 
层input_handler的中间结构: 
struct input_handle { 
    ... 
    struct input_dev *dev; 
    struct input_handler *handler; 
    struct list_head        d_node; 
    struct list_head        h_node; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值