USB 2.0 與USB EHCI 硬件接口

USB 2.0 與USB EHCI 硬件接口

USB 2.0

總線枚舉 (bus enumeration)

數據流

usb 數據傳輸發生在主機軟件和usb 設備上特定的端點(endpoint)之間。這種主機軟件和usb設備端點之間的邏輯通路叫做pipe. pipe 的兩端是主機usb device driver的一塊buffer和usb device的一個endpoint。pipe之間是獨立的,一個USB device工作的過程中可能會存在多個pipe.一個pipe在形成的時候就進行一種數據傳輸。軟件一般通過傳輸類型+設備號+端點號+傳輸方向產生pipe的唯一標示號。

pipe 根據是否規定事務階段(transaction)分爲兩種類型:
stream pipe
控制傳輸、塊傳輸、中斷傳輸建立起來的都是stream pipe。
message pipe
message pipe 只有控制傳輸。
幾個名詞

  • 事務(transaction): 由packet構成,一個事務由令牌包,數據包和握手包構成。根據令牌包的類型會有SETUP事務,IN事務,OUT事務和其他事務等。
  • 階段(stage):在控制傳輸中,構成message pipe, 分爲三個階段,setup階段,數據階段和狀態階段。每個階段會有多個事務構成。
  • 傳輸(transfer): 一系列的事務構成傳輸。

控制傳輸(control transfers)

在這裏插入圖片描述在這裏插入圖片描述
在setup階段中由data階段的數據方向和長度,因爲0號端點支持雙向,從setup當中獲取到方向後準備相應的buffer。

塊傳輸(bulk data transfers)

在這裏插入圖片描述

中斷傳輸(interrupt data transfers)

有延遲要求的數據傳輸被稱作中斷數據。這類數據由usb device在不確定的時間產生,由usb在不低於指定的速率下傳輸。
最典型的中斷數據是事件通知、字符、座標這些若干字節的數據。典型的例子是鼠標點擊是發送的座標數據,這種數據需要usb限制響應時間(在指定時間內做出響應)。
在這裏插入圖片描述

同步數據傳輸(isochronous data transfers)

佔據一個預先協商好的usb帶寬,也被稱作實時流傳輸。同步數據是以穩定的速率傳輸的數據,比如音頻和視頻數據,usb分配專用的一部分帶寬來傳輸同步數據以保證數據的穩定速率。
在這裏插入圖片描述
在這裏插入圖片描述
usb 系統數據流模型如上圖,相關的部分有

  • usb device: usb 設備實現具體功能的部分,需要與usb 主機連接。
  • client software(usb device 驅動): 運行在主機上,跟usb device 一一對應。
  • usb system software: usb系統軟件,usb host驅動,是操作系統用來支持usb總線用的。跟usb device和client software 獨立。
  • usb host controller

USB全速和低速標準以1ms間隔劃分時間爲幀(frame), 高速標準以125us間隔劃分時間爲小幀(micro-frame).
ehci 硬件接口是usb2.0硬件接口標準。規定了echi主機基本寄存器和列表和工作方式。

寄存器接口

內存映射USB主機控制器寄存器

主機控制器寄存器包括兩部分

  • 能力(capability)寄存器組
  • 操作(operational)寄存器組
    在這裏插入圖片描述在這裏插入圖片描述

週期調度

在這裏插入圖片描述

通過ITD管理isochronous 傳輸

在這裏插入圖片描述

通過Queue Head 管理control/bulk/interrupt 傳輸queue head

Queue Head Horizontal Link Pointer指向下一個QH.Current qTD Pointer 指向當前的QTD.
這裏最重要的一部分是transfer overlay區域,這部分區域跟QTD完全一樣,是當前處理QTD的一份cache.
QTD
Queue Head 與QTD一起完成傳輸數據的管理。一個Queue Head管理對應一個endpoint的數據流。Queue head中包含端點的屬性和能力信息。一個QTD管理一個或多個總線事務(transaction), 表示一個傳輸(transfer).
QueueHead處理的步驟如下:

  1. 讀取一個Queuehead
  2. 從overlay area 中執行一次transaction
  3. 將事務的結果寫會到overlay area
  4. 移動到下一個Queue head

在這裏插入圖片描述

工作模式

初始化

  1. 寫入USBINTR使能相應的中斷
  2. 將週期傳輸TABLE基地址寫入PERIODILISTBASE. 如果每個元素中不指向傳輸單元,T標記位爲1.
  3. 設置控制器中斷門限,設置USBCMD中的run/stop標記,開啓控制器
  4. 在CONFIGFLAG中寫1將所有的port路由到ECHI

可以通過USBCMD中的相應位控制開啓異步傳輸和週期傳輸控制。控制器開始工作,port register開始響應設備的插入。並且在使能的高速設備端口發出SOF幀起始信號。

端口路由和控制

在這裏插入圖片描述host 集成根集線器(root hub), roothub是沒有TT模塊的。 usb 主機控制器由一個ehci 和多個xhci構成,如上圖是一個echi和一個伴隨的USB1.1 host control, 每一個物理端口對應一個Transceiver, echi 控制器中有對應與每一個port的狀態和控制寄存器。伴隨USB1.1 host controller中有它所選定的port的狀態和控制寄存器。每一個transceiver 都可以由echi 或者1.1控制器所控制。
在復位時,port 默認由1.1控制器控制,如果系統沒有ECHI,並且有1.1伴隨控制器的情況下,端口會一直保持在全速/低速模式下。當echi 控制器擁有端口時,xhci 不會知道port transceiver的存在,同樣xhci擁有端口時,ehci 也不會知道端口的存在。
端口路由的控制由功能寄存器中的configure flag 和portsc 中的port owner bit 控制,HCSPARAMS寄存器中的N_CC bit 說明硬件中是否有xhci。有configure flag 和 port owner 配合控制端口路由邏輯的狀態轉換圖如下。
在這裏插入圖片描述

掛起和恢復

通過USBCMD run/stop bit 掛起EHCI, 通過PORTSC掛起相應的端口連接的設備。恢復時相反的過程。
設備的掛起和回覆過程中,包括主機主動掛起和恢復port,以及主機檢測到wake up event後回覆。
主機掛起端口後,恢復指定port時,port必須處在掛起狀態,否則設備的動作未定義。主機恢復設備的狀態,端口的port change bit並不會改變。
主機檢測到wake up事件時,端口的force port resume 置爲1,USBSTS中的port change bit 置爲1,如果此時USBINTR中的port change interrupt enable 爲1的話,EHCI會上報中斷。

傳輸策略

usb2.0 最大傳輸速度480Mb/s, 分爲125us長度的小幀,每個小幀能傳60kb.
在這裏插入圖片描述
在每一小幀當中,ECHI首先根據PERIODICLISTBASE + FRINDEX選中一個週期table中的指針開始執行這個元素管理下的鏈表,知道遇到next link pointer當中的Tbit爲1. 此時主機立即釋放週期傳輸結構開始傳輸異步鏈表中的數據,知道這個小幀的結尾。

週期幀鏈表(periodic frame list)
週期幀鏈表是同步傳輸和中斷傳輸的實現基礎。
在這裏插入圖片描述同步傳輸描述符ITD管理同步傳輸數據,queue head(QH)在同步鏈表、異步鏈表管理中斷傳輸,塊傳輸、控制傳輸數據。

異步鏈表(asynchronous list)

異步鏈表是用來支持塊傳輸(bulk transfer)和控制傳輸(control transfer)的。
在這裏插入圖片描述host controller 優先遍歷週期幀鏈表,遇到週期幀鏈表中的結束標誌時,纔會處理異步鏈表。所以同步傳輸和中斷傳輸這兩種受時間限制的數據優先級是高的,塊傳輸控制傳輸在異步鏈表中處理的傳輸優先級低。

小幀完整性

usb2.0 一小幀中能夠傳送的最大bit數爲60kbit, 也就是7500byte. 這裏存在的一個問題是如何確定在一個小幀中能夠發送的事務的數量。小幀的結束點由於2.0的物理限制定義有EOF1和EOF2, 所以能夠利用的有效帶寬是SOF到EOF1, 在接近EOF1時的時間區間內,對於不同的包長,在保證事務完整的情況下的最晚發送時間點不同。最後截止時間點的計算非常重要,它影響到帶寬的利用率。

在這裏插入圖片描述上圖所示的圖中f(x)是一種近似逼近最後開始時間點曲線的方法。y軸是距離EOF的字節時間,x軸是發送事務的最大包長。對於最大包長1的包來說,小幀開頭就是位於7500的點,80%帶寬曲線是小幀中能發送事務數量的80%的時間點,最後開始時間位置是EOF1之前可以啓動一個包長爲1的事務的時間點。
這個近似曲線的算法通過一些經驗值進行了近似。如下

Alorithm CheckTransactionWillFit (MaximumPacketSize, HC_BytesLeftInFrame)
Begin
Local Temp
= MaximumPacketSize + 192
Local rvalue = TRUE
If MaximumPacketSize >= 128 then
Temp += 128
End If
If Temp > HC_BytesLeftInFrame then
Rvalue = FALSE
End If
Return rvalue
End

這個算法有兩個輸入,當前最大的包長度和硬件的當前小幀還剩餘可傳輸字節數的計數器。它無條件的加192,用來估計事務的overhead和bit stuffing. 在包長大於128時,加上一個128來估計大包長帶來的附加bit stuffing. 用這種方法可以更好的逼近最後開始時間曲線。

USB Device

設備狀態
在這裏插入圖片描述

set configuration request

address state:
usb device收到set confiugration request
If the specified configuration value is zero, then the device remains in the Address state. If the specified configuration value matches the configuration value from a configuration descriptor, then that configuration is selected and the device enters the Configured state. Otherwise, the device responds with a Request Error.
configured state:
usb device收到set configuration request
If the specified configuration value is zero, then the device enters the Address state. If the specified configuration value matches the configuration value from a
configuration descriptor, then that configuration is selected and the device remains in the Configured state. Otherwise, the device responds with a Request Error.

Bus Enumeration (總線枚舉)##

當USB設備連接或者從USB總線上移除時,主機使用被稱爲總線枚舉的過程來識別和管理USB設備的狀態變化。當USB設備鏈接到USB供電端口時,將會進行下面的動作:

  1. USB設備接入的hub(root hub)相應port的狀態位改變給主機上報一箇中斷。這時,USB設備處在powered state, 相應的port是disabled的。
  2. 主機處理終端查看此時port接入的設備的狀態。
  3. 此時主機獲知設備連接到的port,主機會等待至少100ms等待插入動作完成和電源供電穩定,接下來,主機發出port enable 和reset command,(集成root hub的ECHI完成這兩個動作是設置相應的寄存器)
  4. hub執行需要的復位動作。當reset 信號結束時,port就被enable。此時USB device 處在default狀態,會從vbus中獲取不超過100mA的電流。USB device所有的寄存器都被複位,並處在默認address。
  5. 主機分配一個默認的地址給USB device,USB device的狀態轉換到address state。
  6. 在USBdevice獲得唯一的地址之前,他的默認control pipe還是通過default address來訪問。主機獲取設備device descriptor 來決定usbdevice default pipe的最大數據payload。
  7. 主機從設備讀取configuration information通過獲取設備的configuration 0 ~n-1,這裏的n是configuration的數目。這個過程大概需要幾毫秒的時間。
  8. host獲取配置信息後,基於這些信息,host決定如何使用device,host會向device發送一個configuration value選擇指定的congfiguration。 現在設備會處在configured state,所有在configuration 中的端點都一描述的屬性特徵就位。此時USBdevice 現在會以configuration中描述的電流值獲取電流。從設備的角度看現在設備處於可用狀態。

當USB 設備被移除時,hub向host發出通知。移除設備時會disable掉指定的port,主機獲取通知後會更新它的本地拓撲信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章