2011年6月18日土曜日

USB HID複合デバイスの作り方

備忘録。

ひとつのUSB機器に複数(composite)のHIDデバイスを作る方法。
市販品のイメージでは、キーボードの横にトラックボールが付いているがUSBコネクタはひとつしかないやつ。
PCにつなぐとトラックボールもキーボードも別に認識される。
  • USB機器側
    • デスクリプタの作り方。
      • デバイスデスクリプタはそのままでいい。
      • コンフィグレーションデスクリプタのなかのインターフェースの数(bNumInterface)を必要な数に増やす。普通は1になっているためひとつの機器(マウスだけ、とか)を示している。
      • インターフェースディスクリプタ、エンドポイントディスクリプタは必要な数分、用意する。普通は一組(エンドポイントは複数あるかもしれないが)
        • で、インターフェースディスクリプタのインターフェース番号bInterfaceNumberを一つ目は0,二つ目は1…というように割り振る。
      • レポートディスクリプタも同様に必要な数用意する。
    • ファームウェアの作り方
      • PCは上記のコンフィグレーションディスクリプタの数を見てインターフェースディスクリプタをくれ、と要求してくる。
      • ひとつしかないときは"0"番をくれ、というのみ。
      • 複数の時は"0"番を頂戴、のあと"1"番をくれ、など要求が複数回になる(ここで"0","1"は上記ディスクリプタで指定したとおり)
      • なので、その要求に応えるようにインターフェースディスクリプタを返す。
        • ※EZ-USBのサンプルは下記参考のアプリケーションノートを参照。
      • エンドポイントの取扱い方は今まで通りでいい。
  • PCからのアクセス方法。
    • 上記でちゃんとディスクリプタを設定・返答するようにしておけば、HIDデバイスなので標準デバイスドライバが各機器用にロードされる。
    • 特に特別なプログラムでアクセスするのでないかぎり、そのままでOK。
      キーボードをキーボードのままで使う、とかマウスをマウスのままで使うとか。
    • 自作プログラムでそいつをアクセスしてる時は下記に注意。
      • デバイスパスの中に"mi_00"のようにインターフェース番号に応じて認識されている状態になる。普通はひとつなのでmi_00しかないが、二つの場合はVID,PIDは同じだけどmi_01のように異なる番号(インターフェースディスクリプタで指定したように)になっているものが認識される状態になる。
      • 普通のサンプルでは、VID,PID一致したときに”デバイスがあった”とオープンしてしまう。これはmi_00のひとつのデバイスしかないため実用上は問題ないが(たぶん)厳密にはよくない。
      • なのでさらにVID,PIDが一致したデバイスパスのなかに所望の"mi_??"があるかをcontainsなどで調べてそれも含めて一致したらそのデバイスパスをオープンする。
      • デバイスパスの例
        • \\?\hid#vid_ffff&pid_0001&mi_01#7&26461c5c&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}"), 
参考にしたもの。
・http://www.cypress.com/?rID=12932 のアプリケーションノート
・USB2.0インターフェース設計術

※正しい用語を使っていないかも。

0 件のコメント:

コメントを投稿