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