1. USB 發展歷史
USB(Universal Serial Bus)通用串行總線是非常成功的一種總線技術,應用場景很廣、發展也非常迅速。到現在一共經歷了以下版本:
| Version | App | Speed | Direction | Data Line |
|---|---|---|---|---|
| USB 1.0 | 低速 Low Speed | 1.5Mbps | Half 單工模式 | 1對差分線 D+/D1 |
| USB 1.1 | 全速 Full Speed | 12Mbps | Half 單工模式 | 1對差分線 D+/D1 |
| USB 2.0 | 高速 Hi-Speed | 480Mbps | Half 單工模式 | 1對差分線 D+/D1 |
| USB 3.1 Gen1 | 超高速 SuperSpeed | 5Gbps | Full 雙工模式 | 2對差分線 |
| USB 3.1 Gen2 | 超高速 SuperSpeed+ | 10Gbps | Full 雙工模式 | 2對差分線 |
| USB 3.2 | 超高速 SuperSpeed+ | 20Gbps | Full 雙工模式 | 4對差分線 |
| USB 4.0 | 超高速 SuperSpeed+ | 40Gbps | Full 雙工模式 | 4對差分線 |

1.1 USB 1.0/2.0
在 USB 1.0/2.0 時期只需要用到4根線:1根電源線、1根地線、1對差分數據線。因為只有1條數據通路,所以只能是單工的,同一時間只能是接收或者發送數據。

使用 Type A 和 Type B 型的接口:

還有一系列小尺寸的變種:

1.2 USB 3.0
在 USB 3.0 時代從兩個方向來增加速度:
- 增加傳輸的時鍾速率,速率從480M增加到了5G。高速信號會給PCB走線、EMC、線纜帶來不小的壓力。
- 增加差分數據通路的數量。首先發明了改進型的
USB3.0 Type A接口,在原有4線的基礎上再增加了5條線:

可以看到增加的5條線分別為1條地線和2對差分數據線。因為有了2條數據通路,所以可以雙工,同一時間能同時接收和發送數據。在工作在 USB 3.0 模式時,原來的 D+/D- 差分線是不使用的。

上圖是 USB3.0 Type A 接口示意圖,注意新增的5條線已斷針的形式隱藏在后面,這樣的設計是為了和 USB 2.0 兼容。但是顏色改成了藍色,以示區別。
在 USB 3.0 還出現了一種全新的接口類型 Type C 接口,它帶來了以下好處:
- 接口線數量猛增到了24線,其中數據通路在
D+/D-之外再提供了 4條差分數據線。 - 實現了正反面任意插拔,大大方便了用戶使用。

從 USB 3.2 開始,因為它需要使用 4 對數據差分線,所以目前唯一支持的只有Type C接口。
1.3 速度識別
USB 1.0 和 1.1 通過 D+/D- 的上拉電阻來進行區分:
D+上拉,USB 1.1 Full-speed。D-上拉,USB 1.0 Low-speed。

USB 2.0 High-speed 首先D+上拉,被當成 USB 1.1 Full-speed。然后通過編碼識別來區分 High-speed 和 Full-speed:

- 1、Hub檢測到有設備插入/上電,向主機通報,主機發送Set_Port_Feature請求讓hub復位新插入的設備。設備復位操作是hub通過驅動數據線到復位狀態
SE0(即D+和D-全為低電平),並持續至少10ms。 - 2、高速設備看到復位信號,通過內部的電流源向D-線持續灌大小為17.78mA電流。因為此時高速設備的1.5k上拉電阻未撤銷,在hub端,全速/低速驅動器形成一個阻抗為45Ohm的終端電阻,
1.5k與45Ohm的電阻並聯,仍然是45Ohm,所以在Hub端看到一個約800mV的電壓,這就是Chirp K信號。Chirp K信號持續1ms ~ 7ms。 - 3、在Hub端,雖然設置了復位信號,並一直驅動着SE0,但USB2.0的高速接收器一直在檢測Chirp K信號,如果沒有Chirp K信號看到,就繼續復位操作,直到復位結束,然后識別為全速設備。
- 4、設備發送的Chirp K信號結束后100us內,hub必須開始恢復一連串的KJKJKJ…序列,向設備表明這是一個USB2.0的hub。這里的KJ序列是連續的,中間不能間斷,而且每個K或J的持續時間在40us~60us。KJ序列停止后的的100-500us內結束復位操作。Hub發送Chirp KJ序列的方式和設備一樣,通過電流源向差分數據線交替灌17.78mA的電流實現。
- 5、在回到設備端來。設備檢測到6個hub發送的Chirp信號后(3對KJ序列),它必須在500us內切換到高速模式。切換動作有:
(1)斷開1.5K的上拉電阻
(2)連接D+/D-上的高速終端電阻,實際上就是全速/低速差分驅動器
(3)進入默認的高速狀態。
執行(1)、(2)步后,USB信號線上看到的現象就發生變化,hub發送出來的Chirp KJ序列幅值降到原來的一半,即400mV。這是因為設備端掛載新的中斷電阻,並聯后的阻抗是22.5Ohm。之后高速操作的信號幅度就是400mV,而不像全速/低速那樣的3V。
USB Chirp K、Chirp J、SE0 信號定義:
| 信號 | 低速模式 Low-speed |
全速速模式 Full-speed |
高速模式 High-speed |
|---|---|---|---|
| Chirp J | D+ = 0,D- = 1 | D+ = 0,D- = 1 | D+ = 1,D- =0 |
| Chirp K | D+ =1, D- = 0 | D+ =1, D- = 0 | D+ =0, D- = 1 |
| SE0 | D+ = 0, D- =0 | D+ = 0, D- =0 | D+ = 0, D- =0 |
| IDLE | K狀態 | J狀態 | SE0狀態 |
- 從J到K或者從K到J,信號翻轉,說明發送的信號是0.從J到J或從K到K,信號不變,說明發送的信號是1.
- Chirp J K狀態高速設備與低速設備相反。
對於 USB 3.0 以后的速度識別,暫未研究。
1.4 OTG
USB OTG技術可實現沒有主機時設備與設備之間的數據傳輸。例如:數碼相機可以直接與打印機連接並打印照片, 手機與手機之間可以直接傳送數據等,從而拓展了USB技術的應用范圍。
在OTG中,初始主機設備稱為A設備,外設稱為B設備。也就是說,手機既可以做外設,又可以做主機來傳送數據,可用電纜的連接方式來決定初始角色(由ID線的狀態來決定)。
在 Mini/Micro USB 接口一共有 5 根線,在原有 USB 的基礎上多出了一根 ID 線。OTG的識別是通過ID腳的電平進行決定OTG作為Device還是Host:

當OTG設備檢測到接地的ID引腳時,表示默認的是A設備(主機),而檢測到ID引腳浮空的設備則認為是B設備(外設)。
1.5 phy 總線
USB信號傳輸前,需要通過phy把usb控制器的數字信號轉成線纜上的模擬信號。usb控制器和phy之間的總線主要有3種:
- 1、UTMI (USB2.0 Transceiver Macrocell Interface)。最早的 USB controller和USB PHY通信的協議。

- 2、ULPI (UTMI+Low Pin Interface)。從名字上就可以看出ULPI是UTMI的Low Pin版本

- 3、HSIC (USB 2.0 High Speed Inter Chip)。是USB 2.0的芯片到芯片變體,它消除了普通USB中的傳統模擬收發器。速度可達480M,是IIC的理想替代。

1.6 傳輸編碼方式
USB 信號在線路上傳輸時,需要采取合適的編碼方式。
-
1、USB 1.0/2.0 采用的是 URZI (No Return Zero-Inverse) 編碼。無需同步的時鍾信號也能產生同步的數據存取。NRZI的編碼規則是,當數據位為1時不轉換,當數據位為0時轉換,如下圖所示。位傳輸的順序以LSB優先。

這種編碼方式會遇到一個嚴重的問題,若重復相同的1信號時,就會造成數據長時間無法轉換,逐漸的累積而導致堵塞的情況,使得讀取的時序出現嚴重的錯誤。因此,在NRZI編碼之間,還需執行所謂的位填塞(bit-stuffing)。即是,若原始的串行數據含有連續的6個1時,就執行位填塞工作,填塞一個0。 -
2、USB 3.0 采用的是 8b/10b 編碼。
-
3、USB 3.1/3.2 采用的是 128/132 (64b/66b) 編碼。
2. 總線拓撲
USB 是星型拓撲總線,由 hub 來進行多級擴展。最大的層級不能超過7層,在任何一條路徑上不能超過5個非根hub。

USB 總線由 3 種角色組成:
- Host。星型總線的中心,配置所有Hub和Device,調度總線上所有的數據收發。
- Hub。提供了擴展端口,能連接更多的Device。Hub本身也是一種特殊的Device。
- Device。提供了實際的設備功能。

經過幾種角色的組合以后,USB 總線形成了邏輯上的星型拓撲,Host 到任一 Device 都是點對點傳輸。
2.1 Device 內部的邏輯關系
USB 將 Device 內部的資源進一步細分成了3個層級:Configuration 配置、Interface 接口、Endpoint 端點。

- 1、Configuration 配置
每個USB設備都可以包含一個或者多個配置,不同的配置使設備表現出不同的功能組合,配置有多個接口組成。在USB協議中,接口由多個端點組成,代表一個基本的功能。
看下面的一個例子。一個USB播放器帶有音頻視領功能,還有旋鈕和按鈕。那么這個 Device 設備 可以提供3種 Configuration 配置:
配置1:音須(接口) + 旅鈕(接口)
配置2: 音頻(接口) + 視頻(接口) + 按鈕(接口)
配置3:視頻(接口) + 旋鈕(接口)
- 2、Interface 接口 / Function 功能
Interface 接口代表一個獨立的基本的功能,所以有時也稱之為 Function 功能。如果我們開發 USB Client 驅動,我們面向的對象就是 USB Interface,上述實例中的音煩接口、視頻接口、投鈕接口、旋鈕接口均需要一個獨立的 USB Client 驅動程序。

一個 Interface 接口中包含了完成這個基本功能的所需要的一個或者多個 Endpoint 端點。
- 3、Endpoint 端點 (Pipe 管道)
端點是USB設備中最基本的可尋址單位,它是位於USB設備或主機上的一個數據緩沖區,用來存放和發送USB的各種數據。
設備的Endpoint 0 是一個特殊端點,在設備初始化時系統需要使用該端點讀配置設備。其他編號的端點 USB Client 驅動都可以使用。
一個 Host 主機的端點和一個設備 Device 的端點建立的連接稱之為 Pipe 管道:

2.2 Compound/Composite Device

在 USB 協議描述中,有兩個非常相近的名字:Compund Device 和 Composite Device。正確的理解的它們有助於我們理解清楚隨后的一些概念。
Compund Device。指的是一個 hub 設備中,還包含了其他的功能 device。Composite Device。指的是一個 Device 當中,包含了多個Interface,能提供多個獨立的功能。
2.3 Hub

在 USB 的總線結構中,Hub是一個重要的組成成員,它主要的作用是控制 Port 端口來連接更多的 USB Device設備。
它的核心點如下:usb host需要給總線上的設備分配不同的地址才不會沖突,usb的星形拓撲連接設備都是通過hub的端口連結到總線上的。總線初始化枚舉設備時,usb設備的地址都是默認地址0,但是hub的端口都是關閉的所以並不產生設備沖突,host逐個打開hub的端口,逐個利用打開端口上設備的默認地址0來配置設備,給其分配新的地址,從endpoint 0中讀出設備的配置並設置。在運行過程中usb設備的熱插拔也是和這類似的。
2.4 Configure Descriptor
對於一個 USB 設備,在 Device、Configuration、Interface、Endpoint 每個層次上都有對應的描述信息。可以使用 endpoint0 在設備初始化的時候讀出和配置這些信息。

以下是USB協議中對這些描述信息的詳細定義:

最重要的是設備在初始化時,通過這些信息來進行枚舉配置的過程。一個設備枚舉的過程分為如下8步:
-
1.獲取設備描述符
- Host/Hub通過數據線上拉電阻的阻值變化檢測到新設備接入。Host等待100ms以保證設備電源穩定。
- Host向device發Bus Reset使得設備進入default狀態,從此之后,設備可以響應默認地址0.
- Host請求Device發送Device Descriptor的前64個字節。
-
2.復位
- Host在收到Device Descritptor的前8個字節后,再次向Device發出Bus Reset。
-
3.設置地址
- Host發送一個Set Address命令給Deivce, 從此Device有個通信地址,不再使用默認地址0進行通信。
-
4.再次獲取設備描述符
- Host請求獲取完整的Device Descritpor, 總計18字節。
-
5.獲取配置描述符
- Host請求獲取9個字節的Configuration Descriptor以了解 Configuration descriptor的總大小。
- Host請求255字節的Configuration Descritpor。
-
6.獲取接口,端點描述符
-
7.獲取字符串描述符
-
8.選擇設備配置
3. 總線調度
USB 作為一個高速總線,它需要充分利用起其帶寬,並且能承擔其多種業務類型的數據包的傳輸。
對數據傳輸來說,最重要的有幾種因素 帶寬、時間延遲、完整性校驗。根據這幾種因素的組合,USB 把數據傳輸分成了4類:
| Type | KeyPoint | Sample | Descript |
|---|---|---|---|
| Control Transfers 控制傳輸 |
完整性校驗 |
USB 配置命令 | 突發的、非周期性的,主機軟件發起的請求/響應通信,通常用於命令/狀態操作。 數據量小對帶寬、時間延遲要求不高,但是要求數據必須正確 |
| Isochronous Transfers 等時傳輸 |
帶寬、時間延遲 |
攝像頭 | 等時傳輸:主機和設備之間定期、連續的通信,通常用於時間相關信息。 這種傳輸類型還保留了數據中封裝的時間概念。然而,這並不意味着這些數據的交付需求總是時間緊迫的。 數據量大需要大帶寬、對時間延遲也很高,但是不要求數據必須正確。也正因為前兩者的要求高,也很難做到數據校驗和重傳 |
| Interrupt Transfers 中斷傳輸 |
時間延遲、完整性校驗 |
鍵盤、鼠標 | 低頻、有邊界延遲通信。 對時間延遲要求高,但數據量小所以要求數據必須正確 |
| Bulk Transfers 批量傳輸 |
帶寬、時間延遲、完整性校驗 |
文件存儲 | 非周期性、大包突發通信,通常用於可以使用任何可用帶寬的數據,也可以延遲到帶寬可用。 數據量大需要大帶寬,但對時間延遲也不高,要求數據必須正確。也正因為對延遲要求不高,所以可以做數據校驗和重傳 |
USB使用以下方法來滿足多種類型的數據在一條共享通道上傳輸:
時間延遲。從時間維度上把數據傳輸切成多個時間片,在每個時間片內絕大部分份額(最多80%)優先傳輸對時間延遲有要求的數據,如Interrupt Transfers、Isochronous Transfers。在時間片剩下的額度內傳輸對時間延遲沒要求的數據,如Control Transfers、Bulk Transfers。完整性校驗。對需要保證數據完整性的數據加上了CRC 校驗,接收端使用 ACK 來知會發送端正確接收,如果沒有收到 ACK 發端會嘗試重發 3 次。
3.1 Frames/Microframes

如上圖,USB從時間維度上把數據傳輸切成多個時間片:
- Frames。Low-speed 和 Full-speed 的時間切片大小為 1ms,USB 控制器每1ms重新調度一下傳輸。
- Microframes。High-speed 的時間切片大小為 125us,USB 控制器每125us重新調度一下傳輸。
這個時間切片,和操作系統上 schedule tick 的概念是一樣的。
在數據格式傳輸上又會進一步細分:
- Transfer。每個時間片的所有傳輸稱之為一個 Transfer,或者為一個 Frames/Microframes。
- Transcation。根據某次數據傳輸的目的,一個 Transfer 可以分成多個 Transcation 事務。
- Packet。數據傳輸的最小單位,一個 Transcation 可能由多個 Packet 事務組成。
3.2 Bulk Transactions

上圖可以看到 Bulk 類型的 In/Out Endpint 在數據收發時的狀態流程圖:
- NAK。接收端數據未准備好。
- ACK。接收端接收到數據且數據校驗正確。
- 不回應。接收端接收到錯誤數據,發端會重發 3 次。
3.3 Control Transfers

Control 類型 和 Bulk 類型的處理類似。
3.4 Interrupt Transactions

Interrupt 類型對 完整性校驗 也是有要求,處理流程和前面一樣。
3.5 Isochronous Transactions

Isochronous 類型是唯一對 完整性校驗 沒有要求的,所以它的數據不需要 ACK 回應。
3.6 USB 和 PCIE 調度的區別
PCIE 總線也是一個非常成功和流行的總線,從底層來說它和 USB 總線是非常像的:
-
它也是高速串行總線。
-
它也是共享性的總線。都是把帶寬邏輯切割成多份,分給不同的Device和驅動。

但是它又看起來和 USB 如此的不同,主要的差異就在總線的調度上面: -
PCIE 硬件使用了一個專門的仲裁器來做總線調度,所以在Device配置好以后,所有的 Mem/Io 空間被映射到一個統一地址空間當中,只要發起普通的讀寫操作就能訪問。而USB的總線調度被暴露了出來,需要硬件軟件共同配合才能完成。毫無疑問,PCIE 的硬件復雜度和成本會遠遠高於 USB。
-
另外由於 PCIE 有獨立的仲裁器來進行調度,所以 PCIE 支持多個設備同時操作總線。而 USB 的所有操作都需要 Host 來調度,所以只能由 Host 發起總線操作。從效率來說 USB 要低。
-
還有一點PCIE硬件仲裁器對軟件是透明的,所以軟件讀寫總線是
同步的。而軟件操作USB總線是異步的,通過回調的操作來進行usb和cpu之間的狀態對齊。
4. 傳輸格式
上文說過一個傳輸時間片 Tranfer/Frame/MicroFrame,可以分割成多個 Transaction 事務,一個 Transaction 事務又可以細分成多個 Packet 包。

4.1 Packet
Packet 包是 USB 傳輸的最小單位,由五部分組成:
- 同步字段(SYNC)
- 包標識符字段(PID)
- 數據字段
- 循環冗余校驗字段(CRC)
- 包結尾字段(EOP)

主要的數據包格式有四類,對應不同的 PID 類型:

4.1.1 Token Packet

此格式適用於IN、OUT、SETUP、PING。
4.1.2 Data Packet

有四種類類型的數據包:DATA0, DATA1, DATA2,and MDATA,且由PID來區分。DATA0和DATA1被定義為支持數據切換同步(data toggle synchronization)。
4.1.3 Handshake Packet

ACK: 對於IN事務,它將由host發出;對於OUT、SETUP和PING事務,它將由device發出。
NAK: 在數據階段,對於IN事務,它將由device發出;在握手階段,對於OUT和PING事務,它也將由device發出;host從不發送NAK包。
4.2 Transcation
在USB上數據信息的一次接收或發送的處理過程稱為事務處理(Transaction)即:The delivery of service to an endpoint。一個事務由一系統packet組成,通常的一次 Transaction 由3個Packets組成:Token -> Data -> Handshake。

4.2.1 IN/Read/Upstream Transaction


4.2.2 OUT/Write/Downstream Transaction


4.2.3 Control Transaction
Control Transaction最多由3個Stage組成, Setup stage, Data stage, Status stage。其中Data stage不是必需的,有的control transaction沒有data stage。
-
Control No Data (
Transfer)

-
Control Read (
Transfer)

-
Control Write (
Transfer)

5. 通訊模型
USB 的主要作用就是建立起 Host 和 Device 之間的通訊。
-
簡要的通訊模型:

-
詳細的通訊模型:

