Input子系统(一)、从内核文档入门(草稿,进度:10%)
本文参考内核文档
linux_5.10/Documentation/input/input.rst
自行翻译而来,依据个人认知和从业关注点进制裁剪和提炼,故仅供读者参考和个人学习使用。
概要
Input子系统设计用于集合Linux下所有输入设备驱动。几乎所有输入设备的驱动都位于drivers/input
目录下,但伋有部分设备驱动位于drivers/hid
与drvers/platform
中。
Input子系统的核心是input内核模块,故其需要早于其他input设备驱动优先被加载。它提供了在以下两个模块组别之间的联系方式:
-
设备驱动
连接硬件并上报事件到input模块;
-
事件报告
从input模块获取事件并将其传递给需要的对象,如:按键给到内核、鼠标移动给到GPM和X这样的UI框架,等等。
示例
以USB鼠标和键盘为例,示例加载顺序:input -> mousedev -> usbcore ->uhci_hcd(or ohci_hcd, or ehci_hcd) -> usbhid -> hid_generic
,之后系统通常会自动创建input/mice
节点,否则自动创建并分别接入GPM或X显示框架(详见原文档)。
详细说明
Event handlers
如果需要,event handers就能将事件传递给目标对象,不管是用户空间还是内核空间的。
evdev
evdev
是比较常见的input设备event接口,它将内核产生的event事件附上时间戳后直接传递给目标程序,相应的event code是与架构、硬件无关的统一代码。实践证明,这是最佳的交互接口----用户获取输入信息,因此比较建议优先使用该方案。
该方案对应的设备节点位于/dev/input
目录下,如:
crw-r--r-- 1 root root 13, 64 Apr 1 10:49 event0
crw-r--r-- 1 root root 13, 65 Apr 1 10:50 event1
crw-r--r-- 1 root root 13, 66 Apr 1 10:50 event2
crw-r--r-- 1 root root 13, 67 Apr 1 10:50 event3
...
通常从设备号范围为64~95,当输入设备数量超过32个时,次设备号将会从256开始编号(由MKDEV
定义可知,其为int32_t类型,其中低20位为次设备号)。
mousedev
mousedev
是一种临时解决方案,用于保证使用鼠标输入的旧程序能够正常工作。它从鼠标或数位板/平板设备获取事件,并向用户空间提供一个 PS/2 风格的(类似于 /dev/psaux)鼠标设备。
该方案对应的设备节点位于/dev/input
目录下,如:
crw-r--r-- 1 root root 13, 32 Mar 28 22:45 mouse0
crw-r--r-- 1 root root 13, 33 Mar 29 00:41 mouse1
crw-r--r-- 1 root root 13, 34 Mar 29 00:41 mouse2
crw-r--r-- 1 root root 13, 35 Apr 1 10:50 mouse3
...
crw-r--r-- 1 root root 13, 62 Apr 1 10:50 mouse30
crw-r--r-- 1 root root 13, 63 Apr 1 10:50 mice
所有mouse
都只能关联单一设备(鼠标、数字板等),但位于最后一行的mice
除外。mice
的特殊性在于其可以共享所有输入设备的数据,即使目标设备未连接,这一特性在老旧程序无法处理热插拔和设备未连接的情景下显得特别有用。
其他类型的event handlers还有:keyboard、joydev,但不做展开。
Device drivers
设备驱动即是能够生成事件的模块。
hid-generic
hid-generic
是整个驱动套件中最大且最复杂的驱动之一。它用于处理所有的 HID 设备,由于 HID 设备种类繁多,并且 USB HID 规范并不简单,因此它的代码体量变得非常庞大。
psmouse
psmouse
是一个支持各种 采用PS/2 协议设备的驱动程序,包括 Synaptics 和 ALPS 触控板、Intellimouse Explorer 设备、Logitech PS/2 鼠标等。
其他类型的device drivers还有:usbmouse、usbkbd、atkbd、iforce,
功能验证
参考
#----> linux_5.10/Documentation/input/input.rst