问题
当该功能可用时,是否有任何方法可以以编程方式协商并为插入的键盘启用 NKRO(N 键无冲突)?另外,如何正确区分“标准模式”处理程序和NKRO?
基本原理
我确实有三种不同的键盘,它们的行为彼此略有不同,甚至在平台之间也是如此。他们都以自己的方式支持NKRO。我的主要问题是其中之一没有任何组合键来强制/切换 NKRO 模式,它只能由驱动程序/操作系统来完成。
测试
Windows 10
我在和Linux 5.10.17+
(Pi Zero) 平台上使用键盘进行演奏。我的设备是Razer Ornata Chroma
、HyperX HX-KB1BR1-NA
和Havit HV-KB390L
。我想我可以在这里放置该设备的一些行为描述。
我指的standard mode
是常用的低速 8 字节大小的 USB 数据包。我game-mode
指的是特定于键盘的功能(如果可用)。
Windows
- Razer: NKRO enabled by default regardless of game-mode state, game-mode only disables Win key,
game-mode state stored only by platform driver
(Razer Central installed)
- Havit: NKRO enabled by default, game-mode does nothing (probably configured via software)
(no additional software installed)
- HyperX: stores NKRO state internally in keyboard and enforces it, game-mode disables Win key only
(no additional software installed)
Linux
- Razer: standard mode by default, game-mode enforces NKRO and disables Win key
- Havit: standard mode by default, game-mode does nothing, There is no key sequence to enforce NKRO
- HyperX: behaves the same as on Windows, internal state changes works between platforms
因此,HyperX
标准模式/NKRO 切换的实现是我最喜欢的,Razer
至少提供了一个组合键来强制执行 NKRO(尽管需要在每次连接/启动时执行),Havit
不幸的是没有提供通过以下方式启用 NKRO 的选项:任何组合键。
我查看了 Linux 源代码和文档 - /drivers/input
、/Documentation/input
、/drivers/hid/hid-input.c
,但我没有找到任何可以帮助我执行 NKRO 的内容,而且理解 C 代码对我来说也不是最简单的任务。我发现唯一提到 NKRO 的是这一行:
#define HP_SDC_CFG_ROLLOVER 0x08 /* WTF 是什么“N 键翻转”? */
嗯,这并没有多大帮助。
那么,是否可以从操作系统端启用 NKRO?
区分标准处理程序和 NKRO 处理程序
在测试过程中,我发现这两种不同的模式与两个不同的eventX
处理程序相关。我们可以检查/proc/bus/input/devices
文件并找到更多上下文。
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard"
P: Phys=usb-20980000.usb-1.1/input0
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.0/0003:0951:16B7.0001/input/input0
U: Uniq=
H: Handlers=sysrq kbd leds event0
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard Mouse"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input1
U: Uniq=
H: Handlers=mouse0 event1
B: PROP=0
B: EV=17
B: KEY=1f0000 0 0 0 0 0 0 0 0
B: REL=1943
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard System Control"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=13
B: KEY=c000 100000 0 0 0
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard Consumer Control"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input3
U: Uniq=
H: Handlers=kbd event3
B: PROP=0
B: EV=1f
B: KEY=3f 301ff 0 0 0 0 483ffff 17aff32d bfd44446 0 0 1 130ff3 8b17c000 677bfa d9415fed 19ed680 4400 0 10000002
B: REL=1040
B: ABS=1 0
B: MSC=10
I: Bus=0003 Vendor=0951 Product=16b7 Version=0111
N: Name="Kingston HyperX Alloy FPS Mechanical Gaming Keyboard"
P: Phys=usb-20980000.usb-1.1/input1
S: Sysfs=/devices/platform/soc/20980000.usb/usb1/1-1/1-1.1/1-1.1:1.1/0003:0951:16B7.0002/input/input5
U: Uniq=
H: Handlers=sysrq kbd event4
B: PROP=0
B: EV=100013
B: KEY=10000 7 ff9f207a c14057ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
该文件格式解释得很好这里
在这种HyperX
情况下,有五个不同的处理程序可用(在其他处理程序中可以更多/更少):
- 键盘事件处理程序,标准模式
- 鼠标处理程序(例如远程 USB 键盘和触摸板)。我假设它总是按设计存在的
- 仅参考其名称“系统控制”,它提供了电源、睡眠等事件。
- 参考“Consumer Control”,提供多媒体及相关特殊按键的事件
- NKRO 事件处理程序
我可以通过查找轻松找到“标准模式”键盘处理程序EV=120013
(我也不确定这是否是正确的方法)。在这种特殊情况下,我可以查找具有相同的受支持键位图的其他条目,但不幸的是,如果Havit
该位图非常不同。我看到并且可能有用的另一种模式是在处理程序中查找sysrq
,但是,我不知道它意味着什么。
就是这样。
如何正确找到给定键盘的standard mode
和NKRO
处理程序?