地位:从内核 4.18 开始,此问题已修复,有关详细信息,请参阅已接受的答案。
我刚刚开始使用红龙阿修罗 USB 键盘。键盘可以正常工作,但不幸的是所有 Ctrl、Alt 键和 Win 键都映射到左 Shift 键,这使得它很难使用。
dmesg 输出是
[185765.848957] input: USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.0/0003:0C45:760B.0022/input/input50
[185765.905395] hid-generic 0003:0C45:760B.0022: input,hidraw3: USB HID v1.11 Keyboard [USB Keyboard] on usb-0000:00:14.0-3/input0
[185765.949342] input: USB Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.1/0003:0C45:760B.0023/input/input51
[185766.009474] hid-generic 0003:0C45:760B.0023: input,hiddev0,hidraw4: USB HID v1.11 Keyboard [USB Keyboard] on usb-0000:00:14.0-3/input1
我已经开始使用调试按键西夫,并且我得到了这些键完全相同的键映射。我可能混合了 KeyPress 和 KeyRelease 事件,但总的来说它们是相同的(请参阅帖子末尾)。
我该如何正确映射 Ctrl、Alt 和 Win 键?
左替代:
KeyRelease event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185237066, (307,429), root:(2272,538),
state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
左Ctrl:
KeyPress event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185265721, (443,237), root:(2408,346),
state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
左移:
KeyRelease event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185303441, (436,539), root:(2401,648),
state 0x1, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
获胜键:
KeyPress event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185327465, (399,367), root:(2364,476),
state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
右 Alt:
KeyPress event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185361768, (348,141), root:(2313,250),
state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
右键:
KeyPress event, serial 36, synthetic NO, window 0x3200001,
root 0xd7, subw 0x0, time 185401328, (598,415), root:(2563,524),
state 0x0, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
编辑:确实,键盘显示为两个 USB 设备。我已从 /sys/debug/kernel/hid 上传了 HID 描述符
答案1
我的Linux 内核补丁修复 Redragon Asura 键盘现已成为主流,并将成为内核 4.18 版本的一部分。
Num Lock 和 Caps Lock LED 未激活(按键工作正常)有一个小问题,该问题将在 4.19 中修复。
该补丁也可以应用于4.16和4.17,openSUSE从4.16开始携带它。
答案2
我知道这个答案有点晚了,但我找到了 Swoogans 键盘驱动程序并根据我们的目的对其进行了修改。我自己最近买了一台Asura K501,也遇到了同样的麻烦。请注意,我的 asura 是 2017 年型号,芯片组是 0x760b 而不是 0x7603
https://bitbucket.org/vipinmohan/redragon-asura-kb-ubuntu
用这个。我的阿修罗现在工作正常了
答案3
部分答案:
第一个(静默)HID 描述符与您通常在 USB 键盘上看到的类似:报告由左右 Ctrl/Shift/Alt/Meta (Win) 键的 8 位组成,后跟保留字节(零)和 6按键扫描码的字节。 (这就是 USB 键盘仅限于 6 键翻转的原因)。这可能是某种遗留描述符。
第二个描述符使用多种报告类型。前三个用于“消费者”(无论是什么)、电源控制和一个供应商定义的(所以我们不知道它的作用)。其余三种报告类型(ID 4 至 6)将每个按键报告为一个位字段(这对于具有 n 键翻转的游戏键盘来说非常有意义)。
正如您从 hidraw 转储中看到的,功能键已正确报告:按下Left Ctrl可让您
04 01 00 00 00 00 00 00
(报告 ID 为4
,第一位打开),同时按下Left Alt会给您
04 04 00 00 00 00 00 00
(报告 ID 为4
,第三位打开)等,释放所有键会将所有位重置为零。
内核中的设备映射
Keyboard.00e0 ---> Key.LeftControl
Keyboard.00e1 ---> Key.LeftShift
Keyboard.00e2 ---> Key.LeftAlt
Keyboard.00e3 ---> Key.LeftMeta
Keyboard.00e4 ---> Key.RightCtrl
Keyboard.00e5 ---> Key.RightShift
Keyboard.00e6 ---> Key.RightAlt
Keyboard.00e7 ---> Key.RightMeta
实际上声称理解这一点,并且它应该将它们映射到不同的扫描代码。所以如果你真的没有看到类似的东西
type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 1d
type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 1
-------------- SYN_REPORT ------------
type 4 (EV_MSC), code 4 (MSC_SCAN), value 38
type 1 (EV_KEY), code 56 (KEY_LEFTALT), value 0
-------------- SYN_REPORT ------------
(evtest
注意不同的MSC_SCAN
代码,一次1d
,一次38
;不用介意带有 的行EV_KEY
),然后当内核将 HID 报告映射到扫描代码时就会出现问题。
在这种情况下,请向内核开发人员提交一个错误(我猜是“输入子系统”),包括到目前为止的所有信息,看看他们是否有调试这个的想法。
一种可能的替代解决方案是以某种方式激活旧式 HID 设备,因为这与普通 USB 键盘更相似,并且可以开箱即用。键盘上是否有一些按键或组合键看起来可以执行此操作?