原创 linux input subsystem 架构分析

2009-9-2 09:33 9139 14 15 分类: 软件与OS

主要数据结构




数据结构


用途


定义位置


具体数据结构的分配和初始化


Struct input_dev


驱动层物理Input设备的基本数据结构


Input.h


通常在具体的设备驱动中分配和填充具体的设备结构


Struct Evdev


Struct Mousedev


Struct Keybdev…


Event Handler层逻辑Input设备的数据结构


Evdev.c


Mousedev.c


Keybdev.c


Evdev.c/Mouedev.c …中分配



Struct Input_handler


Event Handler的结构


Input.h


Event Handler层,定义一个具体的Event Handler


Struct Input_handle


用来创建驱动层DevHandler链表的链表项结构


Input.h


Event Handler层中分配,包含在Evdev/Mousedev…中。


------------------------------


input subsystem 用来统一处理数据输入设备,例如键盘,鼠标,游戏杆,触摸屏等等。


这里引用 Linux Journal 上的一个图来说明input subsystem 的架构:
http://www.linuxjournal.com/article/6396


  c3e154aa-b476-48b4-8aef-6add1205d0a8.jpg


我们可以看到,input core 用来协调硬件的input事件 和 用户层应用之间的通讯。



这里再引用 ELDD 上的一个图片,来详细说明其内部的结构:



 13b12d49-71b2-41fc-8243-226a7fa3c067.jpg


 在内核中,input_dev 表示一个 input设备;input_handler 来表示input设备的 interface。


 所有的input_dev 用双向链表 input_dev_list 连起来,如图所示:


e4ad7684-90ce-4341-bef0-4ec1effa1625.jpg


在调用 int input_register_device(struct input_dev *dev) 的时候,会将新的 input_dev 加入到这个链表中。


 所有的input_handler 用双向链表 input_handler_list 连起来, 如图所示:


a24bf0f4-8508-40ee-8fd6-d57d28118c6a.jpg

                                                                     
在调用 int input_register_handler(struct input_handler *handler) 的时候,会将新的 input_handler 加入到这个链表中。


每个input_dev 和 input_handler 是要关联上才能工作的,在注册 input_dev 或者 input_handler的时候,就遍历上面的列表,找到相匹配的,然后调用 input_handler 的 connect函数来将它们联系到一起。
通常在input_handler 的 connect函数中,就会创建 input_handle, input_handle就是负责将 input_dev 和 input_handler 联系在一起的,如图所示:


点击看大图


88ee57ac-3729-4835-9c01-7b28533c2243.jpg


                                                                             
 这里需要额外说明一下的是: input_dev 中的 h_node 是 input_handle 链表的list节点,也就是说,一个input_dev,可以对应多个 input_handle.


当设备产生 input event 的时候,例如按下了一个键,驱动就会调用 input_handler 中的 event 函数,同时,如果input_dev 支持的话,也会调用 input_dev 的 event 函数。


这样,设备产生的事件就会被驱动记录下来。


当用户层的程序需要获知这些事件的时候,会调用 input_handler中的 struct file_operations *fops 中的相应函数,例如 read 等等。


可以看出,整个 input 框架的构思还是比较简洁方便的。


【参考资料】 


1. The Linux USB Input Subsystem


 Part I : http://www.linuxjournal.com/article/6396


 Part II : http://www.linuxjournal.com/article/6429


2. linux kernel 2.6.23.11

文章评论1条评论)

登录后参与讨论

用户1203975 2010-4-15 15:25

Thanks!
相关推荐阅读
用户190932 2011-02-27 14:34
剖析Linux系统启动过程
本文以RedHat9.0和i386平台为例,剖析了从用户打开电源直到屏幕出现命令行提示符的整个Linux启动过程。并且介绍了启动中涉及到的各种文件。   阅读Linux源代码,无疑是深入学习Linu...
用户190932 2011-02-26 23:18
RedHat系列开机启动脚本顺序
RedHat系列Linux开机启动脚本顺序如果服务器重启之后还需要手工开启相关服务、那还说明上次的配置工作未完成,现特地总结了下red hat linux下开机自动启动脚本所涉及的知识和方法、如下:一...
用户190932 2011-02-05 13:10
2011第一篇:一个程序员的奋斗历程
转帖:这是多年前一位程序员所写,共勉! 我上的是一个三流的高校,就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了,大一开学前的假期我...
用户190932 2010-10-06 23:41
man手册的用法
使用Linux下man已经很久了。但只是大概知道其内容的存放目录,以及man number xxx中mumber的含义。今天需要添加C++ man page。顺便将man的内容作一个较详细的了解。0....
用户190932 2010-04-28 14:05
ubuntu下mini2440的NFS挂载
本文转载自:http://hi.baidu.com/linuxcfan/blog/item/2c4c7e39723194c8d56225b4.html网络文件系统(NFS)一、NFS简介1、NFS就是...
用户190932 2010-04-14 22:56
关于x86、i386、i486、i586和i686等名词的解释
一、x86与i386、i486、i586、i686等        x86或80x86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称。 该系列较早期的处理器名称是以数字来表示,并以“86...
我要评论
1
14
关闭 站长推荐上一条 /2 下一条