windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽,并尽快将未使用的带宽返回到可用带宽池。

在这里,我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps,这分别对应高速、全速、低速三种,但实际上USB 2.0 的带宽非常紧张,这也是本文的前提之一,USB 3.0看起来缓解了带宽的问题,但是带宽的问题并不是上限不够而是调度芙蓉问题。

为什么我的 USB 驱动程序出现带宽不足错误?

USB 总线上带宽的竞争来自多个来源,包括硬件和软件。 很难准确预测 USB 客户端驱动程序的可用带宽量。 USB 主控制器需要一定数量的带宽来运行。 所需的量取决于控制器是否高速。 它因系统而异。 高速运行的 USB 集线器有时必须转换高速上游端口与下游低速设备之间的事务,并且此转换过程会消耗带宽。 但是,事务转换是否需要带宽取决于连接的设备类型和设备树的拓扑。

带宽资源最严重的压力通常来自垄断带宽的 USB 客户端驱动程序。 系统按先到先得的原则分配带宽。 如果加载的第一个 USB 驱动程序请求所有可用带宽,则以后加载的 USB 驱动程序不允许其设备的任何带宽。 系统无法配置设备,也无法枚举该设备。 由于枚举失败的原因不明显,因此用户体验不佳。

有时,客户端驱动程序会通过高速中断传输耗尽可用带宽。 但到目前为止,最常见的情况是客户端驱动程序为常量传输分配过多带宽,但无法及时释放带宽。 系统保留分配的带宽,直到请求它的驱动程序通过打开另一个端点关闭其端点,或者删除为其分配带宽的设备。 系统不为批量传输分配有保证的带宽,因此批量传输绝不是枚举失败的原因。 但是,大容量传输设备的性能取决于为定期 (常时等时等和中断) 传输的设备分配的带宽量。

USB 2.0 规范要求常量设备在其默认接口设置上具有零带宽端点。 这可确保在函数驱动程序打开非默认接口之前不会为设备保留任何带宽,这有助于防止在设备配置期间因带宽请求过多而导致的枚举失败。 它不会阻止客户端驱动程序在配置其设备后分配过多的带宽,从而阻止其他设备正常运行。

正确带宽管理的关键是,系统中执行常量传输的每个 USB 设备都必须为包含常量端点的每个接口提供多个备用 (Alt) 设置,并且客户端驱动程序必须明智地使用这些 Alt 设置。 客户端驱动程序应首先请求具有最高带宽的接口设置。 如果请求失败,客户端驱动程序应以越来越小的带宽请求接口设置,直到请求成功。

例如,假设网络摄像头设备具有以下接口:

接口 0 (默认接口设置:默认设置中没有具有非零常时等量带宽的端点)

常量端点 1:最大数据包大小 = 0 字节

常量端点 2:最大数据包大小 = 0 字节

接口 0 Alt 设置 1

常量端点 1:最大数据包大小 = 256 字节

常量端点2:最大数据包大小 = 256 字节

接口 0 Alt 设置 2

常量端点 1:最大数据包大小 = 512 字节

常量端点 2:最大数据包大小 = 512 字节

网络摄像头的驱动程序将网络摄像头配置为在初始化时使用默认接口设置。 默认设置没有常时常量带宽,因此在初始化期间使用默认设置可以避免网络摄像头由于常量带宽请求失败而无法枚举的危险。

当客户端驱动程序准备好执行常时等量传输时,它应尝试使用 Alt 设置 2,因为 Alt 设置 2 具有最大的数据包大小。 如果请求失败,驱动程序可以使用 Alt 设置 1 进行第二次尝试。 由于 Alt 设置 1 需要的带宽较少,因此即使第一个请求失败,此请求也可能成功。 多个 Alt 设置允许驱动程序在放弃之前进行多次尝试。

网络摄像头变为空闲后,可以通过再次选择默认设置,将分配的带宽返回到可用带宽池。

用户可以通过在 Windows 设备管理器 中检查控制器的属性来查看 USB 控制器分配了多少带宽。 选择控制器的属性,然后在“高级”选项卡下查看。此读数并不指示 USB 集线器为事务转换分配了多少带宽。

报告 USB 控制器带宽使用情况的设备管理器功能在 Windows XP 中无法正常工作。

USB 传输和数据包大小
最大传输大小

最大传输大小指定 USB 驱动程序堆栈中的硬编码限制。 低于这些限制的传输大小可能会因为系统资源限制而失败。 若要避免这些类型的故障并确保所有 Windows 版本的兼容性,请避免使用大型传输大小进行 USB 传输。

USBD_PIPE_INFORMATION 结构的 MaximumTransferSize 成员已过时。 USB 驱动程序堆栈忽略复合和非复合设备的 MaximumTransferSize 中的值。

在 Windows 2000 中,USB 驱动程序堆栈将 MaximumTransferSize 初始化为 USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE。 客户端驱动程序可以在配置设备时设置较小的值。 对于复合设备,每个函数的客户端驱动程序只能更改非默认接口设置中管道的 MaximumTransferSize 。

USB 传输大小受以下限制:

使用 MaximumTransferSize 限制传输大小不会直接影响设备消耗的带宽。 客户端驱动程序必须更改接口设置或限制USBD_PIPE_INFORMATION的 MaximumPacketSize 成员中设置的最大数据包大小。

最大数据包大小

最大数据包大小由端点描述符的 wMaxPacketSize 字段定义。 客户端驱动程序可以在对设备的选择接口请求中调节 USB 数据包大小。 更改此值不会更改设备上的 wMaxPacketSize 。

在请求的 URB 中是管道 的USBD_PIPE_INFORMATION 结构。 在该结构中,

  • 修改 USBD_PIPE_INFORMATION 结构的 MaximumPacketSize 成员。 将其设置为小于或等于设备固件中为当前接口设置定义的 wMaxPacketSize 的值。
  • 在 PipeFlags 成员USBD_PIPE_INFORMATION结构中设置 USBD_PF_CHANGE_MAX_PACKET 标志。
读取传输缓冲区的最大数据包大小限制

当客户端驱动程序发出读取请求时,传输缓冲区必须是最大数据包大小的倍数。 即使驱动程序所需的数据小于最大数据包大小,它仍必须请求整个数据包。 当设备发送的数据包小于最大大小 (短数据包) 时,表示传输已完成。

在较旧的控制器上,客户端驱动程序可以重写该行为。 在数据传输 URB 的 TransferFlags 成员中,客户端驱动程序必须设置 USBD_SHORT_TRANSFER_OK 标志。 该标志允许设备发送小于 wMaxPacketSize 的数据包。

在 xHCI 主控制器上,USBD_SHORT_TRANSFER_OK忽略批量端点和中断端点。 在 EHCI 控制器上传输短数据包不会导致错误情况。

在 EHCI 主控制器上,对于批量端点和中断端点,将忽略USBD_SHORT_TRANSFER_OK。

在 UHCI 和 OHCI 主机控制器上,如果未为批量传输或中断传输设置USBD_SHORT_TRANSFER_OK,则短数据包传输将停止端点,并返回传输的错误代码。

使用短数据包分隔写入传输

USB 驱动程序堆栈驱动程序在写入设备时对数据包大小施加的限制与从设备读取时施加的限制不同。 某些客户端驱动程序必须频繁传输少量的控制数据,以管理其设备。 在这种情况下,将数据传输限制为统一大小的数据包是不切实际的。 因此,在数据写入期间,驱动程序堆栈不会为大小小于端点最大大小的数据包分配任何特殊意义。 这允许客户端驱动程序将设备的大型传输分解为多个大小小于或等于最大值的多个 URB。

驱动程序必须使用小于最大大小的数据包结束传输,或使用零长度的数据包分隔传输结束。 在驱动程序发送小于 wMaxPacketSize 的数据包之前,传输才完成。 如果传输大小正好是最大值的倍数,驱动程序必须发送零长度分隔数据包才能显式终止传输。

根据 USB 规范的要求,客户端驱动程序负责使用零长度数据包分隔数据传输。 USB 驱动程序堆栈不会自动生成这些数据包。

使用小于 wMaxPacketSize 的数据包分隔 USB 数据传输

合规的 USB 2.0 和 USB 1.1 驱动程序必须传输最大大小的数据包 (wMaxPacketSize) ,然后以小于最大大小的数据包结束传输,或使用零长度数据包分隔传输结束。 在驱动程序发送小于 wMaxPacketSize 的数据包之前,传输才完成。 如果传输大小正好是最大值的倍数,驱动程序必须发送零长度分隔数据包才能显式终止传输

设备驱动程序负责根据 USB 规范的要求使用零长度数据包分隔数据传输。 系统 USB 堆栈不会自动生成这些数据包。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/373326.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry):4.2.2 布局处理:4.2.3 键处理:4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

《植物大战僵尸杂交版》2.2版本:全新内容与下载指南

《植物大战僵尸杂交版》2.2版本已经火热更新,带来了一系列令人兴奋的新玩法和调整,为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝,那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…

宏碁F5-572G-59K3笔记本笔记本电脑拆机清灰教程(详解)

1. 前言 我的笔记本开机比较慢,没有固态,听说最近固态比较便宜,就想入手一个,于是拆笔记本看一下有没有可以安的装位置。(友情提示,在拆机之前记得洗手并擦干,以防静电损坏电源器件&#xff09…

ChatTTS使用

ChatTTS是一款适用于日常对话的生成式语音模型。 克隆仓库 git clone https://github.com/2noise/ChatTTS cd ChatTTS 使用 conda 安装 conda create -n chattts conda activate chattts pip install -r requirements.txt 安装完成后运行 下载模型并运行 python exampl…

Python酷库之旅-第三方库Pandas(013)

目录 一、用法精讲 31、pandas.read_feather函数 31-1、语法 31-2、参数 31-3、功能 31-4、返回值 31-5、说明 31-6、用法 31-6-1、数据准备 31-6-2、代码示例 31-6-3、结果输出 32、pandas.DataFrame.to_feather函数 32-1、语法 32-2、参数 32-3、功能 32-4、…

【计算机毕业设计】基于Springboot的IT技术交流和分享平台【源码+lw+部署文档】

包含论文源码的压缩包较大,请私信或者加我的绿色小软件获取 免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者…

14-56 剑和诗人30 - IaC、PaC 和 OaC 在云成功中的作用

介绍 随着各大企业在 2024 年加速采用云计算,基础设施即代码 (IaC)、策略即代码 (PaC) 和优化即代码 (OaC) 已成为成功实现云迁移、IT 现代化和业务转型的关键功能。 让我在云计划的背景下全面了解这些代码功能的当前状态。我们将研究现代云基础设施趋势、IaC、Pa…

MATLAB备赛资源库(1)建模指令

一、介绍 MATLAB(Matrix Laboratory)是一种强大的数值计算环境和编程语言,特别设计用于科学计算、数据分析和工程应用。 二、使用 数学建模使用MATLAB通常涉及以下几个方面: 1. **数据处理与预处理**: - 导入和处理…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换,以探索它们的不同之处,或者因为你知道自己需要其中的一个或另一个,可以使用如下命令: 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

VSCode无法连接网络安装插件-手动安装插件

手动安装插件: 你可以尝试从 Visual Studio Code Marketplace 下载 .vsix 文件,然后在VSCode中手动安装。 手动安装的步骤如下: 1.访问插件页面,下载 .vsix 文件。 Extensions for Visual Studio family of products | Visual S…

CSS【详解】层叠 z-index (含 z-index 的层叠规则,不同样式的层叠效果)

仅对已定位的元素( position:relative,position:absolute,position:fixed )有效,默认值为0,可以为负值。 z-index 的层叠规则 z-index 值从小到大层叠 兄弟元素 z-index 值相同时,后面的元素在…

MySQL架构你了解多少?

MySQL是一个服务器-客户端应用,MySQL8.0服务器是由连接池、服务管理工具和公共组件、NoSQL接口、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。MySQL还为各种编程语言提供了一套用于外部程序访问服务器的连接器。整体架构图如下所示: MySQLConnectors:为…

文件操作和IO流(Java版)

前言 我们无时无刻不在操作文件。可以说,我们在电脑上能看到的图片、视频、音频、文档都是一个又一个的文件,我们需要从文件中读取我们需要的数据,将数据运算后也需要将结果写入文件中长期保存。可见文件的重要性,今天我们就来简…

windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK

文章目录 Loki下载Grafana下载安装Loki添加Loki数据源springboot日志推送 Loki下载 下载地址:https://github.com/grafana/loki/releases/ 找到loki-windows-amd64.exe.zip点击开始下载,我这里下载的2.9.9版本 Grafana下载 下载地址:http…

Hi3861 OpenHarmony嵌入式应用入门--MQTT

MQTT 是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输 协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、 高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器…

“Numpy数据分析与挖掘:高效学习重点技能“

目录 # 开篇 # 补充 zeros & ones eye 1. numpy数组的创建 1.1 array 1.2 range 1.3 arange 1.4 常见的数据类型 1.5 astype 1.6 random.random() & round 2. numpy数组计算和数组计算 2.1 reshape 2.2 shape 2.3 将一维数组变成多维数组 2.4 指定一维…

Java版Flink使用指南——合流

大纲 新建工程无界流奇数Long型无界流偶数Long型无界流奇数String型无界流 合流UnionConnect 测试工程代码 在《Java版Flink使用指南——分流导出》中,我们通过addSink进行了输出分流。本文我们将介绍几种通过多个无界流输入合并成一个流来进行处理的方案。 新建工…

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身?

linux查看目录下的文件夹命令,find 查找某个目录,但是不包括这个目录本身? Linux中查看目录下的文件夹的命令是使用ls命令。ls命令用于列出指定目录中的文件和文件夹。通过不同的选项可以实现显示详细信息、按照不同的排序方式以及使用不同的…

算法小练之 位运算基础

前言 今天正式走入,位运算这个章节,关于这一部分我会先介绍几个重要的知识点,然后再根据几个力扣上的题来讲解。 了解6种位操作 总所周知,变量在计算机中都是二进制存储的,比如一个变量int a 1; 它的存…

申请商标用什么颜色:企业和个人申请注册商标攻略!

在申请注册商标到底要用什么颜色,许多初次申请注册主体都不是特别清楚,普推知产商标老杨建议,在一般情况下建议尽量用黑白色,因为商标用黑白色在使用时可以着任何色。 在用黑色申请注册成功,别的主体用其它颜色要在同…