Ввод с клавиатуры N-Key Rollover

Ввод с клавиатуры N-Key Rollover

Вопрос

Есть ли способ программно согласовать и включить 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случае доступны пять различных обработчиков (в других случаях их может быть больше/меньше):

  1. обработчик событий клавиатуры, стандартный режим
  2. обработчик мыши (например, удаленная USB-клавиатура с тачпадом). Я предполагаю, что он всегда там по замыслу
  3. просто ссылаясь на свое название «Управление системой», он предоставляет события для питания, сна и т. д.
  4. ссылаясь на «Контроль потребителей», он обеспечивает события для мультимедиа и связанных с ним специальных клавиш
  5. обработчик событий NKRO

Я могу легко найти обработчик клавиатуры "стандартного режима", выполнив поиск EV=120013(я также не уверен, что это правильный способ). В этом конкретном случае я мог бы поискать другие записи с идентичной битовой картой поддерживаемых клавиш, но, к сожалению, в этом Havitслучае эта битовая карта сильно отличается. Другой шаблон, который я вижу и который может быть полезен, — это поиск sysrqв обработчиках, однако я не знаю, что это значит.

Вот и все.

Как мне правильно найти обработчики standard modeи NKROдля заданной клавиатуры?

Связанный контент