我最近将一个122键的终端键盘转换为USB作为configfs USB小工具(键盘部分使用HID代码)。它工作得很好,除了我似乎不能让我的Arch Linux安装识别某些HID代码(特别是在目前的F13-F24),并将它们转换为事件代码,我可以在X中使用。
正确接收HID代码
我可以通过 */dev/hidraw 2 * 看到计算机接收到HID(下面的输出是按F24时的输出,HID代码0x 73基于:https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2。
sudo hexdump -C /dev/hidraw2
输出:
00000000 00 00 00 00 00 00 00 00 00 00 73 00 00 00 00 00 |..........s.....|
HID代码未转换为事件
但是,当我尝试showkey -s
、evtest
或xev
时,我什么也得不到。就好像我没有按下一个键。所有“正常”的HID代码都可以工作(事实上,这个消息现在正在键盘上输入),所以它必须是在收到HID代码和翻译之间的东西。
有趣的是,我的evtest功能没有列出F13-F24的事件代码(见下文),但我在其他人的输出中看到了这些功能(例如https://unix.stackexchange.com/questions/130656/how-to-get-all-my-keys-to-send-keycodes)。
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x1d6b product 0x104 version 0x101
Input device name: "CPMH 122 Gadget"
Supported events:
Event type 0 (EV_SYN)
Event type 1 (EV_KEY)
Event code 1 (KEY_ESC)
Event code 2 (KEY_1)
Event code 3 (KEY_2)
Event code 4 (KEY_3)
Event code 5 (KEY_4)
Event code 6 (KEY_5)
Event code 7 (KEY_6)
Event code 8 (KEY_7)
Event code 9 (KEY_8)
Event code 10 (KEY_9)
Event code 11 (KEY_0)
Event code 12 (KEY_MINUS)
Event code 13 (KEY_EQUAL)
Event code 14 (KEY_BACKSPACE)
Event code 15 (KEY_TAB)
Event code 16 (KEY_Q)
Event code 17 (KEY_W)
Event code 18 (KEY_E)
Event code 19 (KEY_R)
Event code 20 (KEY_T)
Event code 21 (KEY_Y)
Event code 22 (KEY_U)
Event code 23 (KEY_I)
Event code 24 (KEY_O)
Event code 25 (KEY_P)
Event code 26 (KEY_LEFTBRACE)
Event code 27 (KEY_RIGHTBRACE)
Event code 28 (KEY_ENTER)
Event code 29 (KEY_LEFTCTRL)
Event code 30 (KEY_A)
Event code 31 (KEY_S)
Event code 32 (KEY_D)
Event code 33 (KEY_F)
Event code 34 (KEY_G)
Event code 35 (KEY_H)
Event code 36 (KEY_J)
Event code 37 (KEY_K)
Event code 38 (KEY_L)
Event code 39 (KEY_SEMICOLON)
Event code 40 (KEY_APOSTROPHE)
Event code 41 (KEY_GRAVE)
Event code 42 (KEY_LEFTSHIFT)
Event code 43 (KEY_BACKSLASH)
Event code 44 (KEY_Z)
Event code 45 (KEY_X)
Event code 46 (KEY_C)
Event code 47 (KEY_V)
Event code 48 (KEY_B)
Event code 49 (KEY_N)
Event code 50 (KEY_M)
Event code 51 (KEY_COMMA)
Event code 52 (KEY_DOT)
Event code 53 (KEY_SLASH)
Event code 54 (KEY_RIGHTSHIFT)
Event code 55 (KEY_KPASTERISK)
Event code 56 (KEY_LEFTALT)
Event code 57 (KEY_SPACE)
Event code 58 (KEY_CAPSLOCK)
Event code 59 (KEY_F1)
Event code 60 (KEY_F2)
Event code 61 (KEY_F3)
Event code 62 (KEY_F4)
Event code 63 (KEY_F5)
Event code 64 (KEY_F6)
Event code 65 (KEY_F7)
Event code 66 (KEY_F8)
Event code 67 (KEY_F9)
Event code 68 (KEY_F10)
Event code 69 (KEY_NUMLOCK)
Event code 70 (KEY_SCROLLLOCK)
Event code 71 (KEY_KP7)
Event code 72 (KEY_KP8)
Event code 73 (KEY_KP9)
Event code 74 (KEY_KPMINUS)
Event code 75 (KEY_KP4)
Event code 76 (KEY_KP5)
Event code 77 (KEY_KP6)
Event code 78 (KEY_KPPLUS)
Event code 79 (KEY_KP1)
Event code 80 (KEY_KP2)
Event code 81 (KEY_KP3)
Event code 82 (KEY_KP0)
Event code 83 (KEY_KPDOT)
Event code 86 (KEY_102ND)
Event code 87 (KEY_F11)
Event code 88 (KEY_F12)
Event code 96 (KEY_KPENTER)
Event code 97 (KEY_RIGHTCTRL)
Event code 98 (KEY_KPSLASH)
Event code 99 (KEY_SYSRQ)
Event code 100 (KEY_RIGHTALT)
Event code 102 (KEY_HOME)
Event code 103 (KEY_UP)
Event code 104 (KEY_PAGEUP)
Event code 105 (KEY_LEFT)
Event code 106 (KEY_RIGHT)
Event code 107 (KEY_END)
Event code 108 (KEY_DOWN)
Event code 109 (KEY_PAGEDOWN)
Event code 110 (KEY_INSERT)
Event code 111 (KEY_DELETE)
Event code 119 (KEY_PAUSE)
Event code 125 (KEY_LEFTMETA)
Event code 126 (KEY_RIGHTMETA)
Event code 127 (KEY_COMPOSE)
Event type 4 (EV_MSC)
Event code 4 (MSC_SCAN)
Event type 17 (EV_LED)
Event code 0 (LED_NUML) state 1
Event code 1 (LED_CAPSL) state 0
Event code 2 (LED_SCROLLL) state 0
Event code 3 (LED_COMPOSE) state 0
Event code 4 (LED_KANA) state 0
Key repeat handling:
Repeat type 20 (EV_REP)
Repeat code 0 (REP_DELAY)
Value 250
Repeat code 1 (REP_PERIOD)
Value 33
”””是司机吗?**
基于我的evtest EV_KEY功能和我见过的其他功能之间的差异,我想可能是我的驱动程序无法将USB HID代码Map到适当的事件代码。
使用hwinfo
,我可以告诉我的键盘使用的是hid-generic驱动程序。查看hid-input.c(http://elixir.free-electrons.com/linux/v3.5.2/source/drivers/hid/hid-input.c)的源代码,我可以看到Map确实存在(HID代码0x 73Map到194,194Map到KEY_F24事件,至少根据我在这里找到的:https://github.com/wayland-project/libinput/blob/master/include/linux/input-event-codes.h)。所以我从网上读到的东西中认为,问题出在hid-generic和libinput之间。
我不知道从这里去哪里,没有任何东西出来的evtest我不知道什么Map的关键。只是没有定义这些键的功能吗?是否有任何方式来指定我的键盘evdev的能力?
1条答案
按热度按时间arknldoa1#
我发现问题了。在查看了 * usbhid * 的代码后,我意识到它是分配evtest发现的可用事件代码的代码。
为此,它读取HID描述符。事实证明,我使用了一个通用的HID描述符,逻辑最大值和使用最大值切断了较高编号的HID代码。
我使用https://github.com/DIGImend/hidrd来获取我的二进制描述符的可编辑版本,然后将Usage Maximum和Logical Maximum更改为我使用的最高HID代码。我把它重新转换成二进制格式,上传并启动键盘。现在evtest识别所有键。
以下是我的原始规格:
我更新的规格: