USB設(shè)備的配置過程_第1頁
USB設(shè)備的配置過程_第2頁
USB設(shè)備的配置過程_第3頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、驅(qū)動(dòng)程序中USB設(shè)備的配置過程(參考Windows XP DDK )DDK驅(qū)動(dòng)程序?qū)懙煤芤?guī)范,USB初始化、數(shù)據(jù)傳輸?shù)倪^程寫的很清楚。通 過閱讀DDK驅(qū)動(dòng)程序,我對(duì)原來USB驅(qū)動(dòng)程序中許多不理解的地方有了更清 楚的理解.下面就參照DDK提供的iso_usb例子對(duì)USB設(shè)備的配置過程進(jìn)行總 結(jié)。驅(qū)動(dòng)程序加載后首先執(zhí)行DriverEntry入口函數(shù)。該函數(shù)設(shè)定了對(duì)各個(gè)IRP 進(jìn)行處理的派遣函數(shù)。DriverEntry函數(shù)執(zhí)行完成后,開始執(zhí)行AddDevice函數(shù)。這個(gè)函數(shù)創(chuàng)建設(shè) 備對(duì)象把設(shè)備對(duì)象連接到設(shè)備堆棧上,清除DO_DEVICE_INITIALIZING標(biāo)志。 然后配置管理器向驅(qū)動(dòng)程序發(fā)送一

2、個(gè)即插即用請(qǐng)求IRP_MN_START_DEVICE, 而調(diào)用下面的HandleStartDevice函數(shù)。在HandleStartDevice函數(shù)中完成了 USB設(shè)備的配置過程:首先為設(shè)備選 擇一個(gè)配置(大多數(shù)設(shè)備僅有一種配置)。選定了某種配置后,接著應(yīng)該選擇配 置中的一個(gè)或多個(gè)接口。然后向總線驅(qū)動(dòng)程序發(fā)送配置選擇URB,總線驅(qū)動(dòng)程 序接收到該URB后向設(shè)備發(fā)出命令使用選定的配置和接口。(1)為設(shè)備選擇配置的過程其實(shí)就是獲取設(shè)備的配置描述符的過程Iso_usb 中使用了兩個(gè)URB來讀取配置描述符。/首先獲取固定大小的配置描述符,這時(shí),此描述符不包含接口描述符和端 點(diǎn)描述符。siz = siz

3、eof(USB_CONFIGURATION_DESCRIPTOR);configurationDescriptor = ExAllocatePool(NonPagedPool, siz);if(configurationDescriptor) /UsbBuildGetDescriptorRequest 函數(shù)構(gòu)造指定類型的 urbUsbBuildGetDescriptorRequest(urb,(USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0,0,config

4、urationDescriptor,NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);/CallUSBD函數(shù)負(fù)責(zé)把urb轉(zhuǎn)發(fā)到底層總線驅(qū)動(dòng)程序ntStatus = CallUSBD(DeviceObject, urb);/然后獲取全部的配置描述符,包括接口描述符和端點(diǎn)描述符siz = configurationDescriptor-wTotalLength;ExFreePool(configurationDescriptor);configurationDescriptor = ExAllocatePool(NonPagedPool, siz)

5、;if(configurationDescriptor) UsbBuildGetDescriptorRequest( urb, (USHORT)sizeof(struct URB_CONTROL_DESCRIPTOR_REQUEST),USB_CONFIGURATION_DESCRIPTOR_TYPE, 0,0,configurationDescriptor, NULL,siz, NULL);ntStatus = CallUSBD(DeviceObject, urb);從配置描述符中提取感興趣的接口描述符,總線驅(qū)動(dòng)程序提供了函數(shù) USBD_ParseConfigurationDescripto

6、rEx 以簡(jiǎn)化這個(gè)過程。interfaceDescriptor =USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor,ConfigurationDescriptor, interfaceindex, 0,-1, -1, -1);該函數(shù)各個(gè)參數(shù)的含義是:第一個(gè)參數(shù)是上一步獲取的完整的配置描述符; 第二個(gè)參數(shù)是描述符內(nèi)部開始搜索的地址,如果從頭開始搜索,需要設(shè)置和第一 個(gè)參數(shù)相同;剩下的五個(gè)參數(shù)是和感興趣的接口相關(guān)搜索關(guān)鍵字,分別是 InterfaceNumber, AlternateSetting, InterfaceClass

7、, InterfaceSubClass, InterfaceProtoco。但相關(guān)的關(guān)鍵字不需要的時(shí)候,可以設(shè)置成-1。由于配置描述符中可能包含多個(gè)接口,所以驅(qū)動(dòng)程序需要將上述函數(shù)返回的 接口描述符保存在USBD_INTERFACE_LIST_ENTRY類型的數(shù)組中。iso_usb程 序首先使用ExAllocatePool函數(shù)為接口描述符分配足夠的內(nèi)存。interfaceList =ExAllocatePool(NonPagedPool, sizeof(USBD_INTERFACE_LIST_ENTRY) * (numberOfInterfaces + 1);然后通過循環(huán)使用USBD_Pars

8、eConfigurationDescriptorEx函數(shù)獲取的接口描 述符對(duì)數(shù)組進(jìn)行初始化。初始化時(shí),應(yīng)該把接口描述符地址賦給 USBD_INTERFACE_LIST_ENTRY 結(jié)構(gòu)的 InterfaceDescriptor成員,并把 Interface 成員置NULL。最后需要將數(shù)組的最后一個(gè)元素的兩個(gè)成員全部置為NULL。初始化接口。首先調(diào)用 USBD_CreateConfigurationRequestEx 函數(shù)創(chuàng)建 一個(gè)urb。然后需要對(duì)接口中的管道進(jìn)行相應(yīng)的初始化,最后將這個(gè)urb傳遞給 底層驅(qū)動(dòng)程序,由底層總線驅(qū)動(dòng)程序完成接口的初始化。urb = USBD_CreateConfi

9、gurationRequestEx(ConfigurationDescriptor, tmp);Interface = &urb-UrbSelectConfiguration.Interface;/需要初始化管道的MaximumTransferSize成員。它代表單一 URB能攜帶的 最大數(shù)據(jù)量for(i=0; iNumberOfPipes; i+) Interface-Pipesi.MaximumTransferSize = ntStatus = CallUSBD(DeviceObject, urb);但USB設(shè)備配置完成之后,應(yīng)該將一些句柄保存到設(shè)備擴(kuò)展中供以后 使用。0 URB 成員 UrbSelectConfiguration.ConfigurationHandle 返回配置句 柄;0USBD_INTERFACE_INFORMATION 結(jié)構(gòu)中 InterfaceHandle返回接口句柄;0每個(gè)USBD_PIPE_INFORMATION結(jié)構(gòu)中都含有與端點(diǎn)對(duì)應(yīng)的管道句柄 PipeHandle關(guān)閉設(shè)備。當(dāng)驅(qū)動(dòng)程序接到一個(gè)IRP_MN_STOP_DEVICE請(qǐng)求時(shí),應(yīng) 該把設(shè)備置成為配置狀態(tài),創(chuàng)建并傳遞一個(gè)含有NULL配置?指針的配置選擇URB 可以達(dá)到這個(gè)目的。siz = sizeof(struct _URB_SELE

溫馨提示

  • 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)論