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 10
y Linux 5.10.17+
(Pi Zero). Mis dispositivos son Razer Ornata Chroma
, HyperX HX-KB1BR1-NA
y Havit HV-KB390L
. Creo que puedo poner aquí algunas descripciones de comportamiento de esos dispositivos.
Me standard mode
refiero a un paquete USB de baja velocidad de 8 bytes, que se usa comúnmente. Me game-mode
refiero 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, HyperX
la implementación del cambio de modo estándar/NKRO es la que más me gusta, Razer
al menos proporciona una combinación de teclas para hacer cumplir NKRO (aunque es necesario hacerlo en cada conexión/arranque), Havit
desafortunadamente 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.c
Lo ú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 eventX
controladores diferentes. Podemos inspeccionar /proc/bus/input/devices
el 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 HyperX
caso, hay cinco controladores diferentes disponibles (pueden ser más/menos en otros):
- controlador para eventos de teclado, modo estándar
- controlador de mouse (por ejemplo, teclado USB remoto con panel táctil). Supongo que siempre está ahí por diseño.
- con solo hacer referencia a su nombre "Control del sistema", proporciona eventos de encendido, suspensión, etc.
- refiriéndose a "Control del consumidor", proporciona eventos para multimedia y teclas especiales relacionadas
- 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 Havit
ese mapa de bits es bastante diferente. Otro patrón que veo y que podría resultar útil es buscarlo sysrq
en los controladores. Sin embargo, no sé qué significa.
Y eso es.
¿Cómo puedo encontrar correctamente ambos controladores standard mode
y NKRO
para un teclado determinado?