電子工程師名片——UFI Command,USB盤符的顯示

來源:互聯網
上載者:User

標籤:

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盤符的顯示

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.