Entrada de teclado N-Key Rollover

Entrada de teclado N-Key Rollover

Pregunta

¿Hay alguna forma de negociar y habilitar NKRO (N-Key Rollover) mediante programación para teclados conectados cuando esa función esté disponible? Además, ¿cómo distinguir correctamente entre el controlador en "modo estándar" y NKRO?

Razón fundamental

Tengo tres teclados diferentes que se comportan de forma ligeramente diferente entre sí e incluso entre plataformas. Todos ellos apoyan a la NKRO a su manera. Mi principal problema es que uno de estos no tiene ninguna combinación de teclas para aplicar/cambiar el modo NKRO, solo lo puede hacer el controlador/OS.

Pruebas

Jugué con mis teclados en plataformas Windows 10y Linux 5.10.17+(Pi Zero). Mis dispositivos son Razer Ornata Chroma, HyperX HX-KB1BR1-NAy Havit HV-KB390L. Creo que puedo poner aquí algunas descripciones de comportamiento de esos dispositivos.

Me standard moderefiero a un paquete USB de baja velocidad de 8 bytes, que se usa comúnmente. Me game-moderefiero a una función específica del teclado, si está disponible.

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

Entonces, con eso, HyperXla implementación del cambio de modo estándar/NKRO es la que más me gusta, Razeral menos proporciona una combinación de teclas para hacer cumplir NKRO (aunque es necesario hacerlo en cada conexión/arranque), Havitdesafortunadamente no ofrece una opción para habilitar NKRO a través de cualquier combinación de teclas.

Busqué el código fuente y la documentación de Linux /drivers/input, pero no encontré nada que me ayudara a hacer cumplir NKRO; además, comprender el código C no es la tarea más fácil para mí /Documentation/input. /drivers/hid/hid-input.cLo único que encontré que menciona NKRO es esta línea:

#define HP_SDC_CFG_ROLLOVER 0x08 /* ¿WTF es "N-key rollover"? */

Bueno, no es realmente útil.

Entonces, ¿es posible habilitar NKRO desde el lado del sistema operativo?

Diferenciar manipuladores estándar y NKRO

Durante mis pruebas, descubrí que estos dos modos diferentes se relacionan con dos eventXcontroladores diferentes. Podemos inspeccionar /proc/bus/input/devicesel archivo y encontrar más contexto.

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

Ese formato de archivo está bien explicado.aquí

En el HyperXcaso, hay cinco controladores diferentes disponibles (pueden ser más/menos en otros):

  1. controlador para eventos de teclado, modo estándar
  2. controlador de mouse (por ejemplo, teclado USB remoto con panel táctil). Supongo que siempre está ahí por diseño.
  3. con solo hacer referencia a su nombre "Control del sistema", proporciona eventos de encendido, suspensión, etc.
  4. refiriéndose a "Control del consumidor", proporciona eventos para multimedia y teclas especiales relacionadas
  5. manejador de eventos NKRO

Puedo encontrar fácilmente el controlador de teclado en "modo estándar" buscándolo EV=120013(tampoco estoy seguro de si es la forma adecuada). En ese caso particular, podría buscar otras entradas con un mapa de bits idéntico de claves admitidas, pero desafortunadamente Havitese mapa de bits es bastante diferente. Otro patrón que veo y que podría resultar útil es buscarlo sysrqen los controladores. Sin embargo, no sé qué significa.

Y eso es.

¿Cómo puedo encontrar correctamente ambos controladores standard modey NKROpara un teclado determinado?

información relacionada