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コマンドをまじめに勉強しないといけないのでしょうが、今回はパスして先に進むことにします。