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对差分线

../../../_images/usb_history.jpg

7.12.1.1.1. USB 1.0/2.0

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

../../../_images/usb_port_12_pin.png

使用 Type AType B 型的接口:

../../../_images/usb_port_12.png

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

../../../_images/usb_port_12_all.jpg

7.12.1.1.2. USB 3.0

在 USB 3.0 时代从两个方向来增加速度:

  • 增加传输的时钟速率。速率从 480M 增加到了 5G,高速信号会给 PCB 走线、EMC、线缆带来不小的压力。

  • 增加差分数据通路的数量。首先发明了改进型的 USB3.0 Type A 接口,在原有 4 线的基础上再增加了 5 条线:

../../../_images/usb_port_3_pin.jpg

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

../../../_images/usb_port_3.png

上图是 USB3.0 Type A 接口示意图,注意新增的 5条线已断针的形式隐藏在后面,这样的设计是为了和 USB 2.0 兼容。但是颜色改成了蓝色,以示区别。

在 USB 3.0 还出现了一种全新的接口类型 Type C 接口,它带来了以下好处:

  • 接口线数量猛增到了 24 线,其中数据通路在 D+/D- 之外再提供了 4 条差分数据线。

  • 实现了正反面任意插拔,大大方便了用户使用。

../../../_images/usb_poert_typec.png

小技巧

从 USB 3.2 开始,因为它需要使用 4 对数据差分线,所以目前唯一支持的只有 Type C 接口。

7.12.1.2. 总线拓扑

USB 是 星型 拓扑总线,由 Hub 来进行多级扩展。最大的层级不能超过 7 层,在任何一条路径上不能超过 5 个非根 Hub。

../../../_images/usb_bus_topo.png

USB 总线由 3 种角色组成:

  • Host,星型总线的中心,配置所有 Hub 和 Device,调度总线上所有的数据收发。

  • Hub,提供了扩展端口,能连接更多的 Device。Hub 本身也是一种特殊的 Device。

  • Device,提供了实际的设备功能

../../../_images/usb_bus_topo_star.png

经过几种角色的组合以后,USB 总线形成了逻辑上的星型拓扑,Host 到任一 Device 都是点对点传输。

7.12.1.2.1. Device 内部的逻辑关系

USB 将 Device 内部的资源进一步细分成了3个层级: Configuration 配置、 Interface 接口、 Endpoint 端点。

../../../_images/usb_device_struct.png
  • Configuration 配置

每个 USB 设备都可以包含一个或者多个配置,不同的配置使设备表现出不同的功能组合,配置有多个接口组成。在 USB 协议中,接口由多个端点组成,代表一个基本的功能。 看下面的一个例子。一个 USB 播放器带有音频视频功能,还有旋钮和按钮。那么这个 Device 设备 可以提供 3 种 Configuration 配置:

配置1:音须(接口) + 旅钮(接口)
配置2: 音频(接口) + 视频(接口) + 按钮(接口)
配置3:视频(接口) + 旋钮(接口)
  • Interface 接口 / Function 功能

Interface 接口代表一个独立的基本的功能,所以有时也称之为 Function 功能。如果我们开发 USB Client 驱动,我们面向的对象就是 USB Interface ,上述实例中的音烦接口、视频接口、投钮接口、旋钮接口均需要一个独立的 USB Client 驱动程序。

../../../_images/usb_csw_func.png

一个 Interface 接口中包含了完成这个基本功能的所需要的一个或者多个 Endpoint 端点。

  • Endpoint 端点 ( Pipe 管道)

端点是 USB 设备中最基本的可寻址单位,它是位于 USB 设备或主机上的一个数据缓冲区,用来存放和发送 USB 的各种数据。

设备的 Endpoint 0 是一个特殊端点,在设备初始化时系统需要使用该端点读配置设备。其他编号的端点 USB Client 驱动都可以使用。

一个 Host 主机和一个设备 Device 的端点建立的连接称之为 Pipe 管道:

../../../_images/usb_endpoint.png

7.12.1.2.2. Compound / Composite Device

../../../_images/usb_compound.png

在 USB 协议描述中,有两个非常相近的名字: Compund DeviceComposite Device 。正确的理解的它们有助于我们理解清楚随后的一些概念。

  • Compund Device 。指的是一个 Hub 设备中,还包含了其他的功能 Device

  • Composite Device 。指的是一个 Device 当中,包含了多个 Interface ,能提供多个独立的功能。

7.12.1.2.3. Hub

../../../_images/usb_hub1.png

在 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 设备,在 DeviceConfigurationInterfaceEndpoint 每个层次上都有对应的描述信息。可以使用 Endpoint0 在设备初始化的时候读出和配置这些信息。

../../../_images/usb_device_config.png

最重要的是设备在初始化时,通过这些信息来进行枚举配置的过程。一个设备枚举的过程分为如下 8 步:

  1. 获取设备描述符
    • Host/Hub 通过数据线上拉电阻的阻值变化检测到新设备接入。Host 等待 100ms 以保证设备电源稳定。

    • Host 向 Device 发 Bus Reset 使得设备进入 default 状态,从此之后,设备可以响应默认地址 0。

    • Host 请求 Device 发送 Device Descriptor 的前 64 个字节。

  2. 复位
    • Host 在收到 Device Descritptor 的前 8 个字节后,再次向 Device 发出 Bus Reset。

  3. 设置地址
    • Host 发送一个 Set Address 命令给 Deivce,从此 Device 有个通信地址,不再使用默认地址 0 进行通信。

  4. 再次获取设备描述符
    • Host 请求获取完整的 Device Descritpor, 总计 18 字节。

  5. 获取配置描述符
    • Host 请求获取 9 个字节的 Configuration Descriptor 以了解 Configuration escriptor的总大小。

    • Host 请求 255 字节的 Configuration Descritpor。

  6. 获取接口,端点描述符

  7. 获取字符串描述符

  8. 选择设备配置

7.12.1.2.5. 通讯模型

USB 的主要作用就是建立起 Host 和 Device 之间的通讯。

  • 简要的通讯模型:

../../../_images/usb_flow_abstract.png
  • 详细的通讯模型:

../../../_images/usb_flow_detail1.png

7.12.1.3. 参考资料

  1. USB 2.0 Specification

  2. USB中文网

  3. USB协通讯议–深入理解