USB設備的配置過程_第1頁
USB設備的配置過程_第2頁
USB設備的配置過程_第3頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

3、eof(USB_CONFIGURATION_DESCRIPTOR);configurationDescriptor = ExAllocatePool(NonPagedPool, siz);if(configurationDescriptor) /UsbBuildGetDescriptorRequest 函數(shù)構造指定類型的 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ù)負責把urb轉發(fā)到底層總線驅動程序ntStatus = CallUSBD(DeviceObject, urb);/然后獲取全部的配置描述符,包括接口描述符和端點描述符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);從配置描述符中提取感興趣的接口描述符,總線驅動程序提供了函數(shù) USBD_ParseConfigurationDescripto

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

7、, InterfaceSubClass, InterfaceProtoco。但相關的關鍵字不需要的時候,可以設置成-1。由于配置描述符中可能包含多個接口,所以驅動程序需要將上述函數(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ù)獲取的接口描 述符對數(shù)組進行初始化。初始化時,應該把接口描述符地址賦給 USBD_INTERFACE_LIST_ENTRY 結構的 InterfaceDescriptor成員,并把 Interface 成員置NULL。最后需要將數(shù)組的最后一個元素的兩個成員全部置為NULL。初始化接口。首先調用 USBD_CreateConfigurationRequestEx 函數(shù)創(chuàng)建 一個urb。然后需要對接口中的管道進行相應的初始化,最后將這個urb傳遞給 底層驅動程序,由底層總線驅動程序完成接口的初始化。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設備配置完成之后,應該將一些句柄保存到設備擴展中供以后 使用。0 URB 成員 UrbSelectConfiguration.ConfigurationHandle 返回配置句 柄;0USBD_INTERFACE_INFORMATION 結構中 InterfaceHandle返回接口句柄;0每個USBD_PIPE_INFORMATION結構中都含有與端點對應的管道句柄 PipeHandle關閉設備。當驅動程序接到一個IRP_MN_STOP_DEVICE請求時,應 該把設備置成為配置狀態(tài),創(chuàng)建并傳遞一個含有NULL配置?指針的配置選擇URB 可以達到這個目的。siz = sizeof(struct _URB_SELE

溫馨提示

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

評論

0/150

提交評論