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