加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何在Linux中调试USB HID scancode-keycode转换

发布时间:2020-12-14 00:58:53 所属栏目:Linux 来源:网络整理
导读:我最近将一个122键的终端键盘转换为USB作为配置USB小工具(键盘部分使用的是HID代码),它运行得很好,除了我似乎无法让我的Arch linux安装识别某些HID代码(特别是在F13-F24)并将它们转换成我可以在X中使用的事件代码. 正确收到HID代码 我能够通过/ dev / hidraw
我最近将一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读