<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式系統(tǒng)中USB-HOST協(xié)議棧的設(shè)計(jì)

          嵌入式系統(tǒng)中USB-HOST協(xié)議棧的設(shè)計(jì)

          作者: 時(shí)間:2007-07-09 來源:網(wǎng)絡(luò) 收藏

          1 引言

          在移動(dòng)設(shè)備大力發(fā)展的今天,移動(dòng)設(shè)備間的大量數(shù)據(jù)交流的需求大大刺激了嵌入式USB主機(jī)系統(tǒng)的發(fā)展,這必然要求嵌入式系統(tǒng)必須提供USB的主機(jī)。而傳統(tǒng)意義上的LISB程序的開發(fā)都是USB外設(shè)程序的開發(fā),主控制器驅(qū)動(dòng)大部分由操作系統(tǒng)來提供,開發(fā)者所要做的就是調(diào)用操作系統(tǒng)提供的驅(qū)動(dòng)程序的接口。兩大主流操作系統(tǒng)中,Windows不公開源碼而Linux的卻不方便移植。對于目前使用μCOS,VxWorks和QNX等OS的嵌入式系統(tǒng)和一些無OS的單片機(jī)系統(tǒng)來說,建立好一整套方便移植的USB主機(jī)驅(qū)動(dòng)程序?qū)?huì)有更大的意義。

          2硬件平臺

          硬件平臺的MCU選擇的是TMS320 DM642,他是TIC6000產(chǎn)品系列中的一款,基于C64x的內(nèi)核,工作為600 MHz,C6000平臺上的。他有3個(gè)雙通道視頻口,可以支持多達(dá)6路視頻輸入輸出。DM64.2的處理能力較突出,一塊單片的DM642可以同時(shí)解碼4路MPEG2格式的視頻流。

          USB主控制器選用的是Cypress的一款主/從控制器SL811HS,其既可以工作在主機(jī)(Host)模式又可以工作在從機(jī)(Slave)模式,能與全速(Full-Speed)和低速(Low-Speed)外設(shè)通訊。SL811HS可以與微處理器、微控制器和DSP無縫連接,并可直接連到諸如ISA,PCMCIA等一些總線上,圖1是SL811HS的結(jié)構(gòu)框圖。SL811HS提供一個(gè)長度為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端口的起點(diǎn),根集線器提供了一定數(shù)量的USB端口,USB設(shè)備和附加的集線器可以連接到那里。

          3.2 USB主機(jī)驅(qū)動(dòng)框架

          主機(jī)與外設(shè)之間的信息流與互連關(guān)系如圖2所示,主機(jī)與設(shè)備都被劃分成不同的層次。主機(jī)上黑實(shí)的箭頭是實(shí)際的數(shù)據(jù)流向,設(shè)備上對應(yīng)的接口是基于不同實(shí)現(xiàn)的。在主機(jī)與設(shè)備之間的所有通信最終都是通過USB的電纜進(jìn)行,然而,在上層的水平層之間是一種邏輯的對應(yīng)關(guān)系,其最終的通信還必須是通過黑實(shí)箭頭標(biāo)示的方向。這個(gè)結(jié)構(gòu)與TCP/IP協(xié)議棧的結(jié)構(gòu)類似,因此也可以用USB協(xié)議棧來形象的描述USB主機(jī)驅(qū)動(dòng)程序。

          4 USB協(xié)議棧的實(shí)現(xiàn)

          4.1協(xié)議棧的

          為了使協(xié)議棧便于移植,整個(gè)程序使用C語言編寫,將一些諸如進(jìn)程與互斥操作和數(shù)據(jù)格式的定義等與操作系統(tǒng)和硬件平臺的相關(guān)部分從協(xié)議棧的核心部分分離開來。在移植到其他操作系統(tǒng)時(shí)盡量維持協(xié)議棧的核心部分不動(dòng)或微小改動(dòng),只在與操作系統(tǒng)相關(guān)程序中添加相關(guān)即可。

          4.2 USB-HOST協(xié)議棧的框架

          基于圖2的USB通信層次圖,以對大容量存儲設(shè)備的支持為例,USB-HOST協(xié)議棧的設(shè)計(jì)如圖3所示。

          文件系統(tǒng)層提供與用戶的交互接口。該層提供對文件的一些基本操作,諸如創(chuàng)建文件、刪除文件、讀寫文件等常用操作。為與Windows,可以在該層實(shí)現(xiàn)FAT32,F(xiàn)ATl6,NTFS等文件系統(tǒng)。

          HDM為每個(gè)設(shè)備建立統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)和接口提供給文件系統(tǒng)對硬盤進(jìn)行讀寫扇區(qū)操作。鑒于系統(tǒng)中可靜會(huì)同時(shí)存在IDE硬盤,HDM對兩種硬盤進(jìn)行統(tǒng)一管理,對文件系統(tǒng)掩蓋硬盤的細(xì)節(jié),使得文件系統(tǒng)在對兩種硬盤操作時(shí)沒有什么不同。

          USB設(shè)備驅(qū)動(dòng)層目前只實(shí)現(xiàn)了大容量設(shè)備類驅(qū)動(dòng)對于其他類型的設(shè)備類諸如音頻設(shè)備類、通信設(shè)備類、顯示設(shè)備類、人機(jī)接口設(shè)備類驅(qū)動(dòng)在本層添加,對大容量存儲設(shè)備類,USB規(guī)范針對不同的設(shè)備又選用不同的協(xié)議,如:RBC,SCSH-2,UFI,SFF-8020i,QIC-157等,對于USB硬盤,使用SCSI協(xié)議。設(shè)備類驅(qū)動(dòng)的協(xié)議層將來自USB硬盤的讀寫操作翻譯成SCSI命令,而傳輸層則將命令分解為一個(gè)個(gè)USB事務(wù)發(fā)送到USB總線驅(qū)動(dòng)層。

          總線驅(qū)動(dòng)層實(shí)現(xiàn)USB總線協(xié)議,管理USB設(shè)備和USB事務(wù)管理以及總線枚舉。總線驅(qū)動(dòng)層先初始化所有的主控制器,每當(dāng)成功檢測和初始化一個(gè)主控制器,并給這個(gè)控制器建立一套虛擬根集線器。在初始化主控制器后,注冊所有已支持的驅(qū)動(dòng)。如果有支持的設(shè)備插入的話,就可以自動(dòng)找到相應(yīng)的驅(qū)動(dòng)工作。

          硬件抽象層對上層掩蓋硬件細(xì)節(jié),為了增加軟件可移植性,與USB控制器芯片相關(guān)的部分放在該層的HCD部分中,在移植到其他平臺上時(shí),針對該平臺使用的控制器芯片改動(dòng)HCD的相關(guān)內(nèi)容即可。此外,數(shù)據(jù)的最終傳輸也將在這里完成。

          4.3 虛擬根集線器VRH(Virtual Root Hub)

          一些USB主控制器會(huì)集成一些根集線器,但SI811HS并沒有集成集線器的功能,為了配合USB的系統(tǒng)拓?fù)浣Y(jié)構(gòu),用軟件模擬一個(gè)根集線器,稱為虛擬根集線器,該集線器只有一個(gè)端口。虛擬集線器并不能替代集線器的所有功能,他只是為了滿足USB的拓?fù)浣Y(jié)構(gòu),同時(shí),提供根集線器的接口,方便驅(qū)動(dòng)程序被移植到其他具有根集線器功能的嵌入式系統(tǒng)中去。

          4.4 USB帶寬

          USB是以1 ms的時(shí)間片進(jìn)行數(shù)據(jù)傳輸?shù)?,在這1 ms的時(shí)間片中能傳輸?shù)臄?shù)據(jù)長度就是USB的帶寬,如何保證在1個(gè)時(shí)間片上有最大數(shù)據(jù)的傳輸,則是決定USB傳輸速率的關(guān)鍵。由于USB可能被多種設(shè)備共享,所以在時(shí)間片內(nèi)可能會(huì)有多種類型的USB傳輸,中斷和同步傳輸對實(shí)時(shí)性要求高,因此他們在帶寬的分配上具有優(yōu)先權(quán),其次是控制傳輸,BULK優(yōu)先權(quán)最低,使用剩下的帶寬。SI811HS的SOF中斷標(biāo)志著一個(gè)時(shí)間片的開始。在大容量設(shè)備的驅(qū)動(dòng)程序中,主要是控制傳輸和塊(bulk)傳輸,SOF中斷開始后,安排數(shù)據(jù)傳輸。此外,在塊傳輸中,數(shù)據(jù)的完整性則相對重要的多,因此,驅(qū)動(dòng)程序必須提供完善的錯(cuò)誤檢測和重發(fā)機(jī)制。對于大容量設(shè)備來說,傳輸數(shù)據(jù)量大,傳輸速度也是一個(gè)很重要的指標(biāo),USB 1.1支持的最大傳輸速率是1.5 MB/s,但由于協(xié)議的開銷,數(shù)據(jù)的傳輸速率卻往往達(dá)不到這個(gè)峰值速率。除了對代碼進(jìn)行優(yōu)化外,充分利用帶寬將是提高速率行之有效的方法。

          4.5協(xié)議棧的關(guān)鍵進(jìn)程

          4.5.1 主進(jìn)程

          主進(jìn)程是USB-HOST協(xié)議棧最開始的一個(gè)進(jìn)程,除了初始化外,他的主要任務(wù)是監(jiān)測設(shè)備。該進(jìn)程平時(shí)處于鎖死狀態(tài),當(dāng)被激活時(shí)去檢測虛擬集線器的端口狀態(tài)。有設(shè)備插入時(shí),中斷處理函數(shù)改變端口狀態(tài)并啟動(dòng)主進(jìn)程,主進(jìn)程對端口上的設(shè)備進(jìn)行枚舉,并為其分配資源。相反,當(dāng)有設(shè)備拔除時(shí),主進(jìn)程則將與該設(shè)備相關(guān)的資源釋放。

          4.5.2 中斷處理函數(shù)

          中斷處理函數(shù)也可以看成是一個(gè)優(yōu)先級最高的進(jìn)程,SL811HS的幾個(gè)重要的中斷是:插入/拔除中斷(Insered/Removed)檢測從設(shè)備的插入和拔除操作,SOF定時(shí)器中斷(SOF Timer)啟動(dòng)一個(gè)時(shí)間片,傳輸完成中斷(USB Done Interrupt)標(biāo)志一次傳輸?shù)耐瓿?,中斷處理函?shù)的流程如圖4所示。

          4.5.3軟件狗進(jìn)程

          當(dāng)有兩個(gè)中斷同時(shí)到達(dá)時(shí),處理器可能會(huì)丟失掉一個(gè)中斷沒有處理,可以設(shè)置一個(gè)軟件狗進(jìn)程,定時(shí)執(zhí)行中斷處理函數(shù)。當(dāng)有丟失的中斷時(shí),軟件狗會(huì)將這個(gè)中斷處理掉。

          5 結(jié) 語

          本文主要討論了嵌入式系統(tǒng)中USB-HOST協(xié)議棧的設(shè)計(jì)思路,整個(gè)軟件基于DSPBIOS系統(tǒng)在CCS的編譯環(huán)境下調(diào)試通過,經(jīng)過測試,運(yùn)行穩(wěn)定。軟件的編寫采用移植性好的C語言編寫,并將與平臺相關(guān)的部分代碼與核心代碼分開以增加軟件的可移植性。此外,為軟件的功能的升級也預(yù)留了接口。

          如今,隨著移動(dòng)電子產(chǎn)品的大量出現(xiàn),設(shè)備之間直接通信的需求也越來越大,USB占據(jù)了嵌人式設(shè)備與其他設(shè)備之間通信的主要角色。角色也在不停地變化,在這次傳輸中可能是主機(jī),下次傳輸就有可能扮演從機(jī)的角色,OTG規(guī)范在這種需求下誕生,符合USB OTG的設(shè)備,既可以作為Host,也可以作為外設(shè)來與另一個(gè)OTG設(shè)備直接實(shí)現(xiàn)設(shè)備到設(shè)備的通信。可預(yù)見的將來,嵌入式USB系統(tǒng)的發(fā)展趨勢將是USB OTG。



          關(guān)鍵詞: 驅(qū)動(dòng) 代碼 兼容 頻率

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();