本文將從USB的 插入檢測、 身份識別、 數據傳輸三個方面對USB通信整個過程掃盲,其中有些知識點的詳細信息會放在文章最下面的附錄中供查看,從而保證文章的總體簡潔。在進入主題以前,首先了解一下USB的一些基礎知識
USB的分類 學習
按接口類型分spa
按照USB速度分3d
USB接口通常是4根線,VCC GND DM(D-) DP(D+)
Q:主機端將DM DP接入下拉電阻;設備端根據不一樣速度,將DM DP的某一根接上拉電阻,插入時經過壓差便可斷定是否插入code
對於插入的USB設備,主機須要發送比較短的請求來確認設備的身份、類型、速度等信息,這個過程稱之爲 枚舉
設備的「身份」信息存儲在描述符中。每一個USB設備中都有以下描述符。須要注意的是blog
- 一個USB設備只能有一個設備描述符
- 其餘描述符均可以有多個,對應複合設備,例如USB鍵鼠
設備描述符(device description)索引
配置描述符(config description)接口
接口描述符 (interface description)圖片
接口描述符事務
配置描述符ip
接口描述符
80 06 01 00 00 00 12 00
00 05 01 00 00 00 00 00
80 06 01 00 00 00 12 00
80 06 02 00 00 00 09 00
搞懂了描述符,調好了枚舉,就完成了USB通信的一大半,下面就對描述符進行詳細的探索
設備描述符 | 18 | 配置描述符 | 9 | 接口描述符 | 9 | 終點描述符 | 7 |
bLength | 1 | bLength | 1 | bLength | 1 | bLength | 1 |
bDescriptorType | 1 | bDescriptorType | 1 | bDescriptorType | 1 | bDescriptorType | 1 |
bcdUSB | 2 | wTotalLength | 2 | bNumInterfaces | 1 | bEndpointAddress | 1 |
bDeviceClass | 1 | bNumInterfaces | 1 | bAlterateSetting | 1 | bmAttributes | 1 |
bDeviceSubClass | 1 | bConfigurationValue | 1 | bNumEndpoints | 1 | wMaxPacketSize | 2 |
bDeviceProtocol | 1 | iConfiguration | 1 | bInterfaceClass | 1 | bInterval | 1 |
bMaxPackeerSize0 | 1 | bmAttributes | 1 | bInterSubfaceClass | 1 | ||
idVendor | 2 | bMaxPower | 1 | bInterfaceProtocol | 1 | ||
idProduct | 2 | iInterface | 1 | ||||
bcdDevice | 2 | ||||||
iManufacturer | 1 | ||||||
iProduct | 1 | ||||||
iSerialNumber | 1 | ||||||
iNumConfigurations | 1 |
學習協議我我的以爲應該仍是從總體流程向下詳細到具體協議,上來就看最基本單元/協議會讓人一頭霧水,這段附錄的大致流程也是如此。傳輸概念->傳輸流程->基礎傳輸單元->傳輸流程控制->
- 在USB的通信中,有傳輸(transfer),事務(Transaction),包(packet)三級。包是最基礎的傳輸單元,與TCP/IP協議中的MAC層協議做用相同。
- 在一次傳輸中,由屢次事務組成,每次的事務又由多個包組成
- 與衆多協議相同,較高級別的協議的報文是基於/內嵌在低級協議的報文當中的,在USB中也不例外,例如,包中預留了DATA位,其目的就是填寫報文
傳輸(transfer): 控制(control)、中斷(interrupt)、批量(bulk),同步(Isochronous)
事務(transaction):傳輸方向、流程控制
包(packet):
下圖爲一次完整的獲取設備描述符的過程
傳輸:獲取設備描述符
設置事務:主機向設備下發 -> 80 06 00 01 00 00 40 00
輸入事務:設備向主機上發 -> 12 01 00 01 DC 00 00 10 71 04 F0 FF 00 01 00 00
輸出事務:無
不一樣包的組成部分以下表所示,數字爲每個字段所表明位數。結合上面的完整流程能夠更輸入的理解包的概念。
Token 令牌包 | SYNC | PID | ADDR | ENDP | CRC5 |
8/32 | 8 | 7 | 4 | 5 | |
Data 數據包 | SYNC | PID | DATA | CRC16 | |
8/32 | 8 | 0-1023 | 16 | ||
Handshake 握手包 | SYNC | PID | |||
8/32 | 8 | ||||
SOF 起始包 | SYNC | Frame Number | CRC5 | ||
8/32 | 11 | 5 |
SOF包:在Token包以前發送,Frame Number爲主機內部自增序列號,不斷循環
在分析那個設備描述符的流程時會發現,必須在每次事務的開始,要使用Token(令牌包)確認該次事務的傳輸「基調」。緣由在於,USB是半雙工,DM DP並不是獨立工做,因此採用"三段式"通信,保證總線不會衝突
- 令牌包(Token):主機發起
- 數據包(Data):根據令牌包中的方向,由主機發起(OUT/SETUP)或者設備發起(IN)數據包
- 握手包(Handshake):數據包接收方發起握手包,返回狀態,包含ACK NAK STALL狀態等。
終於說到頂層部分了,有點耐心立刻就說完了,首先傳輸分爲如下幾種方式,對應不一樣需求
傳輸方式 | 令牌包 | 數據包 | 握手包 | 特色及醫用 | 特殊性 |
控制 | ✔ | ✔ | ✔ | 枚舉過程當中使用 | 屢次事務,簡單的下發命令+回覆須要2次事務6個包 |
批量 | ✔ | ✔ | ✔ | 數據量大,要求準確性,經常使用於U盤等設備 | 屢次事務,DATA0/DATA1交替 |
中斷 | ✔ | ✔ | ✔ | 數據量小,要求固定頻率,經常使用於USB鍵盤鼠標 | 與批量類似,主機會按照固定間隔向設備發令牌包 |
同步 | ✔ | ✔ | × | 數據量大,要求低延遲,經常使用於USB攝像頭、聲卡 | 無握手包的批量傳輸 |
控制傳輸經常使用於USB枚舉階段,讀取設備描述符、設置地址等少許頻繁的工做。上面舉的獲取完整設備描述符就是一個很是典型的控制傳輸過程,分爲如下幾個階段
中斷傳輸在數據傳輸方面與批量傳輸相同,重點在於,主機對中斷傳輸設備必須 保持固定掃描間隔,在設備描述符中標註了該掃面間隔。USB總線即便被其餘設備批量傳輸佔用,也會在完成中間抽空向中斷傳輸設備下發令牌
由於要求實時性,對數據準確性不是很敏感,因此同步傳輸中的事務是沒有握手包的,以下圖
命令 | bmRequestType | bRequest | wValue | wIndex | wLength | Data |
GET_STATUS | 0 | 無 | ||||
CLEAR_FEATURE | 1 | 無 | ||||
SET_FEATURE | 3 | |||||
SET_ADDRESS | 5 | 設備地址 | 0 | 0 | 無 | |
GET_DESCRIPTOR | 80H | 6 | 描述符類型+索引 | 0/languageID | 描述符長度 | 描述符 |
SET_DESCRIPTOR | 7 | |||||
GET_CONFIGURATION | 8 | |||||
SET_CONFIGURATION | 00H | 9 | 00xxH 配置值,高字節固定00 | 0 | 0 | 無 |
GET_INTERFACE | 10 | |||||
SET_INTERFACE | 11 | |||||
GET_STATUS | 12 |
D7 | D6-D5 | D4-D0 |
0:OUT 1:IN |
00:標準請求 01:類請求 10:用戶自定義 |
00:設備01:接02:端03:其餘 |