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

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

需要指出的是,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.mfbz.cn/a/766202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网安小贴士(3)网安协议

一、前言 网络安全协议是构建安全网络环境的基础,它们帮助保护网络通信免受各种威胁和攻击。 二、定义 网络安全协议是指在计算机网络中用于确保网络通信和数据传输安全的协议。它们定义了在网络通信过程中的安全机制、加密算法、认证和授权流程等,以保…

【论文阅读】自动驾驶光流任务 DeFlow: Decoder of Scene Flow Network in Autonomous Driving

再一次轮到讲自己的paper!耶,宣传一下自己的工作,顺便完成中文博客的解读 方便大家讨论。 Title Picture Reference and pictures paper: https://arxiv.org/abs/2401.16122 code: https://github.com/KTH-RPL/DeFlow b站视频: https://www.b…

关于 Mybatis 的开启二级缓存返回对象不一致问题

做实验报告的时候&#xff0c;跟着学习&#xff0c;发现我已经将 开启 二级缓存的 配置都配置好了&#xff0c;但是返回值地址不一致&#xff0c;说明对象不一致&#xff0c;二级缓存命中失败。 跟着流程配置&#xff1a; mybatis-config <settings><!-- 启用 myba…

SpringBoot+Thymeleaf项目重定向到另一个系统HTTPS变成HTTP

SpringBootThymeleaf项目是一个简单的单体项目&#xff0c;只有一个页面。 重定向的是前后分离&#xff0c;前端用的vue。 浏览器看到重定向后 https成了http&#xff0c;F12控制台看到是 301 Moved Permanently 单体项目最开始写法&#xff1a; response.sendRedirect(url); …

react native中使用@react-navigation/native进行自定义头部

react native中使用react-navigation/native进行自定义头部 效果示例图实例代码 效果示例图 实例代码 /* eslint-disable react-native/no-inline-styles */ /* eslint-disable react/no-unstable-nested-components */ import React, { useLayoutEffect } from react; import…

基于uniapp(vue3)H5附件上传组件,可限制文件大小

代码&#xff1a; <template><view class"upload-file"><text>最多上传5份附件&#xff0c;需小于50M</text><view class"" click"selectFile">上传</view></view><view class"list" v…

html+css+js气球消除小游戏

气球消除小游戏 消除15个就成功 源码在图片后 点赞加关注&#xff0c;谢谢 左上角的数字显示消除气球的数量 定时随机生成气球 &#x1f388;&#x1f388;&#x1f388; 图片 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset&…

C++部分复习笔记上

C语法复习 1. C入门基础 缺省参数 半缺省参数必须从右往左依次来给出&#xff0c;不能间隔着给缺省参数不能在函数声明和定义中同时出现缺省值必须是常量或者全局变量C语言不支持&#xff08;编译器不支持&#xff09; 函数重载 函数重载是函数的一种特殊情况&#xff0c;…

小试牛刀-Solana合约账户详解

目录 一.Solana 三.账户详解 3.1 程序账户 3.2 系统所有账户 3.3 程序派生账户(PDA) 3.4 Token账户 四、相关学习文档 五、在线编辑器 Welcome to Code Blocks blog 本篇文章主要介绍了 [Solana合约账户详解] ❤博主广交技术好友&#xff0c;喜欢文章的可以关注一下❤ …

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

taro小程序terser-webpack-plugin插件不生效

背景 taro小程序terser-webpack-plugin插件不生效 运行环境&#xff1a; taro3.6.32vue3.2.24 webpack5 不断尝试过 按官网这种配置不生效&#xff0c;然后又看了文档中赋的这个链接《编写插件&#xff0c;将 Taro 编译打包耗时缩短至三分之一》。 按这个文档中的配置&…

魏建军亲测智驾第二季:长城全场景NOA挑战重庆

6月30日&#xff0c;魏建军再次直播长城的全场景智能驾驶NOA。上一次直播是保定&#xff0c;而这次选在了山城重庆。 重庆号称「8D魔幻城市」&#xff0c;是每一个在智驾上有抱负的头部公司&#xff0c;都想跑一跑必争之地。 这次直播长城用的智驾系统&#xff0c;也是TA序列…

Go - 8.func 函数使用

目录 一.引言 二.func 定义 三.func 实践 1.多个返回值 2.命名返回值 3.可变参数 四.总结 一.引言 函数是编程语言中的基本构建块&#xff0c;用于将代码组织成可重用的逻辑单元。函数可以接受输入参数&#xff0c;执行特定的操作&#xff0c;并返回结果。在 Go 语言&a…

25.labview数据采集中的读取和写入文本文件和Excel表格文件

①本文将会讲解labview读取和写入文本文件和Excel文件的几种不同方式&#xff0c;讲解程序的基本原理&#xff0c;并提出具体的实施方案&#xff0c;本文内容如下所示。 ②本文文章结束会提供大家 文本和表格读取写入的源程序 &#xff0c;以便于大家学习和使用。 本文中可能用…

家政小程序的开发:打造现代式便捷家庭服务

随着现代生活节奏的加快&#xff0c;人们越来越注重生活品质与便利性。在这样的背景下&#xff0c;家政服务市场迅速崛起&#xff0c;成为许多家庭日常生活中不可或缺的一部分。然而&#xff0c;传统的家政服务往往存在信息不对称、服务效率低下等问题。为了解决这些问题&#…

Windows10录屏,教你3个方法,简单快速录屏

“我的电脑系统是Windows10的系统&#xff0c;今晚要进行线上开会&#xff0c;但我实在有事没办法参加会议&#xff0c;想把会议的内容录制下来方便我后续观看。但却找不到电脑录屏功能在哪里打开&#xff1f;求助一下&#xff0c;谁能帮帮我&#xff1f;” 在数字化时代&…

Oracle - 数据库打补丁实践

原文&#xff1a;https://www.cnblogs.com/ddzj01/p/12097467.html 一、概述 本文将介绍如何给oracle数据库打最新补丁&#xff0c;数据库版本为11.2.0.4单实例&#xff0c;操作系统为redhat6.5 二、下载相关升级包 1. 登录MOS&#xff0c;查阅(ID 2118136.2)&#xff0c;下载…

编译原理1

NFA&DFA 在正规式的等价证明可以借助正规集&#xff0c;也可以通过有限自动机DFA来证明等价&#xff0c;以下例题是针对DFA证明正规式的等价&#xff0c;主要步骤是①NFA&#xff1b;②状态转换表&#xff1b; ③状态转换矩阵&#xff1b; ④化简DFA&#xff1b; 文法和语…

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像

20240702在飞凌OK3588-C开发板上通过HDMI OUT输出USB3.0接口的热像仪的预览图像 2024/7/2 18:19 rootok3588:/# rootok3588:/# rootok3588:/# lsusb Bus 005 Device 001: ID 1d6b:0002 Bus 003 Device 001: ID 1d6b:0001 Bus 001 Device 001: ID 1d6b:0002 Bus 006 Device 00…