input子系统最终做了几件事情[内核input子系统]
Evdev.c文件
event代表数据包数据
上报事件最终调用函数input_event();最终通过handler->event()调用
在input_handler结构体中.event=evdev_event:最后通过处理函数__pass_event做1,2两件事
1:事件最终被放入到了客户端的input_event[]数组中;[/*将event装入client的buffer中,buffer是一个环形缓存区*/ client->buffer[client->head++] = *event;]
这里的操作很简单.就是将event(上传数据)保存到client->buffer中.而client->head就是当前的数据位置.注意这里是一个环形缓存区.写数据是从client->head写.而读数据则是从client->tail中读.
2:并且通过异步通知机制kill_fasync向应用层发送消息,应用层会执行对应的消息处理函数[kill_fasync(&client->fasync, SIGIO, POLL_IN);]
fasync这个东西就是为了使驱动的读写和application的读写分开,使得application可以在驱动读写时去做别的事[并且用来唤醒用户进程空间那个睡着的读进程(他是因为读的时候没有数据而睡着的。阻塞)]
&client->fasync可用来区分向谁发;哪个进程调用这个fasync_helper就向谁发[谁调用flie_operations里面的fasync];fasync机制本身来说还是ipc中的信号机制
3:应用层调用open/read等函数,input子系统的file_operations会被调用;操作写在Evdev.c文件里面
节点操作:open,read函数等等。节点是:/dev/input/eventX
[应用层同样会调用poll机制。poll机制和fasync作用类似,通知的主从双方正好相反。poll机制是应用发出,向内核确认节点是否能够读写;fasync是内核发出,向应用告知节点数据已经就绪]
内核层Event流向
input子系统是驱动上报数据,暂存在内存中,应用程序需要时去读这片内存就可以取到数据,至于为什么采用这个模式,因为知道应用程序需要数据的时机和硬件采集到的数据是很难同步的,采用异步的方式更为合适。
用户层Event流向
一个事件的流程是从 Eventhub ---> InputReader ---> InputDispatcher ---> InputPublisher ---> InputChannel ---> InputConsumer ---> WindowManager or Application.这就是整个事件分发的大致流程
如果是第一次调用getEvents方法,则会调用scanDevicesLocked方法来扫描设备:
EventHub::getEvents--->EventHub::scanDevicesLocked--->EventHub::scanDirLocked---->EventHub::openDeviceLocked -> EventHub:: addDeviceLocked
参考资料
http://blog.csdn.net/wangkaiblog/article/details/12085183android input
http://blog.csdn.net/droidphone/article/details/8434768多点触控的input TP
http://blog.csdn.net/yaozhenguo2006/article/details/6775751input_event 函数
http://blog.csdn.net/loongembedded/article/details/51166888
http://blog.csdn.net/loongembedded/article/details/51167111 input事件类型
http://blog.csdn.net/tianruxishui/article/details/7173045写得不错,
https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt源码的文档
http://www.arm9home.net/read.php?tid=24754对源码文档的翻译
http://blog.chinaunix.net/uid-20776117-id-3212095.html内部函数剖析
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29151914&id=3921536
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29151914&id=3887032
ps:其实源码的说明文档介绍的很清楚,但是不细节,所以需要在了解一定的基础上去看看说明文档
http://wenku.baidu.com/view/ef3ccbe4ed630b1c58eeb5a4.html?re=view图解详细且清晰
http://blog.csdn.net/zjngogo/article/details/46363571和上面的一起看,Android层
http://blog.chinaunix.net/uid-20672257-id-3149668.html内核层的讲解,比较到位
http://blog.csdn.net/coldsnow33/article/details/15809965上层好文
http://www.cnblogs.com/lcw/p/3294356.html全解析
http://www.cnblogs.com/jason-lu/articles/3156411.html
http://blog.csdn.net/tankai19880619/article/details/17019085
http://blog.csdn.net/kc58236582/article/details/50610311