衝突のないキーボード入力Nキー

衝突のないキーボード入力Nキー

質問

その機能が利用可能な場合は、接続されたキーボードに対してプログラムでN-Key conflict-free(NKRO)をネゴシエートして有効にする方法はありますか?また、「標準モード」ハンドラとNKROを正しく区別する方法は?

基本的な

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

テスト

Windows 10私はLinux 5.10.17+Pi Zeroプラットフォームでキーボードを演奏します。私のデバイスは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を有効にするオプションはありません。 。

/drivers/inputLinuxのソースコードとドキュメント(、、、/Documentation/input)を見てみました/drivers/hid/hid-input.cが、NKROを実行するのに役立つものが見つからず、Cコードを理解するのも私にとって最も簡単な作業ではありませんでした。私が見つけたNKROへの唯一の言及は次の行でした。

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

まあ、それはあまり役に立ちません。

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

標準ハンドラとNKROハンドラの区別

テスト中、私はこれら2つのモードがeventX2つの異なるハンドラに関連付けられていることを発見しました。/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そのビットマップが非常に異なる場合があります。私が見て役に立つかもしれないもう一つのパターンはfind inside handlersですがsysrq、それが何を意味するのかわかりません。

それはすべてです。

特定のキーボードのstandard mode合計NKROハンドラを正しく見つける方法は?

関連情報