windows USB 设备驱动开发-USB设备描述符

news/2024/7/8 4:48:09 标签: 驱动开发

USB的描述符是USB设备向主机报告状态的重要数据结构,在USB通电后,端点(也称为终结点)0始终处于可用状态,这个默认的端点就是用于主机从设备中读取描述符的。

讨论USB通讯,需要从软件和硬件两方面说起,在软件上,USB有设备、端点、管道、接口、配置、轮询这些概念,了解这些概念,会帮助我们更好的熟悉USB通讯,在讨论它们之前需要了解描述符的概念,USB IF规定一共有五种描述符,分别是设备描述符、配置描述符、接口描述符、端点描述符、字符串描述,它们之间存在一定的关联性,同时,这些描述符也从侧面勾勒出整个USB规范的设计思想。

每个USB设备都会有设备属性,设备属性对应设备描述符,它会告诉主机自己是什么设备;由于存在复合型设备,所以会有不同的配置,例如一个USB设备可以将两个不同的USB设备集合在一个USB物理接口上,例如鼠标键盘都可以结合在一个物理接口上,此时只需占用一个USB物理端口即可,于是每个USB设备可以用不同的配置,每种配置能暴露不同的接口;每个接口表示一种逻辑上的功能;在每个接口上至少有一个端点,用来和设备通讯;端点是在USB设备在总线上的物理地址;当端点实际建立的使用,就是一个具体的管道。

需要指出的是,USB设备可以通过切换工作模式来修改几乎所有的描述符,这并不意外,在许多外设的开发过程中,模组厂家通常会给出一个用于烧录的端口(通常是串口),这个端口在特殊的模式下有效,当模组启动时检测到自身处于未烧录状态,或者收到烧录指令时,都会将该端口切换出来,主机可以通过这个端口将映像文件写入模组,下一次模组将进入正常的工作状态。

主机通过向默认端点发送各种标准控制请求 (GET_DESCRIPTOR 请求) 从附加设备获取描述符。 这些请求指定要检索的描述符的类型。 为了响应此类请求,设备发送描述符,其中包含有关设备、其配置、接口和相关端点的信息。 设备描述符 包含有关整个设备的信息。 配置描述符 包含有关每个设备配置的信息。 字符串描述符 包含 Unicode 文本字符串。

每个 USB 设备都会公开一个设备描述符,该描述符指示设备的类信息、供应商和产品标识符以及配置数。 每个配置都会公开其配置描述符,指示接口数和电源特征。 每个接口都为其每个备用设置公开一个接口描述符,其中包含有关 类和端点数的信息。 每个接口中的每个端点都会公开端点描述符,这些描述符指示端点类型和最大数据包大小。

例如,请考虑 USB 设备布局中所述的 OSR FX2 板 设备布局。 在设备级别,设备公开默认端点的设备描述符和端点描述符。 在配置级别,设备公开配置 0 的配置描述符。 在接口级别,它公开了备用设置 0 的一个接口描述符。 在端点级别,它公开了三个端点描述符。

USB 设备描述符

设备描述符包含有关 USB 设备整体的信息,它定义为 USB_DEVICE_DESCRIPTOR 结构,客户端驱动程序可以发送 get-描述符请求以获取设备描述符的信息。

每个通用串行总线 (USB) 设备都必须能够提供包含设备相关信息的单个设备描述符。 USB_DEVICE_DESCRIPTOR 结构描述设备描述符。 Windows 使用该信息来派生各种信息集。 例如, idVendor 和 idProduct 字段分别指定供应商和产品标识符。 Windows 使用这些字段值来构造设备 的硬件 ID 。 若要查看特定设备的硬件 ID,请打开设备管理器并查看设备属性。 在“ 详细信息 ”选项卡中, “硬件 ID ”属性值指示 Windows 生成的硬件 ID (“USB\XXX”) 。 bcdUSB 字段指示设备符合的 USB 规范的版本。 例如,0x0200指示设备按照 USB 2.0 规范设计。 bcdDevice 值指示设备定义的修订号。 USB 驱动程序堆栈使用 bcdDevice 以及 idVendor 和 idProduct 为设备生成硬件和兼容 ID。 可以在 设备管理器 中查看这些标识符。 设备描述符还指示设备支持的配置总数。

当设备以高速容量连接到主计算机时,设备在其设备描述符中报告的信息可能与以全速容量连接时不同。 设备不得在连接的生存期内(包括电源状态更改期间)更改设备描述符中包含的信息。

主机通过控件传输获取设备描述符。 在传输中,请求类型为 GET DESCRIPTOR,接收方为设备。 客户端驱动程序可以通过以下两种方式之一启动该传输:使用框架 USB 目标设备对象或通过发送包含请求信息的 URB。

获取设备描述符

Windows 驱动程序框架 (WDF) 客户端驱动程序只能在创建框架 USB 目标设备对象后获取设备描述符。

KMDF 驱动程序必须通过调用 WdfUsbTargetDeviceCreate 获取 USB 目标设备对象的 WDFUSBDEVICE 句柄。 通常,客户端驱动程序在驱动程序的 EvtDevicePrepareHardware 回调实现中调用 WdfUsbTargetDeviceCreate。 之后客户端驱动程序必须调用 WdfUsbTargetDeviceGetDeviceDescriptor 方法。 调用完成后,设备描述符在调用方分配 的USB_DEVICE_DESCRIPTOR 结构中接收。

UMDF 驱动程序必须查询 IWDFUsbTargetDevice 指针的框架设备对象,然后调用 IWDFUsbTargetDevice::RetrieveDescriptor 方法,并将 USB_DEVICE_DESCRIPTOR_TYPE 指定为描述符类型。

主机还可以通过发送 URB 来获取设备描述符。 此方法仅适用于内核模式驱动程序。 但是,除非驱动程序基于 Windows 驱动程序模型 (WDM) ,否则客户端驱动程序应永远不必为此类请求发送 URB。 此类驱动程序必须分配 URB 结构,然后调用 UsbBuildGetDescriptorRequest 宏以指定请求的 URB 格式。 然后,驱动程序可以通过将 URB 提交到 USB 驱动程序堆栈来发送请求。

此代码示例演示 UsbBuildGetDescriptorRequest 调用,该调用使用相应的 URB 设置 pURB 指向的缓冲区的格式:

UsbBuildGetDescriptorRequest(
    pURB,                                                 // Points to the URB to be formatted
    sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
    USB_DEVICE_DESCRIPTOR_TYPE,
    0,                                                    // Not used for device descriptors
    0,                                                    // Not used for device descriptors
    pDescriptor,                                          // Points to a USB_DEVICE_DESCRIPTOR structure
    NULL,
    sizeof(USB_DEVICE_DESCRIPTOR),
    NULL
);
获取设备描述符的例子

下面的代码演示 USB 网络摄像头设备的设备描述符:

Device Descriptor:
bcdUSB:             0x0200
bDeviceClass:         0xEF
bDeviceSubClass:      0x02
bDeviceProtocol:      0x01
bMaxPacketSize0:      0x40 (64)
idVendor:           0x045E (Microsoft Corporation)
idProduct:          0x0728
bcdDevice:          0x0100
iManufacturer:        0x01
0x0409: "Microsoft"
iProduct:             0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber:        0x00
bNumConfigurations:   0x01

在前面的示例中,你将看到设备已根据 USB 规范版本 2.0 进行了开发。 请注意 bDeviceClass、 bDeviceSubClass 和 bDeviceProtocol 值。 这些值指示设备包含一个或多个 USB 接口关联描述符,可用于对每个函数的多个接口进行分组。 

接下来,请关注 bMaxPacketSize0 的值。 此值指示默认端点的最大数据包大小。 此示例设备可以通过其默认端点传输最多 64 字节的数据。

通常,若要配置设备,客户端驱动程序会在获取设备描述符后获取有关设备中支持的配置的信息。 若要确定设备支持的配置数,请检查返回结构的 bNumConfigurations 成员。 此设备支持一种配置。 若要获取有关 USB 配置的信息,驱动程序必须获取 USB 配置描述符。


http://www.niftyadmin.cn/n/5536516.html

相关文章

车牌号查车辆信息-车牌号查车辆信息接口-汽车API接口

接口简介:输入车牌号,返回车辆相关信息(无车主信息)。初始登记日期、上险日期、保险到期时间、车架号、品牌这些数据会返回,其他数据不一定全部返回,,详细参数请查看返回接口文档 一般在新车上险或过户后第…

机器学习复习总结

目录 第一章 机器学习的概念及其应用 1.1机器学习的特点: **1.2机器学习的分类: 1.2.1监督学习: 1.2.2无监督学习: 1.2.3强化学习: 1.2.4三种机器学习的区别 *1.3深度学习 1.3.1深度学习的实质: …

首家!腾讯云数据万象通过中国信通院智能存储专项测试

2024年6月19日,由中国通信标准化协会主办,中国通信标准化协会大数据技术标准推进委员会(CCSA TC601)承办的首届“数据智能大会”在京隆重召开。腾讯云存储受邀出席了活动,大会中“可信数据智能”系列评估测试结果正式颁布,经过严苛…

Ubuntu 22.04.1 LTS 离线安装Docker

确定linux版本 cat /etc/lsb-release DISTRIB_IDUbuntuDISTRIB_RELEASE22.04DISTRIB_CODENAMEjammyDISTRIB_DESCRIPTION"Ubuntu 22.04.1 LTS"确定dpkg版本 sudo dpkg --print-architecture amd64下载地址 https://download.docker.com/linux/ubuntu/dists/jamm…

算法力扣刷题 三十一【150. 逆波兰表达式求值】

前言 栈和队列篇。 记录 三十一【150. 逆波兰表达式求值】 一、题目阅读 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 、-、* 和 / 。 每个操作…

什么是有效的电子签名?PDF电子签名怎样具备法律效力?

电子签名逐渐成为商务文书和法律文件中不可或缺的一部分。《电子签名法》自2005年4月1日起施行,这一立法是中国信息化法律的重要里程碑,为电子签名应用奠定了法律基础。电子签名不仅仅是一种技术手段,更是一种法律认可的签名形式。那么究竟什…

传统数据处理系统存在的问题

传统应用的数据系统架构设计时,应用直接访问数据库系统。当用户访问量增加时,数据库无法支撑日益增长的用户请求的负载,从而导致数据库服务器无法及时响应用户请求,出现超时的错误。 出现这种情况以后,在系统架构上就采…

Mysql 的第二次作业

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 1)登陆数据库。 打开命令行,输入登陆用户名和密码。 mysql -uroot -p123456 ​ 2)切换数据库…