マイコン工作実験日記

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

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (Tsuneo)
2009-02-23 17:24:31
MSC (Mass Storage Class) をいぢり始めると、最低限どのSCSIコマンドをサポートすべきかというのが気になるところです。1つの拠り所は、USB-IFがMSC適合テストの基準として定めているこのスペックです。

"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
返信する
Re: Unknown (sirius506)
2009-02-23 23:46:58
わたしも最初はどのコマンドを用意すればいいのか全くわからなかったので、調べてみることにしました。いくつもの資料をあたるのも面倒なので、これさえ読めばわかるんじゃないだろうかということで、Jan Axelson の「USB Mass Storage」を買っておもに"SCSI Commands"の章をざっと読んでみました。この本には最低限6種類のコマンドがあれば良いことも明記されていたのですが、 Read format capacities等についてはあまり詳しく書かれていなかったので、実際のコードも調べてみたような次第です。
返信する

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。