硬件笔记(8)----USB学习笔记5

10 USB 描述符

如前面所述,当某个设备被连接到 USB 主机上,该设备会向主机提供其功能和电源要求。通常,设备会通过一个描述符表格(其固件的一部分)来提供这些信息。描述符表格是数据的结构化序列,描述了设备信息;这些值由开发人员定义。所有描述符表格都具有一个标准信息,用于介绍设备属性和电源要求。如果某个设计满足指定 USB 设备类别的要求,则该 USB 设备必须具备的其他描述符信息都将包含在设备描述符结构中。附录 A 包含一个 PSoC USB 的全功能设备描述符的示例。如果您正在阅读或创建您自己的描述符,那么请注意,传输数据字段时,优先传输最低有效位。许多参数的长度均为 2个字节。请确保先发送低字节,然后再发送高字节。

带有两种配置的 USB 描述符

10.1 设备描述符

设备描述符为主机提供了许多信息,如设备需要满足的 USB 规范、设备配置编号、设备支持的协议、供应商标识(又称为 VID,每个公司只能从 USB 实施者论坛获得唯一的 VID)、产品标识(又称为 PID,与数据包 ID 不同)和一个序列号(如果设备有)。设备描述符包含了 USB 设备的重要信息。表 5 显示的是设备描述符的结构。

偏移

字段

大小(字节)

说明

0

bLength

1

该描述符的长度 = 18 个字节

1

bDescriptorType

1

描述符类型 = 设备(01h)

2

bcdUSB

2

USB 规范版本(BCD)

4

bDeviceClass

1

设备类别

5

bDeviceSubClass

1

设备子类别

6

bDeviceProtocol

1

设备协议

7

bMaxPacketSize0

1

端点 0 的最大数据包大小

8

idVendor

2

供应商 ID(VID,由 USB-IF 分配)

10

idProduct

2

产品 ID(PID,由制造商分配)

12

bcdDevice

2

设备释放编号(BCD)

14

iManufacturer

1

制造商字符串索引

15

iProduct

1

产品字符串索引

16

iSerialNumber

1

序列号字符串索引

17

bNumConfigurations

1

受支持的配置数量

设备描述符表 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 定义了设备可支持的配置总数。多个配置使设备能够根据特定条件按照特定条件进行不同的配置,如由总线供电或自供电。更多有关该问题的信息,将在后面详细介绍。

10.2 配置描述符

该描述符会提供特定设备配置的信息,如接口数量、设备由总线供电还是自供电、设备能否启动一个远程唤醒以及设备功耗。下表显示的是配置描述符结构。

偏移

字段

大小(字节)

说明

0

bLength

1

该描述符的长度 = 9 个字节

1

bDescriptorType

1

描述符类型 = 配置(02h)

2

wTotalLength

2

总长度包括接口和端点描述符在内

4

bNumInterfaces

1

本配置中接口的数量

5

bConfigurationValue

1

SET_CONFIGURATION 请求所使用的配置值,用于选择该配置

6

iConfiguration

1

描述该配置的字符串索引

7

bmAttributes

1

位 7:预留(设置为 1) 位 6:自供电 位 5:远程唤醒

8

bMaxPower

1

本配置所需的最大功耗(单位为 2 mA)

配置描述符表 wTotalLength 是本配置的整个层次的长度。该值报告了本配置的字节总数以及一个配置所需的接口和端点描述符。 bNumInterfaces 则定义了在该指定配置中接口总数。最小为 1 个接口。 bConfigurationValue 将定义某一直作为参数,SET_CONFIGURATION 请求会使用该参数来选择该配置。 bmAttributes 定义了 USB 设备的参数。如果设备由总线供电,那么位 6 将被设置为 0,如果设备自供电,那么位 6 将被设置为 1。如果 USB 设备支持远程唤醒,则位 5 将被设置为 1。如果不支持远程唤醒,则位 5 将被设置为 0。 bMaxPower 定义了设备全速运行时通过总线消耗的最大功耗,以 2 mA 为单位。如果拔出自供电设备的外部电源,那么它的功耗不会超过该字段中所显示的值。

10.3 接口关联描述符(IAD)

该描述符介绍两个或多个接口,这些接口与单个设备功能相关。接口关联描述符(IAD)会通知给主机各个接口已经连接好。例如,USB UART 具有两个与其相关的接口:控制接口和数据接口。IAD 通知主机这两个接口与同一个功能(USBUART)相关,并属于通信设备类别(CDC)。并非所有情况下都需要使用该描述符。图 43 显示的是单个接口如何与单个设备功能相关。接口描述符定义了该功能的特性。图 43 显示的是两个单独接口与一个指定设备功能相连接 的方式。这便是 IAD 需要的信息。表 7 显示的是接口关联描述符的结构。

多个接口与多个功能相关

多个接口与单个功能相关

偏移

字段

大小(字节)

说明

0

bLength

1

描述符大小(以字节为单位)

1

bDescriptorType

1

描述符类型 = 接口关联(0Bh)

2

bFirstInterface

1

标号与功能相关的第一个接口

3

bInterfaceCount

1

与功能相关的邻近接口的数量

4

bFunctionClass

1

类别代码

5

bFunctionSubClass

1

子类别代码

6

bFunctionProtocol

1

协议代码

接口关联描述符表

10.4 接口描述符

一个接口描述符介绍了包含在配置中的特定接口。该接口的端点数量将显示在该描述符中。接口描述符也包含有关设备的 USB 类别的信息。一个 USB 设备可以属于多个预定义类别,表 12 中显示了多种这些类别。一个 USB 设备类别指 出了设备功能,并有助于加载用于该特定功能的合适驱动器。表 8 显示的是接口描述符的结构。

偏移

字段

大小(字节)

说明

0

bLength

1

该描述符的长度 = 9 个字节

1

bDescriptorType

1

描述符类型 = 接口(04h)

2

bInterfaceNumber

1

该接口基于零的索引

3

bAlternateSetting

1

备用设置值

4

bNumEndpoints

1

该接口所使用的端点数量(不包含 EP0)

5

bInterfaceClass

1

接口类别

6

bInterfaceSubclass

1

接口子类别

7

bInterfaceProtocol

1

接口协议

8

iInterface

1

该接口字符串描述符索引

接口描述符表

10.5 端点描述符

在一个设备中所使用的全部端点都有自己的描述符。该描述符会提供主机必须获取的端点信息。这些信息包括端点的方向、传输类型和数据包的最大尺寸。表 9 显示的是端点描述符的结构。

偏移

字段

大小(字节)

说明

0

bLength

1

该描述符长度 = 7 个字节

1

bDescriptorType

1

描述符类型 = 端点(05h)

2

bEndpointAddress

1

位 3…0:端点数量位 6…4:预留,复位为零位 7:端点的方向。控制端点可以忽略该位。 0 = OUT 端点 1 = IN 端点

3

bmAttributes

1

位 1…0:传输类型 00 = 控制 01 = 同步 10 = 批量 11 = 中断 如果该端点不是同步端点,那么位 5 到位 2 将被预留,必须将这些位设置为零。如果该端点是同步的,这些位将按如下内容定义:位 3...2:同步类型 00 = 无同步 01 = 异步 10 = 自适应 11 = 同步位 5...4:用途类型 00 = 数据端点 01 = 反馈端点 10 = 隐式反馈数据端点 数值 11 表示保留

4

wMaxPacketSize

1

该端点的数据包最大尺寸

6

bInterval

1

中断端点的轮询间隔,单位为 ms(对于同步端点,该间隔为 1 ms;控制或批量端点可能忽略该字段)

端点描述符

10.6 字符串描述符

字符串描述符是另一种可选的描述符,它为用户提供了有关设备的可读信息。该描述符中所包含的信息显示了以下内容:设备名称、生产厂家、序列号或不同接口、配置的名称。如果设备没有使用字符串,必须将前面所述的所有描述符中的字符串附加字段的值设置为 00h。 各字符串是由 UNICODE UTF16LE 编码定义的,并且支持使用一个语言 ID 代码实现多种语言。在 Windows 系统中,可以在“device manager”(设备管理工具)中查找这些字符串。表 10 显示的是字符串描述符的结构。

偏移

字段

大小(字节)

说明

0

bLength

1

该描述符的长度 = 7 个字节

1

bDescriptorType

1

描述符类型 = STRING (03h)

2..n

bString 或 wLangID

变化

Unicode 编码字符串 或 LANGID 代码

字符串描述符表 字符串描述符包括两种类型。第一种字符串描述符包含表示语言 ID 的值,即为 wLangID,它包含一个或多个两字节长的 ID 代码,用于表示字符串的语言。USB-IF 提供了一个包含多种 ID 代码的定义的文档。例如,美式英语的 ID 代码是0409h。更多有关 ID 代码的信息,请参考 USB-IF LANGID 页中的内容。出现在 wLangID 后面的所有字符串描述符都使用 bString,该字符串字段包含一个 Unicode 字符串(UTF16LE)并且每一个字符都使用两个字节来代表。

10.7 其他杂项描述符类型

报告描述符:某个 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”。否则,会按要求将描述符信息提供给主机。更多有关该描述符的信息,请参考 USB 规范中第 9.6.2 章的内容。 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。更多有关 BOS描述符和 USB 2.0 版本的扩展描述符的信息,请参考 USB 3.1 规范中第 9.6.2 章的内容。

10.8 使用多个 USB 描述符

各个 USB 设备只有一个设备描述符。但是,一个设备可以有多种配置、接口、端点和字符串描述符。设备执行枚举时,终端阶段中有一个步是读取设备描述符,并选择需要使能的设备配置类型。每一次操作只能使能一种配置。例如,某个设计中存在两种配置:一种适用于自供电的设备,另一种适用于由总线供电的设备。这时,用于自供电设备的USB 的总体性能会与使用于总线供电设备的不一样。拥有多种配置和多种配置描述符可允许设备选择性实现该功能。 同时一个设备可以有多种接口,因此,它也会有多种接口描述符。具有多种接口的 USB 设备(能够执行不同功能)被称为复合设备。USB 头戴式音频耳机便是一个复合设备示例。这种音频耳机包括一个带有两个接口的 USB 设备。其中,一个接口用于音频传输,另一个接口可用于音量调整。可以同时使能多个接口。图 45 显示的是单个 USB 设备中如何分配两种接口。

多个接口的设置框图

最终,每个接口可以有多种配置。这些配置类型被称为备用设置。可以使用这些备用设置来更改设备的端点配置,从而保留带宽的不同能力。例如,在某种备用设置中,可以将设备的端点配置为批量传输(没有保证的总线带宽),在另一 种备用设置中,可以将设备的端点配置为同步传输(有保证的总线带宽)。图 46 详细演示了该示例。

多接口设置框图

下图显示的是各种配置选项的总体框图,有助于根据不同的配置选项来创建准确的可配置 USB 设备。

配置框图

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券