11 dwmac-rockchip RK3588 平台

11 dwmac-rockchip RK3588 平台

源码:dwmac-rk.cdwmac-rk-tool.cdwmac-rk-tool.h
模块:dwmac-rockchip.koCONFIG_DWMAC_ROCKCHIP
DT compatible:rockchip,rk3588-gmac

1. 模块职责

Rockchip Platform Glue 负责 RK 全系列 SoC 的 DWMAC 适配,RK3588 为其中一代:

  • GRF/PHP GRF 引脚复用(RGMII/RMII/SGMII)
  • 多路时钟树管理与速率相关分频
  • XPCS SerDes(SGMII/QSGMII)
  • OTP / vendor storage MAC 地址
  • 内置 PHY 供电、CSU 时钟隔离
  • 调用 stmmac_dvr_probe() 进入通用核心

2. 数据结构

2.1 rk_gmac_ops

SoC 差异通过 ops 表抽象:

1
2
3
4
5
6
7
8
9
10
struct rk_gmac_ops {
void (*set_to_rgmii)(struct rk_priv_data *bsp, int tx_delay, int rx_delay);
void (*set_to_rmii)(struct rk_priv_data *bsp);
void (*set_to_sgmii)(struct rk_priv_data *bsp);
void (*set_to_qsgmii)(struct rk_priv_data *bsp);
void (*set_rgmii_speed)(struct rk_priv_data *bsp, int speed);
void (*set_rmii_speed)(struct rk_priv_data *bsp, int speed);
void (*set_clock_selection)(struct rk_priv_data *bsp, bool input, bool enable);
void (*integrated_phy_power)(struct rk_priv_data *bsp, bool up);
};

RK3588:rk3588_ops(约 2270 行起)。

2.2 rk_priv_data

1
2
3
4
5
6
7
8
9
10
struct rk_priv_data {
phy_interface_t phy_iface;
struct clk *clk_mac, *mac_clk_rx, *mac_clk_tx;
struct clk *aclk_mac, *pclk_mac, *clk_phy;
struct regmap *grf, *php_grf, *xpcs;
int tx_delay, rx_delay;
struct regulator *regulator;
const struct rk_gmac_ops *ops;
// ...
};

存入 plat_dat->bsp_priv,核心通过 get_stmmac_bsp_priv(dev) 取回。

3. Probe 流程

stmmac_dvr_proberk_gmac_setupstmmac_platformrk_gmac_probestmmac_dvr_proberk_gmac_setupstmmac_platformrk_gmac_probestmmac_get_platform_resourcesstmmac_probe_config_dthas_gmac4 兜底sph_disable = truerk_gmac_setup (时钟/GRF)rk_gmac_csu_init / clk_init / powerupstmmac_dvr_probedwmac_rk_create_loopback_sysfs

3.1 平台特有设置

1
2
3
4
plat_dat->fix_mac_speed = rk_fix_speed;
plat_dat->get_eth_addr = rk_get_eth_addr;
plat_dat->integrated_phy_power = rk_integrated_phy_power;
plat_dat->sph_disable = true;
  • sph_disable:RK 平台默认关闭 Split Header
  • has_gmac4:DT 未指定时 fallback 到 legacy GMAC

4. 接口模式配置

4.1 RGMII

rk3588_set_to_rgmii()

  • 写 GRF 切换 RGMII 模式
  • 配置 tx_delay / rx_delay(DT 属性 tx_delayrx_delay

4.2 RMII

rk3588_set_to_rmii() + 共享 speed 配置。

4.3 SGMII / QSGMII

  • 配置 XPCS 寄存器(xpcs_read/write
  • PCS 模式、自协商使能
  • 可能涉及 php_grf SerDes 电源

5. 速率切换

rk_fix_speed() → phylink link up 时调用:

1
2
3
rk3588_set_gmac_speed(bsp_priv, speed)
→ 100/1000/2500 对应不同 clock mux
→ 写 GRF speed 位

stmmac_mac_link_up() 配合完成 MAC 侧速率匹配。

6. 时钟

rk_gmac_clk_init() 获取并 prepare/enabled:

时钟 用途
clk_mac MAC 主时钟
mac_clk_rx / mac_clk_tx RGMII RX/TX
aclk_mac / pclk_mac AXI/APB
clk_phy 外接 PHY 参考
pclk_xpcs XPCS APB

rk_gmac_powerup/powerdown 配合 runtime PM。

7. MAC 地址

rk_get_eth_addr() 优先级:

  1. Device Tree local-mac-address
  2. Rockchip vendor storage / OTP
  3. 随机 MAC(核心 fallback)

8. RK3588 硬件拓扑

RK3588 通常有 两个 GMAC

控制器 DT 节点 常见用途
GMAC0 gmac0 RGMII + 外接 PHY
GMAC1 gmac1 RGMII 或 SGMII

具体以板级 DTS(rk3588-*.dtsi)为准。

9. 环回测试工具

CONFIG_DWMAC_ROCKCHIP_TOOL 启用 dwmac-rk-tool.c

  • sysfs 接口创建环回测试
  • 用于产测/驱动验证

10. DTS 配置示例要点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gmac0: ethernet@fe1b0000 {
compatible = "rockchip,rk3588-gmac";
reg = <0x0 0xfe1b0000 0x0 0x10000>;
interrupts = <GIC_SPI ...>;
clocks = <&cru ...>, ...;
clock-names = "stmmaceth", "mac_clk_rx", ...;
resets = <&cru SRST_A_GMAC0>;
reset-names = "stmmaceth";
rockchip,grf = <&grf>;
snps,axi-config = <&gmac0_axi_setup>;
snps,mtl-rx-config = <&gmac0_mtl_rx>;
snps,mtl-tx-config = <&gmac0_mtl_tx>;
phy-mode = "rgmii";
phy-handle = <&rgmii_phy0>;
tx_delay = <0x30>;
rx_delay = <0x10>;
};

11. 调试建议

现象 排查
无链路 PHY 供电、phy-mode、delay 参数
千兆不稳 tx_delay/rx_delay 微调
SGMII 不通 XPCS 寄存器、SerDes 时钟
无 MAC 地址 vendor storage、DT local-mac-address
1
2
3
dmesg | grep stmmac
ethtool eth0
cat /sys/class/net/eth0/device/uevent

12. 相关文档

文章互动

阅读 --

留言

0 条留言

正在加载留言…