linux kernel input子系统三层分析

输入子系统之input handler,input core,input dev介绍,如有误,请纠正>>>好记性不如烂笔头!!!

一、输入子系统驱动分成三层

                                     应用层

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

                   input handler层:数据处理者

                            完成fop:实现xxx_read(),xxx_open

                            将数据交给用户:数据从inputdevice层

                            不知道具体数据是什么,只是将数据以数据包的方式传递给应用层(用户)

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

                   input 核心层:管理层

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

                   input device设备层:

                            抽象出一个对象,描述输入设备信息

                            初始化输入设备硬件,获取到数据

                            知道具体的数据是什么,但是不知道数据如何给用户

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

                   硬件层:有鼠标,各种按键,reset,游戏杆,触摸屏等等输入输入设备

备注:最终开发人员编程主要在input device层

二、首先了解核心层的input.c,以linux3.14内核为例,input.c路径为/drivers/input.c,以下是驱动的入口和出口:另外和module_init的区别是有一定的优先级。

subsys_initcall(input_init);

module_exit(input_exit);

进入input_init,其中class_register和class_create类似,只是class_create注册的是一个动态创建的cls,而class_register注册的是全局的一个cls对象,注册完成后可以在/sys/class/input可看到注册信息。。。input_proc_init主要是创建了devices和handlers,创建完成后可在/proc/bus/input下查看已经注册devices和handlers,呈现给用户查看。

input_init:

class_register:

class_create:


input_proc_init:

这就是核心层主要做的内容,另外这个驱动是编译在内核中去了的,所以在开机的时候已经执行完handle层,下面介绍handler层。

三、input handler层对应实现为evdev.c

从代码可看出也是一个独立的模块

Evdev_init里面主要注册了一个input_handler,这个handler是个结构体,包括以下成员其中例如EVDEV_MINOR_BASE,//表示是次设备号基准值,在ls /dev/input/event* -l中可以查看到次设备号都是从基准值递增的。而input_handler中主要是一些函数接口包括connect,event等

那么在input_register_handler中做了什么呢?

其中调用input_attach_handler匹配成功后会调用evdev_handler的connect方法完成设备节点创建,如/dev/input/event0..1..2。

四、下面是input_device层,对应的是my_own_drv.c是自己实现的驱动层。在这里首先我们如果没有初始化的dev成员内核会先帮我们做一些默认初始化,初始化完成后,这里仍然有类似的handler中的注册链表的动作,同时遍历自己对象的链表是会遍历对方的链表,最终完成匹配后同样会调用connect。所以在my_own_drv.c中我们要做的事构建一个input dev,然后注册到input_dev_list中,同时遍历对方的链表:input_handler_list,然后进行一个匹配,匹配成功都会调用handler中的connect:

具体connect的内容请听下回分解。。。


猜你喜欢

转载自blog.csdn.net/u010802169/article/details/80463700
今日推荐