マイコン工作実験日記

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

サポートするSCSIコマンド

2009-02-22 21:09:38 | USB
MSD(Mass Storage Device)の実装を開始したところ、Windows XPは最初に次の2つのSCSIコマンドを出してくることがわかりました。
Inquiry
  デバイスの種類や名称といった基本的な情報を返す
Read Format Capacities
  デバイスのサポートするブロック数を返す

ところが、ATMELが提供するサンプルのコードでは Read Format Capacitiesはサポートされていません。どうやら、Read Capacityというコマンドはサポートされており、それで用が足りるということのようです。少し気になったので、他のサンプルコードでの実装がどうなっているかを簡単に調べて比較してみることにしました。比較対象としたのは、秋月でも売っているAVRを使ったAT90USBKeyのコードとSTM32用のUSB Developer Kitです。

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