USB插拔數據控制傳輸

 

    USB Mass Storage中的BBB協議、SCSI協議的命令塊傳輸傳輸,

USB插拔數據
1. 控制傳輸部分

第二週->三、Bus Hound抓包學習->2. USB插拔數據->控制傳輸、
2. 數據傳輸部分
參考文檔和資料

USB Mass Storage協議
USB Mass Storage大容量存儲的基本知識
0. 基礎知識
0.1 相關協議

數據傳輸依託SCSI協議,傳輸CBW和CSW命令塊和數據塊。

    Host和Device間數據通訊協議是Bulk-only Transport。也稱爲BBB協議,這是與CBI對應的一種說法。因爲CBI是指Commond、Bulk和Interrupt。而對於Bulk-only所有的傳輸都是通過BULK EP完成。

    USB Device內部和數據存儲介質之間通信協議爲SCSI(Small Computer System Interface)。

    USB 設備中的固件(firmware)或者硬件(hardware),必須要實現下面這些功能:
    檢測和響應通用的USB Request和USB總線上的事件。
    檢測和響應來自USB設備的關於信息或者動作的USB Mass Storage Request。
    檢測和響應從USB Transfer中獲得的SCSI Command。這些業界標準的命令,是用來獲得狀態信息,控制設備操作,向存儲介質塊中讀取(read block)和寫入(write block)數據的。
    image.png
    USB Mass Storage相關協議

    USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport
    USB Mass Storage Class Bulk-Only (BBB) Transport
    USB Mass Storage Class Universal Floppy Interface (UFI) Command Specification
    USB Mass Storage Class Bootability Specification
    USB Mass Storage Class Compliance Test Specification
    USB Lockable Storage Devices Feature Specification (LSD FS)
    USB Mass Storage Class USB Attached SCSI Protocol (UASP)

U盤和PC之間的交互主要關心以下幾個協議:SCSI、BBB和UASP協議(提高USB利用率,提高傳輸速度後是UASP協議)。
0.2 IN和OUT事務傳輸

批量純屬分爲IN和OUT,IN和OUT事務傳輸過程。
image.png
image.png
0.3 三種返回包:ACK(確認)、NAK(未確認)、STALL(不支持的控制請求)

    **ACK(確認):ACK(確認) 表示主機和設備已經收到數據,沒有出現錯誤。**設備必須在Setup 事務的交換包中返回ACK,設備也必須在OUT事務的交換中返回ACK。主機在IN事務的交換包中返回ACK。
    **NAK(未確認):NAK(未確認) 表示設備正忙或沒有數據要返回。**如果主機在設備太忙而不能接受數據時發送數據,則設備在交換包中發出NAK。如果主機在設備沒有數據可發送時向設備請求數據,則設備在數據包中發出NAK。在上述兩種情況的任何一種下,NAK表示一個暫時的狀況,而主機會在以後重試。
    **STALL:不支持的控制請求,控制請求失敗或終端失敗。當一個設備接收到一個終端不支持的控制傳輸請求,那麼這個設備返回一個STALL 給主機。**設備在它支持這個請求但是由於某些原因不能採取請求的動作時,也會發出STALL給主機。STALL 的另一個用途是在終端暫停特性設置的情況下來響應傳輸請求,表示終端根本不能發送或接收數據。規範稱這個類型的延遲爲功能延遲。批量和中斷終端必須支持功能延遲。在接收到一個功能STALL後,主機停止所有與設備懸而未決的請求,並且不會恢復通信直到它已經發送一個成功的請求來清除設備的暫停特性。主機絕不會發送STALL

3. SCSI命令
3.0 基本概念

    CBW(Command Block Wrapper):包含命令塊和相關信息的數據包
    **CSW(Command Status Wrapper):**包含命令塊狀態的數據包
    **Data-In:**設備到主機的數據傳輸
    **Data-Out:**主機到設備的數據傳輸
    **Phase Error(相位誤差):**從設備返回的處理結果,在設備復位之前後續的CBW是不確定的
    Processed:接收到數據,而且設備到主機端點的內部控制不再需要考慮
    Relevant:發送到主機的數據是有意義的。
    Reset Recovery:一個錯誤恢復過程,主機可以給設備準備好下一個CBW。

3.1 Bulk-Only Mass Storage Reset (class-specific request)

用來重置大容量存儲設備和相關接口,這個類請求可以讓設備準備好接收CBW。
bmRequestType爲:類定義請求,請求爲專屬接口,主機到設備。
wIndex爲相關接口數字
image.png
3.2 Get Max Lun

Get Max Lun請求用來確定設備支持的邏輯單元數量,數量從0(00h)到15(Fh)連續,發送此請求需要發送以下命令:
bmRequestType爲:類定義請求,請求爲專屬接口,設備到主機。
image.png
設備返回一個字節的數據包含設備的邏輯單元數量,返回值爲x,則設備有(x+1)個邏輯單元。
3.3 主機/設備數據包傳輸順序

主機寫(Data-Out)之前需要發送一個CBW命令。
主機在讀(Data-In)之前需要發送CBW命令,讀之後需要發送CSW命令。
主機可以在發送相關CBW之前進行讀或者發送CSW命令。
3.4 Command Queuing(命令隊列)

    主機收到上一個的CBW的CSW之前不能發送CSW。
    主機連續發送兩個CBW,中間沒有復位和CSW的發送,設備對第二個CBW的響應是不確定的。

3.5 Bi-Directional Command Protocol(雙向命令協議)

單個命令中不能進行雙向數據傳輸。
3.6 SCSI在Mass Storage中常用指令集

相應的迴應在:
image.png
4. 描述字
4.1 設備描述字、配置描述字->鏈接
4.2 接口描述字

接口描述字包含設備實現的功能和特性的信息,含有類、子類和協議以及接口使用的端點數量。
每個接口有自己的接口描述字和附屬描述字,每個接口含有一個或多個接口設置,同一個接口的設置都是互斥的,每次只有一個設置被激活。(鏈接《USB開發大全》70-71頁:詳細字段內容介紹)
image.png
4.3 端點描述字
4.3.1 Control(控制傳輸)

除了端點0外(梭有設備都支持端點0)每一個端點有一個端點描述字。設備描述字含有最大信息包尺寸以及端點的全部信息。端點描述字作爲配置描述字的附屬描述字而被髮送給主機。(鏈接《USB開發大全》71-73頁)
image.pngimage.png
image.png
4.3.2 Bulk-In端點

Bulk-In端點用於將數據和狀態從設備發送到主機。
image.png
4.3.3 Bulk-Out端點

Bulk-Out端點用於將命令和數據從主機發送至設備。
image.png
5. Bulk_Only數據傳輸過程(命令、數據和狀態傳輸過程)

image.png
5.1 CBW(Command Block Wrapper)命令塊

CBW傳輸的字節數爲31(1Fh)。按照小端格式(低地址存放字數據的低字節,高地址存放字數據的高字節,與之相反爲大端格式)排列。
image.png

    dCBWSignature:幫助識別爲一個CBW數據包,包含43425355h(小端)
    **dCBWTag:**主機發送的對一個CBW塊進行標記,設備需要在CSW的dCSWTag中將相應的內容反饋給主機,dCSWTag可以把CSW同CBW聯繫起來。
    dCBWDataTransferLength:主機期望傳輸的數據長度。
    bmCBWFlags: 定義數據的傳輸方向,由bit7定義(0:Data-Out,1:Data-In),其他比特默認爲0。
    bCBWLUN::設備邏輯單元號(LUN)。對於支持多個LUN的設備,主機把指向的LUN寫在這個字段裏,沒有指向則置零。
    bCBWCBLength:CBW的CB的有效長度
    CBWCB:設備執行的命令塊,這裏是SCSI命令,一般是16字節。設備應將該字段中的第一個bCBWLength字節解釋爲由bInterfaceSubClass標識的命令集定義的命令塊。如果設備支持的命令集使用的命令塊長度小於16 (10h)字節,則優先傳輸有效字節,從偏移量爲15 (Fh)的字節開始。設備將忽略CBWCB字段的內容超過偏移量(15 + bcbwclength - 1)的字節。

image.png
5.2 CSW(Command Status Wrapper命令傳輸狀態包)

CSW傳輸13個字節的數據,按照小端格式,表示CBW傳輸狀態(設備到主機)
image.png

    dCSWSignature:幫助識別此數據包爲CSW的簽名。簽名字段必須包含值53425355h(小端),表示CSW。
    **dCSWTag:**和相應的CBW進行對應。
    **dCSWDataResidue:**主機對設備進行數據寫時,由於dCBWDataTransferLength中規定的預期數據量與設備實際處理的數據量之間存在差異,設備應在dCSWDataResidue中報告Data-Out的數據量。主機對設備進行數據讀時,在設備中,由於dCBWDataTransferLength中預期的數據量與設備實際發送的相關數據量之間存在差異,設備應在dCSWDataResidue中報告Data-In的數據量。dCSWDataResidue不能超過在dCBWDataTransferLength中發送的值。
    **bCSWStatus:**CBW是否傳輸成功,0爲成功,非零爲失敗

image.png
5.3數據傳輸條件(Data Transfer Conditions)

描述傳輸如何保持同步,主機使用CBW的方向和長度域(dCBWDataTransferLength)進行傳輸。設備確定實際的傳輸方向和長度。設備用合適的CSW返回CBW的結果。
image.png
5.3.1 命令傳輸

主機通過Bulk-Out端點發送CBW,每個CBW包含一個命令塊。CBW爲31(1Fh)個字節。
5.3.2 數據傳輸

主機嘗試按照dCBWDataTransferLength和方向位(主機到設備還是設備到主機)進行數據方向和大小的確定。
在數據完成之前設備可以報告錯誤,需要在使用中的端點(數據輸入:Bulk-In端點,數據輸出:Bulk-Out端點)傳輸STALL進行命令終止。
5.3.3 狀態傳輸

設備需要通過Bulk-In端口發送CSW到主機傳輸狀態。一個CSW大小爲13(Dh)個字節。
6. 逐行解析

對以下數據進行逐行解析:
查詢官方文檔獲取相關返回信息數據定義和類型(文檔爲

image.png
6.1 CBW

image.png

    55 53 42 43爲CBW的簽名dCBWSignature(小端格式,實際爲43425355h)
    10 f0 18 8a爲CBW標記塊,連接下面的CSW
    24 00 00 00爲主機期望的數據長度,爲36個字節
    **80(10000000b)**爲數據傳輸方向:爲Data-In:數據讀
    00爲邏輯設備單元號,設備只有一個邏輯設備單元,所以爲0
    06爲CB的有效長度爲6個字節
    **12 00 00 00 24 00 00 00 00…**16個字節的數據爲CBWCB:0x12爲獲取設備信息 0x24爲分配程度36個字節

image.png
6.2 設備返回相關信息image.png

設備返回生產廠家、產品名稱和版本等相關信息,信息格式如下:
image.png
6.3 CSW

image.png
55 53 42 53是CSW的前綴,在2號端口由存儲設備向主機發送數據,10 f0 18 8a爲和6.1的CBW對應的標記塊,後面的00000000表示要傳輸的數據量和CBW中的要求相符,最後的00表示傳輸成功。
6.4 CBW

image.png

    fc000000表示傳輸12+16*15=252個字節的數據
    數據傳輸方向爲數據讀
    0a爲CB的有效長度,爲10個字節
    23 00 000 00 000 00 00fc爲CB的有效數據:在SCSI指令集中0x23爲查詢可用容量及剩餘空間,fc爲最低位

image.png
6.5 返回可用容量和剩餘空間(UFI文檔33-36頁)

image.png
實際返回的是Block(存儲塊)的數量(每塊大小與文件系統有關),並非字節數:
image.png
image.png
image.png
6.6 CSW

image.png
CBW傳輸成功的信號,同上6.3
6.7 CBW

image.png

    主機期望數據長度爲15+15*16=255個字節
    12 01 80 00 ff爲獲取設備信息:0x01爲主機指定設備傳送第一頁的相關信息

6.8 返回設備相關指定信息

image.png
6.9 CSW

表示傳送成功
image.png
6.10 Get Descriptor(獲取設備描述符)

image.png

    0x80爲接收端是設備,標準類型,方向設備到主機
    0x06爲Get Descriptor
    0x0300爲描述符類型爲字符串,索引爲0x00
    0000爲wIndex
    ff(15+16*15)爲設備返回字節數,小於即可
————————————————
版權聲明:本文爲CSDN博主「小森豆丁」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_37769256/article/details/115672978

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章