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 设备的直接通信。