劉 杰,刁節(jié)濤,李 楠,孫兆林
(國(guó)防科學(xué)技術(shù)大學(xué) 電子科學(xué)與工程學(xué)院,湖南 長(zhǎng)沙 410073)
?
基于EZ-USB FX3的驅(qū)動(dòng)程序設(shè)計(jì)
劉杰,刁節(jié)濤,李楠,孫兆林
(國(guó)防科學(xué)技術(shù)大學(xué) 電子科學(xué)與工程學(xué)院,湖南 長(zhǎng)沙 410073)
摘要USB3.0數(shù)據(jù)傳輸接口以其在傳輸速度方面具有的優(yōu)勢(shì)正逐漸取代USB2.0接口成為電子設(shè)備接口的主流,驅(qū)動(dòng)開發(fā)需求也與日俱增。傳統(tǒng)的Driver Studio+WDM驅(qū)動(dòng)設(shè)計(jì)方法難度大、耗時(shí)長(zhǎng),已無法滿足現(xiàn)實(shí)應(yīng)用需求。文中采用全新的WDF驅(qū)動(dòng)架構(gòu),通過通用驅(qū)動(dòng)程序改進(jìn)的方法,在Visual Studio2013+WDK8.1的開發(fā)、編譯環(huán)境下進(jìn)行了USB3.0驅(qū)動(dòng)程序設(shè)計(jì)。實(shí)驗(yàn)結(jié)果表明,該方法設(shè)計(jì)的驅(qū)動(dòng)可穩(wěn)定運(yùn)行,有效地降低了驅(qū)動(dòng)開發(fā)難度,并且縮短了開發(fā)周期。
關(guān)鍵詞USB3.0驅(qū)動(dòng);WDF; EZ-USB FX3
USB(UniversalSerialBus)接口自誕生以來已經(jīng)走過了10多年的歷史,其具有廉價(jià)、易用、傳輸速度快、兼容性好等一系列優(yōu)點(diǎn),被廣泛用于電子設(shè)備的數(shù)據(jù)傳輸接口。以前,USB開發(fā)者采用WDM的驅(qū)動(dòng)模式進(jìn)行Windows操作系統(tǒng)下的USB驅(qū)動(dòng)開發(fā),但在Windows操作系統(tǒng)經(jīng)歷了Win7、Win8和最新的Win10革新之后,原始的WDM模式已經(jīng)無法滿足現(xiàn)實(shí)的驅(qū)動(dòng)開發(fā)需求。因此,WDF這種新的驅(qū)動(dòng)開發(fā)模式應(yīng)運(yùn)而生。
賽普拉斯的EZ-USBFX3是新一代USB3.0外設(shè)控制器,其集成了USB3.0和USB2.0 傳輸接口和32位ARM926EJ-S微處理器[1],具有強(qiáng)大的數(shù)據(jù)處理能力,在數(shù)據(jù)傳輸領(lǐng)域充當(dāng)著重要角色。本文利用賽普拉斯公司的EZ-USBFX3硬件平臺(tái),采用WDF的驅(qū)動(dòng)架構(gòu)對(duì)USB3.0的驅(qū)動(dòng)開發(fā)進(jìn)行了探索,并在Win7操作系統(tǒng)下進(jìn)行了驗(yàn)證,對(duì)其他Windows驅(qū)動(dòng)程序的開發(fā)具有重要的參考價(jià)值。
1EZ-USB FX3
EZ-USBFX3是賽普拉斯公司生產(chǎn)的新一代集成了ARM9處理器的USB3.0外設(shè)控制器,開發(fā)者利用EZ-USBFX3可方便地將USB3.0傳輸接口集成到任何數(shù)據(jù)傳輸系統(tǒng)中,實(shí)現(xiàn)海量數(shù)據(jù)的快速傳輸。FX3集成了USB3.0和USB2.0的物理層,利用ARM9強(qiáng)大的數(shù)據(jù)處理功能能訪問外設(shè)中的數(shù)據(jù)流并高效的處理數(shù)據(jù)。EZ-USBFX3集成了高速USB數(shù)據(jù)傳輸接口,支持USB外設(shè)功能,符合USB3.0規(guī)范,并能向下兼容USB2.0規(guī)范。EZ-USBFX3具有支持高速、全速和低速OTG角色轉(zhuǎn)換的功能,可支持16個(gè)輸入端點(diǎn)和16個(gè)輸出端點(diǎn)。當(dāng)作為外設(shè)時(shí),F(xiàn)X3具有實(shí)現(xiàn)超速、高速和全速的功能,作為主機(jī)時(shí)具有可實(shí)現(xiàn)高速、全速和低速的功能。
2USB3.0驅(qū)動(dòng)設(shè)計(jì)及實(shí)現(xiàn)
2.1WDF驅(qū)動(dòng)模式
WDF驅(qū)動(dòng)模式包含了兩套子框架系統(tǒng),即KMDF框架和UMDF框架。其中,KMDF框架是用來編寫內(nèi)核驅(qū)動(dòng)的,而UMDF框架則是用來編寫用戶層驅(qū)動(dòng)。如無特殊說明,WDF框架就指的是KMDF框架。
早期的驅(qū)動(dòng)開發(fā)都是基于WDM驅(qū)動(dòng)框架的。由于對(duì)IRP的管理、使用失措而導(dǎo)致的驅(qū)動(dòng)問題是WDM程序的一大難點(diǎn),微軟后來放棄了該驅(qū)動(dòng)模型,開發(fā)出了基于對(duì)象技術(shù)的KMDF驅(qū)動(dòng)模型。KMDF驅(qū)動(dòng)模型大幅減少了驅(qū)動(dòng)開發(fā)者的代碼書寫量,縮短了驅(qū)動(dòng)程序開發(fā)周期,同時(shí)也大幅降低了驅(qū)動(dòng)編寫出錯(cuò)的概率。
KMDF驅(qū)動(dòng)程序框架由對(duì)象和事件回調(diào)例程構(gòu)成[2]。一個(gè)USB設(shè)備的KMDF驅(qū)動(dòng)程序通常包括一個(gè)DriverEntry例程、一個(gè)EvtDriverDeviceAdd例程、一個(gè)或多個(gè)I/O隊(duì)列、一個(gè)或多個(gè)I/O事件回調(diào)例程、電源管理例程以及其他回調(diào)例程。這種基于對(duì)象的WDF驅(qū)動(dòng)模式能夠兼容WDM模式的驅(qū)動(dòng),其優(yōu)越性是WDM驅(qū)動(dòng)模式無法比擬的。
2.2驅(qū)動(dòng)工作原理
USB接口傳輸數(shù)據(jù)時(shí),首先由USB主控制器發(fā)出請(qǐng)求和數(shù)據(jù),通過根集線器逐層向下發(fā)給USB設(shè)備,從設(shè)備對(duì)接收到的請(qǐng)求做出響應(yīng)后再逐層向上返回給USB主控制器,由主控制器將數(shù)據(jù)交給計(jì)算機(jī)CPU進(jìn)行處理,如圖1所示。
圖1 USB接口信息傳遞模型
USB驅(qū)動(dòng)程序在信息過程中起著重要的樞紐作用。應(yīng)用程序?qū)鬏敂?shù)據(jù)保存在內(nèi)存緩沖區(qū)中,然后向相應(yīng)的USB設(shè)備發(fā)出數(shù)據(jù)傳輸請(qǐng)求,USB設(shè)備的驅(qū)動(dòng)程序?qū)RP(I/O請(qǐng)求包)做出響應(yīng),將接收到的數(shù)據(jù)轉(zhuǎn)化成USB協(xié)議中規(guī)定的事物處理格式。USB主控制器將接收到的每一個(gè)事物處理以數(shù)據(jù)幀的形式放進(jìn)事物處理隊(duì)列中,然后通過USB接口電纜將事物處理以消息包的形式發(fā)送到USB總線上。USB功能設(shè)備從總線上接收到信息后對(duì)數(shù)據(jù)包進(jìn)行解析,并將解析后的數(shù)據(jù)保存在端點(diǎn)緩沖區(qū)中。
2.3USB3.0驅(qū)動(dòng)設(shè)計(jì)
USB驅(qū)動(dòng)屬于設(shè)備驅(qū)動(dòng),是溝通USB主機(jī)與外部USB設(shè)備之間的橋梁。常見的USB驅(qū)動(dòng)開發(fā)有兩種方法:一種是采用WDK程序生成的KMDF基本框架進(jìn)行各種例程的設(shè)計(jì),這種驅(qū)動(dòng)開發(fā)過程相當(dāng)復(fù)雜,耗時(shí)長(zhǎng),且在開發(fā)過程中極容易出現(xiàn)因USB主機(jī)內(nèi)存泄露而導(dǎo)致藍(lán)屏或死機(jī)的情況;另一種方法就是在現(xiàn)有通用驅(qū)動(dòng)的基礎(chǔ)上進(jìn)行修改,通過添加或刪除相應(yīng)的例程而完成驅(qū)動(dòng)設(shè)計(jì)。其實(shí)現(xiàn)在有諸多優(yōu)秀的USB通用驅(qū)動(dòng)程序,如微軟的通用USB驅(qū)動(dòng)程序。這種通過合理利用通用驅(qū)動(dòng)程序的方法可加快USB設(shè)備驅(qū)動(dòng)程序開發(fā)的速度,降低開發(fā)難度,提高驅(qū)動(dòng)的穩(wěn)定性。文中采用第二種方法,在VisualStudio2013+WDK8.1的開發(fā)和編譯環(huán)境下,利用微軟提供的通用USB2.0驅(qū)動(dòng)程序完成了基于EZ-USBFX3硬件平臺(tái)的USB3.0驅(qū)動(dòng)程序開發(fā)。
在Windows系統(tǒng)中,一個(gè)設(shè)備的驅(qū)動(dòng)安裝程序包含兩個(gè)文件,后綴名為.sys的驅(qū)動(dòng)文件和后綴名為.inf的驅(qū)動(dòng)引導(dǎo)安裝文件。本文利用微軟官網(wǎng)提供的ezusb.sys通用USB驅(qū)動(dòng)模板,通過修改IOCTL驅(qū)動(dòng)接口開發(fā)USB3.0的.sys文件,其中主要差異如表1所示。上層應(yīng)用程序通過調(diào)用DeviceIOControl()函數(shù)獲得IOCTL接口的返回值,從而實(shí)現(xiàn)與底層硬件設(shè)備的指令和數(shù)據(jù)交互[3-6]。完成.sys文件設(shè)計(jì)后,還要對(duì).inf文件進(jìn)行設(shè)計(jì),提供對(duì).sys文件的安裝支持,以確保硬件設(shè)備在連接主機(jī)之后能夠被正確配置。每一個(gè)USB設(shè)備均有一個(gè)獨(dú)特的VID和PID,需要根據(jù)實(shí)際情況來修改VID和PID的值以適應(yīng)硬件的改動(dòng),本文對(duì)應(yīng)設(shè)備的VID和PID的值如下:
[Microsoft.NT$ARCH$]
;USB系列芯片的ID
%USB
在inf文件的[string]節(jié)下列出了設(shè)備的字符串信息,開發(fā)者需要根據(jù)需求修改這些字符串,本文修改代碼如下
[Strings]
MSFT=”ESSS_LIUJIE”
MfgName=”ESSS”
Disk_Description=”EZ-USBFX3InstallationDisk”
USB
kmdf_CyUSB.SvcDesc=”WDFSampleBusDriverforEZ-USBFX3DevelopmentKit”
ClassName= “SampleDevice”
Switch.DeviceDesc= “EZ-USBFX3Sample”
SPSVCINST_ASSOCSERVICE= 0x00000002
通過對(duì).inf文件和.inf文件的設(shè)計(jì),可編譯生成一個(gè)完整的USB驅(qū)動(dòng)程序,其他Windows驅(qū)動(dòng)程序的開發(fā)過程與此類似。本文在VisualStudio2013+WDK8.1的配置環(huán)境下最終設(shè)計(jì)、編譯生成了EZ-USBFX3的設(shè)備驅(qū)動(dòng)程序。
表1 ezusb.sys和cyusb3.sys的IOCTL接口對(duì)照表
2.4驅(qū)動(dòng)安裝
USB設(shè)備驅(qū)動(dòng)程序的安裝過程如圖2所示。USB設(shè)備插入主機(jī)后,操作系統(tǒng)會(huì)自動(dòng)搜索驅(qū)動(dòng)程序,當(dāng)無法找到合適的驅(qū)動(dòng)程序時(shí),系統(tǒng)會(huì)提示安裝自定義驅(qū)動(dòng)程序,此時(shí)找到.inf文件所在的目錄。操作系統(tǒng)讀取.inf文件中的硬件ID信息,并與USB設(shè)備的ID比對(duì),當(dāng)匹配成功后,操作系統(tǒng)會(huì)將驅(qū)動(dòng)程序(.sys文件)和相應(yīng)的.inf文件復(fù)制到系統(tǒng)驅(qū)動(dòng)目錄下,并將硬件設(shè)備的基本信息保存在注冊(cè)表中,等到下一次插入該USB設(shè)備時(shí),操作系統(tǒng)便會(huì)自動(dòng)加載相應(yīng)驅(qū)動(dòng)程序,無需再次手動(dòng)安裝。
3測(cè)試結(jié)果
將EZ-USBFX3設(shè)備連接到主機(jī)USB接口上,主機(jī)會(huì)對(duì)相應(yīng)的接口進(jìn)行枚舉操作,當(dāng)檢測(cè)到有硬件設(shè)備接入后,系統(tǒng)會(huì)提示安裝驅(qū)動(dòng)程序。指定.inf文件所在的目錄,操作系統(tǒng)讀取.inf文件中的硬件ID信息,并與USB設(shè)備的ID比對(duì),匹配成功后,操作系統(tǒng)會(huì)將驅(qū)動(dòng)程序(.sys文件)和相應(yīng)的.inf文件復(fù)制到系統(tǒng)驅(qū)動(dòng)目錄下,實(shí)際驅(qū)動(dòng)安裝效果如圖3所示。成功安裝驅(qū)動(dòng)程序后,通過設(shè)備管理器可以看到設(shè)備的詳細(xì)信息。打開USBControlCenter客戶端,可在左側(cè)面板上看到該USB設(shè)備的一些基本信息,該USB設(shè)備即可正常工作,如圖4所示。
圖2 USB設(shè)備驅(qū)動(dòng)程序安裝流程
圖3 USB設(shè)備驅(qū)動(dòng)程序安裝效果圖
圖4 USB設(shè)備驅(qū)動(dòng)驗(yàn)證結(jié)果
4結(jié)束語(yǔ)
本文分析了USB設(shè)備驅(qū)動(dòng)程序的工作機(jī)制,采用WDF的驅(qū)動(dòng)模式,在VisualStudio2013+WDK8.1環(huán)境下通過通用USB驅(qū)動(dòng)程序改進(jìn)的方法設(shè)計(jì)了基于賽普拉斯公司EZ-USBFX3硬件設(shè)備的驅(qū)動(dòng)程序。該設(shè)計(jì)方法大幅降低了USB3.0驅(qū)動(dòng)開發(fā)難度,縮短了開發(fā)周期,且所設(shè)計(jì)的驅(qū)動(dòng)程序具有較好的穩(wěn)定性、兼容性與可移植性。經(jīng)過測(cè)試,所設(shè)計(jì)的USB3.0驅(qū)動(dòng)程序在Win7操作系統(tǒng)下運(yùn)行穩(wěn)定、可靠,為其他驅(qū)動(dòng)程序的開發(fā)提供了參考。
參考文獻(xiàn)
[1]鄭杰.USB3.0編程寶典[M].北京:電子工業(yè)出版社,2013.
[2]武安河.Windows設(shè)備驅(qū)動(dòng)程序WDF開發(fā)[M].北京:電子工業(yè)出版社,2009.
[3]CypressSemiconductor.CypressCyAPIprogrammer’sreference[M].SanJose,CA,USA:CypressSemiconductor,2011.
[4]SkottKim.USB3.0EZ-USBFX3orientation[M].SanJose,CA,UAS:CypressSemiconductor,2011.
[5]CypressSemiconductor.CypressCyAPIprogrammer’sreference[M].SanJose,CA,USA:CypressSemiconductor,2011.
[6]CypressSemiconductor.EZ-USBFX3developmentkitguide[M].SanJose,CA,UAS:CypressSemiconductor,2011.
[7]代月松.USB3.0在存儲(chǔ)測(cè)試系統(tǒng)中的研究[D].太原:中北大學(xué),2013.
[8]張佩,馬勇,董鑒源.竹林蹊徑:深入淺出Windows驅(qū)動(dòng)開發(fā)[M].北京:電子工業(yè)出版社,2011.
[9]文治洪,胡文東,李曉京,等.基于PL2303的USB接口設(shè)計(jì)[J].電子設(shè)計(jì)工程,2010,18(1):32-34.
[10]范玉磊,謝昌斌,付麗琴.基于DriverStudio的WDM型USB設(shè)備驅(qū)動(dòng)的開發(fā)[J].核電子學(xué)與探測(cè)技術(shù),2011,31(2):232-234.
[11]周立功.USB2.0與OTG規(guī)范及開發(fā)指南[M].北京:北京航空航天大學(xué)出版社,2004.
Driver Design Based on EZ-USB FX3
LIUJie,DIAOJietao,LINan,SUNZhaolin
(SchoolofElectronicScienceandEngineering,NationalUniversityofDefenseTechnology,
Changsha410073,China)
AbstractUSB3.0 data transfer interface is gradually replacing the USB2.0 interface as the protagonist of the electronic device interface with its significant advantages in terms of transmission speed and the needs for driven development are also increasing. The traditional driver design approach with Driver Studio + WDM structure fails to meet the needs for real-world applications due to the complex structure and the huge time consumption. In this paper, the USB3.0 driver is designed with a new WDF driver architecture in Visual Studio2013 + WDK8.1 development and compilation environment by the universal driver improved method. Results show that the driver designed by this method works stably, effectively reducing the driver development effort and shortens the development cycle.
KeywordsUSB3.0 driver; WDF; EZ-USB FX3
收稿日期:2015- 11- 18
作者簡(jiǎn)介:劉杰(1992-),男,碩士研究生。研究方向:嵌入式系統(tǒng)與固態(tài)存儲(chǔ)技術(shù)。
doi:10.16180/j.cnki.issn1007-7820.2016.07.020
中圖分類號(hào)TP334.7
文獻(xiàn)標(biāo)識(shí)碼A
文章編號(hào)1007-7820(2016)07-068-04