??? 摘 要: 為了和通用的嵌入式" title="的嵌入式">的嵌入式處理器協同工作,在 EHCI協議的基礎上對傳輸描述符" title="描述符">描述符和調度策略進行優化會更加有利于實現沒有總線控制權的嵌入式USB主機。在簡單剖析了EHCI協議的調度思想后給出了軟硬件劃分結構和實現方法,軟硬件協同仿真結果證實了設計的正確性。
??? 關鍵詞: EHCI? 傳輸描述符? HTD? 調度
?
??? USB主機控制器" title="主機控制器">主機控制器廣泛應用于PC和便攜式電子設備中。USB主機控制器是USB總線的核心部分,充當著USB總線管理和數據發動者的角色。為了統一高速數據傳輸的軟\硬件接口,Intel公司制定了增強型主機控制器接口EHCI(Enhanced Host Controller Interface)協議,EHCI協議對USB2.0主機的數據傳輸調度進行了詳細描述,使主機控制單元的開發更具規范性。
??? 主機控制器的數據傳輸調度部分與軟硬件劃分方式緊密相關,本文所述結構是位于所開發的一款與嵌入式MCU通用接口相連、沒有總線控制權、面向大容量存儲類設備的IP中。因而本文將重點講述在EHCI協議基礎上針對控制和批量傳輸調度的改進與實現。
1 EHCI協議的調度思想
??? EHCI協議規定了3個接口空間:PCI配置空間、HC寄存器空間和調度接口空間。支持兩種數據傳輸類型:異步傳輸和周期性傳輸。
??? PCI配置空間描述了開發作為PCI設備的USB主機控制器時需要的寄存器。HC寄存器空間由性能寄存器和操作寄存器組成;性能寄存器用于記錄主機控制器的性能參數值;操作寄存器包括命令、狀態、中斷和根集線器端口寄存器,是進行USB控制的最主要接口空間。調度接口空間包括四種傳輸描述符和對應調度策略。
??? 周期性數據傳輸主要包括中斷和同步傳輸,對應描述符為siTD、iTD;異步數據傳輸包括批量和控制傳輸,對應描述符為QH、qTD。所有異步傳輸數據包通過隊列頭QH鏈接成一個環形鏈表" title="鏈表">鏈表,一個QH代表一個端點,利用操作寄存器Asynlistaddr進行初始訪問,QH下鏈接多個傳輸描述符qTD,qTD作為一個傳輸單元對應一個或多個事務處理,可最大尋址20K數據量。創建的傳輸鏈表結構如圖1所示。
?
??? 圖1中三個QH分別代表三個不同類型的端點,而qTD編號則代表了傳輸描述符的調度順序。整個環形鏈表在生存期內一直位于系統內存中。
??? EHCI協議描述的調度思想為:客戶軟件用USB請求塊(URB)的形式向管道請求數據傳輸,主機控制器驅動程序(EHCD)負責跟蹤URB進程并根據數據量的大小生成一條qTD鏈,激活qTD并鏈接在對應端點的QH下,形成圖1所示結構。隨后,EHCD根據USB協議規定的“幀帶寬對于端點均衡分配”原則,按照端點輪流讀取的順序將一個激活的qTD信息映射到QH的工作區中,隨之啟動硬件操作,EHC(高速主機控制器)讀取QH工作區信息開始進行qTD的相關事務處理。處理完畢,回寫狀態信息到QH工作區,觸發特定中斷重新將控制權交還給EHCD,EHCD從QH工作區中讀取狀態信息回寫到對應qTD中,結束一次qTD的傳輸,并激活下一個,以此循環操作。當URB所關聯的qTDs全部處理完畢后,更新URB狀態信息,通過回調函數帶回給應用程序。這部分調度思想主要在驅動程序中實現。
2 傳輸調度的實現
2.1 調度思想改進
??? 由于所面向的IP連接在MCU通用IO上,不具有系統總線控制權,不能主動發起對系統內存的數據讀寫,所以,為了減少硬件對MCU的頻繁訪問以及軟硬件同時訪問memroy時的阻塞現象,在不改變QH、qTD結構的基礎上增加了一種驅動程序中生成但只供硬件調度的傳輸描述符結構——HTD(Hardware Transfer Descriptor),如圖2所示。HTD由qTD演變而來,兩者之間一一對應,它用 5個雙字描述了一次傳輸的所有信息。此外,IP內開辟一塊獨立的存儲區,存儲等待硬件處理的HTD鏈。硬件只需按順序讀取HTD并將狀態回寫即可。這塊存儲區可供軟硬件直接訪問,所以稱為“共享內存”區。驅動程序從所有激活的qTD中選擇1~32個生成HTD,并按處理順序存入共享內存,如圖1所示。
?
2.2 傳輸調度的硬件實現-HTD處理模塊
??? 上述改進部分主要由IP中HTD處理模塊" title="處理模塊">處理模塊(HPU加深區域)實現。圖3為IP實現結構圖,從中可見HPU主要與MCU接口單元(MCUI)、全局控制邏輯(GCU)、共享內存(MEM)、存儲器控制單元(MC)以及串行接口引擎模塊(SIE)交互。
?
??? HPU與MCUI:MCUI傳送軟件對HTD控制寄存器的讀寫信息。
??? HPU與GCU:全局控制邏輯發送事務處理使能信號,幀開始指示信號給HPU,HPU在完成一次事務處理后輸出結束信號給GCU。
??? HPU與MC、MEM:HPU發送讀寫HTD的使能及地址信息給MC,MC單元在確定沒有訪問沖突的情況下連接MEM和HPU,進行兩者之間的HTD值傳送。
??? HPU與SIE:HPU輸出一次事務處理的信息給SIE,SIE根據處理類型(OUT/IN/SETUP)的不同將事務處理分解成令牌包、數據包和握手包形式經根集線器傳送出去,或是SIE接收到設備上傳的數據進行錯誤檢測后將結果告知HPU。
??? HTD處理模塊內部采用狀態機機制實現,共5個主要狀態,如圖4所示。表1是HTD控制寄存器。
?
?
??? (1)idle狀態:系統復位和異步傳輸停止時的默認狀態,不執行硬件操作。
??? (2)取HTD:根據上一個HTD的nextHTDp場指示從MEM中取出對應的HTD,每個DW用一個32位內部寄存器表示。
??? (3)有效性分析:包括4個方面的內容。
?? ?①檢查HTD有效性(Active(A)=1Valid(V)=1);
??? ②將HTD序號和htddonemap/htdskipmap寄存器比對,確保不進行重復處理;
??? ③查看EPnum對應端點是否已經由以前的事務處理導致禁用;
??? ④計算剩余幀時是否足夠。
??? 上述檢測均通過后,可以跳轉到事務處理執行狀態。如果無效,則根據無效的種類跳轉到其他狀態。
??? (4)執行事務處理:將通過有效性檢查的HTD信息傳送給SIE進入包級傳輸。
??? (5)回寫HTD:分析SIE返回的處理信息。包括兩種情況。
??? ①如果設備返回ACK握手包或是正確數據,則表明事務處理正確完成,查看park模式計數器(EHCI協議規定:1幀中可以允許幾次對同一端點的事務處理操作,park計數初始值體現在mult場中),如果為非0值,則更新nrBytestransferrd(已傳輸數據量)的值,進行當前HTD的下一個事務處理;如果為0,則回寫讀取下一個HTD。
??? ②如果事務處理傳輸出錯,則根據錯誤類型做相應處理:
??? a.CRC錯,超時,toggle錯,PID損壞,utmi錯:事務處理重傳;
??? b.stall握手,babble檢測:禁用管道;
??? c.nak握手:out事務處理轉為ping事務處理,in事務處理直接重傳。
??? 當一個HTD所關聯的事務處理均被執行完畢后,置位htddonemap寄存器對應bit位,并查看irq_andmask和irq_ormask值判斷是否觸發中斷。一旦中斷產生,則當前HTD的傳輸調度過程就又進入了驅動程序處理中。
2.3 傳輸調度的驅動實現
?? Linux操作系統將USB驅動程序分為客戶端驅動、USB核心、EHCD、HAL(Hardware Access Layer)四個層次。其中QH-qTD-HTD鏈表形成的相關函數按執行順序列出,如表2所示(高版本Linux內核中已集成EHCI驅動部分的實現代碼,故不詳述)。
?
3 仿真及綜合結果
??? 本IP使用Verilog硬件描述語言,仿真環境為modelsim,綜合環境為synopsys DC,在RTL描述后進行行為級功能仿真,隨后綜合出門級網表并進行門級后仿真。圖5即是HTD處理模塊的一次數據正確發送并回寫的時序仿真波形。
?
參考文獻
[1] Compaq,Intel,Microsoft,Philips.Universal Serial Bus Specification,Revison2.0.2000.
[2] Intel.Enhanced Host Controller Interface Specification for?Universal Serial Bus,Version 1.0.2002.
[3] 周立功.USB2.0與OTG規范及開發指南.北京:北京航空航天大學出版社,2004.