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报错的时候,你连问题在哪一级都定位不了。
下面这张图是我根据RK官方TRM整理出来的,把控制器、PHY、以及关键的时钟/复位路径画在了一起。嗯,这里要注意,图中的箭头方向代表数据流,不是控制流。
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合并到一根线上。
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还没稳定。正确的顺序应该是:
- CRU给PHY提供参考时钟(一般是24MHz或25MHz)。
- PHY完成PLL锁定,状态寄存器置位。
- Controller读取PHY状态,确认就绪。
- Controller发起LFPS握手。
pll_lock信号拉高。
2.3 DP/DM信号完整性基础
好了,到了最接地气的部分。DP和DM,就是USB 2.0那两根差分线。很多驱动工程师觉得信号完整性是硬件的事,跟我没关系。我告诉你,大错特错。驱动里配错的终端电阻、选错的摆幅、甚至PHY的均衡器设置,都能让眼图闭合。
先看一个最基本的USB 2.0信号模型:
在驱动层面,你能直接影响的参数主要有这几个:
- 驱动强度(Drive Strength):控制PHY输出级的电流。调大了信号过冲,调小了眼图张不开。RK平台一般在PHY的寄存器里有个
usb2phy_tune节点,可以动态调整。 - 预加重(Pre-emphasis):补偿高频损耗。如果你的板子走线比较长(超过10cm),建议开启。
- 接收均衡(Rx Equalization):PHY接收端对衰减信号的补偿。RK3588的USB2 PHY支持CTLE(连续时间线性均衡器),可以在驱动里配。
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的关系是核心,信号完整性是实战。后面我们讲驱动代码的时候,你会反复用到这些知识。记住一句话:不懂硬件架构的驱动工程师,迟早要踩坑。