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.0 | 2008年11月17 | 5Gbps | SuperSpeed USB、USB 3.2 Gen 1、USB 3.1 Gen 1 |
USB3.1 | 2013年7月 | 10Gbps | SuperSpeed USB 10Gbps、USB 3.2 Gen 2、USB 3.1 Gen 2 |
USB3.2 | 2017年9月份 | 20Gbps | SuperSpeed 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 |
|
设备描述符 0x01 Device Descriptor
代码
1 |
|
bLength
- 是设备描述符的总长度,以字节为单位。
bDescriptorType
- 代表了本描述符的类型。
- 用于描述设备的描述符 是0x01。
- 其他描述符的数值及含义
bcdUSB
- 显示了设备支持的USB版本,通常是最新版本。
- 这是一个二进制代码形式的十进制数据,采用0xAABC的形式,其中A是主版本号,B是次版本号,C是子次版本号。
- 例如,USB2.0设备拥有0x0200值,USB1.1设备拥有0x0110值。通常,主机将使用bcdUSB以确定需要加载的USB驱动器。
bDeviceClass、bDeviceSubClass、bDeviceProtocol
- 分别代表设备类型,子类型,设备使用的协议
- 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 | 说明 |
---|---|---|---|
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:远程唤醒 位 4:0:保留 |
8 | bMaxPower | 1 | 本配置所需的最大功耗(单位为 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
偏移 | 字段 | 大小(字节) | 说明 |
---|---|---|---|
0 | bLength | 1 | 该描述符的长度 = 7 个字节 |
1 | bDescriptorType | 1 | 描述符类型 = STRING (03h) |
2..n | bString 或 wLangID | 变化 | Unicode 编码字符串 或 LANGID 代码 |
字符串描述符是可选的,字符串描述符用于描述一些方便人们阅读的信息,比如制造商、设备名称啥的。如果一个设备没有字符串描述符,那么其他描述符中和字符串有关的索引值都必须为 0。
接口描述符 0x04 Interface Descriptor
偏移 | 字段 | 大小(字节) | 说明 |
---|---|---|---|
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 | 该接口字符串描述符索引 |
- bLength 1字节,表示接口描述符的长度,标准的接口描述符的长度为9字节。
- bDescriptorType 1字节,表示描述符的类型,接口描述符的类型编码为 0x04。
- bInterfaceNumber 1字节,表示该接口的编号,如果一个配置具有多个接口,每个接口的编号都不相同,从0开始依次递增对一个配置的接口进行编号。
- bAlternateSetting 1字节,接口的备用编号,很少用到,设置为0。
- bNumEndpoints 1字节,表示该接口的端点数(不包括0端点)。
- bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol 均为1字节,分别表示接口所使用的类,子类以及协议,由USB协会规定。
- iInterface 1字节,描述该接口的字符串的索引值,如果为0,表示没有字符串。
bInterfaceClass、bDeviceClass:
Base Class | Descriptor Usage | Description |
---|---|---|
00h | Device | Use class information in the Interface Descriptors |
01h | Interface | Audio USB音频,参见UAC规范 |
02h | Both | Communications and CDC Control 网卡、调制解调器、串列端口 |
03h | Interface | HID (Human Interface Device),键盘、鼠标 参见HID规范 |
05h | Interface | Physical 控制杆 |
06h | Interface | Image 影像扫描仪、Picture Transfer Protocol |
07h | Interface | Printer 打印机 |
08h | Interface | Mass Storage U盘、移动硬盘、存储卡读卡器、数字相机 |
09h | Device | Hub 集线器 |
0Ah | Interface | CDC-Data 调制解调器、网络卡、ISDN、传真 |
0Bh | Interface | Smart Card 读卡器 |
0Dh | Interface | Content Security |
0Eh | Interface | Video USB视频,UVC摄像头,参见UVC规范 |
0Fh | Interface | Personal Healthcare |
10h | Interface | Audio/Video Devices |
11h | Device | Billboard Device Class |
12h | Interface | USB Type-C Bridge Class |
DCh | Both | Diagnostic Device |
E0h | Interface | Wireless Controller 蓝牙 |
EFh | Both | Miscellaneous |
FEh | Interface | Application Specific 红外线资料桥接器 |
FFh | Both | Vendor Specific 自定义USB设备 |
更多信息参考 USB.org 的部分章节 |
端点描述符 0x05 Endpoint Descriptor
偏移 | 字段 | 大小 Byte | 说明 |
---|---|---|---|
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;控制或批量端点可能忽略该字段) |
- 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 核心为它们保留了相应的带宽。
- Transfer Type
- wMaxPacketSize 2字节,表示该端点的数据包最大长度。
- bInterval 1字节
每个端点描述符都规定了该端点所支持的最大数据包长 (wMaxPacketSize),主机每次发送数据包,都不能超过端点的最大包长,各种端点的最大包长如下表:
端点类型 | 最大包长 (低速) | 最大包长 (全速) | 最大包长 (高) |
---|---|---|---|
控制端点 | 8 | 8/16/32/64 | 64 |
实时端点 | 不支持 | 1023 | 1024 |
中断端点 | 8 | 64 | 1024 |
批量端点 | 不支持 | 8/16/32/64 | 512 |
HID
UVC
UVC,全称为:USB video(device) class,是微软与另外几家设备厂商联合推出的为USB视频捕获设备定义的协议标准,目前已成为USB org标准之一。