USB 子系统(三)USB 设备描述符

标准设备请求

SETUP 事务的数据格式

Host 使用控制传输来识别设备、设置设备地址、启动设备的某些特性,对于控制传输,它首先发出"setup 事务",如下:

在"setup 事务"中,

  • SETUP 令牌包:用来通知设备,"要开始传输了"。
  • DATA0 数据包:它含有固定的格式,用来告诉设备"是读还是写"、"读什么"、"写什么"。

Hos 通过 DATA0 数据包发送 8 字节数据给设备,它的格式如下图所示:

标准设备请求

控制传输的建立事务中,可以使用下列格式的数据:

上表中各个"宏"取值如下:

设备/配置/接口/端点

在 SETUP 事务的数据里,表示了要访问的是什么:Device?Interface?Endpoint?

对于一个 USB 设备,它可以多种配置 (Configuration)。比如 4G 上网卡就有 2 种配置:U 盘、上网卡。第 1 次把 4G 上网卡插入电脑时,它是一个 U 盘,可以安装里面的程序。装好程序后,把它再次插入电脑,它就是一个上网卡。驱动程序可以选择让它工作于哪种配置,同一时间只能有一种配置。大多数的 USB 设备只有一种配置。

一个配置下,可以有多个接口 (Interface),接口等同于功能 (Function)。比如 USB 耳机有两个接口(功能):声音收发、按键控制。

一个接口,可能有多个设置 (Setting),比如默认设置下它使用较低的带宽,可以选择其他设置以使用更高带宽。

一个接口,由一个或多个端点 (Endpoint) 组成。端点 0 属于整个设备的,端点 0 是双向的。接口还可以有其他端点,这些端点是单向的,要么是批量 (Bulk) 端点、要么是中断 (Interrupt) 端点、要么是同步 (Isochronous) 端点。

描述符

使用描述符 (Descriptors) 描述设备、配置、接口和端点,有设备描述符、配置描述符、接口描述符、端点描述符。所谓描述符,就是一些格式化的数据,用来描述信息。

一个 USB 设备,

  • 只有一个设备描述符:用来表示设备的 ID、它有多少个配置、它的端点 0 一次最大能传输多少字节数据。
  • 可能有多个配置描述符:用来表示它有多少个接口、供电方式、最大电流。
  • 一个配置描述符下面,可能有多个接口描述符:用来表示它是哪类接口、有几个设置 (Setting)、有几个端点。
  • 一个接口描述符符下面,可能有多个端点描述符:用来表示端点号、方向 (IN/OUT)、类型(批量/中断/同步)。

还有一些字符串描述符 (String descriptors),它用可读的文字来描述设备,是可选的。

设备描述符

配置描述符

接口描述符

端点描述符

设备枚举过程示例

使用"usbprotocolsuite"打开,可以看到设备的枚举过程:

  • 使用控制传输,读取设备信息(设备描述符):第一次读取时,它只需要得到 8 字节数据,因为第 8 个数据表示端点 0 能传输的最大数据长度。

  • Host 分配地址给设备,然后把新地址发给设备:

  • 使用新地址,重新读取设备描述符,设备描述符长度是 18:

  • 读取配置描述符:它传入的长度是 255,想一次性把当前配置描述符、它下面的接口描述符、端点描述符全部读出来

  • 读取字符描述符

参考文献

《韦东山老师相关课程》
《圈圈教你玩 USB》
《USB2.0 协议规范》