Linux usb 1. 總線簡介


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 AType 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 KChirp JSE0 信號定義:

信號 低速模式
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 DeviceComposite 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 設備,在 DeviceConfigurationInterfaceEndpoint 每個層次上都有對應的描述信息。可以使用 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 TransfersIsochronous Transfers。在時間片剩下的額度內傳輸對時間延遲沒要求的數據,如Control TransfersBulk 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 之間的通訊。

  • 簡要的通訊模型:
    在這里插入圖片描述

  • 詳細的通訊模型:
    在這里插入圖片描述

參考資料

1.USB 2.0 Specification
2.USB中文網
3.USB協通訊議–深入理解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM