通用串行總線(USB)接口具有簡(jiǎn)單靈活、高帶寬、易于擴(kuò)展和熱插拔等優(yōu)點(diǎn),它目前已成為數(shù)碼設(shè)備的標(biāo)準(zhǔn)接口之一,小到U盤、MP3,大到數(shù)碼相機(jī)、打印機(jī),USB接口的身影無(wú)處不在。但我們目前所使用的USB移動(dòng)設(shè)備多為USB的外設(shè)(Device) , 比如USB的移動(dòng)硬盤、USB接口的數(shù)碼相機(jī),一般只能在PC上使用,即只能通過PC實(shí)現(xiàn)文件和數(shù)據(jù)的交換。
業(yè)界和用戶的需求呼喚USB主機(jī)的嵌入式化,因此在嵌入式系統(tǒng)中實(shí)現(xiàn)USB主機(jī)功能成了USB設(shè)計(jì)領(lǐng)域的熱點(diǎn)之一。
迄今為止,嵌入式USB主機(jī)的最大市場(chǎng)和增長(zhǎng)點(diǎn)在移動(dòng)消費(fèi)電子設(shè)備領(lǐng)域, 比如PDA與USB記憶棒傳遞數(shù)據(jù)、MP3之間傳遞歌曲、數(shù)碼相機(jī)連接打印機(jī)等。
嵌入式USB主機(jī)也逐漸用于工業(yè)測(cè)控領(lǐng)域,用來(lái)實(shí)現(xiàn)數(shù)據(jù)的采集和交換。原來(lái)數(shù)據(jù)采集和交換大多是使用軟盤、串行接口(RS232/RS485)或以太網(wǎng)等方式。軟盤存儲(chǔ)容量小、可靠性差,而串行接口或以太網(wǎng)都需要布線施工,接入成本大,而且不具備移動(dòng)性?,F(xiàn)在,越來(lái)越多的嵌入式系統(tǒng)采用通過USB總線連接的測(cè)控設(shè)備。
USB控制器ISP1161簡(jiǎn)介
一個(gè)USB系統(tǒng)一般由一個(gè)USB主機(jī)(HOST)、一個(gè)或多個(gè)USB集線器(HUB)和一個(gè)或多個(gè)USB設(shè)備節(jié)點(diǎn)(NODE)組成。USB協(xié)議規(guī)定了USB主機(jī)與USB設(shè)備的主從關(guān)系,所以USB接口產(chǎn)品的應(yīng)用離不開USB主機(jī)的開發(fā)。USB主機(jī)是包含USB軟件驅(qū)動(dòng)和USB主機(jī)硬件功能接口的計(jì)算機(jī)系統(tǒng)實(shí)體。USB主機(jī)硬件是指USB主機(jī)控制器,它規(guī)定了USB主機(jī)硬件接口,因而在設(shè)計(jì)USB協(xié)議棧時(shí)必須了解相關(guān)的USB主機(jī)控制器規(guī)范。
針對(duì)嵌入式系統(tǒng)應(yīng)用的USB主機(jī)控制器規(guī)范是康柏、微軟、松下等公司提出的OHCI(開放式主機(jī)控制器接口)標(biāo)準(zhǔn)。
飛利普公司的ISP1161芯片支持OHCI標(biāo)準(zhǔn),它是一個(gè)符合USB2.0全速規(guī)范的單片主機(jī)控制器和設(shè)備控制器。ISP1161可以僅作為主機(jī)控制器或設(shè)備控制器使用,也可以同時(shí)作為主機(jī)和設(shè)備控制器使用。
ISP1161可分為四大功能模塊:
1)主機(jī)控制器模塊:實(shí)現(xiàn)主機(jī)控制器的功能。提供兩個(gè)下行端口,每個(gè)下行端口都有自己的過流檢測(cè)輸入管腳和電源轉(zhuǎn)換控制輸出管腳。
2)設(shè)備控制器模塊:實(shí)現(xiàn)設(shè)備控制器的功能。提供一個(gè)上行端口,有其自身的VBUS檢測(cè)輸入管腳。
3)微處理器接口模塊:兩個(gè)USB控制器共用一個(gè)微處理器總線接口,它們有相同的數(shù)據(jù)總線,I/O地址不同。它們也有各自的中斷請(qǐng)求輸出管腳和獨(dú)立的DMA通道。
4)電源調(diào)整和上電復(fù)位模塊:除了可以軟件復(fù)位外,還可以通過RESET_N管腳實(shí)現(xiàn)硬件復(fù)位。ISP1161只接受5V或3.3V的電壓,當(dāng)輸入5V電壓時(shí),電源調(diào)整器會(huì)將其調(diào)整為3.3V。
ISP1161 主機(jī)控制器子模塊的功能框圖示于圖1,主機(jī)控制器的下行端口可與任意一個(gè)符合USB 規(guī)范的USB 設(shè)備和包含USB 上行端口的USB 集線器相連。類似地,設(shè)備控制器的上行端口可與任意一個(gè)符合USB 規(guī)范的USB主機(jī)和包含USB 下行端口的USB 集線器相連。
相關(guān)嵌入式應(yīng)用系統(tǒng)的架構(gòu)
本文涉及的嵌入式系統(tǒng)是一個(gè)指紋驗(yàn)證系統(tǒng),其總體結(jié)構(gòu)如圖2所示。系統(tǒng)采用英特爾公司的32位400MHz微處理器PXA255以滿足指紋識(shí)別系統(tǒng)計(jì)算量大的需要,PXA255具有豐富的外圍接口,如:LCD控制器、串口、CF卡接口、USB客戶端口,但沒有USB 主機(jī)控制器。此外,硬件平臺(tái)還包括存儲(chǔ)模塊、數(shù)據(jù)采集模塊、USB模塊、網(wǎng)絡(luò)通信模塊和調(diào)試及下載接口模塊,系統(tǒng)總體結(jié)構(gòu)框圖如圖2所示。
32位微處理器PXA255中央處理器結(jié)合一個(gè)51單片機(jī)完成對(duì)整個(gè)系統(tǒng)的控制操作。
8M的FLASH和32M的SDRAM用作存儲(chǔ)模塊。
具有USB設(shè)備接口的富士通公司指紋傳感器芯片MBF200實(shí)現(xiàn)對(duì)指紋數(shù)據(jù)的采集和轉(zhuǎn)換。
通過USB主機(jī)接口實(shí)現(xiàn)嵌入式系統(tǒng)與USB設(shè)備——MBF200之間的通信。
鑒于該指紋驗(yàn)證系統(tǒng)要實(shí)現(xiàn)網(wǎng)絡(luò)化,因而配置了CF接口無(wú)線網(wǎng)卡。
通過PXA255本身的串口控制器與PC通信,用于調(diào)試和下載Windows CE鏡像文件。
人機(jī)交互用于顯示運(yùn)行結(jié)果和注冊(cè)/增刪指紋數(shù)據(jù)。
對(duì)于PXA255處理器而言,ISP1161類似于一個(gè)具有16位數(shù)據(jù)總線的存儲(chǔ)設(shè)備。ISP1161工作在并行I/O(PIO)模式,只占用兩個(gè)I/O端口和微處理器兩個(gè)內(nèi)存空間。微處理器用兩根地址線A0和A1來(lái)讀寫ISP1161內(nèi)部寄存器和FIFO緩沖RAM。地址線A0用來(lái)選擇傳輸命令數(shù)據(jù):A0=1,處理器訪問ISP1161的命令端口;A0=0,處理器訪問ISP1161的數(shù)據(jù)端口。地址線A1用來(lái)選擇主機(jī)控制器或設(shè)備控制器模式:A1=0,切換至主機(jī)控制器模式;A1=1,切換至設(shè)備控制器模式。本系統(tǒng)中ISP1161和PXA255的硬件接口如圖3所示。用可編程I/O模式實(shí)現(xiàn)數(shù)據(jù)通信,即ISP1161的數(shù)據(jù)總線經(jīng)總線驅(qū)動(dòng)接到PXA255的數(shù)據(jù)總線D[0:15],A0和A1分別接到PXA255的A1和A2以實(shí)現(xiàn)主機(jī)和設(shè)備、命令和數(shù)據(jù)端口的選擇。I/O口地址的完全解碼包括芯片選擇信號(hào)CS及地址線A1和A0。I/O口的訪問方向由RD及WR信號(hào)控制:當(dāng)RD為低時(shí),微處理器從ISP1161A1 數(shù)據(jù)口讀取數(shù)據(jù);當(dāng)WR為低時(shí),微處理器向指令端口寫入一個(gè)指令,或向數(shù)據(jù)端口寫入數(shù)據(jù)。
USB主機(jī)軟件設(shè)計(jì)
系統(tǒng)的軟件平臺(tái)是微軟公司的Windows CE。
ISP1161軟件模型
USB主機(jī)軟件系統(tǒng)包括通用串行總線驅(qū)動(dòng)程序(USBD)、主機(jī)控制器驅(qū)動(dòng)程序(HCD)和客戶端軟件??蛻舳塑浖菓?yīng)用代碼或USB類驅(qū)動(dòng)程序。USBD和HCD共同用作USB主機(jī)堆棧。USBD以I/O請(qǐng)求包的形式指定某一特定通道傳輸數(shù)據(jù),并把請(qǐng)求分解成多個(gè)事務(wù)。HCD與ISP1161之間以PTD(Philips Transfer Description)的形式進(jìn)行通信。I/O請(qǐng)求包的數(shù)據(jù)在底層被打包成PTD的格式后再與ISP1161進(jìn)行通信。
ISP1161只提供了一部分符合OHCI標(biāo)準(zhǔn)的寄存器,而其硬件是支持OHCI標(biāo)準(zhǔn)的。所以為使它完全符合OHCI標(biāo)準(zhǔn),我們?cè)O(shè)計(jì)時(shí)在系統(tǒng)內(nèi)存中定義一套完全符合OHCI規(guī)范的操作寄存器和HCCA控制器通信區(qū),軟件讀寫其中數(shù)據(jù),以軟件模擬硬件來(lái)實(shí)現(xiàn)完整的OHCI規(guī)范,并按照OHCI規(guī)范的要求,在系統(tǒng)內(nèi)存中維護(hù)了一套完整的數(shù)據(jù)結(jié)構(gòu),以完成對(duì)主機(jī)控制器初始化、狀態(tài)讀取并收集USB主機(jī)與設(shè)備通信的詳細(xì)信息。
ISP1161的數(shù)據(jù)傳輸模式
ISP1161提供了HC控制和狀態(tài)寄存器、ATL緩沖區(qū)和ITL緩沖區(qū)。其中HC控制和狀態(tài)寄存器包括一套可操作的符合OHCI的寄存器(32位)和一套ISP1161特定的寄存器(16位)。通過對(duì)相應(yīng)寄存器的操作,主機(jī)控制器驅(qū)動(dòng)程序就可以完成對(duì)主機(jī)控制器初始化和配置工作。ATL緩沖區(qū)和ITL緩沖區(qū)用來(lái)實(shí)現(xiàn)USB系統(tǒng)支持的四種不同數(shù)據(jù)傳輸:控制傳輸、批量傳輸、中斷傳輸和實(shí)時(shí)傳輸。ITL是實(shí)時(shí)傳輸?shù)木彌_的FIFO,而ATL是USB其它三種類型傳輸?shù)木彌_FIFO。
ISP1161數(shù)據(jù)傳輸?shù)木唧w過程為:硬件初始化完成后,調(diào)用HCD的MakePTDdata函數(shù)在系統(tǒng)存儲(chǔ)器中以PTD數(shù)據(jù)結(jié)構(gòu)定義一塊數(shù)據(jù)緩沖區(qū)。再調(diào)用SendPTD函數(shù)發(fā)送PTD數(shù)據(jù),其中的WritePTDtoATL函數(shù)將數(shù)據(jù)復(fù)制到ATL或ITL緩沖區(qū)。通過ISP1161硬件掃描ATL或ITL緩沖區(qū)以實(shí)現(xiàn)與USB終端設(shè)備進(jìn)行通信。
硬件掃描過程就是把數(shù)據(jù)發(fā)送到總線上,以硬件掃描ATL緩沖區(qū)為例:當(dāng)HCD通過HcTransferCounter寄存器向ATL緩沖區(qū)寫入HcATLBufferPort寄存器指定的字節(jié)數(shù)時(shí),主機(jī)控制器硬件開始掃描ATL緩沖區(qū);當(dāng)操作完成后,HcBufferStatusPort寄存器中的位ATLBufferFull被置位,ATLBufferFull位從邏輯0到邏輯1的跳變使硬件開始掃描ATL緩沖區(qū)內(nèi)的PTD;當(dāng)ATLInt中斷產(chǎn)生時(shí),表明硬件停止掃描ATL緩沖區(qū),HcBufferStatus寄存器中的位ATLBufferDone被置位,HCD又可以訪問ATL緩沖區(qū)了。相關(guān)的部分偽代碼如下:
#define hccport base_address | 0x02
#define hcdport base_address
#define CMD_RD 0x00
#define CMD_WR 0x80
void SendlPTD(UINT16 *pPTDdata){ // pPTDdata指針指向PTD數(shù)據(jù)內(nèi)容;
WritePTDtoATL(pPTDdata, 16); //把PTD數(shù)據(jù)寫入ATL緩沖區(qū),16為寫入數(shù)據(jù)字節(jié)數(shù);
do {ReadPTDfromATL(pPTDdata, 72); //從ATL緩沖區(qū)讀取PTD數(shù)據(jù),72為讀取的字節(jié)數(shù);
bfActive = (*pPTDdata) & PTD_ACTIVE; //檢查有效位,PTD結(jié)束后主控器將把該位清零。
}while(bfActive != 0)}
void WritePTDtoATL(UINT16 *pPTDdata, UINT totalbytes){
WriteHCR_UINT16(IDX_HcTransferCounter, databytes);//向HcTransferCounter寄存器寫入要傳輸?shù)淖止?jié)數(shù);
*hccport = IDX_HcATLBufferPort | COM_WR; //向ATLBuffer端口寫入寫命令;
DisableInterrupts(); //禁止所有中斷;
for (UINT m= totalbytes; m》0; m -=4 ){ //為了維護(hù)PTD數(shù)據(jù)在ATL緩沖區(qū)中的結(jié)構(gòu),采取每四字節(jié)循環(huán)
*hcdport = * pwPTDdata ++; //的方式;
*hcdport = * pwPTDdata ++; }
EnableInterrupts();} //使能中斷;
void ReadPTDfromATL(UINT16 * pPTDdata, UINT totalbytes){
WriteHCR_UINT16(IDX_HcTransferCounter, totalbytes);
*hccport = IDX_HcATLBufferPort | COM_RD;
DisableInterrupts();
for (UINT m= totalbytes; m》0; m -=4 ){
* pwPTDdata ++ = *hcdport;
* pwPTDdata ++ = *hcdport; }
EnableInterrupts();}
數(shù)據(jù)結(jié)構(gòu)鏈表的處理
在HCD將PTD從系統(tǒng)內(nèi)存復(fù)制到ATL或ITL緩沖區(qū)之前,HCD必須通過集合數(shù)據(jù)結(jié)構(gòu)來(lái)建立和追蹤PTD。HCD的責(zé)任是追蹤所有已連接設(shè)備的每個(gè)端點(diǎn)的屬性,如端點(diǎn)最大封包大小、端點(diǎn)地址和該端點(diǎn)從屬的設(shè)備地址。另外,HCD必須管理每個(gè)端點(diǎn)新的PTD的產(chǎn)生和已經(jīng)完成的PTD的處理。所以使用一個(gè)有效的數(shù)據(jù)結(jié)構(gòu)體系可以加快主機(jī)控制器的操作。本設(shè)計(jì)實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)類似于OHCI中定義的數(shù)據(jù)結(jié)構(gòu),如圖4所示。此數(shù)據(jù)結(jié)構(gòu)由三部分組成:三種類型端點(diǎn)的隊(duì)列(控制傳輸端點(diǎn)、批量傳輸端點(diǎn)和中斷傳輸端點(diǎn))、每種端點(diǎn)的一個(gè)PTD列和一個(gè)完成隊(duì)列。每個(gè)列隊(duì)由一個(gè)全局指針指定,這個(gè)全局指針保持隊(duì)列中第一個(gè)端點(diǎn)(EP)隊(duì)列頭的地址。每個(gè)EP隊(duì)列頭指向一個(gè)PTD列。一個(gè)PTD列保留著等待被主機(jī)控制器處理的PTD。在控制、批量和中斷傳輸中,PTD被復(fù)制到ATL緩沖區(qū)。一旦PTD被放入ATL緩沖區(qū),主機(jī)控制器就在下一幀中處理該P(yáng)TD。
結(jié)束語(yǔ)
在USB主機(jī)端功能實(shí)現(xiàn)后,我們又開發(fā)了USB設(shè)備——指紋傳感器MBF200的驅(qū)動(dòng)程序,并按照規(guī)定要求實(shí)現(xiàn)了指紋數(shù)據(jù)的采集和傳輸。
責(zé)任編輯:gt
評(píng)論