Frage
Gibt es eine Möglichkeit, NKRO (N-Key Rollover) für angeschlossene Tastaturen programmgesteuert auszuhandeln und zu aktivieren, wenn diese Funktion verfügbar ist? Und wie kann man richtig zwischen dem Handler im „Standardmodus“ und NKRO unterscheiden?
Begründung
Ich habe drei verschiedene Tastaturen, die sich untereinander und sogar plattformübergreifend leicht unterschiedlich verhalten. Alle unterstützen NKRO auf ihre eigene Weise. Mein Hauptproblem ist, dass eine davon keine Tastenkombination zum Erzwingen/Umschalten des NKRO-Modus hat, dies kann nur über den Treiber/das Betriebssystem erfolgen.
Tests
Ich habe mit meinen Tastaturen auf Windows 10
und Linux 5.10.17+
(Pi Zero)-Plattformen gespielt. Meine Geräte sind Razer Ornata Chroma
, HyperX HX-KB1BR1-NA
und Havit HV-KB390L
. Ich denke, ich kann hier einige Verhaltensbeschreibungen dieser Geräte einfügen.
Damit standard mode
meine ich ein langsames, 8 Byte großes USB-Paket, das häufig verwendet wird. Damit game-mode
meine ich eine tastaturspezifische Funktion, sofern verfügbar.
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
Aus diesem Grund HyperX
ist die Implementierung der Umschaltung zwischen Standardmodus und NKRO für mich die bevorzugte, da sie Razer
zumindest eine Tastenkombination zum Erzwingen von NKRO bereitstellt (muss allerdings bei jeder Verbindung/jedem Systemstart ausgeführt werden), Havit
leider aber keine Option zum Aktivieren von NKRO über eine beliebige Tastenkombination bietet.
Ich habe mir den Linux-Quellcode und die Dokumentation angesehen, aber /drivers/input
ich habe nichts gefunden, was mir bei der Durchsetzung von NKRO helfen würde. Außerdem ist das Verstehen von C-Code für mich nicht die einfachste Aufgabe. Das einzige, was ich gefunden habe, das NKRO erwähnt, ist diese Zeile:/Documentation/input
/drivers/hid/hid-input.c
#define HP_SDC_CFG_ROLLOVER 0x08 /* Was zum Teufel ist „N-Key-Rollover“? */
Naja, wirklich hilfreich ist es nicht.
Ist es also möglich, NKRO von der Betriebssystemseite aus zu aktivieren?
Unterscheiden Sie zwischen Standard- und NKRO-Handlern
Während meiner Tests habe ich herausgefunden, dass sich diese beiden unterschiedlichen Modi auf zwei unterschiedliche eventX
Handler beziehen. Wir können /proc/bus/input/devices
die Datei untersuchen und weiteren Kontext finden.
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
Dieses Dateiformat wird gut erklärtHier
In diesem HyperX
Fall stehen fünf verschiedene Handler zur Verfügung (in anderen Fällen können es mehr/weniger sein):
- Handler für Tastaturereignisse, Standardmodus
- Maus-Handler (z. B. Remote-USB-Tastatur mit Touchpad). Ich gehe davon aus, dass es von Natur aus immer da ist
- Allein durch den Namen „Systemsteuerung“ werden Ereignisse für Stromversorgung, Ruhezustand usw. bereitgestellt.
- bezieht sich auf "Consumer Control" und bietet Ereignisse für Multimedia und verwandte Sondertasten
- Handler für NKRO-Events
Ich kann den Tastatur-Handler im „Standardmodus“ leicht finden, indem ich nach suche EV=120013
(ich bin mir auch nicht sicher, ob das der richtige Weg ist). In diesem speziellen Fall könnte ich nach anderen Einträgen mit einer identischen Bitmap der unterstützten Tasten suchen, aber leider Havit
ist diese Bitmap in diesem Fall ziemlich unterschiedlich. Ein anderes Muster, das ich sehe und das nützlich sein könnte, ist die Suche nach sysrq
in Handlern. Ich weiß jedoch nicht, was es bedeutet.
Und das ist es.
Wie kann ich für eine bestimmte Tastatur sowohl Handler standard mode
als auch Tastaturkürzel richtig finden ?NKRO