解读udev中键盘的“KEY”属性

时间:2017-12-31 12:39:37

标签: linux usb udev sysfs

在udev / sysfs中,键盘具有KEY属性。例如,我有一个外部Mac键盘,它有两个“接口”:

/sys/bus/usb/devices/1-1.2.3.2:1.0
ID_INPUT_KEY: 1
ID_INPUT_KEYBOARD: 1
KEY: 10000 0 0 0 1007b00001007 ff9f207ac14057ff ffbeffdfffefffff fffffffffffffffe

/sys/bus/usb/devices/1-1.2.3.2:1.1
ID_INPUT_KEY: 1
KEY: 3a00000000 e000000000000 0

我假设第一个是实际键盘,第二个是特殊键,可能是弹出键。我如何解释KEY属性?它似乎是某种位掩码定义了哪些键存在。它与扫描码有什么关系吗?

1 个答案:

答案 0 :(得分:1)

KEYS字段似乎是键定义的位掩码,例如最低位对应第一个键。最高位对应于最后一个键。

那么钥匙从哪里来?尝试阅读input-event-codes.h(例如,从here)以获取键的定义。然后,您可以按这些值进行位移,然后查看掩码是否匹配。

代码可能更清晰:

#!/usr/bin/env python
import sys

if len(sys.argv) > 1:
    KEYS = sys.argv[1].replace(" ", "")
else:
    KEYS="3a00000000 e000000000000 0".replace(" ", "")

inputkeys = int(KEYS, 16)

# /usr/src/linux-headers-4.15.0-24/include/uapi/linux/input-event-codes.h


if len(sys.argv) > 2:
    linuxkeys = open(sys.argv[2], "r").read()
else:
    linuxkeys = open("/usr/src/linux-headers-4.15.0-24/include/uapi/linux/input-event-codes.h", "r").read()

# Taken from https://gist.github.com/gsora/45ba7b98d31929e75317908a97488ef1
needle = "#define KEY_RESERVED"
linuxkeys = linuxkeys[linuxkeys.find(needle):]

needle = "#define KEY_MAX"
linuxkeys = linuxkeys[:linuxkeys.find(needle)]


keys = {}
for line in linuxkeys.splitlines():
    goodline = line[8:].split("\t")
    if line.startswith("#define ") and len(goodline)>1:
        key = goodline[0]
        for i in range(1, len(goodline)):
            if goodline[i] == "":
                continue
            else:
                value = goodline[i].rsplit()[0]
                try:
                    v = int(value)
                except ValueError:
                    if value.startswith("0x"):
                        v = int(value[2:], 16)
                    else:
                        v = keys[value]

                keys[key] = v
                break

for k,v in sorted(keys.items(), key=lambda x:x[1]):
    if inputkeys & (1<<v):
        print (k)

对于您的KEYS字段,我得到:

KEY_SLASH
KEY_RIGHTSHIFT
KEY_KPASTERISK
KEY_RO
KEY_HIRAGANA
KEY_HENKAN
KEY_KATAKANAHIRAGANA