- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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函数为接口
您可能关注的文档
最近下载
- 《新媒体传播》课件.ppt VIP
- 2025年安全员c2考试试题库(答案+解析).docx
- GBT45001-2020SO45001:2018 职业健康安全管理体系要求及使用指南.pdf VIP
- 个人业绩相关信息采集表含政治表现、最满意、主要特点、不足.pdf VIP
- 部编版六年级上册道德与法治教案:感受生活中的法律知识.docx VIP
- 货运保险与货损理赔通道整合2025年应用前景.docx VIP
- 《飞机构造基础》课件——第一章 飞机结构.pptx VIP
- 中医治疗“慢脾风”医案37例.doc
- 小学科学新教科版二年级上册第一单元 造房子教案(共6课)(2025秋).docx VIP
- 2025年广西公需科目第二套答案.docx VIP
文档评论(0)