當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]Linux2.6環(huán)境下USB設(shè)備的驅(qū)動(dòng)實(shí)現(xiàn)

0  引言

嵌入式linux系統(tǒng)環(huán)境以其易于移植裁減、內(nèi)核小、效率高、完整、原代碼開(kāi)放及性能優(yōu)異等特點(diǎn),在嵌入式領(lǐng)域得到了非常廣泛的應(yīng)用。Linux的USB設(shè)備端的源代碼中主要有USB device的海量存儲(chǔ)設(shè)備、串口設(shè)備、網(wǎng)絡(luò)設(shè)備等設(shè)備驅(qū)動(dòng)程序及各種USB device控制器芯片的驅(qū)動(dòng)程序。市場(chǎng)上USB設(shè)備控制器芯片種類(lèi)繁多,大多數(shù)用戶(hù)需要針對(duì)特定應(yīng)用來(lái)開(kāi)發(fā)相關(guān)的USB設(shè)備控制器驅(qū)動(dòng)程序,才能使設(shè)備正常工作在linux操作系統(tǒng)下。

1 USB設(shè)備端驅(qū)動(dòng)系統(tǒng)

Linux Gadget子系統(tǒng)主要分為三層:第一層為芯片驅(qū)動(dòng)層,負(fù)責(zé)將各種USB device控制器抽象為統(tǒng)一的函數(shù)接口,以供上層驅(qū)動(dòng)程序調(diào)用;第二層主要是對(duì)操作函數(shù)的簡(jiǎn)單封裝;第三層為設(shè)備驅(qū)動(dòng)層,可根據(jù)系統(tǒng)的需求實(shí)現(xiàn)所對(duì)應(yīng)的功能。圖1所示是Linux Gadget子系統(tǒng)的驅(qū)動(dòng)層次。Linux Gadget子系統(tǒng)的設(shè)備驅(qū)動(dòng)層主要根據(jù)各個(gè)類(lèi)別的規(guī)范及協(xié)議實(shí)現(xiàn)各種設(shè)備的驅(qū)動(dòng),本設(shè)計(jì)需要使一個(gè)嵌入式設(shè)備擁有移動(dòng)硬盤(pán)的功能,所以,可以根據(jù)海量存儲(chǔ)類(lèi)的規(guī)范及協(xié)議來(lái)實(shí)現(xiàn)該功能。



1.1 UDC驅(qū)動(dòng)的基本構(gòu)架

圖2所示是UDC驅(qū)動(dòng)的基本構(gòu)架圖。在控制器驅(qū)動(dòng)程序中,首先應(yīng)注冊(cè)platform驅(qū)動(dòng),調(diào)用其probe函數(shù)搜索設(shè)備,并在probe函數(shù)內(nèi)初始化usb_ep和usb_gadget等結(jié)構(gòu),然后注冊(cè)設(shè)備,并申請(qǐng)中斷,接著等待中斷進(jìn)入中斷服務(wù)子程序,最后聲明和實(shí)現(xiàn)usb_gadget_register_driver注冊(cè)函數(shù)并輸出給上層驅(qū)動(dòng)。在該過(guò)程中,聯(lián)系它們的紐帶是一些全局結(jié)構(gòu)體變量。

1.2 Gadget API

Gadget API為Gadget系統(tǒng)定義了統(tǒng)一的數(shù)據(jù)結(jié)構(gòu)和接口函數(shù),它和主機(jī)端的USB Core地位類(lèi)似,但功能僅限于提供編程接口,如用結(jié)構(gòu)體usb_gadget_ops和usb_ep_ops對(duì)設(shè)備控制器驅(qū)動(dòng)操作函數(shù)和端點(diǎn)操作函數(shù)進(jìn)行重新封裝。比較特殊的是Gadget驅(qū)動(dòng)程序注冊(cè)函數(shù)usb_gadget_register_driver,它們是由設(shè)備控制器(UDC)驅(qū)動(dòng)直接提供的,用于將UDC綁定到gadget driver。這增加了Gadget Driver和UDC之間的依賴(lài)性。

在設(shè)備端,Gadget系統(tǒng)雖然類(lèi)似主機(jī)驅(qū)動(dòng)系統(tǒng)分了三層結(jié)構(gòu),但Gadget API只定義了一些數(shù)據(jù)結(jié)構(gòu)、宏和功能函數(shù),并對(duì)UDC驅(qū)動(dòng)程序進(jìn)行了簡(jiǎn)單包裝,而沒(méi)有驅(qū)動(dòng)管理等功能。

1.3設(shè)備應(yīng)用驅(qū)動(dòng)程序

設(shè)備端應(yīng)用程序(Gadget Driver)用于控制USB設(shè)備功能的實(shí)現(xiàn),使設(shè)備表現(xiàn)出“網(wǎng)絡(luò)連接”、“打印機(jī)”或“大容量存儲(chǔ)設(shè)備”等特性。本文以大容量移動(dòng)存儲(chǔ)設(shè)備為例來(lái)實(shí)現(xiàn)移動(dòng)硬盤(pán)的功能。

BULK ONLY傳輸指的是主機(jī)和大容量存儲(chǔ)設(shè)備之間的一種數(shù)據(jù)傳輸方式。

2設(shè)備端驅(qū)動(dòng)調(diào)度

在嵌入式Linux操作系統(tǒng)中,Gadget driver和Gadget API可完成部分USB協(xié)議處理、BULK ONLY等傳輸協(xié)議以及指令的解析處理,用戶(hù)只需要在設(shè)備控制器驅(qū)動(dòng)程序中完成部分USB協(xié)議處理和Gadget API的銜接工作。

圖3所示的流程圖給出了USB設(shè)備端驅(qū)動(dòng)程序的基本調(diào)度思想。該方案的主要思路是被動(dòng)的接受主機(jī)端的傳輸命令(任何類(lèi)型的通信都由USB主機(jī)發(fā)起,USB設(shè)備間不能直接通信),然后通過(guò)中斷觸發(fā)的方式完成主機(jī)端的數(shù)據(jù)傳輸。當(dāng)產(chǎn)生設(shè)備端中斷時(shí),設(shè)備控制器驅(qū)動(dòng)程序首先判斷中斷類(lèi)型。當(dāng)其為批量傳輸端點(diǎn)IN中斷時(shí),驅(qū)動(dòng)程序會(huì)將該EP下鏈接的REQ中的數(shù)據(jù)依次寫(xiě)入U(xiǎn)SB2.0 OTG IP的設(shè)備控制器的內(nèi)存區(qū);當(dāng)其為批量傳輸OUT中斷時(shí),驅(qū)動(dòng)程序會(huì)將設(shè)備控制器內(nèi)存區(qū)的數(shù)據(jù)讀入REQ中的buffer中;當(dāng)其為端點(diǎn)0的控制傳輸中斷時(shí),驅(qū)動(dòng)程序?qū)⒆x取端點(diǎn)緩沖區(qū)的數(shù)據(jù),并解析當(dāng)前的設(shè)備請(qǐng)求。如果主機(jī)傳輸給設(shè)備的設(shè)備請(qǐng)求為USB REO SEDRESS(設(shè)置設(shè)備地址)、USB_REQ_GET_STATUS(獲取設(shè)備狀態(tài))、USB_REQ_SET_FEATURE(設(shè)置設(shè)備特性),設(shè)備控制器驅(qū)動(dòng)程序會(huì)自行響應(yīng)請(qǐng)求。但是,如果是其它設(shè)備請(qǐng)求,如GET_DESCRIPTOR(獲取設(shè)備描述符)時(shí),設(shè)備控制器驅(qū)動(dòng)便會(huì)將該請(qǐng)求提交給Gadget Driver,然后由Gadget Driver排隊(duì)將該設(shè)備請(qǐng)求提交給端點(diǎn),以等待下次控制端點(diǎn)中斷。


控制傳輸比較復(fù)雜,它需要完成建立階段、數(shù)據(jù)傳輸階段和狀態(tài)階段。整個(gè)控制端點(diǎn)中斷的處理可通過(guò)四個(gè)狀態(tài)實(shí)現(xiàn),分別是:端點(diǎn)0空閑(EP0_IDLE)、 數(shù)據(jù)IN傳輸(EP0 IN DATA_PHASE)、數(shù)據(jù)OUT傳輸(EP0 OUT DATA_PHASE)和狀態(tài)階段(EPO_STATUS)。

EP0_IDLE狀態(tài)主要處理建立階段的setup令牌,并根據(jù)獲得的設(shè)備請(qǐng)求處理能夠處理的設(shè)備請(qǐng)求,同時(shí)把不能處理的設(shè)備請(qǐng)求(如獲取設(shè)備描述符,配置描述符等)提交給上層Gadget Driver;EP0_OUT_DATA_PHASE狀態(tài)主要處理數(shù)據(jù)階段的OUT傳輸;EP0_OUT_DATA_PHASE狀態(tài)主要處理數(shù)據(jù)階段的IN傳輸;EP0_STATUS狀態(tài)則主要完成控制傳輸過(guò)程中的狀態(tài)階段。

在圖3所示的流程圖中,EP0為控制傳輸端點(diǎn),EP1、EP2、EP3為批量傳輸端點(diǎn),它們主要包括端點(diǎn)傳輸類(lèi)型、端點(diǎn)緩沖區(qū)大小等信息。REQ為Gadget Driver提交的端點(diǎn)請(qǐng)求,主要包含傳輸?shù)臄?shù)據(jù)長(zhǎng)度和地址。[!--empirenews.page--]

3 UDC的設(shè)計(jì)與實(shí)現(xiàn)

設(shè)備控制器驅(qū)動(dòng)主要分為Gadget Driver接口模塊、Gadget API函數(shù)模塊、中斷處理模塊、數(shù)據(jù)結(jié)構(gòu)定義、初始化模塊、硬件讀寫(xiě)模塊等,各模塊可以單獨(dú)進(jìn)行設(shè)計(jì)。

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,端點(diǎn)數(shù)據(jù)結(jié)構(gòu)otg_udc_ep等)來(lái)描述該USB設(shè)備控制器。

定義完特定的設(shè)備控制器驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)后,再進(jìn)行相應(yīng)的映射(static struct otg_ip_udcmemory),以便將具體的設(shè)備控制器、設(shè)備端點(diǎn)和Gadget的抽象數(shù)據(jù)結(jié)構(gòu)聯(lián)系起來(lái)。

3.2 Gadget Driver接口模塊

UDC驅(qū)動(dòng)提供有usb_gadget_driver_register模塊,該模塊可實(shí)usb_gadget_register_driver等綁定函數(shù)的功能,以綁定UDC和Gadget Driver。

3.3 Gadget API函數(shù)模塊

Linux USB gadget driver API定義了一個(gè)通用的gadget driver的接口,利用gadget driver可通過(guò)API與底層USB controller driver進(jìn)行通信。該API屏蔽了底層硬件的不同,故可使gadget driver只注重功能的實(shí)現(xiàn),而盡量與硬件無(wú)關(guān)。其代碼如下:



該模塊主要實(shí)現(xiàn)Gadget API定義的函數(shù)功能,如結(jié)構(gòu)體usb_ep_ops和usb_gadget_ops中的函數(shù),以及usb_gadget_register_driver注冊(cè)函數(shù)等。這些函數(shù)可供Gadget Driver調(diào)用。

3.4  中斷處理模塊

由于設(shè)備是被動(dòng)的接受主機(jī)的控制,設(shè)備的所有行為都是基于設(shè)備中斷的觸發(fā),因此,函數(shù)主要處理Reset中斷、Resume中斷、Suspend中斷、EP0中斷以及其他端口中斷。

3.5  初始化模塊

初始化主要是打開(kāi)中斷、打開(kāi)并設(shè)置端點(diǎn)、設(shè)置最大總線轉(zhuǎn)向時(shí)間(此時(shí)問(wèn)即包間最大等待時(shí)間),還要設(shè)置最大緩沖區(qū)長(zhǎng)度等。

3.6  硬件讀寫(xiě)模塊

和主機(jī)控制器驅(qū)動(dòng)程序類(lèi)似,設(shè)備控制器的讀寫(xiě)方式分為PIO讀寫(xiě)和DMA讀寫(xiě)兩種模式,讀寫(xiě)內(nèi)容也分為寄存器讀寫(xiě)和端點(diǎn)緩沖區(qū)讀寫(xiě)。在讀寫(xiě)過(guò)程中,所有讀寫(xiě)地址都必須是雙字節(jié)對(duì)齊模式。

4  驅(qū)動(dòng)測(cè)試結(jié)果

本文研究的HCD已經(jīng)應(yīng)用于實(shí)際的工程中,驅(qū)動(dòng)測(cè)試的硬件環(huán)境如圖4所示。



本系統(tǒng)的硬件平臺(tái)是Realview EB,這是一個(gè)高度集成的開(kāi)發(fā)板,其母板上的硬件資源包括:一個(gè)FPGA (Xilinx Virtex-II XC2V6000)、靜態(tài)和動(dòng)態(tài)內(nèi)存、集成外圍設(shè)備和兩個(gè)用于Core Tiles連接的tile連接器。設(shè)計(jì)時(shí)可通過(guò)增加一個(gè)額外的Core Tile(ARM926EJS CORE)來(lái)創(chuàng)建一個(gè)微處理系統(tǒng)。Logic Tile(Xilinx XC2V6000)中包含有一塊具有主機(jī)控制器功能的芯片otg_ip,otg_ip可通過(guò)片內(nèi)總線AHB掛載在母板EB上。在該開(kāi)發(fā)板上運(yùn)行Linux系統(tǒng)時(shí),可通過(guò)交叉編譯調(diào)試環(huán)境將開(kāi)發(fā)報(bào)與一臺(tái)PC機(jī)相連,這樣,調(diào)試信息就可以通過(guò)串口打印在該主機(jī)的終端上。otg_ip可通過(guò)ULPI接口連接PHY芯片,并與USB設(shè)備相連。

設(shè)備控制器驅(qū)動(dòng)模塊otg_ip_udc.ko和g_filestorage.ko成功加載后,再將其作為移動(dòng)優(yōu)盤(pán)插入電腦主機(jī)的USB接口,驅(qū)動(dòng)即可成功識(shí)別。圖5所示是內(nèi)核打印的信息結(jié)果。



5  結(jié)束語(yǔ)

USB通用串行總線具有傳輸速率高、功耗低、可熱插拔和發(fā)展快速等優(yōu)點(diǎn),而Linus操作系統(tǒng)則具有易于移植和裁減、內(nèi)核小、效率高、原代碼開(kāi)放等特點(diǎn),本文通過(guò)將其結(jié)合而給出的Linux環(huán)境下的USB設(shè)備驅(qū)動(dòng)方法,可以快速地實(shí)現(xiàn)大容量的存儲(chǔ)功能,實(shí)驗(yàn)表明:該系統(tǒng)的數(shù)據(jù)讀寫(xiě)速度可以達(dá)到681 kB/s,而且效果良好。
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉