RK平台网络问题排查指南:从初始化到吞吐量,一文搞定常见故障 电子说
在嵌入式开发中,RK(瑞芯微)平台凭借高性能、高兼容性广泛应用于物联网、工业控制等场景,而以太网作为核心通信接口,其稳定性直接决定了设备的可用性。但实际开发中,我们常会遇到初始化失败、网络不通、丢包等问题,排查起来耗时费力。
本文基于 RK 官方以太网问题排查手册,梳理了 7 类核心故障的现象表现、排查逻辑与实操方案,涵盖从开机初始化到吞吐量优化的全流程,帮你快速定位问题、高效解决。

开机 Log 中出现明确报错,如:
•No PHY found(未找到 PHY 芯片)
•Cannot attach to PHY(无法挂载 PHY)
•MDIO device at address 1 is missing(PHY 地址不匹配)
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
};
};
|
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》
Log 无报错,ifconfig能看到ethx节点(如 eth0),但无法 ping 通同网段 IP 或外网。
千兆不通常与信号延迟(tx/rx delay)相关,先固定百兆测试:
•临时固定百兆(重启失效):
|
ethtool -s eth0 autoneg off speed 100 duplex full
|
•永久固定百兆(修改 DTS):在 GMAC 节点中加入:
|
max-speed = <100>; // 强制百兆模式
|
•若固定百兆后能正常 link(串口打印link is up 100M/full),说明问题在千兆信号延迟。
•优先使用官方工具扫回环,获取正确 delay 值:
|
echo 1000 > phy_lb_scan # 扫描回环,生成delay参数
|
•将扫描结果填入 DTS,重新编译烧录(参考文档:《Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdf》)。
•特殊情况:若 PHY / 交换机无法自动扫描,需手动微调 delay 值(以 5 为步进,范围 0x0~0x60)。
•检查时钟输出:确保 25M/50M 时钟正常(幅值、频率达标);
•重新核对 IOMUX 复用:避免引脚冲突(如 GMAC 引脚被复用为 UART);
•验证电源域:PHY 所在电源域(如 AVDD、DVDD)电压稳定;
•时钟方向:同“DMA 时钟错误” 中的百兆 PHY 配置规则。
插网线后无link up打印,或自协商后速率异常(如千兆降为百兆但仍不通)。
1.逐引脚核对 IO 复用
用pinmux-pins文件逐一对照 GMAC 所有引脚(如 TXD、RXD、TXC、RXC),确保无复用错误:
|
cat /sys/devices/platform/xxx.ethernet/pinmux-pins # xxx为GMAC基地址
|
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(自协商标志位)和bit2(link 状态位)是否变化:无变化→PHY 未正常工作。
1.验证 PHY 自身状态
◦检查 PHY 电源、复位、晶体(如 25MHz)是否正常;
◦用示波器测 MDI 信号:正常 PHY 应输出链路脉冲信号,若无→MDI± 接线反或 PHY 故障;
◦排查 MDI 相关信号问题:如链路过长、ESD 结电容过大(会导致信号衰减)。
•百兆以太网:吞吐量需≥90M/bps;
•千兆以太网:吞吐量需≥900M/bps。
•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 端:
|
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移到CPU3(16进制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:
|
# 关闭eth0的RX/TX硬件校验
ethtool --offload eth0 rx off tx off
# 查看校验状态
ethtool --show-offload eth0
|
PHY 持续接收错误数据,导致链路反复断开 / 重连。
1.EEE 模式问题→合入对应补丁
若开启了 EEE(节能模式),部分 PHY 会因兼容性问题触发 link 波动,需合入 RK 官方的 EEE 补丁(联系 FAE 获取)。
2.PHY 时钟配置错误→设为 output 模式
优先将主控配置为时钟输出模式(稳定性更高),避免 PHY 时钟输入异常导致的链路波动。
3.物理层问题→换网线、查接触
◦网线水晶头接触不良是常见诱因,更换一根认证网线测试;
◦用示波器测 MDI 信号,排除信号衰减或干扰。
1.PHY 寄存器验证
同“自协商失败” 中的循环读寄存器方法,观察拔插网线时寄存器值是否正常变化,若异常→硬件信号故障。
使用 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 ID为29 */
|
1.获取官方补丁
从 RK FTP 下载 RTL836x 补丁:
◦FTP 地址:ftp://www.rockchip.com.cn
◦账号:rkwifi,密码:Cng9280H8t
◦路径:05-补丁Patch/rtl8367_switch/rk3568_rk3588/
1.先验证交换机自身功能
交换机引出的 2 个网口接 2 台 PC(同网段静态 IP),若 PC 间无法 ping 通→交换机本身故障:
◦检查交换机电源、晶体(如 25MHz)、复位引脚;
◦核对硬件上下拉配置(参考芯片 datasheet)。
1.再验证主控与交换机通信
◦若主控 Log 报 “找不到 PHY” 或 “DMA 错误”,参考本文第一、二章节排查;
◦区分交换机型号:RTL8367RB 用 EXT_PORT1 作为 RGMII,RTL8367S 用 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 delay,bit7-0=tx delay
io -4 0xfdc60380
# 写入值(如rx=0x10,tx=0x0,高16位为使能)
io -4 0xfdc60380 0xffff0010
|
RK 平台以太网问题排查遵循 “从上层到下层,从软件到硬件” 的原则:
1.先看开机 Log:是否有初始化、DMA、PHY 相关报错(定位到具体章节);
2.再查功能节点:ifconfig是否有 ethx,拔插网线是否有 link 打印;
3.分层测试:先测百兆再测千兆,先测本地再测外网,逐步缩小范围;
4.工具辅助:用示波器测时钟 / MDI 信号,用 iperf 测吞吐量,用寄存器验证通信。
你在 RK 平台网络开发中还遇到过哪些疑难问题?欢迎在评论区留言讨论,一起踩坑避坑!
全部0条评论
快来发表一下你的评论吧 !