文章目錄
USB是什麼
- 說法一:you sb,你是沙雕
- 說法二:美國USA的弟弟USB
- 說法三:通用串行總線(universal serial bus)
USB解決什麼問題
簡化PC與外圍設備的連接,增加易用性
因爲外圍設備是各種各樣的,所以的PC有很多種接口,比如早期鍵盤鼠標的PS/2,9針串口,23針並口,DVI,VGA,RJ45,RJ11,HDMI,SATA,PCIE等等,很多接口還是不支持熱拔插的
在比較老的PC中,連接外圍設備時,要斷電,甚至要打開機箱,而且因爲接口的不同,想要支持這些外圍設備,主板就得做各種接口出來,非常的麻煩
如果能夠實現一種統一的接口,主板上不需要做N種接口就能接入任何外圍設備,而且支持熱拔插,傳輸速度也很快,那無疑是幫大忙了
USB是基於此而實現,支持即插即用(plug and play),並且支持熱拔插(hot plug)
USB-OTG
由於USB是主從模式,只能由主機發起通信,從機響應,因而兩個主機或者兩個從機是無法通信的,因此提出了OTG(on to go),同一個設備,在不同場合下,可以在主從之間切換
USB的特點
- USB1.0和USB1.1版本中,支持低速(1.5Mbps)和全速(12Mbps)
- USB2.0加入高速模式(480Mbps),高速模式是可選的,不一定所有USB芯片都支持
- USB3.0(5.0Gbps)
注:bps是每秒多少位
USB的拓撲結構
USB是主從機構,主機叫host,從機叫device
一個主機具有一個或者多個USB主控制器(host controller)和根集線器(root hub)
主控制器負責數據處理,根集線器提供一個連接主控制器與設備的接口和通路
USB集線器(usb hub)對原有的USB口在數量上擴展,但是並不增加帶寬,每一個usb集線器下,又可以接入新的USB集線器,因此可以層層拓展,但是總數是有限制的
通常情況下,一個PC具有多個主控制器,每個主控制器下面有一個根集線器,根集線器下通常具有1-N個USB口,如果希望插入的幾個USB設備具有較大的傳輸速度,可以考慮連接到不同的USB主控上
USB的電氣特性
標準USB是四線:5V電源VCC,地GND,差分數據線正D+,差分數據線D-
OTG中多一根線(ID),用於身份識別,判斷是主還是從
USB2.0的三種傳輸速度:低速(1.5Mpbs)、全速(12Mpbs)、高速(480Mpbs)
USB數據的編碼:NRZI,數據爲0時,電平翻轉;數據爲1時,電平不翻轉
位填充:根據上述,可能存在長時間電平不變化的情況,因此數據出現連續6個1時,強制插入一個0後編碼發送,在接收端,需要檢測並去掉這個0,才能恢復數據
USB的插入檢測機制
主機端:D+和D-分別接15K電阻下地,當懸空時保持爲低電平
從機端:D+或D-接1.5K電阻上拉,具體接到D+還是D-,由速度決定
全速&高速:D+
低速:D-
因此從機接入到主機後,主機端的集線器能檢測到D+或D-的電平出現變化,隨後報告給USB主控制器
USB描述符
USB主機如何知道一個設備的功能、行爲呢,需要通過描述符實現,描述符中記錄了設備的類型、廠商ID、產品ID、端點情況、版本號等衆多信息
qualifier descriptor 和 other speed configuration descriptor 以及一些特殊的描述符不做介紹
如果有特殊描述符,它跟在相應接口描述符之後
-
設備描述符:Device descriptor
一個USB設備只有一個設備描述符,設備描述符裏決定了該設備有多少在種配置,每種配置都對應一個配置描述符
設備描述符主要記錄信息:USB協議版本號、設備類型、端點0的最大包大小、廠商ID、產品ID、設備版本號、廠商字符串、產品字符串、設備序列號、可能的配置數等 -
配置描述符:configuration descriptor
每個配置描述符中,定義了該配置裏有多少個接口,每個接口對應一個接口描述符
配置描述符主要記錄的信息:配置所含接口數,配置的編號、供電方式、是否支持遠程喚醒、電流需求等 -
接口描述符:interface descriptor
接口描述符裏定義了該接口有多少個端點,每個端點對應一個端點描述符
接口描述符主要記錄的信息:接口的編號、接口的端點數、接口所使用的類、子類、協議 -
端點描述符:endpoint descriptor
端點描述符定義了端點的大小、類型等
端點描述符主要記錄的信息:端點號及方向、端點的傳輸類型、最大包長度、查詢時間間隔等 -
字符串描述符:string descriptor
提供一些方便人們閱讀的信息,它不是必須的
在主機獲取描述符時,首先獲取設備描述符,接着獲取配置描述符,然後根據配置描述符中的配置集合的總長度,一次將配置描述符、接口描述符、類特殊描述符、端點描述符一次讀回,對於字符串描述符則是單獨獲取的
USB設備的枚舉過程
枚舉:從設備讀取各種描述符信息
USB主機檢測到USB設備插入後,進行枚舉,根據獲取的信息,加載合適的驅動程序
在設備的枚舉過程中,使用控制傳輸,控制傳輸分爲三個過程:建立過程、可選的數據過程、狀態過程
- 建立過程:它開始於一個setup令牌包,後面緊跟一個data0數據包,後面就是數據過程
- 數據過程:輸入數據或者輸出數據,數據過程後是狀態過程
- 狀態過程:與數據過程相反,是輸出數據或者輸入數據,用來確認所有的數據是否都已經正確傳輸完成
枚舉的詳細過程:
-
主機檢測到設備插入,對設備復位
設備復位後地址爲0,主機通過0地址和剛插入的設備通信,主機往0地址的設備的端點0發送獲取設備描述符的標準請求(這是一個標準傳輸的建立過程),設備收到請求後,返回設備描述符給主機(8字節),主機收到設備描述符確認無誤後,返回一個0長度的確認數據包給設備,進入設置地址階段 -
主機再次對設備復位,設置地址
再一次復位後,進入設置地址階段,USB主機往0地址的設備端點0發出一個設置地址的請求(控制傳輸的建立過程),新的設備地址在建立過程的數據包中,因此沒有數據過程,具體的地址由USB主機管理,分配一個唯一的地址給剛接入的設備。USB設備在接收到請求後,就進入狀態過程,主機會再次發送一個請求狀態返回,這時USB設備返回0長度的狀態數據包,主機收到後,經過確認,發送應答包ACK給USB設備,設備收到ACK後,啓用新的設備地址 -
主機再次獲得設備描述符
主機使用新設置的地址訪問USB設備,這次獲取全部的18字節的設備描述符 -
主機獲取配置描述符
配置描述符共9個字節,主機獲取到配置描述符後,根據配置描述符中所描述的配置集合總長度,獲取配置集合。
配置集合包括配置描述符、接口描述符、類特殊描述符、端點描述符等 -
獲取字符串描述符
如果有字符串描述符的話,可以獲取這個
USB包結構和傳輸過程
包的結構
USB總線上傳輸數據是以包爲基本單位,一個包被分爲不同的域,包的類型不同,包含的域也不同
包有個共同特點,那就是以同步域開始,緊跟一個包標識符,最終以包結束符來收尾
- 同步域:用於告訴USB的串行接口引擎數據就要開始傳輸了,請做好準備,除此之外,同步域還可以用來同步主機端和設備端的數據時鐘
- 包結束符:對於高速設備,用故意的填充錯誤來表示,此時CRC校驗仍然可以通過,因此可以判斷是故意的錯誤填充,而不是數據傳輸錯了;對於全速和低速設備,將D+和D-都保持低電平,時間爲2個數據位寬度
- 包標識符:用來表示一個包的類型,共有8位,只前4位是有效數據,後4位是前4位的取反,用於校驗
包的分類
包的類型:令牌包(token packet)、數據包(data packet)、握手包(handshake packet)、特殊包(special packet)
PID類型 | PID名 | PID[3:0] | 說明 |
---|---|---|---|
令牌類 | OUT | 0001 | 通知設備將要輸出數據 |
令牌類 | IN | 1001 | 通知設備將要輸入數據 |
令牌類 | SOF | 0101 | 通知設備這是一個幀起始包 |
令牌類 | SETUP | 1101 | 通知設備將要開始一個控制傳輸 |
數據類 | DATA0 | 0011 | 數據包 |
數據類 | DATA1 | 1011 | 數據包 |
數據類 | DATA2 | 0111 | 數據包 |
數據類 | MDATA | 1111 | 數據包 |
握手類 | ACK | 0010 | 確認 |
握手類 | NAK | 1010 | 不確認 |
握手類 | STALL | 1110 | 掛起 |
握手類 | NYET | 0110 | 未準備好 |
特殊類 | PRE | 1100 | 前導(這是一個令牌包) |
特殊類 | ERR | 1100 | 錯誤(這是一個握手包) |
特殊類 | SPLIT | 1000 | 分裂事務(這是一個令牌包) |
特殊類 | PING | 0100 | PING測試(這是一個令牌包) |
特殊類 | - | 0000 | 保留 |
令牌包
令牌包用來啓動一次USB傳輸,USB是主從結構,數據傳輸由主機發起,主機發送一個令牌包,通知哪個設備進行響應,如何響應
令牌包分四種:輸出、輸入、建立、幀起始
- 輸出:通知設備將要輸出一個數據包
- 輸入:通知設備返回一個數據包
- 建立:只用在控制傳輸中,通知設備將要輸出一個數據包,但是隻是用DATA0數據包,且只能發送到設備的控制端點,設備必須接收
- 幀起始:在每幀開始時發送,以廣播的形式發送,所有USB設備均可接收到
令牌包結構:
-
OUT、IN、SETUP
| 同步域 | 8位包標識符PID | 7位地址 | 4位端點號 | 5位CRC校驗 | EOP | -
SOF
| 同步域 | 8位包標識符PID | 11位幀號 | 5位CRC校驗 | EOP |
數據包
用來傳輸數據,數據包都具有同樣的結構
| 同步域 | 8位包標識符PID | 字節0 | 字節1 | … | 字節N | 16位CRC校驗 | EOP |
爲什麼同樣用於傳輸數據,會有不同類型的數據包,是因爲傳輸錯誤時需要糾錯
例如:主機向設備發送了一個包,設備接收到並返回確認信號ACK,但是這個ACK在傳輸過程中受到干擾而損壞,主機無法正確獲取ACK,就沒辦法判斷是否傳輸成功
解決辦法:主機和設備都維護自己的一個數據包類型切換機制,發送或接收成功時切換數據包類型,正常情況下,主機和設備的數據包類型保持一致,如果檢測到包的類型不一致,則認爲發生了錯誤,例如當發生上述情況時,主機無法獲取ACK導致主機的數據包切換少了一次,下一次獲取設備發送的包時,就會檢測到包的類型不一致
握手包
握手包用來表示一個傳輸是否被對方確認,握手包只有同步域、PID、EOP,是最簡單的一種數據包
握手包的類型:
- ACK:正確接收數據,並且有足夠的空間來容納數據,主機和設備都可以用ACK來確認,其它3種只能用於設備返回
- NAK:沒有數據需要返回,或者數據正確但是沒有足夠的空間容納,主機接到NAK時,會嘗試重傳,NAK並不代表數據出錯,如果是數據出錯,則什麼都不會返回,等待方會因獲取不到返回而等待超時
- STALL:設備無法執行這個請求,或端點已被掛起,表示一種錯誤的狀態,需要主機進行干預才能解除
- NYET:設備本次數據接收成功,但是沒有足夠的空間容納下一次數據,主機下一次輸出時,應先使用ping試探設備是否有足夠空間
特殊包
特殊包是一些在特殊場合使用的包,總共4種:PRE、ERR、SPLIT、PING,其中ERR是握手包,其餘是令牌包
特殊包的類型:
- PRE:通知集線器打開其低速端口的一種前導包,只用於全速模式中,一般情況下,爲了防止全速信號使低速設備誤動作,集線器不會將全速信號送給低速設備,當收到PRE令牌包時,纔會打開低速端口,接着以低速模式給低速設備發送其它包
- ERR:在分裂事務中表示錯誤
- SPLIT:高速事務分裂令牌包,通知集線器將高速數據包轉化爲全速或低速數據包發送給下面的端口
- PING:該令牌包不發送數據,而是等待設備返回ACK或NAK,用於判斷是否能傳輸數據,它只用於批量傳輸和控制傳輸的輸出事務中
USB的四種傳輸類型
雖然已經定義了基本傳輸單位爲包,但是還需要按照一定的關係將不同的包組織成事務才能傳輸數據
USB事務
事務通常由兩個或三個包組成:令牌包、數據包、握手包
- 令牌包:由主機發送,用於啓動一個事務
- 數據包:存放數據,可以由主到從,也可以由從到主,方向由令牌包決定
- 握手包:由數據接收者發送,將數據接收狀態反饋給發送方
USB協議規定了4中傳輸類型:批量傳輸、同步傳輸、中斷傳輸、控制傳輸
其中批量、同步、中斷每次傳輸都是一個事務,而控制包括三個過程,建立和狀態過程分別是一個事務,數據過程可能包含多個事務
批量傳輸
批量傳輸通常用於數據量大、對數據的實時性要求不高的場合,例如USB打印機、掃描儀、大容量存儲設備等
批量傳輸使用批量事務傳輸數據,一次批量事務有三個階段:令牌包階段、數據包階段、握手包階段
批量輸出事務:
- 主機發送一個OUT令牌包,這個令牌包包含了設備地址、端點號
- 主機發送一個DATA包,這時指定的設備接收DATA包
- 主機切換到接收模式,等到設備返回握手包
- 設備的返回情況
- 設備正確接收數據,返回ACK或NYET
- 設備沒有足夠的空間接收,返回NAK
- 設備的端點處於掛起狀態,返回SALLL
- 設備檢測到有錯誤,不返回,讓主機等待超時
批量輸入事務:
- 主機發送一個IN令牌包,這個令牌包包含了設備地址、端點號
- 主機切換到接收模式,等到設備返回數據包
- 設備返回的情況
- 設備未檢測到錯誤,將數據包放到總線上
- 設備沒有數據需要返回,則使用NAK握手包響應主機
- 設備的端點處於掛起狀態,返回SALLL握手包
- 設備檢測到有錯誤,不返回,讓主機等待超時
- 主機返回的情況
- 主機未檢測到錯誤,使用ACK握手包應答
- 主機檢測到錯誤,不做任何響應,讓設備檢測超時
PING事務:
- 主機發出PING令牌包
- 設備根據情況返回ACK、NAK、STALL握手包
中斷傳輸
- 中斷傳輸通常用在數據量不大,但是對時間要求嚴格的設備中,例如鼠標、鍵盤等,中斷傳輸也可以用於檢測某個標誌位,當條件滿足時進行批量傳輸
- 這裏的中斷,並不是硬件意義上的中斷,而是指由主機按照一定的頻率去發出中斷傳輸請求
- 設備的端點描述符將會報告它的查詢間隔,主機會保證在小於這個時間間隔內安排一次中斷傳輸事務
- 中斷傳輸和批量傳輸結構上基本一樣,只是中斷傳輸沒有PING和NYET兩種包
同步傳輸
用於數據量大、對實時性要求高的場合,例如音視頻設備,但是同步傳輸不保證數據100%正確,因爲它沒有應答包
控制傳輸
控制傳輸分爲三個過程:建立過程、可選的數據過程、狀態過程
- 建立過程:建立事務是一個輸出數據的過程,令牌包是SETUP,數據包只能是DATA0,握手包爲ACK或者不應答
- 數據過程:數據過程是可選的,也可以沒有,如果有的話,可以包含多個方向相同的數據事務,數據過程的第一個包必須是DATA1,正確傳輸一個包後,進行包類型切換
- 狀態過程:狀態過程只使用DATA1包
端點類型與傳輸類型的關係
一個具體的端點,只能工作在一種傳輸模式下,例如:控制端點、批量端點、中斷端點
端點0是每個USB設備都必須具備的默認控制端點,非0端點要設置後才能使用