键盘输入 N 键无冲突

键盘输入 N 键无冲突

问题

当该功能可用时,是否有任何方法可以以编程方式协商并为插入的键盘启用 NKRO(N 键无冲突)?另外,如何正确区分“标准模式”处理程序和NKRO?

基本原理

我确实有三种不同的键盘,它们的行为彼此略有不同,甚至在平台之间也是如此。他们都以自己的方式支持NKRO。我的主要问题是其中之一没有任何组合键来强制/切换 NKRO 模式,它只能由驱动程序/操作系统来完成。

测试

Windows 10我在和Linux 5.10.17+(Pi Zero) 平台上使用键盘进行演奏。我的设备是Razer Ornata ChromaHyperX HX-KB1BR1-NAHavit 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情况下,有五个不同的处理程序可用(在其他处理程序中可以更多/更少):

  1. 键盘事件处理程序,标准模式
  2. 鼠标处理程序(例如远程 USB 键盘和触摸板)。我假设它总是按设计存在的
  3. 仅参考其名称“系统控制”,它提供了电源、睡眠等事件。
  4. 参考“Consumer Control”,提供多媒体及相关特殊按键的事件
  5. NKRO 事件处理程序

我可以通过查找轻松找到“标准模式”键盘处理程序EV=120013(我也不确定这是否是正确的方法)。在这种特殊情况下,我可以查找具有相同的受支持键位图的其他条目,但不幸的是,如果Havit该位图非常不同。我看到并且可能有用的另一种模式是在处理程序中查找sysrq,但是,我不知道它意味着什么。

就是这样。

如何正确找到给定键盘的standard modeNKRO处理程序?

相关内容