嵌入式系統(tǒng)中USB-HOST協(xié)議棧的設(shè)計
1 引言
在移動設(shè)備大力發(fā)展的今天,移動設(shè)備間的大量數(shù)據(jù)交流的需求大大刺激了嵌入式USB主機系統(tǒng)的發(fā)展,這必然要求嵌入式系統(tǒng)必須提供USB的主機驅(qū)動。而傳統(tǒng)意義上的LISB驅(qū)動程序的開發(fā)都是USB外設(shè)驅(qū)動程序的開發(fā),主控制器驅(qū)動大部分由操作系統(tǒng)來提供,開發(fā)者所要做的就是調(diào)用操作系統(tǒng)提供的驅(qū)動程序的接口。兩大主流操作系統(tǒng)中,Windows不公開源碼而Linux的代碼卻不方便移植。對于目前使用μCOS,VxWorks和QNX等OS的嵌入式系統(tǒng)和一些無OS的單片機系統(tǒng)來說,建立好一整套方便移植的USB主機驅(qū)動程序?qū)懈蟮囊饬x。
2硬件平臺
硬件平臺的MCU選擇的是TMS320 DM642,他是TIC6000產(chǎn)品系列中的一款,基于C64x的內(nèi)核,工作頻率為600 MHz,兼容C6000平臺上的代碼。他有3個雙通道視頻口,可以支持多達6路視頻輸入輸出。DM64.2的處理能力較突出,一塊單片的DM642可以同時解碼4路MPEG2格式的視頻流。
USB主控制器選用的是Cypress的一款主/從控制器SL811HS,其既可以工作在主機(Host)模式又可以工作在從機(Slave)模式,能與全速(Full-Speed)和低速(Low-Speed)外設(shè)通訊。SL811HS可以與微處理器、微控制器和DSP無縫連接,并可直接連到諸如ISA,PCMCIA等一些總線上,圖1是SL811HS的結(jié)構(gòu)框圖。SL811HS提供一個長度為256 B內(nèi)部RAM空間,該空間的前16 B分配給控制寄存器使用,后面的則作為數(shù)據(jù)緩沖區(qū)(最大240 B)。
3 USB協(xié)議棧的基本知識
3.1 USB設(shè)備的拓?fù)?/P>
USB的拓?fù)浣Y(jié)構(gòu)像金字塔,位于塔尖的是根集線器(Root Hub),根集線器是系統(tǒng)中所有USB端口的起點,根集線器提供了一定數(shù)量的USB端口,USB設(shè)備和附加的集線器可以連接到那里。
3.2 USB主機驅(qū)動框架
主機與外設(shè)之間的信息流與互連關(guān)系如圖2所示,主機與設(shè)備都被劃分成不同的層次。主機上黑實的箭頭是實際的數(shù)據(jù)流向,設(shè)備上對應(yīng)的接口是基于不同實現(xiàn)的。在主機與設(shè)備之間的所有通信最終都是通過USB的電纜進行,然而,在上層的水平層之間是一種邏輯的對應(yīng)關(guān)系,其最終的通信還必須是通過黑實箭頭標(biāo)示的方向。這個結(jié)構(gòu)與TCP/IP協(xié)議棧的結(jié)構(gòu)類似,因此也可以用USB協(xié)議棧來形象的描述USB主機驅(qū)動程序。
4 USB協(xié)議棧的實現(xiàn)
4.1協(xié)議棧的兼容性
為了使協(xié)議棧便于移植,整個程序使用C語言編寫,將一些諸如進程與互斥操作和數(shù)據(jù)格式的定義等與操作系統(tǒng)和硬件平臺的相關(guān)部分從協(xié)議棧的核心部分分離開來。在移植到其他操作系統(tǒng)時盡量維持協(xié)議棧的核心部分不動或微小改動,只在與操作系統(tǒng)相關(guān)程序中添加相關(guān)代碼即可。
4.2 USB-HOST協(xié)議棧的框架
基于圖2的USB通信層次圖,以對大容量存儲設(shè)備的支持為例,USB-HOST協(xié)議棧的設(shè)計如圖3所示。
文件系統(tǒng)層提供與用戶的交互接口。該層提供對文件的一些基本操作,諸如創(chuàng)建文件、刪除文件、讀寫文件等常用操作。為與Windows兼容,可以在該層實現(xiàn)FAT32,F(xiàn)ATl6,NTFS等文件系統(tǒng)。
HDM為每個設(shè)備建立統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)和接口提供給文件系統(tǒng)對硬盤進行讀寫扇區(qū)操作。鑒于系統(tǒng)中可靜會同時存在IDE硬盤,HDM對兩種硬盤進行統(tǒng)一管理,對文件系統(tǒng)掩蓋硬盤的細(xì)節(jié),使得文件系統(tǒng)在對兩種硬盤操作時沒有什么不同。
USB設(shè)備驅(qū)動層目前只實現(xiàn)了大容量設(shè)備類驅(qū)動對于其他類型的設(shè)備類諸如音頻設(shè)備類、通信設(shè)備類、顯示設(shè)備類、人機接口設(shè)備類驅(qū)動在本層添加,對大容量存儲設(shè)備類,USB規(guī)范針對不同的設(shè)備又選用不同的協(xié)議,如:RBC,SCSH-2,UFI,SFF-8020i,QIC-157等,對于USB硬盤,使用SCSI協(xié)議。設(shè)備類驅(qū)動的協(xié)議層將來自USB硬盤的讀寫操作翻譯成SCSI命令,而傳輸層則將命令分解為一個個USB事務(wù)發(fā)送到USB總線驅(qū)動層。
總線驅(qū)動層實現(xiàn)USB總線協(xié)議,管理USB設(shè)備和USB事務(wù)管理以及總線枚舉??偩€驅(qū)動層先初始化所有的主控制器,每當(dāng)成功檢測和初始化一個主控制器,并給這個控制器建立一套虛擬根集線器。在初始化主控制器后,注冊所有已支持的驅(qū)動。如果有支持的設(shè)備插入的話,就可以自動找到相應(yīng)的驅(qū)動工作。
硬件抽象層對上層掩蓋硬件細(xì)節(jié),為了增加軟件可移植性,與USB控制器芯片相關(guān)的部分放在該層的HCD部分中,在移植到其他平臺上時,針對該平臺使用的控制器芯片改動HCD的相關(guān)內(nèi)容即可。此外,數(shù)據(jù)的最終傳輸也將在這里完成。
4.3 虛擬根集線器VRH(Virtual Root Hub)
一些USB主控制器會集成一些根集線器,但SI811HS并沒有集成集線器的功能,為了配合USB的系統(tǒng)拓?fù)浣Y(jié)構(gòu),用軟件模擬一個根集線器,稱為虛擬根集線器,該集線器只有一個端口。虛擬集線器并不能替代集線器的所有功能,他只是為了滿足USB的拓?fù)浣Y(jié)構(gòu),同時,提供根集線器的接口,方便驅(qū)動程序被移植到其他具有根集線器功能的嵌入式系統(tǒng)中去。
4.4 USB帶寬
USB是以1 ms的時間片進行數(shù)據(jù)傳輸?shù)?,在這1 ms的時間片中能傳輸?shù)臄?shù)據(jù)長度就是USB的帶寬,如何保證在1個時間片上有最大數(shù)據(jù)的傳輸,則是決定USB傳輸速率的關(guān)鍵。由于USB可能被多種設(shè)備共享,所以在時間片內(nèi)可能會有多種類型的USB傳輸,中斷和同步傳輸對實時性要求高,因此他們在帶寬的分配上具有優(yōu)先權(quán),其次是控制傳輸,BULK優(yōu)先權(quán)最低,使用剩下的帶寬。SI811HS的SOF中斷標(biāo)志著一個時間片的開始。在大容量設(shè)備的驅(qū)動程序中,主要是控制傳輸和塊(bulk)傳輸,SOF中斷開始后,安排數(shù)據(jù)傳輸。此外,在塊傳輸中,數(shù)據(jù)的完整性則相對重要的多,因此,驅(qū)動程序必須提供完善的錯誤檢測和重發(fā)機制。對于大容量設(shè)備來說,傳輸數(shù)據(jù)量大,傳輸速度也是一個很重要的指標(biāo),USB 1.1支持的最大傳輸速率是1.5 MB/s,但由于協(xié)議的開銷,數(shù)據(jù)的傳輸速率卻往往達不到這個峰值速率。除了對代碼進行優(yōu)化外,充分利用帶寬將是提高速率行之有效的方法。
4.5協(xié)議棧的關(guān)鍵進程
4.5.1 主進程
主進程是USB-HOST協(xié)議棧最開始的一個進程,除了初始化外,他的主要任務(wù)是監(jiān)測設(shè)備。該進程平時處于鎖死狀態(tài),當(dāng)被激活時去檢測虛擬集線器的端口狀態(tài)。有設(shè)備插入時,中斷處理函數(shù)改變端口狀態(tài)并啟動主進程,主進程對端口上的設(shè)備進行枚舉,并為其分配資源。相反,當(dāng)有設(shè)備拔除時,主進程則將與該設(shè)備相關(guān)的資源釋放。
4.5.2 中斷處理函數(shù)
中斷處理函數(shù)也可以看成是一個優(yōu)先級最高的進程,SL811HS的幾個重要的中斷是:插入/拔除中斷(Insered/Removed)檢測從設(shè)備的插入和拔除操作,SOF定時器中斷(SOF Timer)啟動一個時間片,傳輸完成中斷(USB Done Interrupt)標(biāo)志一次傳輸?shù)耐瓿桑袛嗵幚砗瘮?shù)的流程如圖4所示。
4.5.3軟件狗進程
當(dāng)有兩個中斷同時到達時,處理器可能會丟失掉一個中斷沒有處理,可以設(shè)置一個軟件狗進程,定時執(zhí)行中斷處理函數(shù)。當(dāng)有丟失的中斷時,軟件狗會將這個中斷處理掉。
5 結(jié) 語
本文主要討論了嵌入式系統(tǒng)中USB-HOST協(xié)議棧的設(shè)計思路,整個軟件基于DSPBIOS系統(tǒng)在CCS的編譯環(huán)境下調(diào)試通過,經(jīng)過測試,運行穩(wěn)定。軟件的編寫采用移植性好的C語言編寫,并將與平臺相關(guān)的部分代碼與核心代碼分開以增加軟件的可移植性。此外,為軟件的功能的升級也預(yù)留了接口。
如今,隨著移動電子產(chǎn)品的大量出現(xiàn),設(shè)備之間直接通信的需求也越來越大,USB占據(jù)了嵌人式設(shè)備與其他設(shè)備之間通信的主要角色。角色也在不停地變化,在這次傳輸中可能是主機,下次傳輸就有可能扮演從機的角色,OTG規(guī)范在這種需求下誕生,符合USB OTG的設(shè)備,既可以作為Host,也可以作為外設(shè)來與另一個OTG設(shè)備直接實現(xiàn)設(shè)備到設(shè)備的通信??深A(yù)見的將來,嵌入式USB系統(tǒng)的發(fā)展趨勢將是USB OTG。
評論