2. USB硬件接口与电气特性
在嵌入式 Linux USB Host 驱动开发中,理解 USB 的硬件接口与电气特性是进行正确驱动移植与适配的基础。本章将深入剖析 USB 2.0 与 USB 3.0 在物理层上的核心差异,详细解读 D+/D- 差分信号线的工作原理,明确 VBUS 供电规范,并阐述 OTG 与 ID 检测机制。这些知识将直接指导你在硬件原理图设计、驱动初始化配置以及电源管理策略中的决策。
2.1 USB 2.0 与 USB 3.0 物理层差异
USB 2.0 与 USB 3.0 在物理层设计上存在根本性区别,主要体现在信号线数量、编码方式、传输方向和拓扑结构上。USB 3.0 引入了全新的 SuperSpeed 物理层,与 USB 2.0 的物理层完全独立,实现了向后兼容。
下表详细对比了 USB 2.0 与 USB 3.0 在物理层的关键参数:
| 特性 | USB 2.0 (High-Speed) | USB 3.0 (SuperSpeed) |
|---|---|---|
| 信号线数量 | 4 根 (VBUS, D+, D-, GND) | 9 根 (VBUS, D+, D-, GND, SSTX+, SSTX-, SSRX+, SSRX-, GND_DRAIN) |
| 数据传输方向 | 半双工 (Half-Duplex) | 全双工 (Full-Duplex) |
| 差分信号对 | 1 对 (D+/D-) | 2 对 (SSTX+/SSTX- 发送, SSRX+/SSRX- 接收) |
| 编码方式 | NRZI (Non-Return-to-Zero Inverted) + 位填充 | 8b/10b 编码 |
| 信号电压摆幅 | 400 mV (差分) | 800-1200 mV (差分) |
| 终端阻抗 | 45 Ω (每根线对地) | 100 Ω (差分对之间) |
| 拓扑结构 | 共享总线 (Shared Bus) | 点对点 (Point-to-Point) |
| 数据传输速率 | 480 Mbps | 5 Gbps |
下图展示了 USB 2.0 与 USB 3.0 在物理连接上的结构差异:
2.2 D+/D- 信号线详解
D+ 和 D- 是 USB 2.0 总线中唯一的数据传输通道,它们构成一对差分信号线。差分信号传输具有抗共模干扰能力强、电磁辐射低等优点,是高速数据传输的基础。
2.2.1 信号电平与状态
D+ 和 D- 上的电压差决定了总线状态。在高速模式下,信号摆幅约为 400 mV。总线状态包括:
- J 状态 (Idle): D+ 为高电平,D- 为低电平。
- K 状态 (Sync): D+ 为低电平,D- 为高电平。
- SE0 (Single-Ended Zero): D+ 和 D- 均为低电平,用于复位和断开检测。
2.2.2 设备速度检测
在 USB 2.0 系统中,Host 通过检测 D+ 或 D- 线上的上拉电阻来判断设备速度:
- 低速设备 (1.5 Mbps): 在 D- 线上接 1.5 kΩ 上拉电阻。
- 全速/高速设备 (12/480 Mbps): 在 D+ 线上接 1.5 kΩ 上拉电阻。
下图展示了设备插入时 Host 检测速度的流程:
2.3 VBUS 供电规范
VBUS 是 USB 总线中的电源线,负责为连接的设备供电。嵌入式系统设计时,必须严格遵循 VBUS 的电压和电流规范,否则可能导致 Host 控制器损坏或设备无法识别。
| USB 版本 | VBUS 电压 (V) | 最大供电电流 (mA) | 说明 |
|---|---|---|---|
| USB 2.0 | 4.75 ~ 5.25 | 500 (低/全/高速) | 标准下行端口 (SDP) |
| USB 3.0 | 4.75 ~ 5.25 | 900 (SuperSpeed) | 标准下行端口 (SDP) |
| USB BC 1.2 | 4.75 ~ 5.25 | 1500 (充电下行端口) | 专用充电端口 (DCP) |
2.4 OTG 与 ID 检测
USB On-The-Go (OTG) 规范允许设备在 Host 和 Peripheral 角色之间动态切换。ID 引脚是 OTG 功能的核心硬件信号,用于识别设备应扮演的角色。
2.4.1 ID 引脚电平与角色
- ID 接地 (ID_GND): 设备作为 A-Device (默认 Host),负责提供 VBUS 电源。
- ID 悬空 (ID_FLOAT): 设备作为 B-Device (默认 Peripheral),从 VBUS 取电。
2.4.2 驱动中的 ID 检测处理
在嵌入式 Linux 中,OTG 驱动通过 GPIO 中断或 ADC 采样来检测 ID 引脚状态。检测到 ID 变化后,驱动需要执行以下操作:
- 角色切换: 调用
usb_add_hcd()或usb_remove_hcd()来注册或注销 Host 控制器。 - 电源管理: 切换 VBUS 的供电方向(输出或输入)。
- 通知上层: 通过
extcon或usb_role_switch框架通知 USB 核心层角色变更。
usb_otg: usb@xxx {
compatible = "vendor,usb-otg";
id-gpios = &gpio1 0 GPIO_ACTIVE_LOW;
vbus-supply = <&vbus_regulator>;
dr_mode = "otg"; // 支持 OTG 模式
};
下图展示了 OTG 设备角色切换的硬件连接与检测逻辑:
2.5 嵌入式驱动适配要点总结
在进行 USB Host 驱动移植时,硬件接口与电气特性相关的适配工作主要集中在以下几个方面:
- 原理图核对: 确认 D+/D- 走线阻抗匹配,VBUS 供电能力满足设备需求,ID 引脚连接正确。
- 设备树配置: 正确配置 VBUS 使能 GPIO、ID 检测 GPIO、过流检测 GPIO 以及电源管理 IC 的 I2C 地址。
- 驱动初始化: 在 Host 控制器驱动的
probe()函数中,初始化 VBUS 电源、注册 ID 检测中断、设置默认角色。 - 电源管理: 实现 VBUS 的使能/禁能函数,处理过流中断,并在系统挂起时正确管理 VBUS 状态。