windows USB设备驱动开发通用技术

news2024/11/19 17:28:22

通用串行总线 (USB) 设备通过配置、接口、备用设置和终结点来定义其功能和功能,下面提供这些概念的高级概述。

常见 USB 方案
获取用于通信的设备句柄 ,并使用检索到的句柄或对象发送数据传输。


USB 描述符检索 以获取有关设备配置的信息、接口、设置及其终结点。


配置设备 以选择活动的 USB 配置和每个接口的设置。

发送控制传输 ,以配置设备和执行特定于特定设备的供应商命令

发送批量传输,通常由传输大量数据的大容量存储设备使用。

发送中断传输。 读取数据以检索硬件中断数据。

发送流传输,主要用于媒体流式处理设备。

USB 选择性挂起 ,允许设备进入低功耗状态,并使设备恢复工作状态。

USB 设备布局


通用串行总线 (USB) 设备通过配置、接口、备用设置和终结点定义其功能和特性。 USB 配置定义设备的功能和特性,主要是其电源功能和接口。 设备可以有多个配置,但一次只能有一个处于活动状态。 活动配置不是由 USB 驱动程序堆栈选择的,但可能由应用程序、驱动程序、设备驱动程序启动。 设备驱动程序选择活动配置。

配置可以有一个或多个用于定义设备功能的 USB 接口 。 通常,功能和接口之间存在一对一的关联。 但是,某些设备公开与一个函数相关的多个接口。 在这种情况下,设备可以具有接口关联描述符IAD,IAD 将属于特定函数的接口组合在一起。

每个接口都包含一个或多个终结点,这些 终结点用于向/从设备传输数据。 此外,接口包含定义与接口关联的函数的带宽要求的 备用设置 。 总之,一组终结点构成一个接口,一组接口构成设备中的配置。

那么,选择活动配置意味着什么? 在设备初始化期间,USB 设备的设备驱动程序必须选择配置、该配置中的一个或多个接口以及每个接口的备用设置。 大多数 USB 设备不提供多个接口或多个备用设置。 例如,OSR USB FX2 学习工具包设备具有一个接口,其中包含一个备用设置和三个终结点。

单接口设备

下图显示了具有单个接口的设备配置:

在此示例中,该图显示了终结点 0,称为 默认终结点。 所有 USB 设备都必须具有用于控制传输的默认终结点  。 配置 0 有一个接口:具有一个备用设置的接口 0。 备用设置 0 使用接口中的所有三个终结点。

多接口设备

对于多功能设备,设备具有多个接口。 若要使用特定函数或接口,客户端驱动程序会选择接口和关联的备用设置。 考虑一个多功能 USB 设备,例如网络摄像头。 该设备具有两种功能:视频捕获 (相机) 和音频输入 (麦克风) 。 设备在流式传输视频的视频接口中定义终结点。 设备在单独的接口中具有另一个终结点,该终结点通过麦克风获取音频输入。 设备的配置包括这两个接口。

下图显示了网络摄像头设备的配置:

在此示例中,该图显示了默认终结点。 配置 0 有两个接口:接口 0 和接口 1。 接口 0 有三个备用设置。 在任何给定时间,只有一个备用设置处于活动状态。 请注意,备用设置 0 不使用终结点,而备用设置 1 和 2 使用终结点 1。 通常,摄像机使用 常时等量终结点 进行流式处理。 对于该类型的终结点,使用终结点时,在总线上保留带宽。 当相机未流式传输视频时,客户端驱动程序可以选择备用设置 0 以节省带宽。 当网络摄像头流式传输视频时,客户端驱动程序可以切换到备用设置 1 或备用设置 2,这可提高质量级别并消耗不断增加的总线带宽。 接口 1 有两个备用设置。 与接口 0 类似,备用设置 0 不使用终结点。 备用设置 1 定义为使用终结点 1。

不能在配置中的两个接口之间共享终结点。 设备使用终结点地址来确定数据传输或终结点操作(如管道重置)的目标终结点,所有这些操作都由主机启动。

在开始使用设备之前,请获取有关设备布局的信息。 USBView 是一个应用程序,可用于浏览所有 USB 控制器以及连接到它们的 USB 设备。 对于每个连接的设备,可以查看设备、配置、接口和终结点描述符,以了解设备的功能。

标准 USB 描述符
映射到设备布局的 USB 描述符

主机软件通过将各种标准控制请求发送到默认终结点,获取描述符请求,从附加设备获取描述符,请参阅 USB 规范第 9.4.3 节。 这些请求指定要检索的描述符的类型。 为了响应此类请求,设备发送描述符,其中包含有关设备、其配置、接口和相关终结点的信息。 设备描述符 包含有关整个设备的信息。 配置描述符 包含有关每个设备配置的信息。 字符串描述符 包含 Unicode 文本字符串。

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

例如,让我们考虑 OSR FX2 板设备布局 (请参阅 USB 设备布局) 。 在设备级别,设备公开默认终结点的设备描述符和终结点描述符。 在配置级别,设备公开配置 0 的配置描述符。 在接口级别,它公开了备用设置 0 的一个接口描述符。 在终结点级别,它公开了三个终结点描述符。


USB 设备描述符

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

主机通过控件传输获取设备描述符。 Microsoft 提供编程接口来获取描述符。

USB 配置描述符

USB 配置包含一系列接口。 每个接口由一个或多个备用设置组成,每个备用设置由一组终结点组成, (查看 USB 设备布局) 。 配置描述符描述整个配置包括其接口、备用设置及其终结点。 其中每个实体也都以描述符格式进行描述。 配置描述符还可以包含由设备制造商定义的自定义描述符。

因此,只有配置描述符的初始部分是固定的,即 9 个字节。 其余部分是可变的,具体取决于接口的数量及其备用设置,以及设备支持的终结点。 在此文档集中,初始 9 个字节称为配置描述符。 描述符的前两个字节指示总长度。

下表显示了 USB 网络摄像头设备的配置描述符:

bConfigurationValue 字段指示设备固件中定义的配置编号。 USB 配置还指示某些电源特征。 bmAttributes 包含一个位掩码,该掩码指示配置是否支持远程唤醒功能,以及设备是总线供电还是自供电。 MaxPower 字段指定设备采用总线供电时,设备可从主机提取的最大功率) ((以毫安单位为单位)。 配置描述符还指示设备支持的 (bNumInterfaces) 接口总数。

USB 接口描述符

接口描述符包含有关 USB 接口的备用设置的信息。

下表显示了网络摄像头设备的接口 0 的备用设置 0 的接口描述符:

在前面的示例中,请注意 bInterfaceNumber 和 bAlternateSetting 字段值。 这些字段包含主机用于激活接口及其备用设置之一的索引值。 对于激活,应用程序或驱动程序在函数调用中指定索引值。 然后,USB 驱动程序堆栈根据该信息生成一个标准控制请求 (SET INTERFACE) 并将其发送到设备。 请注意 bInterfaceClass 字段。 接口描述符或其任何备用设置的描述符指定类代码、子类和协议。 0x0E 的值指示接口适用于视频设备类。 另请注意 iInterface 字段。 该值指示在接口描述符后面追加了两个字符串描述符。 字符串描述符包含 Unicode 说明,这些说明在设备枚举期间用于标识功能。

USB 终结点描述符

接口中的每个终结点描述设备的单个输入或输出流。 支持不同类型函数流的设备具有多个接口。 支持与一个函数相关的多个流的设备可以支持单个接口上的多个终结点。

除默认终结点之外,所有类型的终结点必须提供终结点描述符,以便主机可以获取有关终结点的信息。 终结点描述符包括其地址、类型、方向和终结点可以处理的数据量等信息。 到终结点的数据传输基于该信息。

下表显示了网络摄像头设备的终结点描述符:


bEndpointAddress 字段指定包含终结点编号 (位 3.0) 的唯一终结点地址,以及终结点方向 (位 7) 。 通过读取上述示例中的这些值,我们可以确定描述符描述了终结点编号为 2 的 IN 终结点。 bmAttributes 属性指示终结点类型为常时等量。 wMaxPacketSizefield 指示终结点在单个事务中可以发送或接收的最大字节数。 位 12..11 指示每个微帧可以发送的事务总数。 bInterval 指示终结点发送或接收数据的频率。

USB 终结点及其管道

USB 设备具有用于数据传输的终结点。 在主机端,终结点由管道表示, 本文区分这两个术语。
终结点是 USB 设备上的缓冲区。 终结点是一个与硬件本身相关的术语,独立于主机操作系统。 主机可以向该缓冲区发送和接收数据。 终结点可分为控制和数据终结点。

每个 USB 设备必须在地址 0 处提供至少一个控制终结点,称为默认终结点或 Endpoint0。 此终结点是双向的。 也就是说,主机可以将数据发送到终结点,并在一次传输中从终结点接收数据。 控制传输的目的是使主机能够获取设备信息、配置设备或执行特定于设备的控制操作。

数据终结点是可选的,用于传输数据。 它们是单向的,具有类型 (控制、中断、批量、常时等量) 和其他属性。 所有这些属性均在终结点描述符中介绍 (请参阅 USB 描述符标准) 。

在 USB 术语中,终结点的方向 ( 和传输) 基于主机。 因此,IN 始终是指从设备传输到主机,OUT 始终是指从主机传输到设备。 USB 设备还可以支持控制数据的双向传输。

设备上的终结点分组为功能接口,一组接口构成设备配置。

主机软件可以在配置设备之前或在选择备用设置期间查看终结点信息。 你将循环访问所有接口,然后循环访问设置的每个接口列表,并查看设置中每个终结点或整个终结点集的属性。 查看终结点信息不会影响设备的配置状态。

USB 管道

数据通过称为 管道的抽象在 USB 设备和 USB 主机之间传输。 管道纯粹是一个软件术语。 管道与设备上的终结点通信,并且该终结点具有地址。 管道的另一端始终是主控制器。

通过选择配置和接口的备用设置来配置设备时,将打开终结点的管道。 因此,它们成为 I/O 操作的目标。 管道具有终结点的所有属性,但它处于活动状态,并用于与主机通信。

未配置的终结点称为终结点,而配置的终结点称为管道。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之进程学习

进程打开的文件列表:就是0 1 2 stdin stdout stderro等 类似于任务管理器是动态分ps是静态的 Zombie状态: 在Linux进程的状态中,僵尸进程是非常特殊的一种,它是已经结束了的进程,但是没有从进程表中删除。太多了会导…

Flutter笔记(一)- 安装和配置Flutter

一、下载Flutter 访问网址:https://docs.flutter.dev/get-started/install?hlzh-cn 根据电脑所使用的操作系统的平台进行选择。笔者电脑的操作系统为Windows,因此选择如图1-1的Windows图片: 图1-1 Flutter网站(一) …

【LangChain系列——案例分析】【基于SQL+CSV的案例分析】【持续更新中】

目录 前言一、LangChain介绍二、在SQL问答时如何更好的提示?2-1、安装2-2、SQLite 样例数据2-3、使用langchain与其进行交互2-4、查看模型提示语2-5、提供表定义和示例行2-6、将表信息插入到Prompt中去2-7、添加自然语言->SQL示例2-8、在向量数据库中查找最相关的…

springboot异常产生原因

DataIntegrityViolationException Cause: java.sql.SQLException: Field ‘id’ doesn’t have a default value org.springframework.dao.DataIntegrityViolationException: ### Error updating database. Cause: java.sql.SQLException: Field id doesnt have a default …

qt开发-15_QFile

QFile 类提供了读取和写入文件的接口。在嵌入式里如果需要读写文件,最简单的方法就是 用 Qfile。 QFile 是一个读写文本、二进制文件和资源的 I/O 设备。QFile 可以自己使用,也可以更方 便地与 QTextStream 或 QDataStream 一起使用。 文件名通常在构造函…

海云安参编《数字安全蓝皮书 》正式发布并入选《2024中国数字安全新质百强》荣膺“先行者”

近日,国内数字化产业第三方调研与咨询机构数世咨询正式发布了《2024中国数字安全新质百强》(以下简称百强报告)。海云安凭借在开发安全领域的技术创新力及市场影响力入选百强报告“新质百强先行者” 本次报告,数世咨询经过对国内8…

获取个人免费版Ubuntu Pro

首先上官网地址:Ubuntu Pro | Ubuntu 点击页面中的"Get Ubuntu Pro now" 将用途选为“Myself”,在此页面中Ubuntu说明了该版本只面向个人开发者,且最终只允许5台设备免费使用;因而部署设备的抉择就不得不慎重考虑了&am…

Java | Leetcode Java题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; class Solution {void dfs(char[][] grid, int r, int c) {int nr grid.length;int nc grid[0].length;if (r < 0 || c < 0 || r > nr || c > nc || grid[r][c] 0) {return;}grid[r][c] 0;dfs(grid, r - 1, c);dfs(grid, r…

设计模式原则——接口隔离原则

设计模式原则 设计模式示例代码库地址&#xff1a; https://gitee.com/Jasonpupil/designPatterns 接口隔离原则 要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口&#xff0c;让接口中只包含客户感兴趣的方法接口隔离原则的目标是降低类或模块之间的耦合度&…

WIN版-苹果和平精英画质帧率优化教程

一、视频教程&#xff1a; 想要视频的联系博主 二、图文教程&#xff1a; 前置说明&#xff1a;不按教程&#xff0c;会导致修改不成功&#xff0c;或者设备里面内容丢失。请务必按教程操作&#xff01;&#xff01; 准备工作&#xff08;这部分是在要改的设备上操作&#x…

数据结构--栈(图文)

栈是一种基本的抽象数据类型&#xff0c;具有后进先出的特点。在栈这种数据结构中&#xff0c;元素只能在一端进行插入和删除操作&#xff0c;这一端被称为栈顶&#xff08;Top&#xff09;&#xff0c;而另一端则称为栈底&#xff08;Bottom&#xff09;。 栈的概念及特点 栈…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

怎么使用python进行整除取余求幂

怎么使用python进行整除取余求幂&#xff1f; 整除法是//&#xff0c;称为地板除&#xff0c;两个整数的除法仍然是整数。 10//33 3 求模运算是%&#xff0c;相当于mod&#xff0c;也就是计算除法的余数。 5%2 1 求幂运算使用两个连续的*&#xff0c;幂运算符比取反的优先级高…

操作系统面试篇一

很多读者抱怨计算操作系统的知识点比较繁杂&#xff0c;自己也没有多少耐心去看&#xff0c;但是面试的时候又经常会遇到。所以&#xff0c;我带着我整理好的操作系统的常见问题来啦&#xff01;这篇文章总结了一些我觉得比较重要的操作系统相关的问题比如 用户态和内核态、系统…

css3实现水纹进度条

其实有一个mask-image属性 挺有意思&#xff0c;在元素上面实现遮罩层的效果&#xff0c;不过这玩意有些兼容性问题 需要处理&#xff0c;所以单纯可以通过渐变色的方式来实现 同时加上动画效果 .jianbian {width: 100%;height: 16px;background-color: #eee;display: flex;bor…

【shell 学习一】shell执行方式以及变量(自定义变量、整数运算)定义

1.shell执行方式 测试脚本 vim file1 echo hello 2024 read -p 请输入 name echao hh,$name执行1 bash file1执行2 sh file1执行3 . file1执行4 source file11和2的方式&#xff0c;是子shell 3和4的方式&#xff0c;是本shell bash是进入新的命令 这时候退出edit是退出这个新…

docker部署FastDFS整合Springboot

文章目录 1、FastDFS是什么&#xff1f;2、搭建docker环境3、部署fastdfs4、整合springboot5、接口测试参考文章 1、FastDFS是什么&#xff1f; FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文…

树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; OpenCv颜色追踪_程序手动调试HSV色彩空间_检测灰度图中的…

Windows USB设备驱动开发 - 常见概念的解释

我们听到许多 USB 术语几乎交替抛出。 它们都是什么意思&#xff1f;假设我们看到类似 “多亏了 USB 3.0&#xff0c;我可以将 SuperSpeed U 盘连接到电脑的 xHCI 主机控制器&#xff0c;并更快地复制文件。” 让我们了解该句子中的 USB 术语。 USB 3.0、USB 2.0 和 USB 1.0 请…

C语言 | Leetcode C语言题解之第200题岛屿数量

题目&#xff1a; 题解&#xff1a; void cleanLand(char** grid, int gridSize, int ColSize,int row,int column) {if(grid[row][column] 1){//不等于1则清零grid[row][column] 0;}else{//不等于1则返回return ;}int newRow;int newColumn;//上if(row ! 0) //还能上{ne…