从整体上来说,input输入子系统分为3层:上层(输入事件处理层)、中层(输入核心层)、下层(输入设备驱动层),依次为上图中从右往左。
输入设备其实就是通过某些接口总线向开发板输入信息,比如鼠标,其实就是通过usb接口向开发板传递输入信息,输入设备驱动层其实就是配置usb这种接口总线使它能够正常接收输入。而输入事件处理层就是将我们收到的数据进行处理成一定的格式,举一个触摸屏的例子,
通过(hexdump /dev/input/event2(event2是在我的开发板上,其它的根据实际情况定))命令,当我点击触摸屏然后松开,发现控制台打印了以下消息(十六进制):
0247 0000 00d3 000e 0003 0000 02c4 0000
0247 0000 00db 000e 0003 0001 0181 0000
0247 0000 00de 000e 0001 014a 0001 0000
0247 0000 00e0 000e 0003 0018 0001 0000
0247 0000 00e2 000e 0000 0000 0000 0000
0248 0000 c838 0002 0001 014a 0000 0000
0248 0000 c876 0002 0003 0018 0000 0000
0248 0000 c89f 0002 0000 0000 0000 0000
可以看到,每一个input事件都有一个时间,包含32位的秒,32位的微妙,此外还有16位的type(事件类型),16位的code(事件键值),32位的value(值),这就是输入事件处理层处理之后按照这样的格式输出。
还以触摸屏(i2c接口)为例,开发板收到i2c总线上的信息后,为什么会把信息输出到/dev/input/event2里面去,这就是输入核心层所做的事,输入核心层其实是负责协调上层和下层,使得上层和下层之间能够完成数据传递。当下层发生输入事件的时候,整个系统就被激活了,事件就会通过核心层传递到上层对应的一个/多个handler中,最终会传递到应用空间。