Linux驱动修炼之道-INPUT子系统(上)

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/05/19/6431094.aspx

内核的输入子系统是对分散的,多种不同类别的输入设备(如键盘,鼠标,跟踪球,操纵杆,触摸屏,加速计和手写板)等字符设备进行统一处理的一层抽象,就是在字符设备驱动上抽象出的一层。输入子系统包括两类驱动程序:事件驱动程序和设备驱动程序。事件驱动程序负责和应用程序的接口,而设备驱动程序负责和底层输入设备的通信。鼠标事件生成文件mousedev属于事件驱动程序,而PS/2鼠标驱动程序是设备驱动程序。事件驱动程序是标准的,对所有的输入类都是可用的,所以要实现的是设备驱动程序而不是事件驱动程序。设备驱动程序可以利用一个已经存在的,合适的事件驱动程序通过输入核心和用户应用程序接口。
输入子系统带来了如下好处:

1.统一了物理形态各异的相似的输入设备的处理功能
2.提供了用于分发输入报告给用户应用程序的简单的事件接口
3.抽取出了输入驱动程序的通用部分,简化了驱动,并引入了一致性
如下图,input子系统分三层,最上一层是event handler,中间是intput core,底层是input driver。input driver把event report到input core层。input core对event进行分发,传到event handler,相应的event handler层把event放到event buffer中,等待用户进程来取。

Linux驱动修炼之道-INPUT子系统(上)_第1张图片

现在了解了input子系统的基本思想,下面来看一下input子系统的3个基本的数据结构:

如下图代表了input_dev,input_handler,input_handle,3者之间的关系。一类handler可以和多个硬件设备相关联,一个硬件设备可以和多个handler相关联。例如:一个触摸屏设备可以作为一个event设备,作为一个鼠标设备,也可以作为一个触摸设备,所以一个设备需要与多个平台驱动进行连接。而一个平台驱动也不只为一个设备服务,一个触摸平台驱动可能要为A,B,C3个触摸设备提供上层驱动,所以需要这样一对多的连接。

Linux驱动修炼之道-INPUT子系统(上)_第2张图片

下面来看看input子系统的初始化函数:

下面来看input子系统的file_operations,这里只有一个打开函数input_open_file,这个在事件传递部分讲解。


下边来看input_dev设备的注册:

跟踪程序,来看看input_attach_handler的实现:

下边来看看这个匹配函数:如果id->flags存在,并且相应的标志为被设定则进行比较。

下边是刚刚看到的connect,这里假设这个handler是evdev_handler。如果匹配上了就会创建一个evdev,它里边封装了一个handle,会把input_dev和input_handler关联到一起。

看一下这张图会对上边的结构有清楚的认知了:

Linux驱动修炼之道-INPUT子系统(上)_第3张图片

你可能感兴趣的:(数据结构,linux,面试,Blog)