USB

USB 版本及发展历史

USB接口自1994年推出以来,经过26年的发展,经过USB1.0/1.1、USB2.0、USB3.x,最终发展到了现在的USB4;传输速率也从最开始的1.5Mbps,大幅提高到了最新的40Gbps。

USB1.0

  • 1996年1月15日推出USB1.0接口规范
  • 规定低速传输速率为1.5Mbit/s
  • 对外提供供电电压为5V,最大电流500mA
  • 一般适用于鼠标、键盘等低速HID设备。
  • 支持热插拨

USB1.1

  • 1998年9月23日对原来的USB1.0进行升级,提出了USB1.1
  • USB1.1规定了全速传输速率为12Mbit/s,并兼容USB1.0的1.5Mbit/s
  • 传输线缆最大度度3m
  • 对外提供供电电压为5V,最大电流500mA
  • 一般适用于鼠标、键盘、U盘,光驱等。
  • 一个USB接口理论上可以支持127个设备。

USB2.0

  • 2000年4月27日由USB-IF组织提出了USB2.0总线协议规范
  • 具备480Mbit/s的高速传输速率,向下兼容低速1.5Mbit/s和全速12Mit/s
  • 传输线缆最大度度5m
  • 对外提供供电电压为5V,最大电流500mA
  • 通过HUB级联的方式,一个USB接口理论上可以扩展127个USB设备
  • 支持 4种传输方式:控制传输、中断传输、同步传输和块传输。

USB3 的名字有些多

版本时间带宽别名,指的是同一种
USB3.02008年11月175GbpsSuperSpeed USB、USB 3.2 Gen 1、USB 3.1 Gen 1
USB3.12013年7月10GbpsSuperSpeed USB 10Gbps、USB 3.2 Gen 2、USB 3.1 Gen 2
USB3.22017年9月份20GbpsSuperSpeed USB 20Gbps、USB 3.2 Gen 2x2

USB3.0 / USB 3.2 Gen 1 / USB 3.1 Gen 1

  • 超高速USB3.0规范于2008年11月17日出USB-IF组织推出。
  • 提供更高的5.0Gbit/s的超高速传输速度,并向下兼容低速1.5Mbits/s、全速12Mbit/s和高速480Mbit/s传输速率
  • 对外提供供电电压为5V,最大电流900mA
  • 传输线缆最大度度3m
  • 增加了新的电源管理功能,支持待机、睡眠以及暂定模式,更加省电。
  • 全双工通讯。

USB3.1 / USB 3.2 Gen 2 / USB 3.1 Gen 2

2013年7月份,USB 3.1发布,速度翻番至10Gbps,同时USB-IF就把USB 3.0改名为USB 3.1 Gen 1,新的USB 3.1则叫做USB 3.1 Gen 2。

  • 2013年7月份发布
  • 速度翻番至10Gbps
  • 新增USB A/V影音传输。以更适合作为移动设备的输出接口,尤其是可逆的Type-C。
  • 将供电的最高允许标准提高到了20V/5A,供电100W。
  • 必须使用USB Type-C接口才能达到10Gbps的速度。

USB3.2 / USB 3.2 Gen 2x2

  • 2017年9月份,USB 3.2发布。
  • 据最新公布的规范,USB 3.0、USB 3.1的版本命名都将彻底消失,统一被划入USB 3.2的序列,三者分别再次改名叫做USB 3.2 Gen 1、USB 3.2 Gen 2、USB 3.2 Gen 2x2。
  • 它们还各自有一个市场推广命名,分别是SuperSpeed USB、SuperSpeed USB 10Gbps、SuperSpeed USB 20Gbps。
    之所以想出USB 3.2 Gen2x2这样的名字,大概是因为它使用了USB Type-C接口的上下两端全部针脚,速度得以翻番。
  • 必须使用USB Type-C接口才能达到20Gbps的速度。

USB 描述符

USB是个通用的总线,端口都是统一的。但是USB设备却各种各样,例如USB鼠标,USB键盘,U盘等等,那么USB主机是如何识别出不同的设备的呢?这就要依赖于描述符了。

USB的描述符主要有设备描述符,配置描述符,接口描述符,端点描述符,字符串描述符,HID描述符,报告描述符等等。

USB各个描述符之间的关系

一个USB设备有一个设备描述符,设备描述符里面决定了该设备有多少种配置,每种配置描述符对应着配置描述符;

而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;

接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;

端点描述符定义了端点的大小,类型等等。

由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。

在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。

其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

各个描述符的编号

1
2
3
4
5
#define DEVICE_DESCRIPTOR               0x01  //设备描述符   
#define CONFIGURATION_DESCRIPTOR 0x02 //配置描述符
#define STRING_DESCRIPTOR 0x03 //字符串描述符
#define INTERFACE_DESCRIPTOR 0x04 //接口描述符
#define ENDPOINT_DESCRIPTOR 0x05 //端点描述符

img

img

设备描述符 0x01 Device Descriptor

设备描述符

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 定义标准的设备描述符结构
typedef struct _DEVICE_DCESCRIPTOR_STRUCT {
BYTE blength; // 设备描述符的字节数大小
BYTE bDescriptorType; // 设备描述符类型编号
WORD bcdUSB; // USB版本号
BYTE bDeviceClass; // USB分配的设备类代码
BYTE bDeviceSubClass; // USB分配的子类代码
BYTE bDeviceProtocol; // USB分配的设备协议代码
BYTE bMaxPacketSize0; // 端点0的最大包大小
WORD idVendor; // 厂商编号
WORD idProduct; // 产品编号
WORD bcdDevice; // 设备出厂编号
BYTE iManufacturer; // 设备厂商字符串的索引
BYTE iProduct; // 描述产品字符串的索引
BYTE iSerialNumber; // 描述设备序列号字符串的索引
BYTE bNumConfigurations; // 可能的配置数量
} DEVICE_DESCRIPTOR_STRUCT, *pDEVICE_DESCRIPTOR_STRUCT;

// 实际的设备描述符示例
DEVICE_DESCRIPTOR_STRUCT device_descriptor = {
.blength =sizeof(DEVICE_DESCRIPTOR_STRUCT),// 设备描述符的字节数大小,这里是18字节
.bDescriptorType =DEVICE_DESCRIPTOR, // 设备描述符类型编号,设备描述符是01
.bcdUSB =0x1001, // USB版本号,这里是USB01.10,即USB1.1。由于51是大端模式,所以高低字节交换
.bDeviceClass =0x00, // USB分配的设备类代码,0表示类型在接口描述符中定义
.bDeviceSubClass =0x00, // USB分配的子类代码,上面一项为0时,本项也要设置为0
.bDeviceProtocol =0x00, // USB分配的设备协议代码,上面一项为0时,本项也要设置为0
.bMaxPacketSize0 =0x10, // 端点0的最大包大小,这里为16字节
.idVendor =0x7104, // 厂商编号,这个是需要跟USB组织申请的ID号,表示厂商代号。
.idProduct =0xf0ff, // 该产品的编号,跟厂商编号一起配合使用,让主机注册该设备并加载相应的驱动程序
.bcdDevice =0x0100, // 设备出厂编号
.iManufacturer =0x01, // 设备厂商字符串的索引,在获取字符串描述符时,使用该索引号来识别不同的字符串
.iProduct =0x02, // 描述产品字符串的索引,同上
.iSerialNumber =0x03, // 描述设备序列号字符串的索引,同上
.bNumConfigurations=0x01 // 可能的配置数为1,即该设备只有一个配置
};
  • bLength

    • 是设备描述符的总长度,以字节为单位。
  • bDescriptorType

    • 代表了本描述符的类型。
    • 用于描述设备的描述符 是0x01。
      • 其他描述符的数值及含义
      • 在这里插入图片描述
  • bcdUSB

    • 显示了设备支持的USB版本,通常是最新版本。
    • 这是一个二进制代码形式的十进制数据,采用0xAABC的形式,其中A是主版本号,B是次版本号,C是子次版本号。
    • 例如,USB2.0设备拥有0x0200值,USB1.1设备拥有0x0110值。通常,主机将使用bcdUSB以确定需要加载的USB驱动器。
  • bDeviceClassbDeviceSubClassbDeviceProtocol

    • 分别代表设备类型子类型设备使用的协议
    • USB-IF区分设备类分了三个等级(类-子类-协议码)其中,
      • 类包含人机交互类、图像类、无线类、音频类等等,
      • 子类比如音频类的音频控制、音频流等等,
      • 协议比如人机接口类中的鼠标、键盘、触摸屏等,
    • 为何会有这么多USB的Class分类,子分类,设备协议。
      我们要知道,USB协议设计的目的,就是为实现通用,用单一的USB接口取代之前种类繁多的各种其他接口。而为了取代其他各种接口,那意味着就要实现各种设备所对应的各种功能。

  • bMaxPackeSize0

    • 端点一次最大传多少个字节。
    • 根据设备,数据包的大小可以为 8 个字节、 16 个字节、 32 个字节和 64 个字节。
    • USB协议里有规定,端点0最低8字节,端点的最大传输大小和USB速度等级以及传输类型有关,控制传输一般使用端点0,低速最大8字节,全速和高速最大传输64字节:
  • idVendor

    • 代表着设备的生产商ID,由USB设备生产商向USB-IF官方来统一管理和申请。
  • idProduct

    • 代表着该生产商生产的产品编号,同一厂商下的不同idProduct代表着该公司不同的产品系列。
  • bcdDevice

    • 是一个BCD编码格式,代表着设备的出产编号,或者同一产品的版本更新迭代。
  • iManufacturer

    • 描述厂商的字符串的索引,为0则表示没有。
  • iProduct

    • 描述产品的字符串的索引,为0则表示没有。
  • iSerialNumber

    • 产品序列号字符串的索引,为0则表示没有。
  • bNumConfigurations

    • 指示设备有多少个配置,前面提到过,一个USB可能有多个配置,一般USB产品都是1个配置。

配置描述符 0x02 Configuration Descriptor

偏移字段大小
Byte
说明
0bLength1该描述符的长度 = 9 个字节
1bDescriptorType1描述符类型 = 配置(02h)
2wTotalLength2总长度包括接口和端点描述符在内
4bNumInterfaces1本配置中接口的数量
5bConfigurationValue1SET_CONFIGURATION 请求所使用的配置值,用于选择该配置
6iConfiguration1描述该配置的字符串索引
7bmAttributes1位 7:预留(设置为 1)
位 6:自供电
位 5:远程唤醒
位 4:0:保留
8bMaxPower1本配置所需的最大功耗(单位为 2 mA)
  • bLength 1字节,表示配置描述符的长度,配置描述符的长度是9字节。

  • bDescriptor 1字节,表示描述符的类型,配置描述符的类型编码为 0x02。

  • wTotalLength 2字节,是整个配置描述符集合的总长度。包括配置描述符,接口描述符,端点描述符和类特殊描述符(如果有)。

  • bNumInterfaces 1字节,则定义了在该指定配置中接口总数。最小为 1 个接口,通常功能单一的设备只有一个接口(如鼠标),而复合设备具有多个接口(如音频设备)。

  • bConfigurationValue 1字节,表示该配置的值,设置配置请求时会发送一个配置值,如果某个配置的bConfigurationValue和它相匹配,就表示该配置被激活。

  • iConfiguration 1字节,描述该配置的字符串的索引,如果该值为0,表示没有字符串来描述它。

  • bmAttributes 1字节,定义了 USB 设备的一些特性。 位7保留,必须设置为1,位6表示供电方式,设置为 0表示设备由总线供电,设置为 1 表示设备自供电。位5表示是否支持远程唤醒,设置为 1表示支持远程唤醒,设置为 0 表示不支持远程唤醒。位4~位0设置为0。

  • bMaxPower 1字节,表示设备需要从总线获取的最大电流量,以 2 mA 为单位。如需要200mA的最大电流,则该字段的值为100。

字符串描述符 0x03

偏移字段大小(字节)说明
0bLength1该描述符的长度 = 7 个字节
1bDescriptorType1描述符类型 = STRING (03h)
2..nbString 或 wLangID变化Unicode 编码字符串 或 LANGID 代码

字符串描述符是可选的,字符串描述符用于描述一些方便人们阅读的信息,比如制造商、设备名称啥的。如果一个设备没有字符串描述符,那么其他描述符中和字符串有关的索引值都必须为 0。

接口描述符 0x04 Interface Descriptor

偏移字段大小(字节)说明
0bLength1该描述符的长度 = 9 个字节
1bDescriptorType1描述符类型 = 接口(04h)
2bInterfaceNumber1该接口基于零的索引
3bAlternateSetting1备用设置值
4bNumEndpoints1该接口所使用的端点数量(不包含 EP0)
5bInterfaceClass1接口类别
6bInterfaceSubclass1接口子类别
7bInterfaceProtocol1接口协议
8iInterface1该接口字符串描述符索引
  • bLength 1字节,表示接口描述符的长度,标准的接口描述符的长度为9字节。
  • bDescriptorType 1字节,表示描述符的类型,接口描述符的类型编码为 0x04。
  • bInterfaceNumber 1字节,表示该接口的编号,如果一个配置具有多个接口,每个接口的编号都不相同,从0开始依次递增对一个配置的接口进行编号。
  • bAlternateSetting 1字节,接口的备用编号,很少用到,设置为0。
  • bNumEndpoints 1字节,表示该接口的端点数(不包括0端点)。
  • bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol 均为1字节,分别表示接口所使用的类,子类以及协议,由USB协会规定。
  • iInterface 1字节,描述该接口的字符串的索引值,如果为0,表示没有字符串。

bInterfaceClassbDeviceClass

Base ClassDescriptor UsageDescription
00hDeviceUse class information in the Interface Descriptors
01hInterfaceAudio USB音频,参见UAC规范
02hBothCommunications and CDC Control 网卡、调制解调器、串列端口
03hInterfaceHID (Human Interface Device),键盘、鼠标 参见HID规范
05hInterfacePhysical 控制杆
06hInterfaceImage 影像扫描仪、Picture Transfer Protocol
07hInterfacePrinter 打印机
08hInterfaceMass Storage U盘、移动硬盘、存储卡读卡器、数字相机
09hDeviceHub 集线器
0AhInterfaceCDC-Data 调制解调器、网络卡、ISDN、传真
0BhInterfaceSmart Card 读卡器
0DhInterfaceContent Security
0EhInterfaceVideo USB视频,UVC摄像头,参见UVC规范
0FhInterfacePersonal Healthcare
10hInterfaceAudio/Video Devices
11hDeviceBillboard Device Class
12hInterfaceUSB Type-C Bridge Class
DChBothDiagnostic Device
E0hInterfaceWireless Controller 蓝牙
EFhBothMiscellaneous
FEhInterfaceApplication Specific 红外线资料桥接器
FFhBothVendor Specific 自定义USB设备
更多信息参考 USB.org 的部分章节

端点描述符 0x05 Endpoint Descriptor

偏移字段大小
Byte
说明
0bLength1该描述符长度 = 7 个字节
1bDescriptorType1描述符类型 = 端点(05h)
2bEndpointAddress1位 3…0:端点数量
位 6…4:预留,复位为零
位 7:端点的方向。控制端点可以忽略该位。
0 = OUT 端点 (主机到设备)
1 = IN 端点 (设备到主机)
3bmAttributes1位 1…0:传输类型
00 = 控制传输
01 = 同步传输
10 = 批量传输
11 = 中断传输
如果该端点不是同步端点,那么位 5 到位 2 将被预留,必须将这些位设置为零。如果该端点是同步的,这些位将按如下内容定义:
位 3…2:同步类型
00 = 无同步
01 = 异步
10 = 自适应
11 = 同步
位 5…4:用途类型
00 = 数据端点
01 = 反馈端点
10 = 隐式反馈数据端点
数值 11 表示保留
4wMaxPacketSize1该端点的数据包最大尺寸
6bInterval1中断端点的轮询间隔,单位为 ms(对于同步端点,该间隔为 1 ms;控制或批量端点可能忽略该字段)
  • bLength 1字节,表示端点描述符的长度,标准的端点描述符的长度为7字节。
  • bDescriptorType 1字节,表示描述符的类型,端点描述符的类型编码为 0x05。
  • bEndpointAddress 1字节,表示该端点的地址和方向。
  • bmAttributes 1字节,表示该端点的属性,详细看上表。
    • Transfer Type
      • 控制CONTROL 控制端点被用来控制对 USB 设备的不同部分访问。通常用作配置设备、获取设备信息、发送命令到设备或获取设备状态报告。这些端点通常较小。每个 USB 设备都有一个控制端点称为”端点 0”, 被 USB 核心用来在插入时配置设备。USB协议保证总有足够的带宽留给控制端点传送数据到设备.
      • 中断INTERRUPT每当 USB 主机向设备请求数据时,中断端点以固定的速率传送小量的数据。此为USB 键盘和鼠标的主要的数据传送方法。它还用以传送数据到 USB 设备来控制设备。通常不用来传送大量数据。USB协议保证总有足够的带宽留给中断端点传送数据到设备.
      • 批量BULK 批量端点用以传送大量数据。这些端点常比中断端点大得多. 它们普遍用于不能有任何数据丢失的数据。USB 协议不保证传输在特定时间范围内完成。如果总线上没有足够的空间来发送整个BULK包,它被分为多个包进行传输。这些端点普遍用于打印机、USB Mass Storage和USB网络设备上。
      • 等时ISOCHRONOUS 等时端点也批量传送大量数据, 但是这个数据不被保证能送达。这些端点用在可以处理数据丢失的设备中,并且更多依赖于保持持续的数据流。如音频和视频设备等等。
      • 对比总结:控制批量端点用于异步数据传送,而中断同步端点是周期性的。这意味着这些端点被设置来在固定的时间连续传送数据,USB 核心为它们保留了相应的带宽。
  • wMaxPacketSize 2字节,表示该端点的数据包最大长度。
  • bInterval 1字节

每个端点描述符都规定了该端点所支持的最大数据包长 (wMaxPacketSize),主机每次发送数据包,都不能超过端点的最大包长,各种端点的最大包长如下表:

端点类型最大包长 (低速)最大包长 (全速)最大包长 (高)
控制端点88/16/32/6464
实时端点不支持10231024
中断端点8641024
批量端点不支持8/16/32/64512

HID

UVC

UVC,全称为:USB video(device) class,是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。


USB
https://www.oikiou.top/2023/9c721b62/
作者
Oikiou
发布于
2023年12月1日
许可协议