【问题标题】:Finding available keyboards on linux在 Linux 上查找可用的键盘
【发布时间】:2021-11-17 07:50:48
【问题描述】:

我想绑定到任何插入式键盘的 hidraw。为此,我需要找到所有实际上是键盘的输入设备。

我已经进行了一些研究,并希望分享我的一些发现,以获取有关该主题的一些意见。

我可以使用lsusb -v 获取 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 

这是一种定位键盘然后使用 idVendor 和 idProduct 查找相关设备的方法,但我想寻找另一种不限于 USB 设备的通用方法

【问题讨论】:

    标签: keyboard


    【解决方案1】:

    通过遍历sys/class/input/inputN/capabilities/key,我可以获得具有关键事件的设备并检查正确的映射。

    映射与/usr/include/linux/input-event-codes.h 中的定义相关。

    所以在上述情况下key 包含1000000000007 ff9f207ac14057ff ff980000000007ff febeffdfffefffff fffffffffffffffe 每个块都是 16 个十六进制值,因此一个块包含 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
    

    当我想检查键盘是否支持我需要的键时,就像 a-z 那样

     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 中,我使用这个 sn-p 来获取每个关键功能的最后一部分,确保它被解释为十六进制并测试是否按位匹配

    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
    

    【讨论】:

      猜你喜欢
      • 2012-04-19
      • 2019-11-30
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      相关资源
      最近更新 更多