USBのHIDはうんこではないか?

USBキーボードはキーリピートがクソほど遅くて、かつシフトキーの反応が遅くて大文字の打ち間違いが頻発する。

USBマウスは、ボタンアップのイベントを拾いそこなって、選択しっぱなしになる。

これってどうなってるの?

イベント通信で、デバイスから送出されたイベントが失われる可能性がある場合、どうしたらええんでしょうかね。

聞きかじりですが、PS/2デバイスは周期的にステータスを送り続けるだけ。

IOというのは、本来そうでなきゃいけません。イベント至上主義という宗教のせいでハードウェアIOのインターフェースをイベントベースで作ってしまった阿呆さんたち。

ちょっと、いいですか?

2灯式信号機の制御インターフェース

イベント一覧:

  • 青点灯
  • 青消灯
  • 赤点灯
  • 赤消灯

こんなもんで制御したら、えらいことになりまっせ?

IOはスキャンして全データ送る。これ基本。

2灯式信号機の制御インターフェース

ビット割り付け:

  • 第0ビット:青点灯状態制御(0:点灯、1:消灯)
  • 第1ビット:赤点灯状態制御(0:点灯、1:消灯)

更新周期:

10msec~1000msec可変

変化したIOだけ送って帯域圧縮

なんていうのは、ベストエフォート症候群で理性がどうにかなっちゃった人たちの考えそうなことです。

前者のインタフェースでは、イベント情報の欠損などで制御状態がおかしくなってしまった際に、次の正しいイベントが到着するまで、異常な状態が継続します。かつ、『おかしくなった状態を変更するイベントが来ない限り継続する』です。つまり、それは0以上最悪では無限大時間続くのです。

後者のインターフェースでは、ある更新で欠損があったとしても、次の更新周期でリカバリされます。その周期は必ず有限です。更新が行われなければ即異常です。

更新が行われない、いわゆるタイムアウトについて、前者のインターフェースでは実現できませんね。マウスを操作せずに放っておいたらタイムアウト異常になるっていうのもまずかろうと思います。そうはいってもマウスが生きているかどうかのハートビート的なイベントを送出する仕様でもいいんじゃないの?

・・・って、そんなことするんだったら、後者のインターフェースでいいじゃん。

とまぁちょっとした機器間インターフェースを車輪の再発明的に設計したことある人なら誰でも知ってるはずのことをエラソウに書き並べてみました。

ポイントとしては、後者のインターフェースも、すべての設計がみなそうであるように、完璧ではないということです。最悪の場合更新周期の間ずっと異常な状態が続きます。しかしそれが有限であり、最悪値設計できるという点が重要です。

USBのHIDはどう見ても無茶苦茶です。これこそ20世紀の遺物。窓から放り投げてしまえ。

独り言:
これってドライバがタコなだけなのかなぁ。でも所詮はシリアル通信だから、ドロップしたデータのリカバリは上位の処理で補うしかないよなぁ。

りんくる:

HID FAQ