Skip to content

USB ​

Universal Serial Bus (USB) 是一种广泛使用的串行通信协议,用于连接计算机与各种外设设备。USB 最初由 Intel、Compaq、Microsoft 等公司联合开发,旨在简化外设连接,提供热插拔和即插即用功能。USB 经历了多次技术演进,从 USB 1.0 的低速传输发展到 USB4 的高速传输,应用范围从键盘鼠标扩展到高速存储、视频传输、以太网等领域。

USB 拓扑结构 ​

USB 采用树形拓扑结构,主机通过根集线器 (Root Hub) 连接多个 USB 设备和下游集线器。每个 USB 系统只有一个主机,最多支持 127 个设备 (地址 0 用于枚举,地址 1-127 用于设备)。USB 使用 7 位地址寻址,通过集线器的级联扩展端口数量。

USB 的物理连接通过四根线实现:VBUS (5V 电源)、D+ (数据正)、D- (数据负)、GND (地)。USB 2.0 增加了屏蔽层,USB 3.0 及以后增加了更多信号线用于高速传输。USB 设备可以从总线取电,低功耗设备直接从 USB 端口获取电源,高功耗设备可能需要外部供电。

USB 协议层次 ​

USB 协议分为四个层次:物理层、链路层、协议层和应用层。物理层定义了信号的电气特性和传输机制,链路层负责数据包的格式和传输,协议层定义了请求和响应的格式,应用层则是具体设备类的行为规范。

USB 传输的基本单元是"事务" (Transaction),一个事务包含令牌包、数据包和握手包。令牌包指定事务的类型 (IN/OUT/SETUP) 和目标设备的地址及端点号,数据包承载实际数据,握手包表示传输的确认状态 (ACK/NAK/STALL)。

USB 支持四种传输类型,每种类型针对不同的应用场景优化。控制传输用于设备枚举和配置,保证可靠传输但带宽较低。中断传输用于低延迟、低频率的数据传输,如鼠标键盘。批量传输用于大块数据传输,如 U 盘文件传输,不保证带宽但保证可靠性。同步传输用于实时数据流,如音频视频,保证带宽但不保证可靠性。

USB 版本演进 ​

USB 1.0 (1996) 提供 Low Speed (1.5Mbps) 和 Full Speed (12Mbps) 两种速度,适合低速设备如键盘鼠标。USB 2.0 (2000) 引入 High Speed (480Mbps),大幅提升传输速率,支持高速存储设备和视频设备。USB 3.0 (2008) 改名为 USB 3.1 Gen 1,提供 SuperSpeed (5Gbps),增加了更多信号线,实现了全双工传输。

USB 3.1 Gen 2 (2013) 将速度提升到 10Gbps,USB 3.2 (2017) 通过双通道技术实现 20Gbps。USB4 (2019) 基于 Thunderbolt 3 协议,实现 40Gbps 的传输速率,支持多种协议复用和隧道传输。USB4 v2.0 (2022) 进一步提升到 80Gbps。

从工程角度看,USB 的速度提升伴随着物理层的重大变化。USB 1.x/2.0 使用单端信号,通过 D+ 和 D- 的差值表示 0 和 1。USB 3.x 开始使用差分信号,增加了超高速 (SuperSpeed) 信号对,实现了更高的带宽和抗干扰能力。

USB vs PCI ​

USB 和 PCI 都是用于连接外部设备的总线,但它们的设计哲学和应用场景有显著差异。PCI (及其继任者 PCIe) 是计算机内部的高速总线,用于连接显卡、网卡、存储控制器等高性能设备。USB 是面向外设的通用总线,强调易用性和灵活性。

从架构来看,PCI 采用树形拓扑,根复合体 (Root Complex) 连接多个交换设备 (Switch) 和端点设备 (Endpoint)。PCIe 是点对点全双工串行互联,每个通道 (Lane) 独立工作。USB 也是树形拓扑,但通过集线器 (Hub) 扩展,所有设备共享主机的带宽池。

PCIe 设备通过内存映射 I/O (MMIO) 或直接内存访问 (DMA) 直接访问系统内存,延迟低、带宽高。USB 设备通过 USB 控制器与主机通信,数据需要经过 USB 协议栈的处理,延迟较高但接口统一。

从资源管理来看,PCI 设备在枚举时由 BIOS/UEFI 或操作系统分配中断号、MMIO 地址空间、DMA 通道等资源。USB 设备由主机统一管理带宽和电源,设备只需实现标准的 USB 协议,无需关心资源分配细节。

USB 设备类 ​

USB 定义了标准化的设备类规范,使得同类设备可以使用通用驱动。常见设备类包括 Mass Storage (大容量存储)、CDC (通信设备类)、HID (人机接口设备)、Audio (音频设备)、Video (视频设备)、Smart Card (智能卡) 等。

HID 类是最简单的 USB 设备类之一,用于键盘鼠标游戏手柄等输入设备。HID 设备通过报告描述符 (Report Descriptor) 声明数据格式,主机端可以使用通用 HID 驱动,无需为每个设备开发专用驱动。

Mass Storage 类实现了 SCSI 命令集的 USB 传输,使得 U 盘、移动硬盘、读卡器等设备可以使用通用驱动。现代操作系统对 Mass Storage 设备有内置支持,插入即可使用,体现了 USB 即插即用的设计目标。

Linux 的 USB 支持 ​

Linux 内核提供了完整的 USB 子系统,包括 USB 主机控制器驱动 (OHCI、UHCI、EHCI、xHCI)、USB 设备驱动框架和 USB 核心协议栈。Linux 的 USB 设备驱动通过 usb_driver 接口注册,支持热插拔和动态加载。

Linux 提供了丰富的 USB 调试工具,如 lsusb 列出 USB 设备,usbmon 捕获 USB 总线流量,usb-devices 显示详细的 USB 设备树信息。这些工具对开发和调试 USB 相关问题非常有用。

在嵌入式开发中,USB 设备模式 (Device Mode) 和 OTG (On-The-Go) 模式也很重要。USB 设备模式允许嵌入式系统作为 USB 外设连接到 PC,用于模拟串口、网络适配器、大容量存储等。OTG 模式允许设备动态切换主机和外设角色,实现两个 USB 设备的直接通信。