如前面所述,当某个设备被连接到 USB 主机上,该设备会向主机提供其功能和电源要求。通常,设备会通过一个描述符表格(其固件的一部分)来提供这些信息。描述符表格是数据的结构化序列,描述了设备信息;
这些值由开发人员定义。所有描述符表格都具有一个标准信息,用于介绍设备属性和电源要求。
如果某个设计满足指定 USB 设备类别的要求,则该 USB 设备必须具备的其他描述符信息都将包含在设备描述符结构中。
附录 A 包含一个 PSoC USB 的全功能设备描述符的示例。
如果您正在阅读或创建您自己的描述符,那么请注意,传输数据字段时,优先传输最低有效位。许多参数的长度均为 2个字节。请确保先发送低字节,然后再发送高字节。
设备描述符
设备描述符为主机提供了许多信息,如设备需要满足的 USB 规范、设备配置编号、设备支持的协议、供应商标识(又称为 VID,每个公司只能从 USB 实施者论坛获得唯一的 VID)、产品标识(又称为 PID,与数据包 ID 不同)和一个序列号(如果设备有)。
设备描述符包含了 USB 设备的重要信息。表 5 显示的是设备描述符的结构。
bLength 是设备描述符的总长度,以字节为单位。
bcdUSB 则显示了设备支持的 USB 版本,通常是最新版本。这是一个二进制代码形式的十进制数据,采用 0xAABC 的形式,其中 A 是主版本号,B 是次版本号,C 是子次版本号。例如,USB 2.0 设备拥有 0x0200 值,USB 1.1 设备拥有0x0110 值。
通常,主机将使用 bcdUSB 以确定需要加载的 USB 驱动器。
bDeviceClass、bDeviceSubClass 和 bDeviceProtocol 均由操作系统使用,以便在枚举过程中识别 USB 设备的驱动器。将代码填充设备描述符中的这些字段内可以防止各种不同的接口独立运行,如一个复合设备。
大部分 USB 设备都在接口描述符中定义了它的类别,并将这些字段保持为 00h。
bMaxPacketSize 会报告由端点 0 支持的数据包的最大字节数量。根据设备,数据包的大小可以为 8 个字节、16 个字节、32 个字节和 64 个字节。
iManufacturer、iProduct 和 iSerialNumber 都是字符串描述符索引。字符串描述符包括有关制造商、产品和序列号等信息。如果存在字符串描述符,这些变量应该指向其索引位置。如果没有任何字符串,那么应该将零值填充到各个字段内。
bNumConfigurations 定义了设备可支持的配置总数。多个配置使设备能够根据特定条件按照特定条件进行不同的配置,如由总线供电或自供电。
配置描述符
该描述符会提供特定设备配置的信息,如接口数量、设备由总线供电还是自供电、设备能否启动一个远程唤醒以及设备功耗。
wTotalLength 是本配置的整个层次的长度。该值报告了本配置的字节总数以及一个配置所需的接口和端点描述符。
bNumInterfaces 则定义了在该指定配置中接口总数。最小为 1 个接口。
bConfigurationValue 将定义某一直作为参数,SET_CONFIGURATION 请求会使用该参数来选择该配置。
bmAttributes 定义了 USB 设备的参数。如果设备由总线供电,那么位 6 将被设置为 0,如果设备自供电,那么位 6 将被设置为 1。
如果 USB 设备支持远程唤醒,则位 5 将被设置为 1。如果不支持远程唤醒,则位 5 将被设置为 0。
bMaxPower 定义了设备全速运行时通过总线消耗的最大功耗,以 2 mA 为单位。如果拔出自供电设备的外部电源,那么它的功耗不会超过该字段中所显示的值。
接口关联描述符(IAD)
该描述符介绍两个或多个接口,这些接口与单个设备功能相关。接口关联描述符(IAD)会通知给主机各个接口已经连接好。
例如,USB UART 具有两个与其相关的接口:控制接口和数据接口。IAD 通知主机这两个接口与同一个功能(USBUART)相关,并属于通信设备类别(CDC)。并非所有情况下都需要使用该描述符。
图 43 显示的是单个接口如何与单个设备功能相关。接口描述符定义了该功能的特性。图 43 显示的是两个单独接口与一个指定设备功能相连接的方式。这便是 IAD 需要的信息。表 7 显示的是接口关联描述符的结构。
接口描述符
一个接口描述符介绍了包含在配置中的特定接口。该接口的端点数量将显示在该描述符中。接口描述符也包含有关设备的 USB 类别的信息。
一个 USB 设备可以属于多个预定义类别,表 12 中显示了多种这些类别。
一个 USB 设备类别指出了设备功能,并有助于加载用于该特定功能的合适驱动器。表 8 显示的是接口描述符的结构。
端点描述符
在一个设备中所使用的全部端点都有自己的描述符。该描述符会提供主机必须获取的端点信息。这些信息包括端点的方向、传输类型和数据包的最大尺寸。表 9 显示的是端点描述符的结构。
字符串描述符
字符串描述符是另一种可选的描述符,它为用户提供了有关设备的可读信息。该描述符中所包含的信息显示了以下内容:设备名称、生产厂家、序列号或不同接口、配置的名称。
如果设备没有使用字符串,必须将前面所述的所有描述符中的字符串附加字段的值设置为 00h。
各字符串是由 UNICODE UTF16LE 编码定义的,并且支持使用一个语言 ID 代码实现多种语言。
在 Windows 系统中,可以在“device manager”(设备管理工具)中查找这些字符串。表 10 显示的是字符串描述符的结构。
字符串描述符包括两种类型。
第一种字符串描述符包含表示语言 ID 的值,即为 wLangID,它包含一个或多个两字节长的 ID 代码,用于表示字符串的语言。
USB-IF 提供了一个包含多种 ID 代码的定义的文档。例如,美式英语的 ID 代码是0409h。
更多有关 ID 代码的信息,请参考 USB-IF LANGID 页中的内容。
出现在 wLangID 后面的所有字符串描述符都使用 bString,该字符串字段包含一个 Unicode 字符串(UTF16LE)并且每一个字符都使用两个字节来代表。
其他杂项描述符
报告描述符:某个 USB 类设备可能需要一组扩展式的描述符信息。开发者必须保证 USB 设备所需要的任意额外的描述符信息都包含在描述符文件里。例如,对于 HID 类设备,开发者必须将报告描述符添加到描述符文件内,用于定义其他设备属性。如果需要额外的描述符,可以在类定义规范或其他类的支持文档中查找相关的描述符格式。更多有关报告描述符的信息,请参考 AN57473 — PSoC®3 和 PSoC 5LP 的 USB HID 初级应用笔记以及 AN58726 — PSoC®3 和PSoC 5LP 的 USB HID 中级应用笔记。
MS OS 描述符:Microsoft 有一种描述符,即 Microsoft 操作系统特性描述符(也称为 MS OS 描述符),提供给商特定的设备。该描述符为 Microsoft Windows 提供了各种特定信息,如特定图标、注册设置、助手文件和 URL。MS OS 描述符包含一个字符串和一个或多个特性描述符。执行枚举期间,Windows 需要使用包含了 EEh 标志和内砍标签的字符串描述符。如果设备支持 MS OS 描述符,在接收字符串描述符后,Windows 需要额外的信息。如果不支持 MS OS 描述符,则设备会发出“STALL”错误指示,作为握手响应。更多有关 MS OS 描述符的信息,请参考 MSDN 微软操作系统描述符登录页面。
Device_Qualifier 描述符:USB 类设备中还使用了另一种描述符,称为 Device_Qualifier 描述符。它提供了支持高速性能的设备信息,该信息会根据设备的不同运行速度而不同。支持两种速度配置的设备都需要具备该描述符。请求了该描述符的情况下,如果设备正在全速运行,那么它会通知主机:设备以高速运行时操作有什么区别。同样,如果设备正以高速运行,该描述符将会向主机提供设备操在全速运行下的对比信息。通过读取描述符的值,主机能够知道全速配置信息。如果请求了该描述符,而设备仅支持全速操作,那么设备会响应为“STALL”。否则,会按要求将描述符信息提供给主机。
BOS 描述符:USB 2.0 版本中能够支持链路电源管理(LPM)的另一种描述符是二进制设备物体存储(BOS)描述符。对于支持 USB 2.0 的 PSoC 系列产品中,只有 PSoC 4200L 设备能够支持 LPM 特性,因此,它也支持 BOS 描述符。LPM 是从 USB 挂起模式中得到优越化的特性。它允许设备以数十纳秒的转换延迟进入和退出低功耗模式(而挂起模式进入/退出需要 3-20 纳秒的延迟)。
支持 LPM 特性的所有 USB 2.0 设备都需要使用 USB 2.0 的扩展描述符来报告其 LPM 能力。USB 2.0 扩展描述符是BOS 描 述 符 的 一 部 分 。 USB 2.0 设 备 的 标 准 描 述 符 中 bcdUSB 字 段 的 值 表 示 设 备 支 持 通 过 通 过 发 出GetDescriptor(BOS)请求读取 BOS 描述符。支持 BOS 描述符的设备的 bcdUSB 值不得小于 0201H。
使用多个USB描述符
各个 USB 设备只有一个设备描述符。但是,一个设备可以有多种配置、接口、端点和字符串描述符。设备执行枚举时,终端阶段中有一个步是读取设备描述符,并选择需要使能的设备配置类型。每一次操作只能使能一种配置。
例如,某个设计中存在两种配置:一种适用于自供电的设备,另一种适用于由总线供电的设备。这时,用于自供电设备的USB 的总体性能会与使用于总线供电设备的不一样。拥有多种配置和多种配置描述符可允许设备选择性实现该功能。
同时一个设备可以有多种接口,因此,它也会有多种接口描述符。
具有多种接口的 USB 设备(能够执行不同功能)被称为复合设备。
USB 头戴式音频耳机便是一个复合设备示例。
这种音频耳机包括一个带有两个接口的 USB 设备。
其中,一个接口用于音频传输,另一个接口可用于音量调整。可以同时使能多个接口。图 45 显示的是单个 USB 设备中如何分配两种接口。
最终,每个接口可以有多种配置。这些配置类型被称为备用设置。
可以使用这些备用设置来更改设备的端点配置,从而保留带宽的不同能力。
例如,在某种备用设置中,可以将设备的端点配置为批量传输(没有保证的总线带宽),在另一种备用设置中,可以将设备的端点配置为同步传输(有保证的总线带宽)。
图 46 详细演示了该示例。
图 47 显示的是各种配置选项的总体框图,有助于根据不同的配置选项来创建准确的可配置 USB 设备。