标签(空格分隔): linux子系统 输入输出子系统
http://blog.csdn.net/smilefyx/article/details/40538339
http://blog.csdn.net/ielife/article/details/7798952 清晰
http://blog.csdn.net/wangpengqi/article/details/8471144
https://www.cnblogs.com/hackfun/p/5928428.html
http://blog.csdn.net/RadianceBlau/article/details/55046812
http://blog.csdn.net/ielife/article/details/7814108 input输入子系统整体流程(非常清晰)
驱动层的例程可以参考内核代码:linux-kernel-4.4\drivers\input\keyboard\
输入子系统事件处理层(EventHandler)、输入子系统核心层(InputCore)和输入子系统设备驱动层。
在Linux内核文档的documentation/input下,有一个input-programming.txt文件,讲解了编写输入设备驱动程序的核心步骤。
驱动层:具体的键值事件的产生
重点api:input_register_device
事件处理层:设备驱动最终的目的就是能够与事件处理层的事件驱动相互匹配,
但是在drivers/input目录下有evdev.c事件驱动、mousedev.c事件驱动、joydev.c事件驱动等等,这就是再从分类事件类别
重点api:input_register_handler()
核心层:input.c提供了面向应用的统一接口,注册一个字符设备,并且指定了主设备号是13,以及dev目录下的节点名为“input”
并且建立proc节点,但是这里并没有提供供应用层的fileoperations 接口,同时也没有生成”、input/event_xx”这样的节点,那他们在哪里生成?
上面说道设备驱动和事件处理层有个匹配的过程,当匹配成功后,假如是事件驱动,那么就匹配了evdev.c
此时在该文件的evdev_connect中有如下片段:
dev_set_name(&evdev->dev, "event%d", dev_no);//生成节点名
cdev_init(&evdev->cdev, &evdev_fops);//注册fops操作结构体
其中的%的为dev_no,如下是dev_no的来源,一般是次设备号
dev_no = minor;
/* Normalize device number if it falls into legacy range */
if (dev_no < EVDEV_MINOR_BASE + EVDEV_MINORS)
dev_no -= EVDEV_MINOR_BASE;
所以,真正面对上层的操作被封装才了各个事件处理层,当你去open /dev/input/event_xx
的时候就会call到相应的回调函数中。