Skip to main content

GMAC RGMII Delayline 开发指南

本文档基于瑞芯微官方文档 Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf(V1.2.0, 2021-12-28)整理,介绍 Rockchip 平台 RGMII 接口 Delayline 的调试方法。

适用范围
  • 芯片平台:所有支持千兆以太网的 Rockchip 芯片
  • 内核版本:所有版本
  • 读者对象:技术支持工程师、软件开发工程师

一、概述

Rockchip 芯片千兆以太网使用 RGMII 接口,为兼容不同硬件带来的信号差异,芯片内置了 TX/RX RGMII delayline 可调功能。

只要硬件有差别,都需要重新配置 delayline,否则会影响千兆性能甚至导致网络无法正常工作。


二、RGMII Delayline 获取步骤

2.1 代码确认

驱动实现位于:drivers/net/ethernet/stmicro/stmmac/dwmac-rk-tool.c

内核版本说明
Kernel 4.19+代码已包含,无需补丁
Kernel 4.4需打补丁 Rockchip_RGMII_Delayline_Kernel4.4.tar.gz
Kernel 3.10需打补丁 Rockchip_RGMII_Delayline_Kernel3.10.tar.gz

2.2 节点确认

编译烧写后,在 /sys/devices/platform/xxxxx.ethernet/ 目录下可以看到相关 sysfs 节点。

2.3 使用方法

注意

使用 RTL8211E PHY 时,测试前需要拔掉网线。

2.3.1 扫描 delayline 窗口

通过 phy_lb_scan 节点扫描(PHY 回环模式):

# 千兆扫描
echo 1000 > phy_lb_scan

# 百兆扫描
echo 100 > phy_lb_scan

结果说明:

  • 横轴:TX 方向 delayline(范围 0x00 ~ 0x7f)
  • 纵轴:RX 方向 delayline(范围 0x00 ~ 0x7f)
  • "O" 表示该点 pass,空白表示 fail
  • 最后会打印中心点坐标

百兆窗口通常很大(对信号要求低),以千兆扫描结果为准。

2.3.2 测试扫描出来的中间值

# 配置 delayline
echo <tx_delay> <rx_delay> > rgmii_delayline

# 确认配置
cat rgmii_delayline

# PHY 回环测试
echo 1000 > phy_lb

测试 pass 后,将值填入 DTS:

&gmac {
phy-supply = <&vcc_lan>;
clock_in_out = "output";
phy-mode = "rgmii";
tx_delay = <0x2e>; // 填入扫描到的 TX 延时
rx_delay = <0x0f>; // 填入扫描到的 RX 延时
status = "okay";
};

重新烧入固件后,继续 ping 或 iperf 性能测试验证。

2.3.3 自动扫描

如果一组 delayline 无法适配所有板子(窗口太小、硬件一致性差),可打开自动扫描功能:

Device Drivers →
Network device support →
Ethernet driver support →
[*] Auto search rgmii delayline
(CONFIG_DWMAC_RK_AUTO_DELAYLINE)

工作原理:

  • 仅在第一次开机时探测一次
  • 探测结果存储到 vendor storage
  • 后续开机直接从 vendor storage 读取,覆盖 DTS 配置
  • vendor storage 被擦除后才会重新探测

日志:

# 第一次开机
[ 23.532138] Find suitable tx_delay = 0x2f, rx_delay = 0x10

# 之后开机
[ 23.092358] damac rk read rgmii dl from vendor tx: 0x2f, rx: 0x10
note

如果窗口太小,打开自动扫描也不能完全解决问题,建议先优化硬件。

2.4 rgmii-rxid 模式

当硬件启用了 PHY 端的 RX delay(如 RTL8211F),需要关闭主控的 RX delay:

&gmac0 {
phy-mode = "rgmii-rxid"; // RX delay 由 PHY 提供
clock_in_out = "output";
tx_delay = <0x43>; // 只配置 TX delay
/* rx_delay = <0x42>; */ // 注释掉 RX delay
status = "okay";
};

扫描方法相同,但此时只扫描 TX delay,RX delay 由 PHY 硬件固定(一般 2ns)。


三、硬件

3.1 测试 RGMII 接口的指标

按照 RGMII 协议,需满足时序要求。测量时注意:

  • 在靠近接收端测量(发送端反射严重,波形不能反映实际质量)
  • 测量信号:MAC_CLK、TX_CLK、RX_CLK
  • 关注指标:占空比、幅度、上升下降时间
  • 示波器带宽:大于 125M 的 5 倍
  • 推荐差分探头;单端探头注意接地回路尽量短
  • 占空比应控制在 45% ~ 55% 之间
  • 信号应为方波而非正弦波

3.1.1 RX_CLK / MAC_CLK

MAC_CLK / RX_CLK 由 PHY 提供。若信号完整性有问题:

  • 发送端串高频电感改善边沿过缓(需满足带宽)
  • 发送端电阻分压降低幅值调整占空比

3.1.2 TX_CLK

TX_CLK 有问题时:

  • 检查 IO 驱动强度是否调至最大
  • 串高频电感改善边沿
  • 增大 22ohm 串联电阻
  • 占空比问题:分压 MAC_CLK 幅度调整 TX_CLK 占空比(串 100ohm + 下地电阻,阻值因板而异)
  • 条件允许时,将 IO 电源从 3.3V 改为 1.8V(1.8V 信号指标更好,推荐使用 1.8V IO

四、FAQ

4.1 窗口大小

窗口越大越好,表明硬件信号好、冗余度大。 扫描不到窗口或窗口太小,一般是硬件问题,参考硬件章节优化。

4.2 PHY 的选型

  • 无特殊要求,符合 RGMII 协议即可
  • 建议 RTL8211E 换成 RTL8211F 或其他 PHY(信号质量更好)
  • PHY 没有 loopback 功能时,需用示波器测量相位来调试:
    • TX:用大于 125M 5 倍带宽的示波器,在 PHY 端测 TXC 与 TXD 相位差,调整到 1.5~2ns
    • RX:在 tx_delay 确定后,通过吞吐量判断 rx_delay,从 0x10 开始以 5 步进调整,找到 900M+ 区间后取中间值

参考资料

  • 原始文档:Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf V1.2.0
  • 《Rockchip_Developer_Guide_Linux_GMAC_CN.pdf》
  • 瑞芯微官网:www.rock-chips.com