USB设备的配置过程.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
USB设备的配置过程

驱动程序中USB设备的配置过程(参考Windows XP DDK) DDK驱动程序写得很规范,USB初始化、数据传输的过程写的很清楚。通过阅读DDK驱动程序,我对原来USB驱动程序中许多不理解的地方有了更清楚的理解.下面就参照DDK提供的iso_usb例子对USB设备的配置过程进行总结。 1.驱动程序加载后首先执行DriverEntry入口函数。该函数设定了对各个IRP进行处理的派遣函数。 2.DriverEntry函数执行完成后,开始执行AddDevice函数。这个函数创建设备对象把设备对象连接到设备堆栈上,清除DO_DEVICE_INITIALIZING标志。然后配置管理器向驱动程序发送一个即插即用请求IRP_MN_START_DEVICE,而调用下面的HandleStartDevice函数。 3. 在HandleStartDevice函数中完成了USB设备的配置过程:首先为设备选择一个配置(大多数设备仅有一种配置)。选定了某种配置后,接着应该选择配置中的一个或多个接口。然后向总线驱动程序发送配置选择URB,总线驱动程序接收到该URB后向设备发出命令使用选定的配置和接口。 (1)为设备选择配置的过程其实就是获取设备的配置描述符的过程。Iso_usb中使用了两个URB来读取配置描述符。 //首先获取固定大小的配置描述符,这时,此描述符不包含接口描述符和端点描述符。 siz sizeof USB_CONFIGURATION_DESCRIPTOR ; configurationDescriptor ExAllocatePool NonPagedPool, siz ; if configurationDescriptor //UsbBuildGetDescriptorRequest函数构造指定类型的urb UsbBuildGetDescriptorRequest urb, USHORT sizeof struct _URB_CONTROL_DESCRIPTOR_REQUEST , USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, configurationDescriptor, NULL, sizeof USB_CONFIGURATION_DESCRIPTOR , NULL ; //CallUSBD函数负责把urb转发到底层总线驱动程序 ntStatus CallUSBD DeviceObject, urb ; …… …… //然后获取全部的配置描述符,包括接口描述符和端点描述符 siz configurationDescriptor- wTotalLength; ExFreePool configurationDescriptor ; configurationDescriptor ExAllocatePool NonPagedPool, siz ; 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 ; …… (2)从配置描述符中提取感兴趣的接口描述符,总线驱动程序提供了函数USBD_ParseConfigurationDescriptorEx以简化这个过程。 interfaceDescriptor USBD_ParseConfigurationDescriptorEx ConfigurationDescriptor, ConfigurationDescriptor, interfaceindex, 0, -1, -1, -1 ; 该函数各个参数的含义是:第一个参数是上一步获取的完整的配置描述符;第二个参数是描述符内部开始搜索的地址,如果从头开始搜索,需要设置和第一个参数相同;剩下的五个参数是和感兴趣的接口相关搜索关键字,分别是InterfaceNumber, AlternateSetting, InterfaceClass, InterfaceSubClass, InterfaceProtoco。但相关的关键字不需要的时候,可以设置成-1。 由于配置描述符中可能包含多个接口,所以驱动程序需要将上述函数返回的接口描述符保存在USBD_INTERFACE_LIST_ENTRY类型的数组中。iso_usb程序首先使用ExAllocatePool函数为接口

文档评论(0)

kabudou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档