如何在Linux中调试USB HID scancode-keycode转换
我最近将一个122键的终端键盘转换为USB作为配置USB小工具(键盘部分使用的是HID代码),它运行得很好,除了我似乎无法让我的Arch
linux安装识别某些HID代码(特别是在F13-F24)并将它们转换成我可以在X中使用的事件代码.
正确收到HID代码 我能够通过/ dev / hidraw2看到计算机收到HID(下面的输出是按F24,HID代码0x73基于: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代码映射到相应的事件代码. 使用hwinfo我可以告诉我的键盘正在使用hid-generic驱动程序.查看hid-input.c(http://elixir.free-electrons.com/linux/v3.5.2/source/drivers/hid/hid-input.c)的源代码我可以看到映射确实存在(HID代码0x73映射到194,映射到KEY_F24事件,至少根据我在此处找到的内容:https://github.com/wayland-project/libinput/blob/master/include/linux/input-event-codes.h).因此,我从在线阅读的内容中得到了引导,认为问题存在于hid-generic和libinput之间. 我不知道从哪里开始,没有任何东西从evtest中出来我不知道要把钥匙映射到什么地方.只是没有定义这些键的功能吗?反正有没有指定我的键盘功能evdev? 解决方法
发现了问题.在查看了usbhid的代码之后,我意识到这是分配evtest发现的可用事件代码的原因.为此,它通过HID描述符进行读取.事实证明,我使用了通用HID描述符,逻辑最大值和使用最大值切断了编号较高的HID代码.我使用
https://github.com/DIGImend/hidrd来获取二进制描述符的可编辑版本,然后将Usage Maximum和Logical Maximum更改为我使用的最高HID代码.将其重新转换为二进制格式,上传并启动键盘.现在evtest识别所有键.
这是我的原始规格: Usage Page (Desktop),; Generic desktop controls (01h) Usage (Keyboard),; Keyboard (06h,application collection) Collection (Application),Usage Page (Keyboard),; Keyboard/keypad (07h) Usage Minimum (KB Leftcontrol),; Keyboard left control (E0h,dynamic value) Usage Maximum (KB Right GUI),; Keyboard right GUI (E7h,dynamic value) Logical Minimum (0),Logical Maximum (1),Report Size (1),Report Count (8),Input (Variable),Report Count (1),Report Size (8),Input (Constant,Variable),Report Count (5),Usage Page (LED),; LEDs (08h) Usage Minimum (01h),Usage Maximum (05h),Output (Variable),Report Size (3),Output (Constant,Report Count (6),Logical Minimum (0),Logical Maximum (101),; Keyboard/keypad (07h) Usage Minimum (None),; No event (00h,selector) Usage Maximum (KB Application),; Keyboard Application (65h,selector) Input,End Collection 我的更新规格: Usage Page (Desktop),Logical Maximum (115),selector) Usage Maximum (KB F24),; Keyboard F24 (73h,End Collection (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |