MSD(Mass Storage Device)の実装を開始したところ、Windows XPは最初に次の2つのSCSIコマンドを出してくることがわかりました。
ところが、ATMELが提供するサンプルのコードでは Read Format Capacitiesはサポートされていません。どうやら、Read Capacityというコマンドはサポートされており、それで用が足りるということのようです。少し気になったので、他のサンプルコードでの実装がどうなっているかを簡単に調べて比較してみることにしました。比較対象としたのは、秋月でも売っているAVRを使ったAT90USBKeyのコードとSTM32用のUSB Developer Kitです。
どれだけ真面目に実装処理しているかまでは調べていません。単にコマンドをデコードする部分で比較しただけですが、STM32にはRead Format Capacitiesがあったので、同じように処理してやることにしました。やっていることは、確かにRead Capacityとほとんど同じで、ブロック数とブロック長さを返しているだけのようです。
Read Format Capacitiesでは、ホストであるWindows XP側は252バイトの応答を受けられるように待っていますが、実際に送信する応答データは12バイトしかありません。このように応答が短い場合にはendpoint haltの手順を使って応答データがそれで終わりであることを通知する必要があるということで、その処理を追加。続いて、WindowsはRead Capacityコマンドを送ってきています。Read Format Capacitiesとの使い分けの意味を理解するには、SCSIコマンドをまじめに勉強しないといけないのでしょうが、今回はパスして先に進むことにします。
Inquiry デバイスの種類や名称といった基本的な情報を返す Read Format Capacities デバイスのサポートするブロック数を返す
ところが、ATMELが提供するサンプルのコードでは Read Format Capacitiesはサポートされていません。どうやら、Read Capacityというコマンドはサポートされており、それで用が足りるということのようです。少し気になったので、他のサンプルコードでの実装がどうなっているかを簡単に調べて比較してみることにしました。比較対象としたのは、秋月でも売っているAVRを使ったAT90USBKeyのコードとSTM32用のUSB Developer Kitです。
Command | AT91SAM | USBKey | STM32 |
---|---|---|---|
Inquiry | ○ | ○ | ○ |
Read Format Capacities | × | × | ○ |
Read Capacity(10) | ○ | ○ | ○ |
Mode Sense(6) | △ | ○ | ○ |
Mode Sense(10) | × | ○ | ○ |
Read(10) | ○ | ○ | ○ |
Write(10) | ○ | ○ | ○ |
Request Sense | ○ | ○ | ○ |
Test Unit Ready | ○ | ○ | ○ |
Verify(10) | ○ | ○ | ○ |
Prevent/Allow Medium Removal | ○ | ○ | ○ |
Start/Stop Unit | × | × | ○ |
Format Unit | × | × | ○ |
どれだけ真面目に実装処理しているかまでは調べていません。単にコマンドをデコードする部分で比較しただけですが、STM32にはRead Format Capacitiesがあったので、同じように処理してやることにしました。やっていることは、確かにRead Capacityとほとんど同じで、ブロック数とブロック長さを返しているだけのようです。
Read Format Capacitiesでは、ホストであるWindows XP側は252バイトの応答を受けられるように待っていますが、実際に送信する応答データは12バイトしかありません。このように応答が短い場合にはendpoint haltの手順を使って応答データがそれで終わりであることを通知する必要があるということで、その処理を追加。続いて、WindowsはRead Capacityコマンドを送ってきています。Read Format Capacitiesとの使い分けの意味を理解するには、SCSIコマンドをまじめに勉強しないといけないのでしょうが、今回はパスして先に進むことにします。
"USB Mass Storage Class Compliance Test Specification, rev0.9a"
www.usb.org/developers/devclass_docs/MSC-compliance-0_9a.pdf
4.2 Command Set Information (p19)
Table 1 Required and Optional Commands
この表で PDT=00H/07H/0EH の欄が通常のUSBメモリに相当します。ちなみにPDT=05H はCD・DVDです。この表から、最低必要なSCSIコマンドは、次の6種類だと分かります。
Inquiry, Request Sense, Test Unit Ready, Read(10), Read Capacity, Write(10)
Windows, MacOSX, Linux でそれぞれ確認したところ、この6つのSCSIコマンドをサポートしておけば一応正常に動作します。非対応のSCSIコマンドには、そのコマンドのCSWでbCSWStatus=0x01 (command failed)を返し、直後のRequest Sense にはILLEGAL_REQUEST(0x05) - ASC_INVALLID_COMMAND_OPERATION_CODE(0x20)のsense dataを返します。オプションのSCSIコマンドを全てサポートしたときに比べてマウントが気持ち遅くなりますが、ファームウェアを少しでも圧縮したい時にはこれで済ませてしまうというのも手でしょう。
Tsuneo