RK平台网络问题排查指南:从初始化到吞吐量,一文搞定常见故障

电子说

1.4w人已加入

描述

 

 

在嵌入式开发中,RK(瑞芯微)平台凭借高性能、高兼容性广泛应用于物联网、工业控制等场景,而以太网作为核心通信接口,其稳定性直接决定了设备的可用性。但实际开发中,我们常会遇到初始化失败、网络不通、丢包等问题,排查起来耗时费力。

 

 

本文基于 RK 官方以太网问题排查手册,梳理了 类核心故障的现象表现、排查逻辑与实操方案,涵盖从开机初始化到吞吐量优化的全流程,帮你快速定位问题、高效解决。

嵌入式

 

 

 

一、以太网初始化失败:开机就报错?从 PHY 和配置入手

 

现象表现

 

开机 Log 中出现明确报错,如:

 

 

No PHY found(未找到 PHY 芯片)

 

 

Cannot attach to PHY(无法挂载 PHY

 

 

MDIO device at address 1 is missingPHY 地址不匹配)

 

 

排查步骤

 

1.检查 MDC/MDIO 引脚配置

 

 

MDC/MDIO 是主控与 PHY 通信的关键引脚,优先确认 IOMUX 寄存器值是否正确(需对照硬件原理图),同时用示波器测试波形:MDC 时钟频率需小于 2.5MHz,波形无异常抖动。

 

 

2.验证 PHY 供电与复位

 

 

确保 PHY 芯片供电正常(如 3.3V/1.8V,需匹配芯片规格书);

 

 

检查 Reset IO 配置:必须连接主控的3.3V IO(配置成 1.8V 会直接报错),且复位时序需满足 PHY datasheet 要求(可用示波器观察上电后 Reset 脚是否有有效复位信号)。

 

 

1.匹配 PHY 地址(软件与硬件一致)

 

 

 Log 提示 “address X missing”,说明软件配置的 PHY 地址与硬件实际地址不匹配:

 

 

推荐将 DTS 中 PHY 地址修改为通用广播地址0,配置示例:

 

 

&mdio0 {

 

 

  rgmii_phy0: phy@0 {

 

 

    compatible = "ethernet-phy-ieee802.3-c22";

 

 

    reg = <0x0>; // PHY地址设为0

 

 

  };

 

 

};

 

 

二、DMA Initialization Failed:时钟错误是 元凶

 

现象表现

 

Log 中出现 DMA 初始化失败报错,如:

 

 

rk_gmac-dwmac fe1c0000.ethernet: Failed to reset the dma

 

 

stmmac_open: Hw setup failed

 

 

排查核心:时钟信号与配置

 

DMA 依赖稳定的时钟,需从 硬件信号” 和 软件配置” 双向验证:

 

 

1.检查时钟引脚与 IOMUX

 

 

执行命令查看引脚复用配置,确认时钟脚未被占用:

 

 

find / -name pinmux-pins

 

 

cat pinmux-pins

 

 

用示波器测量时钟引脚:确保有正常时钟输出,频率、幅度符合硬件设计(如百兆 PHY 常用 25MHz,千兆常用 125MHz)。

 

 

1.确认时钟树与使能状态

 

 

查看时钟树信息,验证目标时钟是否使能、频率是否正确:

 

 

busybox find / -name clk_summary

 

 

cat clk_summary

 

 

检查 CRU 寄存器(时钟控制单元),确保时钟路径无阻断。

 

 

1.百兆 PHY 时钟方向配置(关键!)

 

 

若使用百兆 PHY,需保证 硬件方向” 与 软件配置” 相反:

 

 

硬件 PHY 设为input → 主控 DTS 中 GMAC 配置为output(推荐);

 

 

硬件 PHY 设为output → 主控 DTS 中 GMAC 配置为input

 

 

参考文档:《Rockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN

 

 

三、网络不通:有 eth 节点但 ping 不通?分千兆 百兆排查

 

前提条件

 

Log 无报错,ifconfig能看到ethx节点(如 eth0),但无法 ping 通同网段 IP 或外网。

 

 

1. 若为千兆 PHY:先测百兆,再查 delay

 

步骤 1:先验证百兆是否正常(缩小问题范围)

 

千兆不通常与信号延迟(tx/rx delay)相关,先固定百兆测试:

 

 

临时固定百兆(重启失效):

 

 

ethtool -s eth0 autoneg off speed 100 duplex full

 

 

永久固定百兆(修改 DTS):在 GMAC 节点中加入:

 

 

max-speed = <100>; // 强制百兆模式

 

 

若固定百兆后能正常 link(串口打印link is up 100M/full),说明问题在千兆信号延迟。

 

 

步骤 2:千兆不通校准 tx/rx delay

 

优先使用官方工具扫回环,获取正确 delay 值:

 

 

echo 1000 > phy_lb_scan # 扫描回环,生成delay参数

 

 

将扫描结果填入 DTS,重新编译烧录(参考文档:《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》)。

 

 

特殊情况:若 PHY / 交换机无法自动扫描,需手动微调 delay 值(以 为步进,范围 0x0~0x60)。

 

 

2. 若为百兆 PHY:优先查硬件与 DTS

 

检查时钟输出:确保 25M/50M 时钟正常(幅值、频率达标);

 

 

重新核对 IOMUX 复用:避免引脚冲突(如 GMAC 引脚被复用为 UART);

 

 

验证电源域:PHY 所在电源域(如 AVDDDVDD)电压稳定;

 

 

时钟方向:同“DMA 时钟错误” 中的百兆 PHY 配置规则。

 

 

四、自协商失败:无法 link?查引脚、测波形、验 PHY

 

现象表现

 

插网线后无link up打印,或自协商后速率异常(如千兆降为百兆但仍不通)。

 

 

排查步骤

 

1.逐引脚核对 IO 复用

 

 

pinmux-pins文件逐一对照 GMAC 所有引脚(如 TXDRXDTXCRXC),确保无复用错误:

 

 

cat /sys/devices/platform/xxx.ethernet/pinmux-pins # xxxGMAC基地址

 

 

1.循环读取 PHY 寄存器,验证通信

 

 

找到 PHY 寄存器路径:

 

 

find / -name phy_registers

 

 

循环读取寄存器,观察值是否正常(全 0xffff 或全 0→硬件信号问题):

 

 

while true; do

 

 

  cat /sys/devices/platform/fe300000.ethernet/mdio_bus/stmmac-0/stmmac-0:01/phy_registers

 

 

done

 

 

拔插网线,检查寄存器 1 bit5(自协商标志位)和bit2link 状态位)是否变化:无变化→PHY 未正常工作。

 

 

1.验证 PHY 自身状态

 

 

检查 PHY 电源、复位、晶体(如 25MHz)是否正常;

 

 

用示波器测 MDI 信号:正常 PHY 应输出链路脉冲信号,若无→MDI± 接线反或 PHY 故障;

 

 

排查 MDI 相关信号问题:如链路过长、ESD 结电容过大(会导致信号衰减)。

 

 

五、丢包 / 吞吐量不达标:从 delay、优化配置入手

 

标准速率参考

 

百兆以太网:吞吐量需≥90M/bps

 

 

千兆以太网:吞吐量需≥900M/bps

 

 

先测吞吐量:用 iperf 定位问题

 

测试 ARM 发送(PC 接收)

 

PC 端(需关闭防火墙):

 

 

iperf.exe -s -w 1M # 启动服务端,窗口大小1M

 

 

ARM 端:

 

 

iperf -c 192.168.50.169 -i 1 -w 1M -t 10 -l 16000 # 连接PC,测试10

 

 

测试 ARM 接收(PC 发送)

 

ARM 端:

 

 

iperf -s -w 1M

 

 

PC 端:

 

 

iperf -c 192.168.50.108 -i 1 -w 1M -t 10 -l 16000

 

 

优化方案(按优先级排序)

 

1.千兆不达标校准 tx/rx delay

 

 

网络不通” 中的千兆 delay 校准步骤(优先自动扫回环)。

 

 

2.定频 CPU 与 DMC(提升硬件性能)

 

 

 CPU 和内存控制器(DMC)设为性能模式,避免降频导致的处理瓶颈:

 

 

# DMC定频performance

 

 

echo performance > /sys/devices/platform/dmc/devfreq/dmc/governor

 

 

# CPU0定频performance(多核心可依次配置)

 

 

echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

 

 

1.中断与队列优化(负载均衡)

 

 

中断迁移:将 eth 中断从 CPU0 移到大核(如 RK3588 的 CPU3):

 

 

查看eth0中断号(假设为234

 

 

cat /proc/interrupts

 

 

将中断234移到CPU316进制0x8对应CPU3

 

 

echo 8 > /proc/irq/234/smp_affinity

 

 

队列分布:将 RX/TX 队列分配到多核心处理:

 

 

echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

 

 

echo f > /sys/class/net/eth0/queues/tx-0/xps_cpus

 

 

1.增大协议缓冲区(UDP 吞吐低适用)

 

 

调整TCP/UDP缓冲区大小

 

 

echo 1048576 > /proc/sys/net/core/wmem_max

 

 

echo 1048576 > /proc/sys/net/core/rmem_max

 

 

echo "4096 1048576 1048576" > /proc/sys/net/ipv4/tcp_rmem

 

 

echo "4096 1048576 1048576" > /proc/sys/net/ipv4/tcp_wmem

 

 

sysctl生效配置

 

 

sysctl -w net.core.rmem_max=2048000

 

 

sysctl -w net.core.wmem_max=2048000

 

 

1.关闭硬件校验(TCP TX 异常适用)

 

 

 TCP 丢包但 UDP 正常,尝试关闭硬件 checksum

 

 

关闭eth0RX/TX硬件校验

 

 

ethtool --offload eth0 rx off tx off

 

 

查看校验状态

 

 

ethtool --show-offload eth0

 

 

六、串口一直打印 link up/down:循环报错?查时钟、EEE、网线

 

核心原因

 

PHY 持续接收错误数据,导致链路反复断开 重连。

 

 

排查步骤

 

1.EEE 模式问题合入对应补丁

 

 

若开启了 EEE(节能模式),部分 PHY 会因兼容性问题触发 link 波动,需合入 RK 官方的 EEE 补丁(联系 FAE 获取)。

 

 

2.PHY 时钟配置错误设为 output 模式

 

 

优先将主控配置为时钟输出模式(稳定性更高),避免 PHY 时钟输入异常导致的链路波动。

 

 

3.物理层问题换网线、查接触

 

 

网线水晶头接触不良是常见诱因,更换一根认证网线测试;

 

 

用示波器测 MDI 信号,排除信号衰减或干扰。

 

 

1.PHY 寄存器验证

 

 

自协商失败” 中的循环读寄存器方法,观察拔插网线时寄存器值是否正常变化,若异常硬件信号故障。

 

 

七、交换机(Switch)相关问题:以 RTL836x 为例

 

适用场景

 

使用 RTL8367RB/RTL8367S 等交换机芯片,需通过 RGMII 与 RK 主控连接。

 

 

关键前提(硬件 + 软件)

 

1.硬件接线:RGMII 交叉连接

 

 

主控 MAC 与交换机 MAC 的 RGMII 引脚需交叉对接:

 

 

交换机 TXD [3:0] → 主控 RXD [3:0]

 

 

交换机 RXD [3:0] → 主控 TXD [3:0]

 

 

交换机 TXC → 主控 RXC,交换机 TX_CTL → 主控 RX_CTL

 

 

1.软件配置:PHY ID 设为 29

 

 

RK 交换机驱动默认 PHY ID 为 29,需将硬件交换机的地址 ID 改为 29,且 MDIO 引脚需上拉:

 

 

#define MDC_MDIO_PHY_ID 29 /* 固定PHY ID29 */

 

 

1.获取官方补丁

 

 

 RK FTP 下载 RTL836x 补丁:

 

 

FTP 地址:ftp://www.rockchip.com.cn

 

 

账号:rkwifi,密码:Cng9280H8t

 

 

路径:05-补丁Patch/rtl8367_switch/rk3568_rk3588/

 

 

排查步骤

 

1.先验证交换机自身功能

 

 

交换机引出的 2 个网口接 台 PC(同网段静态 IP),若 PC 间无法 ping 交换机本身故障:

 

 

检查交换机电源、晶体(如 25MHz)、复位引脚;

 

 

核对硬件上下拉配置(参考芯片 datasheet)。

 

 

1.再验证主控与交换机通信

 

 

若主控 Log 报 找不到 PHY” 或 “DMA 错误,参考本文第一、二章节排查;

 

 

区分交换机型号:RTL8367RB 用 EXT_PORT1 作为 RGMIIRTL8367S 用 EXT_PORT0,需在代码中修正:

 

 

// RTL8367S需改为EXT_PORT0

 

 

ret = rtk_port_macForceLinkExt_set(EXT_PORT0, MODE_EXT_RGMII, &abi);

 

 

1.千兆不通手动调 delay

 

 

交换机暂不支持自动扫回环,可尝试以下 delay 组合(单位:十六进制):

 

 

tx_delay

 

 

rx_delay

 

 

0x0

 

 

0x10

 

 

0x10

 

 

0x0

 

 

0x10

 

 

0x10

 

 

0x20

 

 

0x20

 

 

若上述值无效,以 5 为步进在 0x0~0x60 范围内微调,修改寄存器(以 RK356x 为例):

 

 

查看delay寄存器(0xfdc60380):bit15-8=rx delaybit7-0=tx delay

 

 

io -4 0xfdc60380

 

 

写入值(如rx=0x10tx=0x0,高16位为使能)

 

 

io -4 0xfdc60380 0xffff0010

 

 

总结:RK 网络排查的核心逻辑

 

RK 平台以太网问题排查遵循 从上层到下层,从软件到硬件” 的原则:

 

 

1.先看开机 Log:是否有初始化、DMAPHY 相关报错(定位到具体章节);

 

 

2.再查功能节点:ifconfig是否有 ethx,拔插网线是否有 link 打印;

 

 

3.分层测试:先测百兆再测千兆,先测本地再测外网,逐步缩小范围;

 

 

4.工具辅助:用示波器测时钟 / MDI 信号,用 iperf 测吞吐量,用寄存器验证通信。

 

 

你在 RK 平台网络开发中还遇到过哪些疑难问题?欢迎在评论区留言讨论,一起踩坑避坑!

 

 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分