何謂OHCI、UHCI、EHCI?

OHCI, UHCI and EHCI are USB Spec compatible and provide an interface to different hardware host controller implementations. Multiple implementations of hardware host controllers allow for evolution and creativity within the USB Spec.
 
爲了實現USB主機功能的統一,提高系統的可靠性與可移植性,上游芯片生產廠家在確定USB標準的同時,也確定了相應的主機規範。現在用得比較廣泛的有三種,其中的用於USB2.0高速設備的EHCI (Enhanced Host Control Interface增強主機控制接口)規範是INTEL用於USB2.0高速主機的。而同是INTEL推出的UHCI(Universal Host Control Interface 通用主機)與前Compaq 、Microsoft等推出的OHCI (Open Host Control Interface開放主機控制接口)可用於全速與低速USB系統中,硬件的要求與系統性能、軟件複雜的要求相對較低,也能夠滿足大部分的具有USB接口嵌入式系統的要求。而在UHCI與OHCI的對比中,UHCI對硬件的要求相對較少,但對系統的處理能力與軟件的開發要求相對要高(PC機就較多地採用了UHCI);OHCI則把較多的功能定義在硬件中,軟件需要處理的內容就相對容易,對系統的處理能力和系統資源的要求就低。因此,在嵌入式的USB HOST功能中,較多地選用了遵循OHCI的規範的硬件,從而簡化了系統的設計。

主控器

  主控器(HC)控制總線上包的傳輸。使用1毫秒的幀。在每幀開始時,主控器產生一個幀開始(SOF, Start of Frame)包。

  SOF包用於同步幀的開始和跟蹤幀的數目。包在幀中被傳輸,或由host 到設備(out),或由設備到host(in)。傳輸總是由host發起(輪詢傳輸)。因此每條USB總線只能有一個host。每個包的傳輸都有一個狀態階段,數據接收者可以在其中返回ACK(應答接收),NAK(重試),STALL(錯誤條件)或什麼也沒有(混亂數據階段,設備不可用或已斷開)。USB 規範 USB specification的第8.5節更詳細地解釋了包的細節。USB總線上可以出現四中不同類型的傳輸:控制(control),大塊(bulk),中斷 (interrupt)和同步(isochronous)。傳輸的類型和他們的特性在下面描述(`管道'子節中)。

  USB總線上的設備和設備驅動程序間的大型傳輸被主控器或HC 驅動程序分割爲多個包。

  到默認端點的設備請求(控制傳輸)有些特殊。它們由兩或三個階段組成:啓動(SETUP),數據(DATA,可選)和狀態(STATUS)。設置(set-up)包被髮送到設備。如果存在數據階段,數據包的方向在設置包中給出。狀態階段中的方向與數據階段期間的方向相反,或者當沒有數據階段時爲IN。主控器硬件也提供寄存器,用於保存根端口的當前狀態和自從狀態改變寄存器最後一次復位以來所發生的改變。USB規範 [2]建議使用一個虛擬hub來提供對這些寄存器的訪問。虛擬hub必須符合規範第11章中給出的 hub設備類。它必須提供一個默認管道使得設備請求可以發送給它。它返回標準和hub類特定的一組描述符。它也應當提供一箇中斷管道用來報告其端口發生的變化。當前可用的主控器規範有兩個: 通用主控器接口(UHCI;英特爾)和 開放主控器接口(OHCI;康柏,微軟,國家半導體)。 UHCI規範的設計通過要求主控器驅動程序爲每幀的傳輸提供完整的調度,從而減少了硬件複雜性。OHCI類型的控制器自身提供一個更抽象的接口來完成很多工作,從而更加獨立。


13.2.1 UHCI
  UHCI主控器維護着帶有1024個指向每幀數據結構的幀列表。它理解兩種不同的數據類型:傳輸描述符(TD)和隊列頭(QH)。每個 TD表示表示與設備端點進行通信的一個包。QH是將一些TD(和QH)劃分成組的一種方法。

  每個傳輸由一個或多個包組成。UHCI驅動程序將大的傳輸分割成多個包。除同步傳輸外,每個傳輸都會分配一個 QH。對於每種類型的傳輸,都有一個與此類型對應的QH,所有這些QH都會被集中到這個QH上。由於有固定的時延需求,同步傳輸必須首先執行,它是通過幀列表中的指針直接引用的。最後的同步TD傳輸引用那一幀的中斷傳輸的QH。中斷傳輸的所有QH指向控制傳輸的QH,控制傳輸的QH又指向大塊傳輸的QH。下面的圖表給出了一個圖形概覽:

  這導致下面的調度會在每幀中運行。控制器從幀列表中取得當前幀的指針後,首先爲那一幀中的所有的同步 (isochronous)包執行TD。這些TD的最後一個引用那一幀的中斷傳輸的QH。然後主控器將從那個QH下行到各個中斷傳輸的QH。完成那一隊列後,中斷傳輸的QH會將控制器指向到所有控制傳輸的QH。它將執行在那兒等待調度的所有子隊列,然後是在大塊QH中排隊的所有傳輸。爲了方便處理已完成或失敗的傳輸,硬件會在每幀末尾產生不同類型的中斷。在傳輸的最後一個TD中,HC驅動程序設置 Interrupt-On-Completion位來標記傳輸完成時的一箇中斷。如果TD達到了其最大錯誤數,就標記錯誤中斷。如果在TD中設置短包偵測位,且傳輸了小於所設置的包長度(的包),就會標記此中斷以通知控制器驅動程序傳輸已完成。找出哪個傳輸已完成或產生錯誤是主控器驅動程序的任務。當中斷服務例程被調用時,它將定位所有已完成的傳輸並調用它們的回調。

  更詳盡的描述請看 UHCI specification.

 

13.2.2 OHCI

  對OHCI主控器進行編程要容易得多。控制器假設有一組端點(endpoint)可用,並知道幀中不同傳輸類型的調度優先級和排序。主控器使用的主要數據結構是端點描述符(ED),它上面連接着一個傳輸描述符(TD)的隊列。 ED包含端點所允許的最大的包大小,控制器硬件完成包的分割。每次傳輸後都會更新指向數據緩衝區的指針,當起始和終止指針相等時,TD就退歸到完成隊列 (done-queue)。四種類型的端點各有其自己的隊列。控制和大塊(bulk)端點分別在它們自己的隊列排隊。中斷ED在樹中排隊,在樹中的深度定義了它們運行的頻度。

  幀列表 中斷 同步(isochronous) 控制大塊(bulk)

  主控器在每幀中運行的調度看起來如下。控制器首先運行非週期性控制和大塊隊列,最長可到HC驅動程序設置的一個時間限制。然後以幀編號低5位作爲中斷ED樹上深度爲0的那一層中的索引,運行那個幀編號的中斷傳輸。在這個樹的末尾,同步ED被連接,並隨後被遍歷。同步TD包含了傳輸應當運行其中的第一個幀的幀編號。所有週期性的傳輸運行過以後,控制和大塊隊列再次被遍歷。中斷服務例程會被週期性地調用,來處理完成的隊列,爲每個傳輸調用回調,並重新調度中斷和同步端點。

  更詳盡的描述請看 OHCI specification。服務層,即中間層,提供了以可控的方式對設備進行訪問,並維護着由不同驅動程序和服務層所使用的資源。此層處理下面幾方面:

設備配置信息

與設備進行通信的管道

探測和連接設備,以及從設備分離(detach)。


文章出處:http://www.diybl.com/course/6_system/linux/Linuxjs/200883/134587.html

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