標籤:
USB Mass Storage類規範概述
USB Mass storage Device協議即海量存放裝置協議適用於硬碟,隨身碟等大量儲存裝置。協議使用的介面端點有BulkIn、BulkOut和Interrupt端點。該裝置類又包含6個獨立的子類以及3種傳輸協議。
Bulk- Only 傳輸規範僅僅使用Bulk 端點傳送資料/命令/狀態,CBI 傳輸規範則使用Control/Bulk/Interrupt 三種類型的端點進行資料/命令/狀態傳送。
我們手中的隨身碟就是遵循SCSI協議的。要知道隨身碟不僅僅是USB裝置,它還是一種存放裝置,類似硬碟,USB協議本身沒有定義對存放裝置操作的指令,所以需要通過SCSI來完成讀寫等操作。
Microsoft Windows 中提供對Mass Storage 協議的支援,因此USB 行動裝置只需要遵循 Mass Storage 協議來組織資料和處理命令,即可實現與PC 機交換資料。而Flash 的儲存單元組織形式採用FAT16 檔案系統,這樣,就可以直接在Windows的瀏覽器中通過可移動磁碟來交換資料了,Windows 負責對FAT16 檔案系統的管理,USB 裝置不需要幹預FAT16 檔案系統操作的具體細節。
USB成功枚舉之後會在裝置管理員上面顯示USB MassStorage Device(且帶有黃色驚嘆號),否則會顯示unknow device,
而只有在進行UFI(具體是在inquiry命令之後)通訊之後主機才會顯示盤符,且本來在裝置管理員中USB MassStorage Device上的黃色的驚嘆號消失。
因為這個時候USB裝置已經枚舉成功(主機發送的GetDescriptor、SetAddress等之類的請求都回複成功才能正確的枚舉),所以可以通過BusHound來查看在USB UFI Command的情況,USB裝置的枚舉都是通過端點0來實現,而USB UFI Command都是通過端點1來實現,所有的命令的資料流都在端點1。除了BusHound之外,還有很多查看USB匯流排資料的軟體,例如USB View等,查看Flash資料的軟體有winhex。
枚舉過程CATC儀器抓取資料的檔案:http://download.csdn.net/detail/luckywang1103/6315437 usbUFI.usb
1、GetMaxLun(0xFE)
1)Setup Stage
2)Data Stage
3)Status Stage
以上這個階段對應的程式是
case GetMaxLun: //實際上對隨身碟來說,忽略該步驟也沒有影響 //要求裝置返回一個位元組給主機,以表明USB裝置有多少個 //邏輯裝置,返回的資料就是這個最大裝置邏輯號(0到15) //如果返回2,代表有0、1、2三個邏輯裝置 SFR_Write(FIFO0,0x00); SFR_Write(E0CSR,0x0a);break;
接下來開始在端點1進行UFI Command傳輸
UFI Command構成如下:CBW—>資料—>CSW,三個階段
CBW:Command Block Wrapper 命令塊資料包
CSW:Command Status Wrapper 命令執行狀態
2、Inquiry Command(0x12)
1)CBW
主機在端點1所發出的UFI Command的DATA0資料可以對照圖Table 5.1進行解析。
dCBWSignature:55 53 42 43 help identify this data packet as CBW
dCBWTag:90 C8 E8 88 Command Block Tag send by host
dCBWDataTransferLength:24 00 00 00 data numbers that host expect to transfer on the Bulk-In or Bulk-Out endpoint
剩餘的12 Bytes就是CBWCB:12 00 00 00 24 00 00 00 00 00 00 00
CBWCB(CBW裡面的command block)12個位元組的解析參考《USB Mass Storage Class-UFI Command Specification》
12:Inquiry Command
24:Allocation Length specifies the maximum number of bytes of inquiry data to be returned,資料階段最大傳送36 Bytes
2)Data In
這36 Bytes是按照Inquiry data的格式要求返回的,具體協議資料的分析參考《USB Mass Storage Class-UFI Command Specification》
3)CSW
dCSWSignature:55 53 42 53 help identify this data packet as CSW
dCSWTag:90 C8 EB 88 CSW的這個欄位同CBW的dCBWTag欄位
3、Read_Format_Capacity(0x23)
1)CBW
2)Data
3)CSW
4、Read_Capacity(0x25)
1)CBW
2)Data
3)CSW
5、Read_10(0x28)
上面幾個請求如果均正確返回,Host會發出Read讀檔案系統0簇0扇區的DBR資料,進入檔案系統識別階段。
1)CBW
2)Data
3)CSW
6、ModeSense6(0x1A)
1)CBW
2)Data
3)CSW
7、重複第6步,ModeSense6(0x1A)
8、重複第4步,Read_Capacity(0x25)
9、重複第4步,Read_Capacity(0x25)
10、重複第5步,Read_10(0x28)
11、重複第5步,Read_10(0x28)
12、重複第4步,Read_Capacity(0x25)
13、重複第4步,Read_Capacity(0x25)
14、重複第5步,Read_10(0x28)
15、Test Unity Ready(0x00)
1)CBW
3)CSW
16、重複第4步,Read_Capacity(0x25)
17、重複第4步,Read_Capacity(0x25)
18、重複第4步,Read_Capacity(0x25)
19、重複第5步,Read_10(0x28)
20、接下來一直會重複Test Unity Ready(0x00)
說明:
MASS Storage裝置所使用的SCSI命令集
0x00: testUnityReady
0x03: Request Sense
0x12: Inquiry
0x1A: ModeSense6
0x1B: StartStop
0x1E: MediumRemoval
0x23: ReadFormatCapacity
0x25: ReadCapacity
0x28: Read10
0x2A: Write10
0x2F: Verify
0x5A: ModeSense10
主機首先發出Inquiry命令,響應了Inquiry之後就可以看到盤符.
Inquiry之後會發出ReadFormatCapacity命令,這個命令在SCSI規範中是“廠家自訂命令”,可以參考UFI命令集文檔(實際
上,隨身碟所使用的所有SCSI命令集都可以參考UFI文檔,它比SCSI標準文檔更簡潔明了)。注意這個命令在BusHound裡是沒有描述的,必須在
“Device”選項頁裡勾選上這個隨身碟所對應的USB Mass Storage Device這個節點,才能看到這個命令的資料流。
ReadFormatCapacity之後會發出ReadCapacity命令。
隨身碟讀資料(讀扇區)時會發送Read(10)。ReadCapacity完成後就會發送Read(10)讀取隨身碟的第一個扇區。
隨身碟寫資料時(寫扇區)會發送Write(10)。
TestUnitReady會在無其他資料轉送時會定時發送,如果裝置沒有回應成功的CSW給主機,則主機認為裝置已不存在。此時如果再雙擊磁碟圖
標,Windows會提示“請插入磁碟”。
Verify在寫資料時有用,表示核實資料,一般直接返回成功的CSW就可以了。一般來說,資料校正的工作在接收和向介質寫資料時就已經順帶做了,如果發
現錯誤,則直接告訴主機那次的資料轉送有誤,不會等到主機Verify時。當然,這不是一個必然的方案。
RequestSense:如果CSW指示此次傳輸不成功,那麼主機會發出此請求。
StartStop暫時未發現大用處,一般直接返回成功的CSW。
MediumRemoval在隨身碟被Eject的時候有用,處理不正確會Windows會彈出錯誤資訊。
ModeSense6/10這兩個命令可以不支援(不支援不代表不反應,任何一個命令你都要做出反應,對於不支援的命令,可以通過STALL握手來向主機
表明),暫時也未遇到過什麼異常情況,而且我查看過一些隨身碟,有相當一部分就是隨便回了幾個資料給主機。這兩個命令只會在隨身碟插入後發送一次,此後不再發
送。
電子工程師名片——UFI Command,USB盤符的顯示