2、RK平台USB硬件架构:RK3588/RK3568 USB控制器框图、PHY与Controller的关系、DP/DM信号完整性基础

好,咱们进入第二章。这一章我打算把RK3588和RK3568的USB硬件架构掰开揉碎了讲清楚。很多做驱动的兄弟,上来就啃datasheet,结果被一堆USB_GRF、GRF、PMUGRF、CRU给绕晕了。其实没那么复杂,你只要搞明白三件事:控制器在哪、PHY怎么连、信号怎么走,剩下的都是寄存器配置。

2.1 RK3588/RK3568 USB控制器整体框图

先看整体。RK3588和RK3568的USB控制器布局,说白了就是“多路复用 + 类型混搭”。RK3588有3个USB 3.0控制器(其中两个还带DP组合),外加3个USB 2.0 OTG控制器。RK3568则精简一些,2个USB 3.0 + 2个USB 2.0 OTG。

我个人习惯,拿到一块新板子,第一件事不是看原理图,而是先看芯片的Top Level Block Diagram。你想想看,如果连控制器挂在哪个总线上、中断号怎么分配都不清楚,后面调试DMA报错的时候,你连问题在哪一级都定位不了。

核心要点: RK3588的USB 3.0控制器0和1是Type-C + DP组合,控制器2是纯USB 3.0 Host。RK3568的USB 3.0控制器0是OTG,控制器1是Host。这个差异决定了你的硬件设计选型。

下面这张图是我根据RK官方TRM整理出来的,把控制器、PHY、以及关键的时钟/复位路径画在了一起。嗯,这里要注意,图中的箭头方向代表数据流,不是控制流。

RK3588 USB 控制器与 PHY 架构框图 系统总线(AXI/AHB) USB3.0 Ctrl 0 (OTG + DP) USB3.0 Ctrl 1 (OTG + DP) USB3.0 Ctrl 2 (Host Only) USB2.0 OTG 0 USB2.0 OTG 1 USB2.0 OTG 2 Combined PHY (USB3 + DP) / USB2 PHY Type-C 0 Type-C 1 USB-A 2 说明:USB3.0 Ctrl 0/1 内部集成 DP 控制器,通过 Combined PHY 复用 Type-C 的 4 对高速差分线。 USB2.0 OTG 控制器独立,负责 D+/D- 信号,与 USB3.0 控制器共享同一物理端口。

2.2 PHY与Controller的关系

很多新人搞不清PHY和Controller到底谁管谁。我打个比方:Controller是大脑,PHY是嘴巴和耳朵。Controller负责协议解析、数据打包、DMA传输;PHY负责把数字信号变成模拟信号,怼到线上去。

在RK平台上,PHY和Controller的绑定关系是固定但可配置的。什么意思?

  • USB 3.0 Controller 必须搭配 USB3 PHY(也叫Combined PHY,因为它还管DP)。
  • USB 2.0 Controller 必须搭配 USB2 PHY(就是那个只有D+/D-的)。
  • 但同一个物理端口(比如Type-C 0),它的USB 3.0 Controller和USB 2.0 Controller是两个独立的IP,通过PHY层面的MUX合并到一根线上。
调试技巧: 如果你发现USB 3.0设备只能跑在2.0模式,别急着怀疑PHY。先查一下USB 3.0 Controller的LFPS(Low Frequency Periodic Signaling)有没有正常发出。我遇到过好几次,都是因为PHY的PLL没锁住,导致Controller根本检测不到3.0的握手信号。

RK3588的Combined PHY是个大坑,我简单说一下它的内部结构:

PHY 组件 功能 与Controller的关系
PLL(锁相环) 产生 5GHz / 2.5GHz 时钟 由CRU配置,Controller通过GRF读取锁定状态
Tx/Rx 模拟前端 信号驱动与接收均衡 Controller控制其阻抗校准(ZQ Calibration)
DP 辅助通道 处理 DisplayPort 的 AUX 信号 与USB 3.0 Controller共享同一组差分线,通过MUX切换
Type-C CC 逻辑 检测插入方向、协商电流 通过GPIO/PMIC中断通知Controller

这里有个关键点:PHY的初始化顺序。我曾经在调试一个RK3568的项目时,发现USB 3.0枚举总是失败。折腾了两天,最后发现是PHY的复位时序不对——Controller已经发起了连接,但PHY的PLL还没稳定。正确的顺序应该是:

  1. CRU给PHY提供参考时钟(一般是24MHz或25MHz)。
  2. PHY完成PLL锁定,状态寄存器置位。
  3. Controller读取PHY状态,确认就绪。
  4. Controller发起LFPS握手。
避坑指南: 千万不要在PHY的PLL还没锁定时就去操作Controller的寄存器。我曾经在RK3588的板子上这么干过,结果Controller直接挂死,必须复位整个USB模块才能恢复。正确的做法是在驱动probe时,先等PHY的pll_lock信号拉高。

2.3 DP/DM信号完整性基础

好了,到了最接地气的部分。DP和DM,就是USB 2.0那两根差分线。很多驱动工程师觉得信号完整性是硬件的事,跟我没关系。我告诉你,大错特错。驱动里配错的终端电阻、选错的摆幅、甚至PHY的均衡器设置,都能让眼图闭合。

先看一个最基本的USB 2.0信号模型:

USB 2.0 DP/DM 信号路径与关键节点 USB 2.0 Ctrl USB2 PHY USB 连接器 DP DM 关键信号完整性节点: ① PHY 输出端:驱动摆幅(通常 400mV ±10%) ② PCB 走线:差分阻抗 90Ω ±15% ③ 连接器端:ESD 保护器件寄生电容(应 < 0.8pF) ④ 线缆:衰减与串扰

在驱动层面,你能直接影响的参数主要有这几个:

  • 驱动强度(Drive Strength):控制PHY输出级的电流。调大了信号过冲,调小了眼图张不开。RK平台一般在PHY的寄存器里有个 usb2phy_tune 节点,可以动态调整。
  • 预加重(Pre-emphasis):补偿高频损耗。如果你的板子走线比较长(超过10cm),建议开启。
  • 接收均衡(Rx Equalization):PHY接收端对衰减信号的补偿。RK3588的USB2 PHY支持CTLE(连续时间线性均衡器),可以在驱动里配。
实战经验: 我在调试一款RK3568的平板时,USB 2.0设备插上后经常断连。用示波器抓DP/DM波形,发现信号幅度只有280mV,远低于规范要求的400mV。最后在设备树里把 rockchip,usb2phy-tuning 的 drive_level 从默认的4改成了7,问题解决。说白了,就是PHY的驱动能力没喂饱。

还有一个容易被忽略的点:ESD器件的寄生电容。很多硬件工程师为了省钱,用了电容大于1pF的ESD管。结果USB 2.0高速信号(480Mbps)直接被电容滤成圆头圆脑的,眼图完全闭合。我建议你在驱动调试阶段,先让硬件确认一下ESD器件的型号和寄生参数。

最后,给一张我常用的信号完整性排查清单:

检查项 驱动可调? 典型问题
DP/DM 差分阻抗 否(硬件决定) 阻抗不连续导致反射,眼图有“鬼影”
PHY 驱动强度 是(设备树/寄存器) 幅度过低,接收端无法正确采样
预加重/去加重 是(PHY寄存器) 长走线时高频分量衰减严重
ESD 寄生电容 否(硬件选型) 电容过大,信号上升沿变缓
PHY 参考时钟抖动 部分可调(CRU) 时钟抖动导致数据采样错误
PCB 走线等长 否(硬件决定) DP/DM不等长,引入共模噪声

嗯,这一章的内容差不多就这些。硬件架构是基础,PHY和Controller的关系是核心,信号完整性是实战。后面我们讲驱动代码的时候,你会反复用到这些知识。记住一句话:不懂硬件架构的驱动工程师,迟早要踩坑。