7.12.1. USB简介
7.12.1.1. USB发展历史
USB(Universal Serial Bus)通用串行总线是非常成功的一种总线技术,应用场景很广、发展也非常迅速。到现在一共经历了以下版本:
Version |
App |
Speed |
Direction |
Data Line |
---|---|---|---|---|
USB 1.0 |
低速 Low Speed |
1.5Mbps |
Half 半双工模式 |
1对差分线 D+/D1 |
USB 1.1 |
全速 Full Speed |
12Mbps |
Half 半双工模式 |
1对差分线 D+/D1 |
USB 2.0 |
高速 Hi-Speed |
480Mbps |
Half 半双工模式 |
1对差分线 D+/D1 |
USB 3.1 Gen1 |
超高速 SuperSpeed |
5Gbps |
Full 双工模式 |
2对差分线 |
USB 3.1 Gen2 |
超高速 SuperSpeed+ |
10Gbps |
Full 双工模式 |
2对差分线 |
USB 3.2 |
超高速 SuperSpeed+ |
20Gbps |
Full 双工模式 |
4对差分线 |
USB 4.0 |
超高速 SuperSpeed+ |
40Gbps |
Full 双工模式 |
4对差分线 |

7.12.1.1.1. USB 1.0/2.0
在 USB 1.0/2.0 时期只需要用到 4 根线:1 根电源线、1 根地线、1 对差分数据线。因为只有 1 条数据通路,所以只能是半双工的,同一时间只能是接收或者发送数据。

使用 Type A
和 Type B
型的接口:

还有一系列小尺寸的变种:

7.12.1.1.2. USB 3.0
在 USB 3.0 时代从两个方向来增加速度:
增加传输的时钟速率。速率从 480M 增加到了 5G,高速信号会给 PCB 走线、EMC、线缆带来不小的压力。
增加差分数据通路的数量。首先发明了改进型的 USB3.0 Type A 接口,在原有 4 线的基础上再增加了 5 条线:

可以看到增加的5条线分别为 1 条地线和 2 对差分数据线。因为有了 2 条数据通路,所以可以双工,同一时间能同时接收和发送数据。在工作在 USB 3.0 模式时,原来的 D+/D- 差分线是不使用的。

上图是 USB3.0 Type A
接口示意图,注意新增的 5条线已断针的形式隐藏在后面,这样的设计是为了和 USB 2.0 兼容。但是颜色改成了蓝色,以示区别。
在 USB 3.0 还出现了一种全新的接口类型 Type C
接口,它带来了以下好处:
接口线数量猛增到了 24 线,其中数据通路在
D+/D-
之外再提供了 4 条差分数据线。实现了正反面任意插拔,大大方便了用户使用。

小技巧
从 USB 3.2 开始,因为它需要使用 4 对数据差分线,所以目前唯一支持的只有 Type C
接口。
7.12.1.2. 总线拓扑
USB 是 星型
拓扑总线,由 Hub 来进行多级扩展。最大的层级不能超过 7 层,在任何一条路径上不能超过 5 个非根 Hub。

USB 总线由 3 种角色组成:
Host
,星型总线的中心,配置所有 Hub 和 Device,调度总线上所有的数据收发。Hub
,提供了扩展端口,能连接更多的 Device。Hub 本身也是一种特殊的 Device。Device
,提供了实际的设备功能

经过几种角色的组合以后,USB 总线形成了逻辑上的星型拓扑,Host 到任一 Device 都是点对点传输。
7.12.1.2.1. Device 内部的逻辑关系
USB 将 Device
内部的资源进一步细分成了3个层级: Configuration
配置、 Interface
接口、 Endpoint
端点。

Configuration
配置
每个 USB 设备都可以包含一个或者多个配置,不同的配置使设备表现出不同的功能组合,配置有多个接口组成。在 USB 协议中,接口由多个端点组成,代表一个基本的功能。
看下面的一个例子。一个 USB 播放器带有音频视频功能,还有旋钮和按钮。那么这个 Device
设备 可以提供 3 种 Configuration
配置:
配置1:音须(接口) + 旅钮(接口)
配置2: 音频(接口) + 视频(接口) + 按钮(接口)
配置3:视频(接口) + 旋钮(接口)
Interface
接口 /Function
功能
Interface 接口代表一个独立的基本的功能,所以有时也称之为 Function
功能。如果我们开发 USB Client
驱动,我们面向的对象就是 USB Interface
,上述实例中的音烦接口、视频接口、投钮接口、旋钮接口均需要一个独立的 USB Client
驱动程序。

一个 Interface
接口中包含了完成这个基本功能的所需要的一个或者多个 Endpoint
端点。
Endpoint
端点 (Pipe
管道)
端点是 USB 设备中最基本的可寻址单位,它是位于 USB 设备或主机上的一个数据缓冲区,用来存放和发送 USB 的各种数据。
设备的 Endpoint 0
是一个特殊端点,在设备初始化时系统需要使用该端点读配置设备。其他编号的端点 USB Client
驱动都可以使用。
一个 Host
主机和一个设备 Device
的端点建立的连接称之为 Pipe 管道:

7.12.1.2.2. Compound / Composite Device

在 USB 协议描述中,有两个非常相近的名字: Compund Device
和 Composite Device
。正确的理解的它们有助于我们理解清楚随后的一些概念。
Compund Device
。指的是一个 Hub 设备中,还包含了其他的功能Device
。Composite Device
。指的是一个Device
当中,包含了多个Interface
,能提供多个独立的功能。
7.12.1.2.3. Hub

在 USB 的总线结构中,Hub 是一个重要的组成成员,它主要的作用是控制 Port 端口来连接更多的 USB Device 设备。
它的核心点如下:
USB Host 需要给总线上的设备分配不同的地址才不会冲突,USB 的星形拓扑连接设备都是通过 Hub 的端口连结到总线上的。
总线初始化枚举设备时,USB 设备的地址都是默认地址 0,但是 Hub 的端口都是关闭的所以并不产生设备冲突,Host 逐个打开 Hub 的端口,逐个利用打开端口上设备的默认地址 0 来配置设备,给其分配新的地址,从 Endpoint 0 中读出设备的配置并设置。在运行过程中 USB 设备的热插拔也是和这类似的。
7.12.1.2.4. Configure Descriptor
对于一个 USB 设备,在 Device
、Configuration
、Interface
、Endpoint
每个层次上都有对应的描述信息。可以使用 Endpoint0 在设备初始化的时候读出和配置这些信息。

最重要的是设备在初始化时,通过这些信息来进行枚举配置的过程。一个设备枚举的过程分为如下 8 步:
- 获取设备描述符
Host/Hub 通过数据线上拉电阻的阻值变化检测到新设备接入。Host 等待 100ms 以保证设备电源稳定。
Host 向 Device 发 Bus Reset 使得设备进入 default 状态,从此之后,设备可以响应默认地址 0。
Host 请求 Device 发送 Device Descriptor 的前 64 个字节。
- 复位
Host 在收到 Device Descritptor 的前 8 个字节后,再次向 Device 发出 Bus Reset。
- 设置地址
Host 发送一个 Set Address 命令给 Deivce,从此 Device 有个通信地址,不再使用默认地址 0 进行通信。
- 再次获取设备描述符
Host 请求获取完整的 Device Descritpor, 总计 18 字节。
- 获取配置描述符
Host 请求获取 9 个字节的 Configuration Descriptor 以了解 Configuration escriptor的总大小。
Host 请求 255 字节的 Configuration Descritpor。
获取接口,端点描述符
获取字符串描述符
选择设备配置
7.12.1.2.5. 通讯模型
USB 的主要作用就是建立起 Host 和 Device 之间的通讯。
简要的通讯模型:

详细的通讯模型:
