今天整理了一個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 嗎?
可以跟你請教嗎?
張貼留言