USB设备的配置过程_第1页
USB设备的配置过程_第2页
USB设备的配置过程_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、驱动程序中USB设备的配置过程(参考Windows XP DDK )DDK驱动程序写得很规范,USB初始化、数据传输的过程写的很清楚。通 过阅读DDK驱动程序,我对原来USB驱动程序中许多不理解的地方有了更清 楚的理解.下面就参照DDK提供的iso_usb例子对USB设备的配置过程进行总 结。驱动程序加载后首先执行DriverEntry入口函数。该函数设定了对各个IRP 进行处理的派遣函数。DriverEntry函数执行完成后,开始执行AddDevice函数。这个函数创建设 备对象把设备对象连接到设备堆栈上,清除DO_DEVICE_INITIALIZING标志。 然后配置管理器向驱动程序发送一

2、个即插即用请求IRP_MN_START_DEVICE, 而调用下面的HandleStartDevice函数。在HandleStartDevice函数中完成了 USB设备的配置过程:首先为设备选 择一个配置(大多数设备仅有一种配置)。选定了某种配置后,接着应该选择配 置中的一个或多个接口。然后向总线驱动程序发送配置选择URB,总线驱动程 序接收到该URB后向设备发出命令使用选定的配置和接口。(1)为设备选择配置的过程其实就是获取设备的配置描述符的过程Iso_usb 中使用了两个URB来读取配置描述符。/首先获取固定大小的配置描述符,这时,此描述符不包含接口描述符和端 点描述符。siz = siz

3、eof(USB_CONFIGURATION_DESCRIPTOR);configurationDescriptor = ExAllocatePool(NonPagedPool, siz);if(configurationDescriptor) /UsbBuildGetDescriptorRequest 函数构造指定类型的 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函数负责把urb转发到底层总线驱动程序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);从配置描述符中提取感兴趣的接口描述符,总线驱动程序提供了函数 USBD_ParseConfigurationDescripto

6、rEx 以简化这个过程。interfaceDescriptor =USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor,ConfigurationDescriptor, interfaceindex, 0,-1, -1, -1);该函数各个参数的含义是:第一个参数是上一步获取的完整的配置描述符; 第二个参数是描述符内部开始搜索的地址,如果从头开始搜索,需要设置和第一 个参数相同;剩下的五个参数是和感兴趣的接口相关搜索关键字,分别是 InterfaceNumber, AlternateSetting, InterfaceClass

7、, InterfaceSubClass, InterfaceProtoco。但相关的关键字不需要的时候,可以设置成-1。由于配置描述符中可能包含多个接口,所以驱动程序需要将上述函数返回的 接口描述符保存在USBD_INTERFACE_LIST_ENTRY类型的数组中。iso_usb程 序首先使用ExAllocatePool函数为接口描述符分配足够的内存。interfaceList =ExAllocatePool(NonPagedPool, sizeof(USBD_INTERFACE_LIST_ENTRY) * (numberOfInterfaces + 1);然后通过循环使用USBD_Pars

8、eConfigurationDescriptorEx函数获取的接口描 述符对数组进行初始化。初始化时,应该把接口描述符地址赋给 USBD_INTERFACE_LIST_ENTRY 结构的 InterfaceDescriptor成员,并把 Interface 成员置NULL。最后需要将数组的最后一个元素的两个成员全部置为NULL。初始化接口。首先调用 USBD_CreateConfigurationRequestEx 函数创建 一个urb。然后需要对接口中的管道进行相应的初始化,最后将这个urb传递给 底层驱动程序,由底层总线驱动程序完成接口的初始化。urb = USBD_CreateConfi

9、gurationRequestEx(ConfigurationDescriptor, tmp);Interface = &urb-UrbSelectConfiguration.Interface;/需要初始化管道的MaximumTransferSize成员。它代表单一 URB能携带的 最大数据量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请求时,应 该把设备置成为配置状态,创建并传递一个含有NULL配置?指针的配置选择URB 可以达到这个目的。siz = sizeof(struct _URB_SELE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论