摘要:基于ARM處理器的32位嵌入系統(tǒng)具有極高速和大容量的數(shù)據(jù)處理能力,如何設(shè)計(jì)ARM與主機(jī)設(shè)備或系統(tǒng)的通信接口、提升數(shù)據(jù)通信能力,成為嵌入式系統(tǒng)設(shè)計(jì)的一大問題。文章給出了一種USB接口方案,對(duì)比RS-232串行口,大大提高了嵌入式系統(tǒng)的數(shù)據(jù)吞吐能力,與以太網(wǎng)接口相比有即插即用特性、有塊和同步等多種數(shù)據(jù)傳輸模式,更適合音視頻碼流傳送。文章具體闡述了方案的硬件、軟件設(shè)計(jì),并應(yīng)用于音頻PCM碼流傳送,實(shí)驗(yàn)結(jié)果顯示音效流暢,方案有較高參考價(jià)值。
關(guān)鍵詞:ARM ;嵌入式系統(tǒng);USB;音頻PCM碼流;
0 引言
常用的主機(jī)與嵌入式外設(shè)的高速通信接口有LPT并行口、USB、1394及10/100M以太網(wǎng)等接口。RS232不適合高速數(shù)據(jù)傳送,1394接口需要專門的適配器接口成本過高,一般較少使用,USB接口被廣泛用于高、中、低不同速度設(shè)備與主機(jī)通信,USB2.0的最高速度可達(dá)480Mb/s, 可傳送高清晰數(shù)字視頻碼流,完全可以替代1394接口,USB與以太網(wǎng)接口相比,采用主從結(jié)構(gòu),有即插即用特性,驅(qū)動(dòng)程序豐富,互操作性好等優(yōu)點(diǎn)。
USB(Universal Serial Bus,通用串行總線)接口是1994年Intel、Microsoft等多家公司聯(lián)合推出的計(jì)算機(jī)外設(shè)互連總線協(xié)議。USB接口支持1.5Mb/s、12Mb/s和480Mb/s的數(shù)據(jù)傳輸速率,支持控制、中斷、批量與實(shí)時(shí)4種數(shù)據(jù)傳輸模式,讓外圍設(shè)備可以有彈性的選擇。不管是交換少量或是大量的數(shù)據(jù),還是有無時(shí)效的限制,都有合適的傳輸類型。USB的實(shí)時(shí)同步數(shù)據(jù)傳輸模式適合于高速實(shí)時(shí)音視頻數(shù)據(jù)流的傳送。
基于ARM(Advanced RISC Machines)處理器的32位嵌入系統(tǒng)具有極高運(yùn)算速度和大容量的數(shù)據(jù)處理能力,常需要設(shè)計(jì)高速接口與其他設(shè)備通信,為此本文討論基于S3C44B0X ARM7處理器的嵌入式統(tǒng)[3]擴(kuò)展USB接口(設(shè)備端)的技術(shù)方案。
1 USB接口原理
USB1.1規(guī)范[1]將USB分為5部分:控制器、控制器驅(qū)動(dòng)程序、USB芯片驅(qū)動(dòng)程序、USB設(shè)備以及針對(duì)不同USB設(shè)備的客戶端驅(qū)動(dòng)程序。
(1) 控制器(Host Controller)主要負(fù)責(zé)執(zhí)行由控制器驅(qū)動(dòng)程序發(fā)出的命令。
(2) 控制器驅(qū)動(dòng)程序(Host Controller Driver), 在控制器與USB設(shè)備間建立通信管道(Pipe)。
(3) USB驅(qū)動(dòng)程序(USB Driver),提供對(duì)不同USB設(shè)備及芯片的支持。
(4) USB設(shè)備(USB Device), 有兩類USB設(shè)備:一類稱為功能設(shè)備(Function),另一類是稱為USB集線器(HUB),可以連接多個(gè)USB設(shè)備。
(5) USB設(shè)備驅(qū)動(dòng)程序(Client Driver Software)及特定應(yīng)用程序。
主控制器的驅(qū)動(dòng)軟件由操作系統(tǒng)支持,USB設(shè)備開發(fā)人員一般只需編寫客戶驅(qū)動(dòng)程序,實(shí)現(xiàn)特定功能,設(shè)備端所有功能軟件需要全面設(shè)計(jì)。
USB的四種數(shù)據(jù)傳輸模式分別是:控制型傳輸、中斷型傳輸、批量型傳輸、實(shí)時(shí)型傳輸。第一種在缺省通道中傳輸U(kuò)SB接口本身的配置等控制信息,后面三種用于功能部件傳輸數(shù)據(jù)。中斷型用于鍵盤等的異步輸入輸出少量數(shù)據(jù)傳輸,批量傳輸主要用于象硬盤等塊設(shè)備的數(shù)據(jù)傳輸,在中斷和批量的傳輸過程中要傳遞交互握手信號(hào),確保數(shù)據(jù)準(zhǔn)確無誤。實(shí)時(shí)傳輸對(duì)帶寬有嚴(yán)格要求,但允許有一定誤碼,省去了交互握手信號(hào)的傳遞,常用于音視頻碼流數(shù)據(jù)傳輸。四種類型數(shù)據(jù)都按帶寬要求分配在1ms一幀的數(shù)據(jù)幀內(nèi)進(jìn)行傳輸,USB1.0實(shí)時(shí)傳輸可得到的最大帶寬10.24Mbps[1]。
2 嵌入式系統(tǒng)USB接口設(shè)計(jì)
要滿足高性能ARM嵌入式系統(tǒng)的要求,擴(kuò)展USB接口必須選擇高性能USB控制器芯片,Philips公司的PDISUBD12 USB器件,是與微處理器配合使用的高性能USB接口器件,性價(jià)比很高[2][4]。PDIUSBD12主要特性有:
(1) 符合USB 1.1 技術(shù)規(guī)范;
(2) USB控制器并行接口與處理器間的數(shù)據(jù)傳輸速度高達(dá)2M 字節(jié)/秒;
(3) 在批量模式和同步模式下均可實(shí)現(xiàn)1M 字節(jié)/秒的數(shù)據(jù)傳輸速率;
(4) 集成了FIFO存儲(chǔ)收發(fā)器,支持DMA 操作;
(5) 內(nèi)置時(shí)鐘倍頻PLL電路,可編程時(shí)鐘頻率輸出;
(6) 多中斷模式實(shí)現(xiàn)批量和同步傳輸;
采用PDIUSBD12 USB標(biāo)準(zhǔn)組件與S3C44B0X接口,減小了開發(fā)的時(shí)間、風(fēng)險(xiǎn)以及費(fèi)用,是最快捷、最經(jīng)濟(jì)的方法實(shí)現(xiàn)ARM嵌入式系統(tǒng)擴(kuò)展USB的解決方案之一。PDIUSBD12與S3C44B0X ARM7處理器的電路圖見圖2。因ARM7用存儲(chǔ)器影射方法擴(kuò)展I/O接口,一般按16bit方式尋址,所以U2的A0連到U1的Addr1引腳, 片選信號(hào)nGCS1的基地址是0x0200_0000。
3 ARM端USB設(shè)備程序
設(shè)備端程序主要完成:ARM BIOS和ucLinux的加載、啟動(dòng)通信進(jìn)程、USB控制器初始化、響應(yīng)主控制器標(biāo)準(zhǔn)PnP及其他命令、建立USB端點(diǎn)(End point)邏輯通道、數(shù)據(jù)傳輸操作等功能,圖3是基于ARM 的USB設(shè)備與PC間音頻通信的程序功能結(jié)構(gòu)圖。
圖3
操作USB芯片的接口函數(shù)的宏定義為:
typedef unsigned short int U16 ;
#define pD12_CMD ( ( U16 *) 0x02000002 ) //指向D12命令寄存器指針
#define pD12_DAT ( ( U16 *) 0x02000000 ) //指向D12數(shù)據(jù)寄存器指針
#define D12WriteCmd( data ) (*p D12_CMD = (U16)(data) & 0xff )
#define D12WriteData( data ) (* pD12_DAT = (U16)(data) & 0xff )
#define D12ReadData() (* pD12_DAT & 0xff )
4 音頻碼流USB設(shè)備驅(qū)動(dòng)程序
Windows2000中各種USB設(shè)備客戶驅(qū)動(dòng)程序結(jié)構(gòu)框架基本相同,可以從Windows2000 DDK中獲得USB設(shè)備驅(qū)動(dòng)程序范例代碼,對(duì)范例代碼作少量修改就可以滿足特定功能需要。圖1顯示了驅(qū)動(dòng)程序各層間的數(shù)據(jù)傳遞關(guān)系,底層USB主控制器驅(qū)動(dòng)程序(USB Host Driver)由操作系統(tǒng)提供支持,設(shè)備驅(qū)動(dòng)程序只需要對(duì)USB Host Driver上傳的I/O數(shù)據(jù)包IRP作出響應(yīng),并把要輸出數(shù)據(jù)以IRP形式下傳給USB Host Driver即可[5] [6]。
在ISO(實(shí)時(shí)型)模式下傳輸音頻碼流,USB客戶程序除了WDM(Windows Driver Model)驅(qū)動(dòng)常規(guī)處理外,必須計(jì)算好帶寬,并為驅(qū)動(dòng)程序在非分頁存儲(chǔ)區(qū)內(nèi)分配好環(huán)行緩沖區(qū)(Ringbuffer),以便USB 主控制器可以不間斷輸出實(shí)時(shí)數(shù)據(jù)。RingBuffer的大小按下式計(jì)算:
每幀字節(jié)數(shù) × 每緩沖幀數(shù) × 緩沖區(qū)數(shù) ;
每傳完一緩沖區(qū),USB Host Driver回調(diào)(CallBack)一次客戶驅(qū)動(dòng)程序,USB帶寬按每1ms傳送1幀數(shù)據(jù)來分配,要實(shí)現(xiàn)8kHz采樣頻率、8bits編碼的音頻PCM碼流傳輸,幀數(shù)據(jù)包大小必須設(shè)為8Bytes,若設(shè)置4個(gè)緩沖區(qū)交替工作,每緩沖區(qū)分20幀傳送, 則RingBuffer的大小為640Bytes,那么USB主控制器每20ms的頻率中斷回調(diào)一次客戶驅(qū)動(dòng)程序是合適的。
驅(qū)動(dòng)程序通過IoSetCompletionRoutine()函數(shù)給每個(gè)IRP設(shè)置回調(diào)函數(shù)入口地址[6],每完成一個(gè)IRP緩沖區(qū)數(shù)據(jù)傳送操作,回調(diào)一次該地址指向的函數(shù),以便把下一緩沖包數(shù)據(jù)壓入到IRP棧,直到全部數(shù)據(jù)流傳送完畢或人為終止傳送。
5 結(jié)束語
擴(kuò)展USB接口,大幅提升了32位ARM嵌入式系統(tǒng)數(shù)據(jù)通信的吞吐能力,有即插即用特性和多種數(shù)據(jù)傳輸模式,方案適合于嵌入式系統(tǒng)的多種應(yīng)用。文章具體闡述了方案硬件、軟件設(shè)計(jì)的關(guān)鍵問題,并討論了如何分配USB總線帶寬,實(shí)現(xiàn)恒速音頻PCM碼流傳送,實(shí)驗(yàn)結(jié)果表明該方案能流暢地接收Windows2000通過USB接口輸出話音編碼信號(hào),方案可行,具有較高參考價(jià)值。





