32 位ARM 嵌入式系統(tǒng)擴(kuò)展USB 接口設(shè)計(jì)
采用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。
本文引用地址:http://www.ex-cimer.com/article/151956.htm
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)圖。
操作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)框架基本相同,可以從Windows2000DDK 中獲得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 即可。
在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ù)入口地址,每完成一個(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à)值
評(píng)論