鍵盤輸入 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處理程序?

相關內容