USB キーボードでの NKRO
NKRO (N-key Rollover) というのは、おおざっぱに言うとキーボードのキーを同時押ししたとき、いくつ認識するか?ということです。
NKRO の理想的には以下の挙動になります。
- いくつキーを押しても全て同時に押されていることがコンピュータから認識される
これを NKRO として定義すると、全ての USB HID キーボードは NKRO ではありません。なぜなら、USB HID キーボードは修飾キーを除くと6キーまでしか押されていることを送信できないからです。
USB HID での NKRO
そうすると妥協した次点として以下のような仕様を NKRO とするほかありません。
- 6キーまでは同時押しがコンピュータから認識される
- 7キー目を押すと、最初に押したキーが離されたと認識される
完全な同時押しは6キーまでですが、入力をとりこぼすということはありません。USB HID で NKRO と呼ばれているものはおそらくこの挙動をすると思います。
まぁ実際のユースケースとして、そもそも7キー以上の同時押しは極めて稀です。ということでさらに妥協して以下のような実装も考えられます
- 6キーまでは同時押しがコンピュータから認識される
- 7キー目を押しても無視される
これはこれでほとんど問題ないでしょう。単純に 6KRO になります。押した順番という状態を持つ必要が減るのでファームウェアの実装は簡単になります (バグを少なくできます)。一方で、キーを離さないクセを持つ人がものすごい高速タイピングをした場合にはキーをとりこぼすかもしれません。
PS-2 キーボードではどうなのか?
PS-2 キーボードのプロトコルは単純で、シリアル通信で
- キーを押すと Make 信号を発生させる
- キーを離すと Break 信号を発生させる
というものです。つまり NKRO になるかはOS側の実装次第です。
ゲーマー向けのマザーボードには PS-2 端子がついていることが多いですが、これは
- NKRO 対応のため
- レイテンシ削減のため
であると思われます。USB はホストからのポーリングで成りたっているため、キーを押した瞬間にコンピュータにデータが送られてくるわけではなく、コンピュータ側からのポーリングを待つ必要があります。ポーリング間隔はデバイス側から通知され、最小で1msまで設定可能ですが、OS 側に最終決定権があり、例えば Windows では最小で 8ms (Low Speed) , 1ms (Full Speed), 0.125ms (High Speed) です。つまりこの時点で最大で0.125msの遅延が発生します。
PS-2 の場合、キーが押された瞬間に Make 信号を送るため、理論的にはこちらのほうが早いことになります。
関連エントリー
- Karabiner で自作キーボードが認識しなかった件 余談だけど、既存キーボードと併用して Karabiner を使えば実際に左右分割で使えるはず、と思ったが、どうもそれができなかった。修飾キー...
- NiZ Keyboard PLUM という静電容量無接点キーボード (この写真のキー配列はデフォルトのものではなく、既にカスタマイズ済みです。mac 用のキーキャップが付属しており、HHKB を基準にできるだ...
- ErgoDox について調べた(買わないけど) ヤパチーでErgoDox を見て面白いなあと思ったので調べてみた。 ネットの記事だとErgoDoxって、「とにかく健康だ!! 筋肉だ!!!」...
- WebUSB HackRF One スペクトラムアナライザー HackRF One 用の sweep mode を利用するスペクトラムアナライザーで、いまいち安定して動くものが見つからなかった。WebU...
- 自作キーボードの製作 — コンセンプトとキーレイアウトおよび技術仕様編 500 Can't connect to lowreal.net:443 (certificate verify failed) まず思いつ...