文獻標識碼: A
文章編號: 0258-7998(2014)02-0005-03
通用串行總線(USB)是一種用于連接計算機與外圍設備的串行接口標準,具有結構簡單、配置靈活、即插即用、支持熱插拔、可靠性高、成本低等優點[1]。USB接口主機端為支持USB主機協議的計算機系統,在機載計算機領域,USB接口主機端一般為嵌入式的控制設備。USB接口主機端在USB總線上占控制地位,可以掛載USB外設,所有的USB接口傳輸事務由主機端發起,控制整個USB總線工作。
本文提出一種適用于機載計算機領域的USB接口主機端設計,采用PowerPC系列處理器作為USB主機端的控制器,基于PCI總線與USB控制器連接,構成基于PCI總線的USB接口主機端嵌入式設備。基于VxWorks操作系統完成USB接口主機端的驅動程序設計和開發,實現了一套完整的USB接口主機端軟硬件產品。利用U盤作為USB外設,對所設計的USB接口主機端進行了測試和驗證。結果表明,本文設計的USB接口主機端能夠很好地支持與USB外設的USB通信訪問和控制。
1 USB接口主機端分析
USB總線系統由USB主機、USB外設及USB互聯總線三部分構成。USB主機作為USB通信主控設備,主動發起對USB外設的訪問、控制及通信操作。USB總線作為一種標準通信協議,其主機端層次結構如圖1所示[2]。
如圖1所示,USB主機端采用分層結構,其層次包括USB硬件層、USB主機控制器驅動層、USB主機協議驅動層和USB主機應用層,其中USB硬件層功能由硬件USB控制器完成,之上3層由軟件完成。USB硬件層主要由USB主機控制器實現,負責完成USB總線的物理層和鏈路層協議,并對軟件提供配置和操作接口,由軟件實現對USB控制器的通信控制和總線訪問等功能。USB主機控制器驅動層實現USB主機控制器的驅動程序,該部分驅動程序需針對不同的USB主機控制器芯片的操作接口進行開發,一方面,通過軟件實現了USB硬件層的接口,完成對USB控制器基本操作的控制;另一方面,向上層提供了一個統一的接口抽象,屏蔽了底層硬件控制器的差異。USB主機協議驅動層提供USB協議的主機驅動程序,通過USB主機控制器層的抽象,使該部分程序不依賴于具體硬件層,利用下層的封裝接口,實現對USB總線的控制和管理,為上層軟件提供USB總線的訪問控制。USB主機應用層利用USB主機協議層驅動,實現對USB外設的訪問,實現獨立的USB功能,常見的USB主機應用層功能包括USB存儲外設訪問控制、USB鼠標鍵盤訪問控制等。
2 基于PCI總線的USB接口設計
機載計算機中一般選用具有高可靠性的PowerPC系列處理器。在PowerPC8270處理器芯片中,集成了PCI橋功能,支持標準的PCI總線訪問控制。本文USB主機端硬件設計選用PowerPC8270處理器,通過PCI總線接口連接USB控制器,完成USB主機硬件功能。USB主機核心硬件設計如圖2所示。
如圖2所示,主機端處理器PowerPC8270芯片通過內部集成的PCI橋功能,經PCI總線連接USB控制器;USB控制器芯片選用ISP1562芯片,該芯片具有標準的PCI總線接口,內部集成PCI核,可支持其作為PCI主設備或從設備工作,內部支持2個OHCI控制器核和1個增強型EHCI控制器核,可支持低速1.5 Mb/s、全速12 Mb/s和高速480 Mb/s的通信速率。在圖2設計中,PowerPC處理器作為PCI主設備,USB控制器作為PCI從設備,PCI總線位寬為32 bit,總線頻率為33 MHz,處理器通過PCI總線實現對USB控制器的配置和對USB總線的訪問控制等操作。USB控制器通過I2C接口外接一片EEPROM,用于支持系統信息的加載和讀取。USB控制器接出USB總線經過保護電路后,連接USB外設,保護電路用來防止USB總線信號因過流、過壓和ESD靜電瞬態放電而導致的USB控制器損壞和通信故障。處理器通過局部的60X總線,掛載SDRAM和Flash存儲器。SDRAM存儲器用于支持主機程序運行,Flash存儲器支持主機端操作系統固件及應用程序的固化存儲。
采用圖2所示的設計結構和標準PCI接口對USB控制器的配置寄存器進行相應的設置,即可完成對控制器的初始化及訪問控制操作,大大簡化了主處理器與USB控制器之間配置操作的復雜時序和流程控制,為主機端USB驅動及協議軟件設計和實現提供了便利。
3 VxWorks系統下USB主機端軟件設計
VxWorks操作系統BSP中集成了對USB通信協議的支持,但在實際使用中,需要根據自身硬件的設計、地址空間的劃分及中斷分配等情況,對其通信協議進行修改。USB主機端程序的調試是一個復雜的流程,而BSP中的程序不支持調試功能。因此,在驅動設計和修改中,單獨將VxWorks操作系統BSP中USB相關的程序作為一個部件剝離出來,添加到主機應用程序的工程中,以支持對USB程序的調試,便于程序修改、功能調試和驗證。
3.1 USB主機端軟件設計
在VxWorks操作系統下,基于PCI總線的USB接口主機端驅動流程設計如圖3所示。
如圖3所示的USB主機端程序流程中,首先需要進行主機端PCI總線配置及初始化,主要進行PCI橋的寄存器設置、主機端與USB控制器的PCI地址空間劃分、控制器中斷設置等工作。設計的USB接口選用EHCI接口控制器實現高速的USB通信,USB主機協議棧初始化進行EHCI接口控制器的查找,通過PCI總線對EHCI接口的配置寄存器進行設置和初始化,并對USB的主機協議層驅動USBD所需要的全局變量進行初始化操作。控制器初始化及EHCI接口掛接完成對EHCI主機控制器驅動HCD的初始化,并建立控制器驅動HCD與主機協議層驅動USBD的連接關系。USB設備創建和掛載注冊回調函數,當有USB設備連接時,創建USB存儲設備,并將設備掛載到主機文件系統,支持主機對USB存儲設備的讀寫訪問。通過圖3所示流程,完成VxWorks操作系統下USB協議主機端軟件設計,支持USB協議主機端軟件開發。
3.2 PCI橋配置
PCI總線具有性能高、成本低、開放性和兼容性好等優點,一般采用PCI專用芯片實現PCI總線設備的開發[3]。PowerPC8270處理器內部集成了PCI橋功能,通過該橋實現與USB控制器的訪問控制,在USB主機端軟件開發中(如圖3所示),首先需要進行PCI橋的配置。在軟件上,首先需要進行PCI橋配置接口的設計。PowerPC8270處理器提供兩個地址寄存器,一個為PCI地址寄存器,另一個為PCI數據寄存器。在PCI讀操作時,首先將要讀的PCI總線地址寫入PCI地址寄存器,從PCI數據寄存器即可讀到該地址的數據;在PCI寫操作時,首先將要寫入的PCI總線地址寫入PCI地址寄存器,然后將數據寫入PCI數據寄存器,可以完成一次寫操作。地址寄存器和數據寄存器的基址由處理器的配置字定義,偏移地址分別為0x10900和0x10904。USB控制器作為PCI從設備掛載在主機PCI橋下,根據USB控制器與主機的PCI總線上IDSEL信號的連接方式,可以計算出主機訪問USB控制器的基址。通過該基址加上偏移地址對主機與USB控制器連接的PCI配置空間進行配置。
通過上述方法,對PCI配置空間的基址BAR0寄存器、命令狀態寄存器、Cache Line長度、總線延遲寄存器進行配置,建立通過BAR0寄存器的地址訪問USB控制器配置寄存器的通路。為了支持上層的USB軟件,需要通過PCI總線建立處理器訪問USB控制器及USB控制器訪問處理器的雙向地址映射關系。處理器訪問USB控制器的地址映射通過BAR0地址的配置來完成,USB控制器訪問處理器的地址映射需要通過主機PCI橋的InBound機制來配置完成,通過配置InBound機制的寄存器,提供一種外部設備通過PCI訪問處理器地址空間的方法。通過PCI橋配置,實現雙向地址映射的示意圖如圖4所示。
圖4中虛線框代表虛擬地址,實線框代表實際的物理空間。圖4給出了處理器空間和USB控制器空間通過PCI橋的地址映射關系,建立3段地址空間。處理器空間中,通過硬件連接方式確定基址ADDR2,作為處理器訪問控制器的256 B的PCI配置空間;通過向PCI配置中BAR0寄存器寫入ADDR3,建立處理器訪問USB控制器自身配置寄存器空間的映射,根據USB控制器手冊描述,該段空間大小為116 B,處理器對USB控制器的初始化均通過該段空間完成;通過處理器PCI橋的InBound機制,設置InBound基址、大小寄存器,建立控制器訪問處理器內存空間的映射關系。在主機端USB協議棧調試時,可以通過ADDR3的映射來訪問USB控制器的寄存器,判斷其當前的工作狀態,起到故障排查和定位的作用。
通過PCI橋配置,建立處理器與USB控制器的訪問地址映射,實現兩者的互相訪問,為USB主機端協議功能的實現提供基礎支持。
3.3 USB主機端軟件實現
在PCI配置完成的基礎上進行USB主機端軟件設計。按照圖3所示的流程實現對USB總線的管理和控制,進行初始化、應用程序注冊、動態鏈接注冊等功能。USBD初始化相關的API包括usbdInitialize、usbdShutdown、usbdHcdAttach和usbdHcdDetach共4個,完成usbdLib庫的初始化、關閉usbdLib庫、連接HCD和斷開HCD功能;使用usbdClientRegister和usbdClientUnregister 2個API實現應用程序注冊和取消注冊功能,USBD允許同時有多個應用程序模塊使用USB總線,因此對于要使用USB總線的應用程序模塊,需要先在USBD中進行注冊,而不再使用USB的模塊應當取消在USBD中的注冊,以節省主機端資源;動態連接注冊API接口函數usbdDynamicAttachRegister和usbdDynamicAttachUnRegister用于注冊回調函數,當USB總線上有設備插入或設備拔出動作時,回調函數能夠收到報告并進行相應處理,對于插入操作,回調函數進行設備類型判斷、設備創建操作,對于拔出操作,回調函數進行設備類型確認、設備銷毀操作。
4 測試驗證
采用標準的U盤設備對本文設計的USB主機端進行了功能測試和讀寫速度性能測試,測試結果如表1所示。
表1針對主機設備未插入卡、插入卡和拔出卡3種場景下USB主機端的串口輸出進行了測試。在未插入卡的情況下,USB主機端完成了協議棧初始化、USBD驅動初始化、EHCI控制器初始化并連接EHCI控制器與USBD驅動;當有卡插入主機端時,觸發回調函數工作,首先查找到主機設備下的卡設備,然后創建/bd0文件系統,完成卡設備到/bd0文件系統的掛載;當拔出卡時,觸發回調函數的移除設備操作,主機端移除/bd0文件系統。
向主機端插入U盤設備,分別寫入和讀取1 MB~10 MB數據,測試主機端對U盤外設的讀取速率,結果如圖5所示。
圖5中,橫軸為每次讀或寫的數據量大小,縱軸為所測量出來的讀寫速率。從圖可以看出,隨著每次讀寫數據量的增大,讀寫的速率基本保持穩定,而讀取的速率比寫入的速率快4 Mb/s左右。計算平均值可得,本文設計的USB主機端寫入U盤的速率為5.92 Mb/s,讀取U盤的速率為9.77 Mb/s。
本文基于PowerPC處理器設計并實現了一種基于PCI總線的USB主機端設備,并在VxWorks操作系統下設計并實現了其PCI配置、USB主機端驅動及協議軟件,能夠穩定地支持對U盤等存儲外設的訪問,在工程上取得了良好的應用。
參考文獻
[1] 楊偉,劉強,顧新.Linux下USB設備驅動研究與開發[J].計算機工程,2006,32(19):283-285.
[2] 張楊,于銀濤.VxWorks內核、設備驅動與BSP開發詳解[M]. 北京:人民郵電出版社,2009.
[3] 鄧鳳軍,張龍,王益忠.基于PCI總線的HDLC通信卡的設計與實現[J].電子技術應用,2012,38(8):30-32.