Wednesday, October 01, 2014

USB Mass Storage Class 簡介

USB Mass Storage Class的規格很薄,只有22頁,這邊我是指[Bulk-Only Transport]。因為它是目前最廣泛支援的規格,所以只談這部分,其他的規範,用到再去看即可。

顧名思義,這個規格規範如何只用一個bulk-in跟一個bulk-out endpoint去達成資料傳輸的目的。它首先定義兩個它專屬的 class request:

  • Bulk-Only Mass Storage Reset:就是Transport Layer的reset。至於要做到怎樣,規格寫得很清楚。
  • Get Max LUN:這個就有點模糊了。其實LUN就是Logical Unit Number,也就是這個裝置所支援的[槽(Slot/Drive)]。如果這個裝置支援兩個槽,那Max LUN就是1。

接下來是整個資料的流程(規格書):


HOST先透過bulk-out endpoint送CBW(Command Block Wrapper),如果Device有回ACK,接下來HOST可以收送資料,然後Device送個CSW(Command Status Wrapper),一個命令完成。

下面是CBW的資料格式(規格書):




下面是CSW的資料格式(規格書):


接下來就沒啦,只剩下一些錯誤處理的方式描述。有這麼簡單嘛?當然沒有啦,請注意[Bulk-Only Transport]這個名詞,Transport就是表示這份規格只是一份載具的規格,至於這個載具要搭載甚麼樣的資料,不好意思喔,請看另外的文件。

一般而言,目前市面上隨身碟支援的大多是SCSI command,所以請用google搜尋[scsi command]。這些文件會描述USB Mass Storage Class應該傳輸的資料內容。我手邊的有[SCSI Block Commands - 2 (SBC-2)]、[SCSI Block Commands - 3 (SBC-3)],跟[SCSI Primary Commands - 4 (SPC-4)],但是都是Draft version,據說正式版已經要收錢才可以取得了...。

話說回來,這些文件又臭又長,不過也不必全部都實作啦,只要做一些大家都會用到的命令就可以。雖然如此,大部分的人都是用買來的實作,所以你也不太有機會碰到。但是呢,微軟超機車的WHCK可不會這樣放過你,它會一個一個根據你支援的命令,發出一些很機車的參數,然後看你的裝置可不可以通過它的測試。我曾經被玩過一次,那是在WHCK還叫做WLK的時代,真的是痛不欲生...因為有些通不過的地方,雙方文件都寫得很模糊,根本就是只能用猜的,那真的是只能賭運氣看看怎樣改會過。所以如果你買的實作無法通過WHCK,請乖乖K規格書,然後期待問題不會太多吧。

還有一點要提的是,SCSI commands其實是很底層的命令,所以基本上它都是會存取到實體層的資訊。如果你的USB Mass Storage Class要支援SD卡,那你還得跟SD Host controller打交道才行,如果是NAND Flash的話,那就是要跟NAND controller打交道。

花了一點時間喵了一下,SCSI Primary Commands,應該是定義所有基本的命令,而INQUERY命令內的[PERIPHERAL DEVICE TYPE]欄位則是告訴HOST要套用哪一份文件:



通常NAND跟SD卡都是用SBC-2。SBC-3好像是新版,它相容於SBC-2。

1 comment:

Unknown said...

找資料時候發現這裡
謝謝你的這篇文章 :)

codeblock