Linux input子系统学习小结 -
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux input子系统学习小结
目录
一基本框架
二注册流程
三事件触发流程
摘要
本文inuxinpu子系统学习小结,抓住input子系统里面的几个关键点(handle,handler,设备文件,client)形成的简洁小结,简化理解。
一基本框架
linux中输入设备驱动的分层如下图所示:
图1 linux中输入设备的分层---from网络
原理以及为什么要设计这样一个系统,详细请参考其他资料
二注册过程:
如图2
图2
Input 子系统在初始化时,首先调用register_chrdev(INPUT_MAJOR, "input", &input_fops); 为自己注册了256个字符设备节点。
(这也代表着系统中最多可以存在256个输入设备)这256个设备会被分为8类,分别对应于数组input_table[8]中存放的8个handler.
staticstructinput_handler *input_table[8]; // kernel/input/input.c
其中数第1个句柄管理次设备号0-31,第2个句柄管理设备号32-63,以此类推…..
每一个句柄,都可以用来实现一类事件驱动(但每类事件驱动最多只能管理32个设备)。
例如:/dev/input/eventX所表示的设备和dev /input/mouseX所表示的设备就分别使用了最常见的两种事件驱动。
以/dev/input/eventX 为例,他们都使用同一个event事件驱动,从对象的角度看,拥有同一个handler。
而这个handler 所管理的设备,拥有次设备号64-95,每一个次设备号又可以对应到一个handle.
/sys/devices/virtual/input/的目录和文件创建在什么时候?
mtk_tpd.c -----》(tpd->dev=input_allocate_device())调用input_dev_attr_groups数组来创建。
三事件触发:
如图3
图3
input设备文件和driver对应表:
通过在设备文件目录下运行:getevent
/dev/input/event3-----hwmdata(motion sensor)
/dev/input/event2-----mtk-tpd
/dev/input/event1-----mt6573-kpd
/dev/input/event0-----ACCDET (耳机hook key)
运行这个工具,然后按键或者滑动触摸屏,会看到程序会实时打印event。
从上面的输出来看, input 子系统与设备,设备驱动的对应关系。
1)key, touch,hwm_sensor 的应用服务进程是那个?
是PID193 100 196484 43052 ffffffff afd0b6fc S system_server
通过查看edven.c---->edven_open()看到其注册client的信息。
log:
evdev_opendev note=4 ,name=event4,task_gid=193
evdev_opendev note=3 ,name=event3,task_gid=193
evdev_opendev note=1 ,name=event1,task_gid=193
evdev_opendev note=0 ,name=event0,task_gid=193
evdev_opendev note=2 ,name=event2,task_gid=193
也就是说一个client:system_server对应处理4个设备。
system_server:会处理以下input设备子系统的report事件:/dev/input/event3-----hwmdata(motion sensor)
/dev/input/event2-----mtk-tpd
/dev/input/event1-----mt6573-kpd
/dev/input/event0-----ACCDET (耳机hook key)。