マイコン工作実験日記

Microcontroller を用いての工作、実験記録

下調べ

2009-02-11 21:18:43 | USB
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ノートの方が要点が整理されてあり、わかりやすい感じです。ざっと読んでみて次のようなことを学習しました。
  1. SDやフラッシュのようなデバイスをサポートするには、Bulk-Only Transport(BOT)というトランスポート層プロトコルを使う。その名前の示すとおり、BULKのパイプしか使わない。
  2. デバイスの制御にはSCSIコマンドを使うが、SCSIコマンド/レスポンスとR/Wのデータの両方を上述のようにBULKパイプを使って流す。
  3. BULK転送は最大64バイト。1ブロック(512バイト)を送受するには8回の転送が必要となる。
やりとりにSCSIコマンドを使うということは、以前なにかの記事で読んで知っていたのですが、データとコマンドは別のパイプを使うものと思い込んでいました。BULKの転送量についても改めて認識。AT91SAM7Sではもともと、エンドポイントのバッファ長は最大64バイトしかサポートしていないのですが、AT91SAM7A3のEP4とEP5では512バイトサポートできます。1度で1ブロック運べるかと思っていましたが、そうではないのですね。

なんとなくMSDの概要は理解できましたが、SCSIコマンドの詳細までは追いかけていません。サンプルを参考にしながら、実際にWindowsとつなげてみて必要なものだけ実装していくつもりでいます。