首页 > 解决方案 > 在 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 设备的通用方法

标签: keyboard

解决方案


通过迭代,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

推荐阅读