USBでCDC+MSDの複合デバイス機能を追加するにあたり、まずは情報収集です。
なにはともあれ、ATMELのAT91 Software Packageの内容を確認。前回、SDカードのコードをここから拝借した際にCDC+MSDのサンプルが存在することには気が付いていたので、こいつを参考にさせていただくことにします。なんと言っても、複合デバイスのConfiguration Descriptorと Windows用のINFファイルが用意されているのが助かります。複合デバイスのConfiguration Descriptorは、構造的にも複雑なものになっているようです。ほんとはUSBの理解を深める勉強材料のひとつなのでしょうが、自分でディスクリプタを用意する際にディスクリプタ長を間違えたりすると、Windowsにつなげた時にblue screenを見るハメになるのを経験的に知っているので、これはもうサンプルを使わせていただくことにします。Vendor ID, Product IDもそのまま使うことで、提供されているINFファイルを利用することもできますし。
ちょっと意外だったのはCDC+MSDの複合デバイスを使うには、Windows XP側ではSP3が必要だということ。SP2ではHot Fixが出ていたようです。Skype電話機のように HID+Audioの複合デバイスなら数多く使われているわけですが、CDC+MSDのような複合デバイスについては、それほどのニーズがないためにちゃんとサポートできていなかったということなのでしょうか?
MSDも今回初めて挑戦する項目ですので、USB.ORGからMass Storage Classの仕様書を入手。概要だけならATMELのAPノートの方が要点が整理されてあり、わかりやすい感じです。ざっと読んでみて次のようなことを学習しました。
なんとなくMSDの概要は理解できましたが、SCSIコマンドの詳細までは追いかけていません。サンプルを参考にしながら、実際にWindowsとつなげてみて必要なものだけ実装していくつもりでいます。
なにはともあれ、ATMELのAT91 Software Packageの内容を確認。前回、SDカードのコードをここから拝借した際にCDC+MSDのサンプルが存在することには気が付いていたので、こいつを参考にさせていただくことにします。なんと言っても、複合デバイスのConfiguration Descriptorと Windows用のINFファイルが用意されているのが助かります。複合デバイスのConfiguration Descriptorは、構造的にも複雑なものになっているようです。ほんとはUSBの理解を深める勉強材料のひとつなのでしょうが、自分でディスクリプタを用意する際にディスクリプタ長を間違えたりすると、Windowsにつなげた時にblue screenを見るハメになるのを経験的に知っているので、これはもうサンプルを使わせていただくことにします。Vendor ID, Product IDもそのまま使うことで、提供されているINFファイルを利用することもできますし。
ちょっと意外だったのはCDC+MSDの複合デバイスを使うには、Windows XP側ではSP3が必要だということ。SP2ではHot Fixが出ていたようです。Skype電話機のように HID+Audioの複合デバイスなら数多く使われているわけですが、CDC+MSDのような複合デバイスについては、それほどのニーズがないためにちゃんとサポートできていなかったということなのでしょうか?
MSDも今回初めて挑戦する項目ですので、USB.ORGからMass Storage Classの仕様書を入手。概要だけならATMELのAPノートの方が要点が整理されてあり、わかりやすい感じです。ざっと読んでみて次のようなことを学習しました。
- SDやフラッシュのようなデバイスをサポートするには、
Bulk-Only Transport(BOT)
というトランスポート層プロトコルを使う。その名前の示すとおり、BULKのパイプしか使わない。 - デバイスの制御にはSCSIコマンドを使うが、SCSIコマンド/レスポンスとR/Wのデータの両方を上述のようにBULKパイプを使って流す。
- BULK転送は最大64バイト。1ブロック(512バイト)を送受するには8回の転送が必要となる。
なんとなくMSDの概要は理解できましたが、SCSIコマンドの詳細までは追いかけていません。サンプルを参考にしながら、実際にWindowsとつなげてみて必要なものだけ実装していくつもりでいます。