キーボード入力 Nキーロールオーバー

キーボード入力 Nキーロールオーバー

質問

NKRO (N キー ロールオーバー) 機能が利用可能な場合、接続されたキーボードに対してプログラムでネゴシエートして有効にする方法はありますか? また、「標準モード」ハンドラーと NKRO を適切に区別するにはどうすればよいですか?

根拠

私は 3 つの異なるキーボードを持っていますが、それぞれ動作が若干異なり、プラットフォーム間でも異なります。これらはすべて独自の方法で NKRO をサポートしています。私の主な問題は、これらのうちの 1 つに NKRO モードを強制/切り替えるためのキーの組み合わせがなく、ドライバー/OS によってのみ実行できることです。

テスト

私はキーボードを および (Pi Zero) プラットフォームで使用しましたWindows 10Linux 5.10.17+デバイスはRazer Ornata ChromaHyperX 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、、 )を調べましたが、NKRO の適用に役立つものは何も見つかりませんでした。また、C コードを理解することは私にとって簡単な作業ではありません。NKRO について言及している唯一のものは次の行です。/Documentation/input/drivers/hid/hid-input.c

#define HP_SDC_CFG_ROLLOVER 0x08 /* 「N キー ロールオーバー」って何ですか? */

まあ、あまり役に立ちませんね。

では、OS 側から NKRO を有効にすることは可能ですか?

標準ハンドラーとNKROハンドラーを区別する

eventXテスト中に、これら 2 つの異なるモードが 2 つの異なるハンドラーに関連していることがわかりました。/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場合、5 つの異なるハンドラーが使用可能です (他のハンドラーではこれより多い/少ない場合があります)。

  1. キーボードイベントのハンドラー、標準モード
  2. マウスハンドラー(例:リモートUSBキーボードとタッチパッド)。これは設計上常に存在するものと想定しています。
  3. 「システム制御」という名前を参照するだけで、電源、スリープなどのイベントを提供します。
  4. 「消費者コントロール」とは、マルチメディアや関連する特殊キーのイベントを提供するものである。
  5. NKRO イベントのハンドラー

「標準モード」キーボード ハンドラーは、検索することで簡単に見つけることができますEV=120013(適切な方法かどうかはわかりません)。この特定のケースでは、サポートされているキーの同一のビットマップを持つ他のエントリを検索できますが、残念ながらHavitそのビットマップはかなり異なります。私が見つけたもう 1 つのパターンは、ハンドラーで検索することですsysrqが、それが何を意味するのかはわかりません。

以上です。

特定のキーボードの と のハンドラーをstandard mode適切に見つけるにはどうすればよいでしょうか?NKRO

関連情報