1. RK网络接口概述:RK平台网络架构、GMAC与RMII接口区别、PHY芯片选型要点
做嵌入式网络开发这么多年,我接触过不少平台。但瑞芯微RK系列,说实话,是我个人觉得在“网络接口易用性”和“性能上限”之间平衡得比较好的一个系列。你想想看,从消费级的机顶盒到工业级的边缘计算盒子,RK的GMAC(千兆以太网MAC)几乎都能见到。
这一章,咱们不扯虚的。直接聊RK的网络架构长什么样,GMAC和RMII这两个接口到底差在哪,以及选PHY芯片时那些容易踩的坑。
1.1 RK平台网络架构概览
先看整体框架。RK平台的网络通路,说白了就是一条“数据从网线到CPU”的流水线。
从图上能看出来,RK的GMAC控制器用的是Synopsys DesignWare的IP核。这个核在业界很常见,Linux内核里对应的驱动叫stmmac。RK在此基础上做了平台适配,也就是dwmac-rk这个驱动文件。
核心要点:RK的网络性能瓶颈,往往不在MAC控制器本身,而在“MAC到PHY的接口”以及“PHY芯片的选型”上。这一点,我后面会反复强调。
1.2 GMAC与RMII接口区别
很多刚接触RK的工程师会问:RGMII和RMII到底选哪个?
其实没那么复杂。我直接给你列个表,一看就明白。
| 对比项 | RGMII (Reduced GMII) | RMII (Reduced MII) |
|---|---|---|
| 最大速率 | 1000 Mbps (千兆) | 100 Mbps (百兆) |
| 数据位宽 | 4位 (DDR双沿采样) | 2位 |
| 时钟频率 | 125 MHz (DDR) | 50 MHz |
| 信号线数量 | 12 ~ 14根 | 7 ~ 9根 |
| PCB走线难度 | 较高 (等长、阻抗控制严格) | 较低 |
| 典型应用 | 千兆以太网、高性能场景 | 百兆以太网、成本敏感场景 |
我个人习惯是:只要项目对带宽有要求,哪怕只是“未来可能升级到千兆”,我都会优先选RGMII。为什么?因为改版太痛苦了。我曾经在一个项目里,前期为了省几根信号线选了RMII,结果客户后来要求千兆,整个底板layout几乎重做。
1.2.1 RGMII的时序要点
RGMII用的是DDR(双数据率)采样。什么意思?就是时钟的上升沿和下降沿都传输数据。125MHz的时钟,实际数据速率就是250Mbps每根线,4根线加起来就是1000Mbps。
这里有个坑:RGMII对时钟和数据的相位关系要求很严。RK的GMAC控制器内部有一个tx_delay和rx_delay的调节寄存器,用来补偿PCB走线延迟。
// 设备树中RGMII延迟调节示例 (RK3588)
&gmac1 {
phy-mode = "rgmii-rxid"; // 仅RX侧内部延迟
tx_delay = <0x42>; // TX延迟调节 (0~0x7F)
rx_delay = <0x25>; // RX延迟调节 (0~0x7F)
status = "okay";
};
注意:不同RK芯片的延迟调节范围可能不同。比如RK3568的tx_delay范围是0~0x7F,但RK3399可能只有0~0x3F。一定要查对应芯片的TRM手册。
1.2.2 RMII的适用场景
RMII的优势就一个字:省。省引脚、省PCB面积、省BOM成本。如果你的产品确定只需要100Mbps(比如一些IoT网关、数据采集器),RMII完全够用。
但要注意:RMII需要外部提供50MHz参考时钟。这个时钟可以由MAC提供,也可以由PHY提供,或者用独立晶振。我建议优先让MAC提供时钟,这样PHY芯片可以省掉一颗晶振,成本更低。
1.3 PHY芯片选型要点
PHY芯片选型,说难不难,说简单也不简单。我总结了四个核心维度,你照着筛就行。
1.3.1 接口匹配
首先,PHY芯片的接口必须和MAC侧匹配。你MAC用的是RGMII,PHY就必须支持RGMII。这个看起来是废话,但我真见过有人把RMII的PHY焊到RGMII的板子上,结果调了三天。
- RGMII PHY:如Realtek RTL8211F、Microchip KSZ9031、裕太微 YT8531
- RMII PHY:如Realtek RTL8201F、Microchip LAN8720A
1.3.2 时钟方案
PHY芯片需要时钟才能工作。常见的有三种方案:
| 时钟方案 | 优点 | 缺点 |
|---|---|---|
| 外部独立晶振 | 精度高、稳定 | 多一颗物料、占PCB面积 |
| MAC提供时钟 | 省晶振、BOM精简 | 对MAC时钟质量有要求 |
| PHY输出时钟给MAC | 适合某些特殊设计 | 时钟路径可能引入抖动 |
我个人最常用的是“MAC提供时钟”方案。RK的GMAC可以直接输出125MHz(RGMII)或50MHz(RMII)给PHY,省事又省钱。
1.3.3 驱动与内核支持
这一点容易被忽略。你选的PHY芯片,Linux内核是否原生支持?
RK平台的内核里,PHY驱动通常放在drivers/net/phy/目录下。常见的PHY驱动:
realtek.c— 支持RTL8211F、RTL8201F等micrel.c— 支持KSZ9031、KSZ8081等motorcomm.c— 支持裕太微YT8531等国产PHY
经验之谈:如果选国产PHY芯片(如裕太微、景略),一定要确认内核版本是否包含对应驱动。我曾经在Linux 4.19上移植YT8531驱动,发现需要从5.10内核反向移植,折腾了两天。
1.3.4 温度范围与工业级要求
如果你的产品要在户外或工业环境下运行,PHY芯片的温度范围必须满足要求。
- 商业级:0°C ~ 70°C
- 工业级:-40°C ~ 85°C
- 扩展工业级:-40°C ~ 105°C
嗯,这里要注意:有些PHY芯片标称工业级,但实际在低温下时钟抖动会变大。我建议在选型阶段就做一下高低温测试,别等到量产了才发现问题。
1.4 避坑指南:我踩过的几个坑
最后,分享几个我在RK网络接口调试中真实遇到过的坑。
坑1:RGMII的PCB等长没做好
我曾经在一个RK3568项目里,RGMII的TX和RX时钟线差了300多mil。结果千兆模式下丢包率高达5%。后来把等长控制在±50mil以内,问题解决。
坑2:PHY复位时序不对
RK的GMAC驱动在初始化时,会通过GPIO复位PHY。如果复位信号保持时间不够,PHY可能无法正常启动。我建议复位低电平保持至少10ms。
坑3:设备树中phy-mode写错
这个错误很低级,但很容易犯。RGMII要写成"rgmii"或"rgmii-rxid",RMII要写成"rmii"。写错了内核会报phy mode not supported,然后网络起不来。
好了,这一章的内容就到这里。RK的网络架构、GMAC与RMII的区别、PHY选型要点,这三个知识点是后续所有调试和优化工作的基础。把这些搞清楚了,后面调起性能来才能得心应手。