Input子系统(一)、从内核文档入门

本文参考内核文档linux_5.10/Documentation/input/input.rst自行翻译而来,依据个人认知和从业关注点进制裁剪和提炼,故仅供读者参考和个人学习使用。

概要

Input子系统设计用于集合Linux下所有输入设备驱动。几乎所有输入设备的驱动都位于drivers/input目录下,但伋有部分设备驱动位于drivers/hiddrvers/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,

功能验证

在键盘上敲击几个按键就足以验证键盘是否已经与内核驱动匹配并正常工作。

  • 鼠标,使用命令cat /dev/input/mouse0查看鼠标是否已工作,当鼠标移动时,如果终端上有打印字符即验证已工作;
  • 摇杆,使用相同命令访问节点/dev/input/jsX,通常js会自动创建;

另外,也可使用evtest工具间接访问event设备。

Event 接口

使用/dev/input/eventX设备节点,可以有选择的阻塞(或非阻塞)的形式获取输入信息,但数据会按一定形式组织,对应结构如下:

    struct input_event {
	    struct timeval time;
	    unsigned short type;
	    unsigned short code;
	    unsigned int value;
    };
  • time,时间戳;
  • type,事件类型,例如:EV_KEY, 按键类型。其他详见:include/uapi/linux/input-event-codes.h
  • code, 事件代码,例如:KEY_BACKSPACE,空格键。其他详见:include/uapi/linux/input-event-codes.h
  • value, 事件数值,例如:1,按键按下;0,按键松开;2,长按;

参考

#----> linux_5.10/Documentation/input/input.rst


posted @ 2024-11-13 21:55  0欧姆  阅读(25)  评论(0)    收藏  举报  来源