Tastatureingabe N-Key Rollover

Tastatureingabe N-Key Rollover

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 10und Linux 5.10.17+(Pi Zero)-Plattformen gespielt. Meine Geräte sind Razer Ornata Chroma, HyperX HX-KB1BR1-NAund Havit HV-KB390L. Ich denke, ich kann hier einige Verhaltensbeschreibungen dieser Geräte einfügen.

Damit standard modemeine ich ein langsames, 8 Byte großes USB-Paket, das häufig verwendet wird. Damit game-modemeine 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 HyperXist die Implementierung der Umschaltung zwischen Standardmodus und NKRO für mich die bevorzugte, da sie Razerzumindest eine Tastenkombination zum Erzwingen von NKRO bereitstellt (muss allerdings bei jeder Verbindung/jedem Systemstart ausgeführt werden), Havitleider aber keine Option zum Aktivieren von NKRO über eine beliebige Tastenkombination bietet.

Ich habe mir den Linux-Quellcode und die Dokumentation angesehen, aber /drivers/inputich 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 eventXHandler beziehen. Wir können /proc/bus/input/devicesdie 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 HyperXFall stehen fünf verschiedene Handler zur Verfügung (in anderen Fällen können es mehr/weniger sein):

  1. Handler für Tastaturereignisse, Standardmodus
  2. Maus-Handler (z. B. Remote-USB-Tastatur mit Touchpad). Ich gehe davon aus, dass es von Natur aus immer da ist
  3. Allein durch den Namen „Systemsteuerung“ werden Ereignisse für Stromversorgung, Ruhezustand usw. bereitgestellt.
  4. bezieht sich auf "Consumer Control" und bietet Ereignisse für Multimedia und verwandte Sondertasten
  5. 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 Havitist diese Bitmap in diesem Fall ziemlich unterschiedlich. Ein anderes Muster, das ich sehe und das nützlich sein könnte, ist die Suche nach sysrqin Handlern. Ich weiß jedoch nicht, was es bedeutet.

Und das ist es.

Wie kann ich für eine bestimmte Tastatur sowohl Handler standard modeals auch Tastaturkürzel richtig finden ?NKRO

verwandte Informationen