Linux2.6環(huán)境下USB設(shè)備的驅(qū)動實現(xiàn)
3 UDC的設(shè)計與實現(xiàn)
設(shè)備控制器驅(qū)動主要分為Gadget Driver接口模塊、Gadget API函數(shù)模塊、中斷處理模塊、數(shù)據(jù)結(jié)構(gòu)定義、初始化模塊、硬件讀寫模塊等,各模塊可以單獨進行設(shè)計。
3.1 數(shù)據(jù)結(jié)構(gòu)定義
根據(jù)Gadget API提供的數(shù)據(jù)結(jié)構(gòu),可以定義自己的數(shù)據(jù)結(jié)構(gòu)(如設(shè)備數(shù)據(jù)結(jié)構(gòu)otg_udc,端點數(shù)據(jù)結(jié)構(gòu)otg_udc_ep等)來描述該USB設(shè)備控制器。
定義完特定的設(shè)備控制器驅(qū)動的數(shù)據(jù)結(jié)構(gòu)后,再進行相應的映射(static struct otg_ip_udcmemory),以便將具體的設(shè)備控制器、設(shè)備端點和Gadget的抽象數(shù)據(jù)結(jié)構(gòu)聯(lián)系起來。
3.2 Gadget Driver接口模塊
UDC驅(qū)動提供有usb_gadget_driver_register模塊,該模塊可實usb_gadget_register_driver等綁定函數(shù)的功能,以綁定UDC和Gadget Driver。
3.3 Gadget API函數(shù)模塊
Linux USB gadget driver API定義了一個通用的gadget driver的接口,利用gadget driver可通過API與底層USB controller driver進行通信。該API屏蔽了底層硬件的不同,故可使gadget driver只注重功能的實現(xiàn),而盡量與硬件無關(guān)。其代碼如下:
該模塊主要實現(xiàn)Gadget API定義的函數(shù)功能,如結(jié)構(gòu)體usb_ep_ops和usb_gadget_ops中的函數(shù),以及usb_gadget_register_driver注冊函數(shù)等。這些函數(shù)可供Gadget Driver調(diào)用。
3.4 中斷處理模塊
由于設(shè)備是被動的接受主機的控制,設(shè)備的所有行為都是基于設(shè)備中斷的觸發(fā),因此,函數(shù)主要處理Reset中斷、Resume中斷、Suspend中斷、EP0中斷以及其他端口中斷。
3.5 初始化模塊
初始化主要是打開中斷、打開并設(shè)置端點、設(shè)置最大總線轉(zhuǎn)向時間(此時問即包間最大等待時間),還要設(shè)置最大緩沖區(qū)長度等。
3.6 硬件讀寫模塊
和主機控制器驅(qū)動程序類似,設(shè)備控制器的讀寫方式分為PIO讀寫和DMA讀寫兩種模式,讀寫內(nèi)容也分為寄存器讀寫和端點緩沖區(qū)讀寫。在讀寫過程中,所有讀寫地址都必須是雙字節(jié)對齊模式。
4 驅(qū)動測試結(jié)果
本文研究的HCD已經(jīng)應用于實際的工程中,驅(qū)動測試的硬件環(huán)境如圖4所示。
本系統(tǒng)的硬件平臺是Realview EB,這是一個高度集成的開發(fā)板,其母板上的硬件資源包括:一個FPGA (Xilinx Virtex-II XC2V6000)、靜態(tài)和動態(tài)內(nèi)存、集成外圍設(shè)備和兩個用于Core Tiles連接的tile連接器。設(shè)計時可通過增加一個額外的Core Tile(ARM926EJS CORE)來創(chuàng)建一個微處理系統(tǒng)。Logic Tile(Xilinx XC2V6000)中包含有一塊具有主機控制器功能的芯片otg_ip,otg_ip可通過片內(nèi)總線AHB掛載在母板EB上。在該開發(fā)板上運行Linux系統(tǒng)時,可通過交叉編譯調(diào)試環(huán)境將開發(fā)報與一臺PC機相連,這樣,調(diào)試信息就可以通過串口打印在該主機的終端上。otg_ip可通過ULPI接口連接PHY芯片,并與USB設(shè)備相連。
設(shè)備控制器驅(qū)動模塊otg_ip_udc.ko和g_filestorage.ko成功加載后,再將其作為移動優(yōu)盤插入電腦主機的USB接口,驅(qū)動即可成功識別。圖5所示是內(nèi)核打印的信息結(jié)果。
5 結(jié)束語
USB通用串行總線具有傳輸速率高、功耗低、可熱插拔和發(fā)展快速等優(yōu)點,而Linus操作系統(tǒng)則具有易于移植和裁減、內(nèi)核小、效率高、原代碼開放等特點,本文通過將其結(jié)合而給出的Linux環(huán)境下的USB設(shè)備驅(qū)動方法,可以快速地實現(xiàn)大容量的存儲功能,實驗表明:該系統(tǒng)的數(shù)據(jù)讀寫速度可以達到681 kB/s,而且效果良好。
評論