通用串行总线 (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 操作的目标。 管道具有终结点的所有属性,但它处于活动状态,并用于与主机通信。
未配置的终结点称为终结点,而配置的终结点称为管道。