摘? 要: 簡(jiǎn)單介紹了USB接口技術(shù)的原理及其優(yōu)點(diǎn),。基于嵌入式系統(tǒng)與USB設(shè)備等不能直接傳輸數(shù)據(jù)及嵌入式系統(tǒng)大容量存儲(chǔ)難等問題的現(xiàn)狀,,提出了在嵌入式系統(tǒng)中集成USB Host功能以解決這一問題,。
關(guān)鍵詞: USB接口; 嵌入式系統(tǒng); USB—Host;SL811HS
?
隨著測(cè)控技術(shù)及嵌入式系統(tǒng)應(yīng)用的迅速發(fā)展,,數(shù)據(jù)量越來越大,對(duì)數(shù)據(jù)傳輸速度要求越來越高,并且要求高可靠性,、穩(wěn)定性和極好的移動(dòng)性,能夠方便快捷地將數(shù)據(jù)傳送至處理中心進(jìn)行處理控制等,。而通用串行總線(USB)具有即插即用,、熱插拔、易擴(kuò)展和高傳輸速率等優(yōu)點(diǎn),,人們希望USB能應(yīng)用在移動(dòng)數(shù)據(jù)交換等沒有PC機(jī)的領(lǐng)域中,。而在非PC機(jī)應(yīng)用領(lǐng)域,這正是USB的一個(gè)致命弱點(diǎn),。USB的拓?fù)浣Y(jié)構(gòu)中居于核心地位的是主機(jī)(Host),,任何一次USB的數(shù)據(jù)傳輸都必須由主機(jī)來發(fā)起和控制,所有的USB設(shè)備都只能和主機(jī)建立連接,,任何兩個(gè)外設(shè)之間或是兩個(gè)主機(jī)之間都無法直接通信[1],。目前,大量扮演主機(jī)角色的是個(gè)人電腦(PC),,所買到和使用的USB移動(dòng)設(shè)備都是USB的設(shè)備,,如USB的移動(dòng)硬盤、USB接口的數(shù)碼相機(jī)等等,。所有這些設(shè)備都只能在PC機(jī)上使用,,只能通過PC機(jī)來進(jìn)行相互的文件和數(shù)據(jù)交換。沒有PC機(jī),這些設(shè)備就“失靈”了(就數(shù)據(jù)交換的功能而言),。因此,,USB接口技術(shù)在嵌入式領(lǐng)域中的應(yīng)用就成了USB領(lǐng)域新的研究焦點(diǎn)。解決這一問題的根本辦法就是在嵌入式系統(tǒng)中集成USB Host功能,,使之具有與USB Slave設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)哪芰?。具有主機(jī)功能的嵌入式設(shè)備可讀寫U盤,對(duì)于數(shù)據(jù)采集,、存儲(chǔ)更加方便,,更適合野外設(shè)備或長(zhǎng)期運(yùn)行設(shè)備的數(shù)據(jù)采集。
1 USB接口硬件設(shè)計(jì)
1.1 系統(tǒng)硬件的總體結(jié)構(gòu)
USB技術(shù)規(guī)范將使用USB進(jìn)行數(shù)據(jù)傳輸?shù)碾p方劃分為兩種角色[2]:Host機(jī)和Slave機(jī),,并且規(guī)定,,數(shù)據(jù)傳輸只能發(fā)生在Host機(jī)和Slave機(jī)之間。要將實(shí)現(xiàn)USB Slave 的USB 接口的數(shù)字設(shè)備應(yīng)用于嵌入式系統(tǒng)中,,就要在嵌入式系統(tǒng)中集成USB Host 功能模塊,,使之具有與USB Slave 設(shè)備進(jìn)行數(shù)據(jù)傳輸?shù)哪芰Γ瑘D1所示為系統(tǒng)總體結(jié)構(gòu),。
?
?
1.2 USB Host模塊硬件連接
USB Host 功能模塊硬件連接如圖2所示,。CPU選用與MCS-51系列單片機(jī)完全兼容的Dalla 8公司的80C320 單片機(jī),而且運(yùn)行速度在同樣晶振頻率下比80C32平均高2.5倍,,最高工作頻率可達(dá)33MHz,。USB主機(jī)接口芯片選用SL811HS。
?
1.3 SL811HS
SL811HS[3]是Cypress公司推出的遵從USB1.1協(xié)議的專用于嵌入式系統(tǒng)USB主控制器(Host /Slave)芯片,,由主/從控制器模塊,、RAM緩存及控制寄存器模塊、串行接口引擎SIE等模塊組成,。其中,,SIE模塊負(fù)責(zé)完成USB總線與主機(jī)之間數(shù)據(jù)的串、并轉(zhuǎn)換等功能,;RAM緩存用于數(shù)據(jù)緩存,,它和控制寄存器(占前16B)的空間為00H~FFH,共256B,。SL811HS的功能框如圖3所示,。
?
該芯片既能與USB低速設(shè)備進(jìn)行通信,也能與USB高速設(shè)備進(jìn)行通信[4],。由于提供了8bit 寬數(shù)據(jù)總線及中斷支持,,使得該芯片能方便地與一般的單片機(jī)、DSP等控制器進(jìn)行通信,,并受到CPU的控制,。其特點(diǎn)主要有:能通過硬件設(shè)置或軟件設(shè)置的方法使該芯片工作在Host或Slave模式,;自動(dòng)探測(cè)所連接的設(shè)備是低速設(shè)備還是高速設(shè)備;8bit雙向數(shù)據(jù)總線,;片上SIE,、USB收發(fā)器;自動(dòng)產(chǎn)生SOF令牌包,,以及自動(dòng)生成令牌包,、數(shù)據(jù)包中所需要的CRC5/CRC16數(shù)據(jù);內(nèi)部256B RAM,,支持乒乓操作,;支持SUSPEND/RESUME、WAKE UP,、LOW-POWER模式,。
2 USB接口軟件設(shè)計(jì)
2.1 接口固件設(shè)計(jì)
USB Host模塊設(shè)計(jì)中最困難的就是固件(Firmware)設(shè)計(jì),固件編程要遵循復(fù)雜的USB規(guī)范,,所以比硬件設(shè)計(jì)工作量大得多,。該模塊固件程序主要由如下部分組成:對(duì)SL811HS進(jìn)行設(shè)置的初始化程序,這部分程序在系統(tǒng)復(fù)位后就立刻執(zhí)行,;發(fā)現(xiàn)USB設(shè)備接入的子程序,,并判斷該設(shè)備是高速還是低速設(shè)備;對(duì)該USB設(shè)備進(jìn)行Enumerate,,即枚舉,,并指定其USB地址的子程序;其他數(shù)據(jù)通信子程序利用該部分程序完成指定的應(yīng)用要求[5],。USB傳輸函數(shù)usbXfer程序流程如圖4所示,。
?
以包為基礎(chǔ),USB定義的4種數(shù)據(jù)傳輸類型所能達(dá)到的傳輸速度,、占用USB總線的帶寬、傳輸數(shù)據(jù)的總量和應(yīng)用場(chǎng)合等都是不同的,。每種傳輸方式都由很多個(gè)事務(wù)來完成,。USB事務(wù)處理一般由三個(gè)階段組成:令牌階段、數(shù)據(jù)階段和握手階段,。令牌階段定義了事務(wù)處理的類型,,包括SETUP、IN 和OUT,;數(shù)據(jù)階段負(fù)責(zé)運(yùn)送和傳輸相關(guān)的數(shù)據(jù),,Data0 和Data1兩種數(shù)據(jù)包交替使用,以支持雙方的傳輸同步,;握手階段由接收方向發(fā)送方提供反饋,,告知數(shù)據(jù)是否正確接收,。
在USB Host 模塊中,固件的核心部分是USB傳輸函數(shù)usbXfer,。usbXfer管理著USB的事務(wù)處理,,其入口參數(shù)有:設(shè)備地址UsbAddr 、端點(diǎn)地址Endpoint,、令牌包類型PID,、端點(diǎn)最大負(fù)荷Payload、傳輸數(shù)據(jù)總長(zhǎng)度Length ,、數(shù)據(jù)緩存區(qū)指針Buffer,。
USB主機(jī)檢測(cè)到設(shè)備連接好后要對(duì)其進(jìn)行配置,稱為設(shè)備的枚舉,,該部分固件的核心是設(shè)備請(qǐng)求函數(shù)VendorCmd,。VendorCmd構(gòu)建在usbXfer函數(shù)之上,通過調(diào)用usbXfer進(jìn)行若干次的控制傳輸來實(shí)現(xiàn),??刂苽鬏?shù)膶?shí)現(xiàn)是固件程序中一個(gè)比較復(fù)雜的部分??刂苽鬏斢扇齻€(gè)階段組成:建立階段,、數(shù)據(jù)階段和狀態(tài)階段。建立階段,,主機(jī)進(jìn)行SETUP事務(wù)處理,,向目標(biāo)設(shè)備發(fā)送標(biāo)準(zhǔn)設(shè)備請(qǐng)求;數(shù)據(jù)階段,,由若干個(gè)IN事務(wù)處理或OUT事務(wù)處理組成,;狀態(tài)階段,主機(jī)則完成與數(shù)據(jù)階段相反的事務(wù)處理,,結(jié)束本次控制傳輸,。
設(shè)備的枚舉過程主要包括以下幾個(gè)步驟:(1)主機(jī)請(qǐng)求設(shè)備控制端點(diǎn)0,以確定缺省管道支持的最大數(shù)據(jù)量;(2)主機(jī)給USB設(shè)備分配1個(gè)唯一的地址;(3)主機(jī)從描述符中讀取配置信息并加以執(zhí)行;(4)主機(jī)驗(yàn)證設(shè)備所需要的資源是否可以獲得;(5)主機(jī)USB設(shè)備發(fā)送1個(gè)配置值,,指出如何使用該設(shè)備,。枚舉成功后,主機(jī)和設(shè)備就可根據(jù)設(shè)備接口類型,,采用相應(yīng)的接口協(xié)議進(jìn)行數(shù)據(jù)控制和傳輸,。USB設(shè)備類型主要?jiǎng)澐譃椋阂纛l設(shè)備、顯示設(shè)備,、人機(jī)接口,、海量存儲(chǔ)器等。特定的設(shè)備類型又劃分為若干個(gè)子類,,它們又有可能采用不同的接口協(xié)議傳輸指令和數(shù)據(jù),。以U盤為例,,類代碼08h(海量存儲(chǔ)器類),子類代碼06h(SCSI指令集子類),,傳輸協(xié)議50h(Bulk—Only傳輸協(xié)議),。按照這些標(biāo)準(zhǔn),U盤的操作過程可分為:指令,、數(shù)據(jù)和狀態(tài)三個(gè)階段,,也就是主機(jī)首先向設(shè)備Bulk—Out端點(diǎn)寫包含SCSI的指令塊(CBW);然后從Bulk—In讀數(shù)據(jù)或向Bulk—Out端點(diǎn)寫數(shù)據(jù),;最后從Bulk—In端點(diǎn)讀取傳輸狀態(tài)(CSW),。通過Mass Storage類的子類命令的實(shí)現(xiàn),在建立了FAT文件系統(tǒng)后,,該文件系統(tǒng)就可以直接調(diào)用子類命令對(duì)U盤進(jìn)行各種操作,,以實(shí)現(xiàn)對(duì)文件的管理。
2.2? 驅(qū)動(dòng)程序設(shè)計(jì)
主機(jī)控制器驅(qū)動(dòng)程序設(shè)計(jì)主要包括四個(gè)部分:主機(jī)控制器的初始化和管理,、傳輸執(zhí)行和資源的調(diào)配,、中斷處理以及根集線器操作和控制。主機(jī)控制器為USB總線驅(qū)動(dòng)屏蔽了硬件操作,完成USB底層數(shù)據(jù)傳輸,它為上層驅(qū)動(dòng)提供了簡(jiǎn)單的軟件接口,定義了usb_ operation函數(shù)結(jié)構(gòu)體供USB總線調(diào)度調(diào)用,。
Struct usb_ operations {
int ( * allocate) (struct usb_device * ),;? ?
???? ??????????????? // 分配USB設(shè)備資源
int ( * deallocae) (struct usb_device * );
?????? ????????????? // 收回USB設(shè)備資源
int ( * get_frame_number)(struct usb_device * usb_dev),;?
????????????????????? // 獲得當(dāng)前幀號(hào)
int ( * submit_urb) (struct urb * purb),;
????????????????????? // 提交URB請(qǐng)求塊
int ( * unlink_urb) (struct urb * purb);
????????????????????? // 撤銷URB請(qǐng)求塊
? },;
函數(shù)調(diào)用涉及兩個(gè)不同數(shù)據(jù)結(jié)構(gòu)的變量,,其中,usb_device包含了對(duì)設(shè)備地址,、描述表,、配置、端點(diǎn)等基本設(shè)備信息;urb說明了USB總線請(qǐng)求的基本信息,,包括USB通道信息,、數(shù)據(jù)緩沖區(qū)、帶寬和完成處理函數(shù)等,。USB總線上所有的交易都是由函數(shù)submit_urb( )發(fā)起的。主機(jī)控制器驅(qū)動(dòng)程序基本流程如圖5所示,。
?
由于USB總線的通用操作如USB設(shè)備枚舉,、具體數(shù)據(jù)傳輸?shù)纫呀?jīng)由主機(jī)控制器驅(qū)動(dòng)程序完成了,所以主機(jī)端設(shè)備驅(qū)動(dòng)程序這部分的驅(qū)動(dòng)程序只需要完成與具體設(shè)備相關(guān)的操作即可,。USB設(shè)備驅(qū)動(dòng)程序首先要做的是向Linux內(nèi)核注冊(cè)它自己,,并告訴系統(tǒng)它所支持的設(shè)備類型以及它所支持的操作,。這些信息通過usb_driver結(jié)構(gòu)來傳遞。
struct usb_driver usb_storage_driver = {
name:? “usb-storage”,?? ?????? ? // 驅(qū)動(dòng)程序的名字
probe: storage_probe,?? ??? // 函數(shù)指針
disconnect:? storage_disconnect,?? // 函數(shù)指針
id_table:? storage_usb_ids,???? ?? // 保存設(shè)備廠商ID和產(chǎn)品ID
},;
usb_device是程序中一個(gè)重要的數(shù)據(jù)結(jié)構(gòu),,驅(qū)動(dòng)程序在設(shè)備探測(cè)階段可通過它獲得設(shè)備的相關(guān)配置信息。當(dāng)一個(gè)設(shè)備插入U(xiǎn)SB總線時(shí),,主機(jī)對(duì)設(shè)備進(jìn)行總線枚舉,,完成對(duì)設(shè)備的配置并讀入設(shè)備屬性。相關(guān)屬性如設(shè)備描述符,、配置描述符等信息被主機(jī)控制器保存在usb_device結(jié)構(gòu)中,。然后,內(nèi)核根據(jù)設(shè)備標(biāo)志找到對(duì)應(yīng)的驅(qū)動(dòng)程序,,并調(diào)用該驅(qū)動(dòng)程序的storage_probe( )函數(shù),。usb_device結(jié)構(gòu)被作為參數(shù)傳入該函數(shù)。驅(qū)動(dòng)函數(shù)的注冊(cè)和注銷都比較簡(jiǎn)單,,注冊(cè)時(shí)只需要將usb_storage_driver結(jié)構(gòu)作為參數(shù)傳遞給usb_register( )函數(shù)即可,,usb_register(&usb_storage_driver)注銷類usb_deregister(&usb_storage_driver)、Storage_disconnect( )在設(shè)備被卸載時(shí)被調(diào)用,。
2.3 用戶程序設(shè)計(jì)
用戶程序是系統(tǒng)與用戶的接口,,通過通用驅(qū)動(dòng)程序來完成對(duì)外設(shè)的控制和通信。在編寫用戶程序時(shí),,首先建立與外設(shè)的連接,,然后再實(shí)施數(shù)據(jù)的傳輸。本設(shè)計(jì)使用VisualC++6.0編譯環(huán)境,將API函數(shù)包裝成一個(gè)USB.DLL連接庫(kù)程序文件,,其編程方法與串口編程類似:首先查找設(shè)備,,打開設(shè)備的句柄,然后進(jìn)行讀寫和控制操作,,最后關(guān)閉設(shè)備句柄,。在VC動(dòng)態(tài)鏈接庫(kù)中需將以下函數(shù)進(jìn)行封裝:
__declspec(dllexport)int__stdcall? EzBulk_ DataOut(uns?I gned? char*DataOut,int? DataOutLen);
__declspec(dllexport)int__stdcall? EzBulk_DataIn(unsig ned? char*DataIn,int *lpDataInLen);
__declspec(dllexport)int__stdcall? EzOpenDevice();
__declspec(dllexport)int__stdcall? EzClose Device();
然后在VB中調(diào)用此USB.DLL做以下聲明。這樣就可以直接在VB中調(diào)用這些函數(shù)作相應(yīng)的開發(fā)了,。
Private Declare Function EzInit Lib “USB.DLL” (ByVal PipeIn As Byte, ByVal PipeOut As Byte, ByRef lpVoid As Any)As Long
Private Declare Function EzBulk_ DataOut Lib “USB.DLL”(ByRef DataOut As Byte, ByVal DataOutLen As Long)As Long
Private Declare Function EzBulk_ DataIn Lib “USB.DLL” (ByRef DataIn As Byte, ByRef DataInLen As Long)As Long
有了嵌入式主機(jī)后,,脫離PC機(jī)的數(shù)據(jù)傳輸不再是夢(mèng)想了。在MP3播放器,、數(shù)碼相機(jī)里嵌入U(xiǎn)SB主機(jī)模塊,,使其由傳統(tǒng)的USB外設(shè)成為USB主機(jī)。這樣,,這些嵌入式的主機(jī)就可以直接與移動(dòng)硬盤,、打印機(jī)等USB設(shè)備相連接,實(shí)現(xiàn)特定的功能,。例如:江蘇某企業(yè)生產(chǎn)的提花毛皮機(jī)控制系統(tǒng)中就實(shí)現(xiàn)了USB Host模塊功能,,用戶系統(tǒng)可以直接讀寫作為Slave的U盤,,將花型準(zhǔn)備系統(tǒng)設(shè)計(jì)的花型以文件的方式存儲(chǔ)到U盤中,在用戶需要時(shí),,可讀取U盤中的花型文件進(jìn)行分析,、處理,效果良好,。
目前USB主機(jī)的研究與應(yīng)用已得到國(guó)內(nèi)外的廣泛重視和迅速發(fā)展,,正在推廣使用的USB3.0標(biāo)準(zhǔn)能提供4.8Gb/s的高速數(shù)據(jù)傳輸性能(USB1.1和USB2.0分別是12Mb/s和480Mb/s),甚至支持光纖連接,。這樣其峰值速度就可達(dá)到20Gb/s,,如此就可實(shí)現(xiàn)USB高速組網(wǎng)或廣播電視節(jié)目信號(hào)在USB設(shè)備上的傳輸。USB3.0標(biāo)準(zhǔn)還可解決因USB2.0供電不足而無法支持大功耗USB移動(dòng)設(shè)備的問題,。隨著移動(dòng)數(shù)碼產(chǎn)品的發(fā)展趨勢(shì),,提出了USB2.0協(xié)議的補(bǔ)充協(xié)議USB OTG和無線USB傳輸規(guī)范,同時(shí)具備主從機(jī)功能的高速USB OTG設(shè)備和無線USB的應(yīng)用將是未來開發(fā)者們研究的方向,。充分利用USB簡(jiǎn)便的特性以及高速數(shù)據(jù)傳輸性能,,擴(kuò)大其支持設(shè)備的種類,這將給USB的應(yīng)用帶來廣闊的市場(chǎng),,也將給人們的生產(chǎn)生活帶來巨大的便利,。
參考文獻(xiàn)
[1]? 王田苗. 嵌入式系統(tǒng)設(shè)計(jì)與實(shí)例開發(fā)[M]. 第二版. 北京: 清華大學(xué)出版社, 2003:141-145.
[2]? 馬偉.計(jì)算機(jī)USB系統(tǒng)原理及其主/從機(jī)設(shè)計(jì)[M].北京: 北京航空航天大學(xué)出版社, 2004: 93-98.
[3] Cypress Semiconductor Corporation. SL811HS? Datasheet?[EB/OL]. http://www.uclinux.org/, 2005-02-05.
[4] ?陳啟美,丁傳鎖.計(jì)算機(jī)USB接口技術(shù)[M]. 南京:南京大學(xué)出版社,2003:73-89.
[5] ?鄭智.嵌入式Linux下USB驅(qū)動(dòng)程序開發(fā)研究[J].武漢理工大學(xué)學(xué)報(bào). 信息與管理工程版,,2006,28(7):
?117-120.