慕曉蕾
(1.河北工業(yè)大學(xué)計算機(jī)科學(xué)與軟件學(xué)院,天津 300130; 2.石家莊開發(fā)區(qū)冀科雙實科技有限公司,河北石家莊 050081)
W indows CE下USB設(shè)備流驅(qū)動開發(fā)與設(shè)計
慕曉蕾1,2
(1.河北工業(yè)大學(xué)計算機(jī)科學(xué)與軟件學(xué)院,天津 300130; 2.石家莊開發(fā)區(qū)冀科雙實科技有限公司,河北石家莊 050081)
本文針對Window s CE下USB設(shè)備流驅(qū)動的廣泛應(yīng)用,介紹了該系統(tǒng)下流驅(qū)動的開發(fā)環(huán)境和驅(qū)動分類,并重點(diǎn)對USB設(shè)備流驅(qū)動進(jìn)行分析。
Window s CE;USB;流接口驅(qū)動
Window s CE是微軟公司開發(fā)的一種嵌入式操作系統(tǒng),它是一種模塊化的、易剪裁、定制移植方便的、實時搶占式多任務(wù)嵌入式操作系統(tǒng);它能支持多種硬件平臺(包括X86、ARM、M IPS、SuperH等)[1]。S3C2440是一款 Sam sung公司推出的基于ARM 920T內(nèi)核的16/32位RISC嵌入式微處理器,它專為手持設(shè)備和一般類型應(yīng)用而設(shè)計,能夠滿足嵌入式系統(tǒng)中的高性能、低功耗、小體積的要求。ARM SYS2440是立宇泰公司提供的一個二次開發(fā)平臺,提供了完整的BSP源碼資源,設(shè)備驅(qū)動工程師可以在此基礎(chǔ)上進(jìn)一步進(jìn)行設(shè)備驅(qū)動的添加修改、內(nèi)核的重定制等。本文介紹通過ARM SYS2440平臺來開發(fā) Window s CE系統(tǒng)下USB流驅(qū)動的基本流程。
搭建Window s CE流驅(qū)動所需要的開發(fā)環(huán)境需要以下幾個軟件:
(1)Platfo rm Builder 5.0:此軟件是用來定制Window s CE操作系統(tǒng)的集成開發(fā)環(huán)境。開發(fā)人員可以利用這個集成開發(fā)環(huán)境完成Window s CE操作系統(tǒng)的定制、編譯和調(diào)試工作,而且也可以在這個集成開發(fā)環(huán)境中開發(fā)應(yīng)用軟件、驅(qū)動程序等。
(2)Visual Studio 2008:此軟件用來編寫調(diào)試流驅(qū)動時所用到的應(yīng)用程序,雖然應(yīng)用程序也可以用 Platform Builder 5.0來編寫,但 Visual Studio 2008更通用,更方便。
(3)ActiveSync 4.5:此軟件是用來同步 PC機(jī)與ARM SYS2440實驗板的,可以在微軟中國官方網(wǎng)站下載。
(4)DNW:串口調(diào)試工具,在上電時用來顯示B IOS發(fā)往串口的相關(guān)信息,可以輸入相關(guān)參數(shù)進(jìn)行設(shè)置。
驅(qū)動程序介于設(shè)備和操作系統(tǒng)之間,用來為操作系統(tǒng)提供接口,達(dá)到實現(xiàn)操作不同硬件的目的。Window s CE系統(tǒng)驅(qū)動有很多種,下面介紹兩種不同的分類方式。
(1)Device.dll加載的驅(qū)動:由Device.dll加載的驅(qū)動實現(xiàn)了流驅(qū)動的接口。以流驅(qū)動方式來實現(xiàn)的驅(qū)動沒有設(shè)備類型的限制。流設(shè)備驅(qū)動程序也被稱為可安裝的驅(qū)動程序(Installable D river),它為操作系統(tǒng)提供了流接口函數(shù),如XXX_ Init()、XXX_Open()、XXX_Read()、XXX_W rite ()、XXX_Close()等等。
(2)GW ES.dll加載的驅(qū)動:由 GW ES加載的驅(qū)動主要是系統(tǒng)使用,稱為本機(jī)驅(qū)動。本機(jī)驅(qū)動提供給操作系統(tǒng)的不是標(biāo)準(zhǔn)的流接口,而是事先約定好的特定接口。不同的設(shè)備,接口也不一樣。WinCE中,常見的本機(jī)驅(qū)動有LCD顯示驅(qū)動、觸摸屏驅(qū)動、鼠標(biāo)和鍵盤驅(qū)動及打印機(jī)驅(qū)動等。本機(jī)設(shè)備驅(qū)動程序是由 GEWES統(tǒng)一管理和加載的。
(3)FileSys.dll加載的驅(qū)動:文件系統(tǒng)驅(qū)動以dll的方式實現(xiàn),它預(yù)先實現(xiàn)了一組函數(shù)和IO控制的函數(shù)。這些函數(shù)被標(biāo)準(zhǔn)的文件系統(tǒng) API調(diào)用。
(1)分層驅(qū)動:分層驅(qū)動由MDD(Model Device Driver)層和PDD(Platform Dependent D river)層兩層驅(qū)動組成。MDD層驅(qū)動主要為應(yīng)用層提供接口(DD I),而 PDD層驅(qū)動主要負(fù)責(zé)為MDD層提供接口(DDSI),具體結(jié)構(gòu)圖如圖1所示,PDD層驅(qū)動為MDD層驅(qū)動隱藏了具體的硬件實現(xiàn),方便代碼維護(hù)和移植。
(2)單層驅(qū)動:單層驅(qū)動不僅直接為系統(tǒng)提供接口,也直接操作硬件。比分層驅(qū)動效率更高。
圖1 分層驅(qū)動結(jié)構(gòu)圖
Window s CE平臺為了支持不同類型的外圍設(shè)備,提供了能定制接口的流接口驅(qū)動程序模型。由于流接口驅(qū)動程序是為連接到目標(biāo)平臺上的外圍設(shè)備而設(shè)計的,對大多數(shù)USB外圍設(shè)備來說,適用于采用流接口驅(qū)動程序模型來開發(fā)驅(qū)動程序[2]。
在W INCE500/PUBL IC/COMMON/OA K/ DRIVERS/USB文件夾里有COMMON、INC、CLASS、HCD、USBD幾個文件夾,其中INC和COMMON里面有一個lock.c的程序,這個程序是將要被其他USB有關(guān)的驅(qū)動程序所使用的一個鎖,是一個類似臨界區(qū)的封裝體,可以保護(hù)多線程對同一內(nèi)存區(qū)域的讀寫訪問。HCD和USBD是底層驅(qū)動,HCD模塊給USBD模塊提供最底層的支持,USBD實現(xiàn)高層的接口函數(shù)[2]。
而 W INCE500/PUBL IC/COMMON/DDK/ INC文件夾里提供的是與設(shè)備驅(qū)動有關(guān)的頭文件,與USB設(shè)備相關(guān)的文件有USB100.H、USB-TYPES.H、USBD I.H。USB100.H、USBTYPES.H里面關(guān)于 USB的定義是完全符合USB規(guī)范的,是不能隨便定義的;USBD I.H文件里的內(nèi)容就是USBD總線驅(qū)動程序向USB設(shè)備驅(qū)動程序提供的接口描述,開發(fā)USB設(shè)備驅(qū)動時必須要包含此頭文件才可以得到USBD接口的原型。
通過對Window s CE下USB文件夾結(jié)構(gòu)的分析可知,所有的USB設(shè)備驅(qū)動程序都必須在它們的DLL庫里面設(shè)置一定的入口點(diǎn)來與USBD模塊進(jìn)行適當(dāng)?shù)慕换ァ?/p>
下面簡單介紹一下相關(guān)函數(shù)的作用:
USBDeviceA ttach()是在USB設(shè)備連接到計算機(jī)時運(yùn)行,USBD模塊通過調(diào)用這個函數(shù)初始化USB設(shè)備,得到USB設(shè)備信息并配置USB設(shè)備,同時申請必需的資源[2]。
USB InstallD rive()是在系統(tǒng)第一次加載USB設(shè)備驅(qū)動程序時被調(diào)用的,通過它驅(qū)動程序能創(chuàng)建所需要的注冊鍵,并將驅(qū)動程序需要的注冊表信息寫到 H KEY_LOCAL_MACH INE/ D rivers/USB/ClientD rivers下。USB設(shè)備驅(qū)動程序使用 RegisterClientDriver ID()和 Register-ClientSettings()函數(shù)來注冊相應(yīng)的設(shè)備信息[3]。
USBUninstallDriver()負(fù)責(zé)卸載USB設(shè)備驅(qū)動程序,通過調(diào)用UnRegisterClientSettings()函數(shù)和UnRegisterClientDriver ID()函數(shù)來刪除注冊鍵并釋放其它相關(guān)資源。
因此,我們的驅(qū)動程序中就一定要按照這三個函數(shù)的原型來實現(xiàn),否則就不能為設(shè)備管理器所識別。需要指出的是,*LPDEV ICE_ NO TIFY_ROU TINE指針?biāo)赶虻暮瘮?shù)是用來接收通知消息的,因為任何USB設(shè)備都必須實現(xiàn)USB_CLOSE_DEV ICE消息的響應(yīng),這個指針?biāo)赶虻暮瘮?shù)也是必須要實現(xiàn)的。
(1)打開PB5.0,新建一個動態(tài)鏈接庫(DLL)工程,在工程中添加源文件,選擇代表設(shè)備的文件名前綴(這是非常重要的,因為設(shè)備管理器在注冊表中是通過前綴來識別設(shè)備的,并且在流接口命名時也是將這個前綴作為入口點(diǎn)函數(shù)的前綴)。PB5.0在創(chuàng)建工程的時候已經(jīng)自動編寫好了source和M akefile文件,.reg文件和.def文件也已經(jīng)存在,只需要添加相應(yīng)的內(nèi)容就可以。
(2) 在 C:/W INCE500/PLA TFORM/ SMDK2440A/DRIV ERS目錄下(注:其中C盤是我的安裝目錄,SMDK2440A是立宇泰的2440實驗板提供的BSP)新建一個文件夾,并用記事本打開該目錄下的dir按其格式添加“/新建文件夾的名字”打開剛剛新建的文件夾,依次新建.reg文件,.def文件,source文件和Makefile文件。
這兩種方式都能實現(xiàn)流驅(qū)動,生成dll文件,第一種方式是平臺自動創(chuàng)建 source,Makefile等文件,第二種方式則都要手動添加。流驅(qū)動是嵌入式系統(tǒng)中最常見的設(shè)備驅(qū)動,操作接口和文件系統(tǒng)操作相似,通過CreateFile,ReadFile,W rite-File,IOControl函數(shù)等來操作應(yīng)用程序和流驅(qū)動交互[4]。
隨著USB設(shè)備的普及,開發(fā)人員的驅(qū)動開發(fā)任務(wù)也是越來越繁重了,特別是對于一些嵌入式開發(fā)來講,由于設(shè)備所采用的操作系統(tǒng)不同,相應(yīng)的硬件接口也是不一樣的,開發(fā)相關(guān)的USB驅(qū)動程序更是難上加難。通過本文,能了解W indow s CE下USB流驅(qū)動開發(fā)的大致步驟,為今后更復(fù)雜的開發(fā)應(yīng)用奠定基礎(chǔ)。
[1] 何宗健.Window s CE嵌入式系統(tǒng) [M].北京:北京航空航天大學(xué)出版社,2006.
[3] 劉彥峰,李崢,馬智.基于Window s CE的USB Key驅(qū)動程序設(shè)計[J].微計算機(jī)信息,2008-12-03.
[4] 計濤.淺談W INCE驅(qū)動程序設(shè)計[J].2010,(2).
The design of USB stream interface driver for W indows CE
MU Xiao-lei1,2
(1.College of Com puter Science and Softw are,Hebei University of Technology,TianJin300130,China;2.Shijiazhuang Development Zone JiKe ShuangShi Technology Co.,L TD,Shijiazhuang Hebei050081,China)
Aiming at the extensive app lication about USB Stream Interface Driver for Window s CE.The development environment and the classification of Stream Interface D river fo r Window s CE were introduled,and USB Stream Interface Driver were analyzed emphatically.
Window s CE;USB;Stream Interface Driver
TP311.52
:A
1001-9383(2010)04-0015-03
2010-10-30
慕曉蕾(1980-),女,遼寧朝陽人,主要從事嵌入式系統(tǒng)開發(fā)設(shè)計等工作.
10.3969/j.issn.16712 1041. 2010.01.035.