Вопрос
Есть ли способ программно согласовать и включить NKRO (N-Key Rollover) для подключенных клавиатур, когда эта функция доступна? Кроме того, как правильно различать обработчик "стандартного режима" и NKRO?
Обоснование
У меня есть три разных клавиатуры, которые ведут себя немного по-разному друг от друга и даже между платформами. Все они поддерживают NKRO по-своему. Моя главная проблема в том, что у одной из них нет комбинации клавиш для включения/переключения режима NKRO, это может сделать только драйвер/ОС.
Тесты
Я играл с моими клавиатурами на платформах Windows 10
и Linux 5.10.17+
(Pi Zero). Мои устройства — это Razer Ornata Chroma
, HyperX HX-KB1BR1-NA
и Havit 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 /* Что за "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
случае доступны пять различных обработчиков (в других случаях их может быть больше/меньше):
- обработчик событий клавиатуры, стандартный режим
- обработчик мыши (например, удаленная USB-клавиатура с тачпадом). Я предполагаю, что он всегда там по замыслу
- просто ссылаясь на свое название «Управление системой», он предоставляет события для питания, сна и т. д.
- ссылаясь на «Контроль потребителей», он обеспечивает события для мультимедиа и связанных с ним специальных клавиш
- обработчик событий NKRO
Я могу легко найти обработчик клавиатуры "стандартного режима", выполнив поиск EV=120013
(я также не уверен, что это правильный способ). В этом конкретном случае я мог бы поискать другие записи с идентичной битовой картой поддерживаемых клавиш, но, к сожалению, в этом Havit
случае эта битовая карта сильно отличается. Другой шаблон, который я вижу и который может быть полезен, — это поиск sysrq
в обработчиках, однако я не знаю, что это значит.
Вот и все.
Как мне правильно найти обработчики standard mode
и NKRO
для заданной клавиатуры?