ひとつの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 件のコメント:
コメントを投稿