Linux系统下如何查找可用键盘设备以绑定其hidraw接口
跨总线通用键盘hidraw设备识别方案
你之前通过lsusb -v匹配USB HID键盘接口属性的方案,仅适用于USB总线设备:
Bus 001 Device 002: ID 17ef:6099 Lenovo Lenovo Traditional USB Keyboard Device Descriptor: ... idVendor 0x17ef Lenovo idProduct 0x6099 ... Configuration Descriptor: ... Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 1 Boot Interface Subclass bInterfaceProtocol 1 Keyboard iInterface 0
以下是不限设备总线的通用识别方案,支持USB、蓝牙、内置键盘、PS/2转接等所有接入系统的键盘设备:
方案1:基于input子系统属性过滤
Linux所有输入设备统一由input子系统管理,无需区分总线类型:
- 第一步:过滤符合键盘属性的输入设备
所有标准键盘设备的event节点在/proc/bus/input/devices中会标记EV=120013(对应键盘必备的EV_KEY、EV_REP、EV_LED事件能力),可通过以下命令快速过滤:
返回结果中的grep -E '^(N:|H:|B: EV=|B: KEY=)' /proc/bus/input/devices | grep -B2 -A2 'EV=120013'H: Handlers=eventX kbd字段对应的eventX就是该键盘的输入事件节点。 - 第二步:匹配对应hidraw节点
通过udevadm查询event节点关联的hidraw设备:
也可以直接遍历udevadm info --query=property --name=/dev/input/eventX | grep 'DEVNAME=.*hidraw'/sys/class/hidraw/下的设备,读取对应子目录下的input设备能力值做匹配,无需依赖udev。
方案2:udev规则自动匹配(热插拔场景适用)
如果需要处理键盘热插拔自动绑定hidraw的需求,可以直接写udev规则匹配系统预定义的键盘属性,不需要手动解析设备能力:
规则示例:
SUBSYSTEM=="hidraw", ENV{ID_INPUT_KEYBOARD}=="1", MODE="0660", GROUP="input", SYMLINK+="keyboard-hidraw%n"
该规则会自动给所有键盘类hidraw设备创建/dev/keyboard-hidraw*的软链接,直接读取软链接即可定位目标设备。
注意:部分多功能键盘会同时暴露键盘、鼠标、宏按键等多个hidraw节点,仅标记ID_INPUT_KEYBOARD=1的节点对应普通键盘输入功能,其余节点可按需过滤。
内容的提问来源于stack exchange,提问作者Martin Kouba
相关产品推荐
相关产品推荐

