input子系统五:总结框架
通过前面的学习,我们可以看到输入子系统可以分为三大块:input核心层、input handler层、input设备层
1、input核心层
input核心层的主要功能主要有以下几点:
1、提供函数接口比如:input设备和input handler的注册函数
2、申请和维护子系统需要的一些资源:设备链表和handler链表,以及初始化input子系统的文件资源
3、最终向用户空间上报事件
2、input handler层(多半都能用内核已经实现好的)
input handler层的功能主要有以下几点
1、提供输入设备和handler的连接函数,当设备注册时需要用这个函数来将input_dev和handler连接起来
2、提供事件处理函数,处理和这个handler相连的设备产生的事件并且上报到input核心层
3、提供用户空间的操作函数,也就是字符设备的fops,让用户能读写设备
3、input设备层(一般需要驱动工程师自己编写)
input设备层的功能主要有以下几点
1、从底层硬件设备采集事件信息
2、将采集到的事件信息上报至核心层处理
关于input设备、input handler和input 核心三者之间的关系
首先input 核心就像一个民政局,这时我们的 input_dev 调用了 input_register_device 说“老子要结婚,你帮我打扮一下,还要给我找个对象”,这时我们的核心层就会先给他打扮一下,准备一些必须的东西,比如能产生同步事件等等,然后就把他放到设备链表里input_dev_list,然后就去找到另外一条链表input_handler_list。
这条链表里面就是我们的handler,这时我们的核心层就会说“这里有个小伙子要找对象,不知道符合你们的要求不”,这时handler发话了“我们的要求都写好了,就放在那个id_table里面”,这时我们的核心层就找了个手下 input_match_device() 来看看符不符合要求,如果符合就会过来通知handler“精神小伙,不能错过啊”,这时我们的核心层就会调用handler 的 connect 函数来办一些符合handler乡俗的结婚仪式比如初始化设备、链表等等,最后发给他们一个本子也就是我们的 handle 让他们都把自己登记在这个本子上并且调用 input_register_handle() 注册结婚,并且这个本子会让设备和handler用各自的链表h_list记录下来,以后有什么事就可以通过这个本子找到对方。
有的同学可能注意到了,链表是可以存储一串数据的,那这个本子(handle)是不是有很多本,没错,内核中的明证局实行的是多夫多妻制,只要符合要求都可以结婚,但是一个本子(handle)只可以记录一对,不能记录多对,你没看到一个结婚证几个人公用的吧?
从这以后设备和handler就愉快的在一起了,设备要开始搞事了,他出去赚钱(收集事件),然后他就调用 input_event() 去民政局(input核心)把这些钱存起来,但是明证局不认识他赚的钱,这些钱必须通过他媳妇的手之后才能存起来,这时我们的结婚证(handle)就起作用了,他拿到input设备的h_list一个个找来handler,让他们来处理设备赚来的钱,这时就会调用handler的event函数,将我们设备赚来的钱转化成标准样式,然后存储起来,通知用户来读取。
水平有限,只能编到这里了!!!!!