開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序_第1頁
開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序_第2頁
開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序_第3頁
開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序_第4頁
開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序文章信息作者:李虹時(shí)間:2004-10-06出處:計(jì)算機(jī)與信息技術(shù)責(zé)任編輯:方舟文章導(dǎo)讀本文介紹WDM型USB設(shè)備驅(qū)動(dòng)程序的基本概念、結(jié)構(gòu)和特性,并說明了利用Driverworks進(jìn)行開發(fā)的方法正文摘要 本文介紹WDM型USB設(shè)備驅(qū)動(dòng)程序的基本概念、結(jié)構(gòu)和特性,并說明了利用Driverworks進(jìn)行開發(fā)的方法。關(guān)鍵詞 WDM;USB設(shè)備驅(qū)動(dòng)程序;Driverworks 導(dǎo)言通用串行總線USB是1995年康柏、微軟、IBM、DEC等公司推廣的一種新型的通信標(biāo)準(zhǔn),該總線接口具有安裝方便、高帶寬、易于擴(kuò)展等優(yōu)點(diǎn),已逐漸成為現(xiàn)代數(shù)據(jù)傳輸?shù)陌l(fā)展趨勢(shì)。而在開發(fā)USB設(shè)備時(shí),設(shè)

2、備驅(qū)動(dòng)程序的設(shè)計(jì)是其中一項(xiàng)重要的技術(shù)環(huán)節(jié),它直接影響整個(gè)設(shè)備系統(tǒng)的性能。Windows98及其更高版本的操作系統(tǒng)對(duì)USB總線提供了全面的支持,并且用WDM驅(qū)動(dòng)程序模型代替了VxD設(shè)備驅(qū)動(dòng)程序。WDM支持USB協(xié)議,并為其提供了高效的開發(fā)平臺(tái)。因此WDM已成為開發(fā)USB外設(shè)驅(qū)動(dòng)程序所必須而有效的技術(shù)。Windows驅(qū)動(dòng)程序模型(WDM)Windows環(huán)境下驅(qū)動(dòng)程序共有三類,一類是VxD( Virtual Device Driver,虛擬設(shè)備驅(qū)動(dòng)程序),起源于Windows 3.1 時(shí)代,用于Windows 95/98/Me操作系統(tǒng)中;一類是KMD( Kernel Mode Driver,內(nèi)核模式

3、驅(qū)動(dòng)程序),用于Windows NT下;還有一類就是WDM(Win32 Driver Mode,Win32驅(qū)動(dòng)程序模型),是微軟從Windows 98開始,推出的一個(gè)新的驅(qū)動(dòng)類型,它是一個(gè)跨平臺(tái)的驅(qū)動(dòng)程序模型,不僅如此WDM驅(qū)動(dòng)程序還可以在不修改源代碼的情況下經(jīng)過重新編譯后在非Intel平臺(tái)上運(yùn)行,毫不夸張地講,WDM算得上是21世紀(jì)的驅(qū)動(dòng)程序框架。WDM是在NT4.0驅(qū)動(dòng)程序結(jié)構(gòu)上發(fā)展起來的,所以它與NT4.0的驅(qū)動(dòng)程序極為相似,但是它卻有了本質(zhì)上的提高,增加了對(duì)即插即用(PnP)、高級(jí)電源管理(PowerManagement)、Windows管理接口(WMl)的支持。更重要的是,WDM是一

4、種通用的驅(qū)動(dòng)模式,提供了包括USB、IEEEl394和HID等在內(nèi)的一系列驅(qū)動(dòng)程序類。1、WDM驅(qū)動(dòng)程序的分層結(jié)構(gòu)WDM體系結(jié)構(gòu)實(shí)行分層處理,即設(shè)備驅(qū)動(dòng)被分成了若干層,典型地分成:高層驅(qū)動(dòng)程序、中間層驅(qū)動(dòng)程序、底層驅(qū)動(dòng)程序。每層驅(qū)動(dòng)再把I/O請(qǐng)求劃分成更簡(jiǎn)單的請(qǐng)求,以傳給更下層的驅(qū)動(dòng)執(zhí)行。最底層的驅(qū)動(dòng)程序在收到IO請(qǐng)求后,通過硬件抽象層,與硬件發(fā)生作用,從而完成IO請(qǐng)求工作。在這樣的架構(gòu)下,上面的驅(qū)動(dòng)層就不需要對(duì)每個(gè)操作系統(tǒng)都要開發(fā)一遍了。如圖1所示 WDM還引入了功能設(shè)備對(duì)象FDO(Functional Device Object)與物理設(shè)備對(duì)象PDO(Physical Devic

5、e Object)兩個(gè)新類來描述硬件,一個(gè)PDO對(duì)應(yīng)一個(gè)真實(shí)硬件。一個(gè)硬件只允許有一個(gè)PDO,但卻可以擁有多個(gè)FDO,而在驅(qū)動(dòng)程序中我們不是直接操作硬件而是操作相應(yīng)的PDO與FDO。驅(qū)動(dòng)程序和設(shè)備對(duì)象的分層情況如圖2所示。 其中總線驅(qū)動(dòng)程序(Bus Driver)位于最底層,控制對(duì)總線上所有設(shè)備的訪問,創(chuàng)建PDO代表發(fā)現(xiàn)的設(shè)備。功能驅(qū)動(dòng)程序(Function Driver)控制設(shè)備的主要功能,分層在總線驅(qū)動(dòng)的上面,負(fù)責(zé)創(chuàng)建FDO。在USB情況下,功能驅(qū)動(dòng)程序必須使用USB類驅(qū)動(dòng)程序訪問設(shè)備。2、USB驅(qū)動(dòng)程序的WDM結(jié)構(gòu)USB驅(qū)動(dòng)程序的構(gòu)成層次如圖3所示。其中USB客戶驅(qū)動(dòng)程序通過W

6、indows系統(tǒng)提供的USB類驅(qū)動(dòng)程序接口(USBDI)與下層驅(qū)動(dòng)程序通信。 在USB設(shè)備可用之前,必須對(duì)其進(jìn)行配置和接口選擇,然后所選擇的接口的各個(gè)管道才是可用的。在USBDI的基礎(chǔ)上進(jìn)行編程將大大簡(jiǎn)化,用戶不用關(guān)心IRP的類型,而只需要在相應(yīng)的分發(fā)例程中通過構(gòu)造USB塊并將其通過USBDI發(fā)送下去就可以實(shí)現(xiàn)對(duì)USB設(shè)備的控制了。設(shè)備的訪問WDM不是通過驅(qū)動(dòng)程序名稱,而是通過一個(gè)128位的全局惟一標(biāo)識(shí)符(GUID)實(shí)現(xiàn)驅(qū)動(dòng)程序的識(shí)別。在應(yīng)用程序與WDM驅(qū)動(dòng)程序通信方面系統(tǒng)為每一個(gè)用戶請(qǐng)求打包形成一個(gè)I/O請(qǐng)求包(IRP)結(jié)構(gòu),將其發(fā)送至驅(qū)動(dòng)程序,并通過識(shí)別IRP中PDO來區(qū)別是發(fā)送

7、給哪一個(gè)設(shè)備的。內(nèi)核通常通過發(fā)送IRP來運(yùn)行驅(qū)動(dòng)程序中的代碼。WDM驅(qū)動(dòng)程序有一個(gè)主要的初始化入口點(diǎn),即一個(gè)必須稱為DriverEntry的例程。它有一個(gè)標(biāo)準(zhǔn)的函數(shù)原型。當(dāng)WDM驅(qū)動(dòng)程序被裝入時(shí),內(nèi)核調(diào)用DriverEntry例程。驅(qū)動(dòng)程序的DriverEntry例程必須設(shè)置一系列的回調(diào)例程來處理IRP。每個(gè)回調(diào)例程有一個(gè)標(biāo)準(zhǔn)的函數(shù)原型。內(nèi)核會(huì)在合適的環(huán)境下調(diào)用這個(gè)例程。大多數(shù)的WDM設(shè)備對(duì)象都是在即插即用管理器調(diào)用AddDevice例程入口點(diǎn)時(shí)被創(chuàng)建的。插入新設(shè)備后,當(dāng)系統(tǒng)找到由安裝信息文件所批示的驅(qū)動(dòng)程序時(shí),這個(gè)例程被調(diào)用。在此之后,一系列即插即用IRP被發(fā)送到驅(qū)動(dòng)程序,設(shè)備驅(qū)動(dòng)程序可進(jìn)行

8、相應(yīng)的功能處理。USB設(shè)備驅(qū)動(dòng)程序開發(fā)工具開發(fā)USB設(shè)備驅(qū)動(dòng)程序需要專門的開發(fā)工具,目前應(yīng)用廣泛的工具主要有兩大類。一類是Microsoft公司提供的Windows DDK(Device Driver Kit)。它有Windows 98 DDK和Windows 2000 DDK兩個(gè)版本。Windows 98 DDK能夠開發(fā)Windows 95/98/Me/NT下的VxD、KMD和WDM驅(qū)動(dòng)程序。Windows 2000 DDK 能夠開發(fā)Windows 98/Me/NT/2000下的KMD和WDM驅(qū)動(dòng)程序。由于DDK基于匯編語言的編程方式和內(nèi)核模式的調(diào)用,對(duì)沒有深厚的OS原理和編程水平的人員來說

9、,任務(wù)相當(dāng)艱巨。另一類是NuMega公司提供的DriverStudio,它是一個(gè)大的開發(fā)工具包,包含VtoolsD、SoftICE和DriverWorks等開發(fā)工具。 VtoolsD開發(fā)包提供了對(duì)VxD編程的C/C+類庫支持,利用VtoolsD中的QuickVxD工具可以快速生成VxD的C/C+代碼框架,開發(fā)者可以在此基礎(chǔ)上根據(jù)各自的需要添加自己的代碼。DriverWorks用于開發(fā)KMD和WDM驅(qū)動(dòng)程序,并且對(duì)DDK函數(shù)進(jìn)行了類的封裝,從而為開發(fā)Windows NT、Windows 2000和Widnwos98 WDM設(shè)備驅(qū)動(dòng)程序提供了一個(gè)自動(dòng)化的方法。DriverWorks,提供了VC+下

10、的開發(fā)向?qū)river Wizard,按照它的提示可以迅速地生成驅(qū)動(dòng)程序的框架。這個(gè)框架結(jié)構(gòu)提供可以正確執(zhí)行WDM動(dòng)態(tài)環(huán)境中IRP的請(qǐng)求,而且,也包含用于簡(jiǎn)化系統(tǒng)提供的標(biāo)準(zhǔn)類驅(qū)動(dòng)程序(如HID、流)和總線驅(qū)動(dòng)程序(如PCI和USB)接口的類等??傊肈riverWorks開發(fā)WDM驅(qū)動(dòng)程序,可以大大簡(jiǎn)化開發(fā)人員的工作量、縮短開發(fā)周期以及降低開發(fā)驅(qū)動(dòng)程序的難度。用DriverWorks開發(fā)WDM型USB設(shè)備驅(qū)動(dòng)程序要想使用DriverWorks,必須先安裝以下軟件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。由于DriverWorks所用

11、的類庫是對(duì)DDK的庫函數(shù)的封裝,還必須在Visual C+中編譯需要的庫文件3,下面介紹怎樣在VC環(huán)境中創(chuàng)建自己的庫文件。(1) 啟動(dòng)Visual C+。 (2) 選擇菜單FileOpen Workspace。打開位于DriverStudioDriverWorksSourcevdwlibs.dsw的工作空間文件。(3) 選擇菜單BuildBatch Build,在彈出的對(duì)話框架中選擇你想編譯的庫。(4) 點(diǎn)擊對(duì)話框中的Build即可編譯你選擇的庫。下面就通過一個(gè)例子來說明利用DriverWorks開發(fā)USB設(shè)備驅(qū)動(dòng)程序的方法。這個(gè)USB設(shè)備有3個(gè)雙向端點(diǎn),每個(gè)端點(diǎn)的配置如下:端點(diǎn)類型地址 緩沖

12、區(qū)(字節(jié))0 IN/OUT控制(Control)0x80/0x00 16/161 IN/OUT塊(Bulk)0x81/0x01 16/162 IN/OUT 塊(Bulk)0x82/0x02 64/64驅(qū)動(dòng)程序需要實(shí)現(xiàn)的功能就是控制設(shè)備上的LED燈的亮和滅,以及通過端點(diǎn)2對(duì)設(shè)備進(jìn)行讀寫。(1) 首先,通過快捷方式“Setup DDK and Start MSVC”來啟動(dòng)VC IDE。這個(gè)快捷方式所指向的程序,會(huì)進(jìn)行一些必要的設(shè)置,然后再啟動(dòng)VC IDE,這樣我們的程序就可以使用DDK和DW的頭文件和庫了。(2) 從VC IDE的菜單“DriverStudio”中選擇“DriverWizard”,

13、之后按對(duì)話框的提示填寫項(xiàng)目名稱及所在目錄。并按向?qū)нx擇驅(qū)動(dòng)程序類型為WDM,總線類型為USB。(3) 按端點(diǎn)的配置表進(jìn)行端點(diǎn)的設(shè)置。由于在USB中規(guī)定端點(diǎn)0是必須存在的,所以我們只需對(duì)端點(diǎn)1和端點(diǎn)2進(jìn)行定義即可。(4) 選擇端點(diǎn)2產(chǎn)生BULK Read及BULK Write 的代碼,DriverWorks會(huì)自動(dòng)產(chǎn)生對(duì)端點(diǎn)2的讀寫代碼,不用修改,就可以直接使用。(5) 增加一個(gè)IOCTL來控制USB設(shè)備的LED燈。IOCTL代碼名稱取為TEST_IOCTL_LED,其他值默認(rèn)。(6) 最后按下“ Finish”按鈕,就結(jié)束了Wizard。在此過程中只針對(duì)需要修改的步驟進(jìn)行了說明,未加說明的部分均

14、可直接按“Next”按鈕。到此,我們已經(jīng)創(chuàng)建好了一個(gè)基本的驅(qū)動(dòng)程序,其中的塊讀寫代碼都由DriverWorks自動(dòng)生成,無需另外加代碼,只有廠商請(qǐng)求通過Ioctl來進(jìn)行,控制LED燈的亮滅。代碼如下:NTSTATUS TESTDevice:TEST_IOCTL_LED_Handler(KIrp I)NTSTATUS status = STATUS_SUCCESS;t << "Entering TESTDevice:TEST_IOCTL_LED_Handler, " << I << EOL;/ TODO: Verify that the i

15、nput parameters are correct/ If not, return STATUS_INVALID_PARAMETERif(I.IoctlOutputBufferSize()|!I.IoctlBuffer()|(I.IoctlInputBufferSizer()!=sizeof(UCHAR)/ TODO: Handle the the TEST_IOCTL_LED request, or / defer the processing of the IRP (i.e. by queuing) and set/ status to STATUS_PENDING.PURB pUrb

16、=m_Lower.BuildVendorRequest(NULL,/transfer buffer0, /transfer buffer size0, /request reserved bits(UCHAR)(*PUCHAR)I.IoctlBuffer(), /request. 1=LED_ON, 0=LED_OFF0 / Value);/transmitstatus=m_Lower.SubmitUrb(pUrb,NULL,Null,5000L);/ TODO: Assuming that the request was handled here. Set I.Information/ to indicate how much data to copy back to the user.I.Information() = 0;I.Status()=status;return status;這個(gè)函數(shù)控制LED燈,它是通過USB Vendor Request來向設(shè)備傳送的。其中request1的時(shí)候表示讓L ED亮,request0的時(shí)候讓LED來。它通過DeviceIoControl由上層應(yīng)用程序傳下來。現(xiàn)在,驅(qū)動(dòng)程序完成了,為確保最后生成的USB驅(qū)動(dòng)程序能編譯成功

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論