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. 為了實現(xiàn)USB主機功能的統(tǒng)一,提高系統(tǒng)的可靠性與可移植性,上游芯片生產(chǎn)廠 家在確定USB標準的同時,也確定了相應(yīng)的主機規(guī)范。現(xiàn)在用得比較廣泛的有三種,其中的用于USB2.0高速設(shè)備的EHCI (Enhanced Host Control Interface增強主機控制接口)規(guī)范是INTEL用于USB2.0高速主機的。而同是INTEL推 出的UHCI(Universal Host Control Interface 通用主機)與前Compaq 、Microsoft等推出的OHCI (Open Host Control Interface開放主機控制接口)可用于全速與低速USB系統(tǒng)中,硬件的要求與系統(tǒng)性能、軟件復(fù)雜的要求相對 較低,也能夠滿足大部分的具有USB接口嵌入式系統(tǒng)的要求。而在UHCI與OHCI的對比中,UHCI對硬件的要求相對較少,但對系統(tǒng)的處理能力與軟件的 開發(fā)要求相對要高(PC機就較多地采用了UHCI);OHCI則把較多的功能定義在硬件中,軟件需要處理的內(nèi)容就相對容易,對系統(tǒng)的處理能力和系統(tǒng)資源的 要求就低。因此,在嵌入式的USB HOST功能中,較多地選用了遵循OHCI的規(guī)范的硬件,從而簡化了系統(tǒng)的設(shè)計。 主控器 主控器(HC)控制總線上包的傳輸。使用1毫秒的幀。在每幀開始時,主控器產(chǎn)生一個幀開始(SOF, Start of Frame)包。 SOF包用于同步幀的開始和跟蹤幀的數(shù)目。包在幀中被傳輸,或由host 到設(shè)備(out),或由設(shè)備到host(in)。傳輸總是由host發(fā)起(輪詢傳輸)。因此每條USB總線只能有一個host。每個包的傳輸都有一個狀態(tài) 階段,數(shù)據(jù)接收者可以在其中返回ACK(應(yīng)答接收),NAK(重試),STALL(錯誤條件)或什么也沒有(混亂數(shù)據(jù)階段,設(shè)備不可用或已斷開)。USB 規(guī)范 USB specification的第8.5節(jié)更詳細地解釋了包的細節(jié)。USB總線上可以出現(xiàn)四中不同類型的傳輸:控制(control),大塊(bulk), 中斷 (interrupt)和同步(isochronous)。傳輸?shù)念愋秃退麄兊奶匦栽谙旅婷枋觯╜管道'子節(jié)中)。 USB總線上的設(shè)備和設(shè)備驅(qū)動程序間的大型傳輸被主控器或HC 驅(qū)動程序分割為多個包。 到默認端點的設(shè)備請求(控制傳輸)有些特殊。它們由兩或三個階段組成:啟動(SETUP),數(shù)據(jù)(DATA,可 選)和狀態(tài)(STATUS)。設(shè)置(set-up)包被發(fā)送到設(shè)備。如果存在數(shù)據(jù)階段,數(shù)據(jù)包的方向在設(shè)置包中給出。狀態(tài)階段中的方向與數(shù)據(jù)階段期間的方 向相反,或者當沒有數(shù)據(jù)階段時為IN。主控器硬件也提供寄存器,用于保存根端口的當前狀態(tài)和自從狀態(tài)改變寄存器最后一次復(fù)位以來所發(fā)生的改變。USB規(guī)范 [2]建議使用一個虛擬hub來提供對這些寄存器的訪問。虛擬hub必須符合規(guī)范第11章中給出的 hub設(shè)備類。它必須提供一個默認管道使得設(shè)備請求可以發(fā)送給它。它返回標準和hub類特定的一組描述符。它也應(yīng)當提供一個中斷管道用來報告其端口發(fā)生的 變化。當前可用的主控器規(guī)范有兩個: 通用主控器接口(UHCI;英特爾)和 開放主控器接口(OHCI;康柏,微軟,國家半導(dǎo)體)。 UHCI規(guī)范的設(shè)計通過要求主控器驅(qū)動程序為每幀的傳輸提供完整的調(diào)度,從而減少了硬件復(fù)雜性。OHCI類型的控制器自身提供一個更抽象的接口來完成很多工作,從而更加獨立。 13.2.1 UHCIUHCI主控器維護著帶有1024個指向每幀數(shù)據(jù)結(jié)構(gòu)的幀列表。它理解兩種不同的數(shù)據(jù)類型:傳輸描述符(TD)和隊列頭(QH)。每個 TD表示表示與設(shè)備端點進行通信的一個包。QH是將一些TD(和QH)劃分成組的一種方法。 每個傳輸由一個或多個包組成。UHCI驅(qū)動程序?qū)⒋蟮膫鬏敺指畛啥鄠€包。除同步傳輸外,每個傳輸都會分配一個 QH。對于每種類型的傳輸,都有一個與此類型對應(yīng)的QH,所有這些QH都會被集中到這個QH上。由于有固定的時延需求,同步傳輸必須首先執(zhí)行,它是通過幀 列表中的指針直接引用的。最后的同步TD傳輸引用那一幀的中斷傳輸?shù)腝H。中斷傳輸?shù)乃蠶H指向控制傳輸?shù)腝H,控制傳輸?shù)腝H又指向大塊傳輸?shù)腝H。 下面的圖表給出了一個圖形概覽: 這導(dǎo)致下面的調(diào)度會在每幀中運行。控制器從幀列表中取得當前幀的指針后,首先為那一幀中的所有的同步 (isochronous)包執(zhí)行TD。這些TD的最后一個引用那一幀的中斷傳輸?shù)腝H。然后主控器將從那個QH下行到各個中斷傳輸?shù)腝H。完成那一隊列 后,中斷傳輸?shù)腝H會將控制器指向到所有控制傳輸?shù)腝H。它將執(zhí)行在那兒等待調(diào)度的所有子隊列,然后是在大塊QH中排隊的所有傳輸。為了方便處理已完成或 失敗的傳輸,硬件會在每幀末尾產(chǎn)生不同類型的中斷。在傳輸?shù)淖詈笠粋€TD中,HC驅(qū)動程序設(shè)置 Interrupt-On-Completion位來標記傳輸完成時的一個中斷。如果TD達到了其最大錯誤數(shù),就標記錯誤中斷。如果在TD中設(shè)置短包偵測 位,且傳輸了小于所設(shè)置的包長度(的包),就會標記此中斷以通知控制器驅(qū)動程序傳輸已完成。找出哪個傳輸已完成或產(chǎn)生錯誤是主控器驅(qū)動程序的任務(wù)。當中斷 服務(wù)例程被調(diào)用時,它將定位所有已完成的傳輸并調(diào)用它們的回調(diào)。 更詳盡的描述請看 UHCI specification。 13.2.2 OHCI對OHCI主控器進行編程要容易得多??刂破骷僭O(shè)有一組端點(endpoint)可用,并知道幀中不同傳輸類型 的調(diào)度優(yōu)先級和排序。主控器使用的主要數(shù)據(jù)結(jié)構(gòu)是端點描述符(ED),它上面連接著一個傳輸描述符(TD)的隊列。 ED包含端點所允許的最大的包大小,控制器硬件完成包的分割。每次傳輸后都會更新指向數(shù)據(jù)緩沖區(qū)的指針,當起始和終止指針相等時,TD就退歸到完成隊列 (done-queue)。四種類型的端點各有其自己的隊列。控制和大塊(bulk)端點分別在它們自己的隊列排隊。中斷ED在樹中排隊,在樹中的深度定 義了它們運行的頻度。 幀列表 中斷 同步(isochronous) 控制 大塊(bulk) 主控器在每幀中運行的調(diào)度看起來如下。控制器首先運行非周期性控制和大塊隊列,最長可到HC驅(qū)動程序設(shè)置的一個 時間限制。然后以幀編號低5位作為中斷ED樹上深度為0的那一層中的索引,運行那個幀編號的中斷傳輸。在這個樹的末尾,同步ED被連接,并隨后被遍歷。同 步TD包含了傳輸應(yīng)當運行其中的第一個幀的幀編號。所有周期性的傳輸運行過以后,控制和大塊隊列再次被遍歷。中斷服務(wù)例程會被周期性地調(diào)用,來處理完成的 隊列,為每個傳輸調(diào)用回調(diào),并重新調(diào)度中斷和同步端點。 更詳盡的描述請看 OHCI specification。服務(wù)層,即中間層,提供了以可控的方式對設(shè)備進行訪問,并維護著由不同驅(qū)動程序和服務(wù)層所使用的資源。此層處理下面幾方面:
原文:http://blog.chinaunix.net/u1/34831/showart_1095335.html |