2012年12月9日

[Note] USB2.0 Transfer Architecture

今天整理了一個USB Transfer的架構圖~

Transfer Mode       Data Transaction                 Phase (Packet)
----------------------------------------------------------------
Control Transfer     Setup Stage                        Token   - PID/ADDRESS/ENDPORINT/CRC
(控制傳輸)            (設定階段)                             Data   - PID/DATA/CRC
                                                                            Handshake   - PID
                              --------------------------------------------
                              Data Stage                            Token
                              (資料階段)                             Data
                                                                            Handshake
                              --------------------------------------------
                              Status Stage                         Token
                              (狀態階段)                             Data
                                                                            Handshake
----------------------------------------------------------------
Bulk Transfer         IN/OUT                                Token
(大容量傳輸)       (One or More)                        Data
                                                                            Handshake
----------------------------------------------------------------
Interrupt Transfer   IN/OUT                                Token
(中斷傳輸)           (One or More)                        Data
                                                                            Handshake
----------------------------------------------------------------
Isochronous Transfer   IN/OUT                          Token
(等時傳輸)                 (One or More)                  Data
                                                                            Handshake
----------------------------------------------------------------

1. Control Transfer:

USB中最基本的傳輸單元是Packet,而一筆Transaction則由Token/Data/Handshake 3個packet所構成。 由下面這張Control Transfer的USB trace我們可以看見實際USB運作的情況~與上面的表格去做對應。


圖中Transfer#80為一個Control Transfer,可以進一步拆解成三個Transaction分別為Setup(#49046)/Data(#49048)/Status(#49382),而每一個Transaction又可以再進一步拆解成三個packet(Token/Data/Handshake)。




上圖是一個Token Packet,我們可以看到在一個Token Packet當中主要構成的元素有:
Packet Sync/ PID/ Address/ ENDP/ CRC這五種
1. Packet Sync - 一串K-Chirp,J-Chirp組成,同步封包使用
2. Packet ID - 用來告知Device這次傳送的packet的目的功能是甚麼,常用的有setup/in/out/ack/data0/data1/nack等
3. Address - Device的位置
4. ENDP - 在位置之外,更清楚的標明所要傳送或接收對應的endpoint編號
5. CRC - 錯誤檢查碼



上圖是一個Data Packet,Data Packet構成的元素與Token Packet大同小異,主要有:
Packet Sync/ PID/ Data0/ (Data1)/ CRC這幾種
1. Data0 - Control transfer中的Data phase傳送了8 Bytes的Data,可以分成五個欄位
 => bmRequestType (1 byte) : 命令式樣,資料方向與命令接收對象
           bit7 -> 資料方向。 OUT/沒有Data phase為0,IN為1
           bit6:5 -> 命令式樣。00:標準命令,01:USB device class command,10:廠商自訂命令
           bit4:0 -> 命令接收對象。00000:裝置,00001:機能介面,00010:Endpoint,00011:其他。
 => bmRequest (1 byte) : 命令碼
 => wValue (2 bytes) : 命令相依資訊
 => wIndex (2 bytes) : 命令相依資訊
 => wLength (2 bytes) : 資料階段傳送或者接收的位元數。IN的場合,指最大值


最後是Handshake Packet格式,顧名思義Handshake封包中會利用PID來表示傳送的狀況,
可能會有ACK/NAK/STALL/NYET/ERR等幾種不同的Handshake封包

1 則留言:

大頭鰱 提到...

你好
你有弄過
linux usb gadget driver 嗎?
可以跟你請教嗎?