keyboard - 在 Linux 上查找可用的键盘
问题描述
我想绑定到任何插入键盘的 hidraw。为此,我需要找到所有实际上是键盘的输入设备。
我已经做了一些研究,并想分享我的一些发现,以获得围绕该主题的一些输入。
我可以使用lsusb -v
. 在那里我可以通过接口类找到键盘
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
那将是定位键盘然后使用 idVendor 和 idProduct 查找相关设备的一种方法,但我想寻找另一种不限于 USB 设备的通用方法
解决方案
通过迭代,sys/class/input/inputN/capabilities/key
我可以获得具有关键事件的设备并检查正确的映射。
该映射与 中的定义相关/usr/include/linux/input-event-codes.h
。
所以在上面提到的情况下,每个块都是 16 个十六进制值,所以一个块key
包含1000000000007 ff9f207ac14057ff ff980000000007ff febeffdfffefffff fffffffffffffffe
8 个字节或 64 位,右边是最低有效位。第一个块仅包含 13 个 hey 值或 52 位。总共 52 + 64 + 64 + 64 = 244 位。
start | end | bits
----- | --- | -------------------------------------------------------------------------------
243 | 192 | 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111
191 | 128 | 1111 1111 1001 1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0111 1111 1111
1111 1111 1001 1111 0010 0000 0111 1010 1100 0001 0100 0000 0101 0111 1111 1111
127 | 64 | 1111 1110 1011 1110 1111 1111 1101 1111 1111 1111 1110 1111 1111 1111 1111 1111
63 | 0 | 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
这意味着在我的示例中,从位 1 到位 138 的所有键都已定义,但
0 ... KEY_RESERVED
84 ... (undefined)
101 ... KEY_LINEFEED
112 ... KEY_MACRO
118 ... KEY_KPPLUSMINUS
120 ... KEY_SCALE
剩下的我们有
140 ... KEY_CALC
142 ... KEY_SLEEP
150 ... KEY_WWW
152 ... KEY_COFFEE
158 ... KEY_BACK
159 ... KEY_FORWARD
161 ... KEY_EJECTCD
163 ... KEY_NEXTSONG
164 ... KEY_PLAYPAUSE
165 ... KEY_PREVIOUSSONG
166 ... KEY_STOPCD
173 ... KEY_REFRESH
176 ... KEY_EDIT
177 ... KEY_SCROLLUP
178 ... KEY_SCROLLDOWN
179 ... KEY_KPLEFTPAREN
180 ... KEY_KPRIGHTPAREN
183 ... KEY_F13
184 ... KEY_F14
185 ... KEY_F15
186 ... KEY_F16
187 ... KEY_F18
188 ... KEY_F19
189 ... KEY_F19
190 ... KEY_F20
191 ... KEY_F21
当我想检查键盘是否支持我需要的键时,就像 az 一样
16 ... KEY_Q
...
25 ... KEY_P
30 ... KEY_A
...
38 ... KEY_L
44 ... KEY_Z
...
50 ... KEY_M
0111 1111 0000 0111 1111 1100 0011 1111 1111 0000 0000 0000 0000 => 7f07fc3ff0000
所有需要检查的是最后一个块是否验证fffffffffffffffe & 7f07fc3ff0000 == 7f07fc3ff0000
在 bash 中,我使用这个片段来获取每个关键功能的最后一部分,确保它被解释为十六进制并测试是否按位匹配
ls -d1 /sys/class/input/input*/capabilities/key | while read dev; do KEY="$(cat $dev | rev | cut -d ' ' -f 1 | rev)"; [ $(( (0x$KEY & 0x7f07fc3ff0000) == 0x7f07fc3ff0000 )) == 1 ] && echo $dev ; done
推荐阅读
- kotlin-coroutines - 在 lambda 中运行协程
- c++ - DLL 类 C++ 中的模板方法
- java - React-Native 超时(Android)中的无头任务
- java - Java 中的扩展方法可以在不破坏二进制向后兼容性的情况下实现吗?
- node.js - 构建 Reactjs 空白页面而不生成其他页面
- node.js - Sequelize js如何获取关联模型的平均值(聚合)
- java - 如果退出活动打开显示可见,如何在recycleview上保持不可见按钮
- oracle - 如何为多列创建sql分区?
- python - python - 如何在python中的sql参数化查询的单引号内放置参数标记
- r - 将列表列表转换为 R 中的数据框:Tidyverse 方式