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

一、以太网初始化失败:开机就报错?从PHY和配置入手
现象表现
开机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
};
};
|
二、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值(以5为步进,范围0x0~0x60)。
2.若为百兆PHY:优先查硬件与DTS
•检查时钟输出:确保25M/50M时钟正常(幅值、频率达标);
•重新核对IOMUX复用:避免引脚冲突(如GMAC引脚被复用为UART);
•验证电源域:PHY所在电源域(如AVDD、DVDD)电压稳定;
•时钟方向:同“DMA时钟错误”中的百兆PHY配置规则。
四、自协商失败:无法link?查引脚、测波形、验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结电容过大(会导致信号衰减)。
五、丢包/吞吐量不达标:从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移到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
|
六、串口一直打印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 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网络排查的核心逻辑
RK平台以太网问题排查遵循“从上层到下层,从软件到硬件”的原则:
1.先看开机Log:是否有初始化、DMA、PHY相关报错(定位到具体章节);
2.再查功能节点:ifconfig是否有ethx,拔插网线是否有link打印;
3.分层测试:先测百兆再测千兆,先测本地再测外网,逐步缩小范围;
4.工具辅助:用示波器测时钟/ MDI信号,用iperf测吞吐量,用寄存器验证通信。
你在RK平台网络开发中还遇到过哪些疑难问题?欢迎在评论区留言讨论,一起踩坑避坑!
-
嵌入式
+关注
关注
5209文章
20625浏览量
336759 -
以太网
+关注
关注
41文章
6160浏览量
181513 -
瑞芯微
+关注
关注
27文章
841浏览量
54647
发布评论请先 登录
网卡吞吐量测试解决方案
综合模块化航空电子平台网络故障注入策略
如何提高无线传感器网络的吞吐量
debug 吞吐量的办法
debug 吞吐量的办法
Keithley吉时利6511常见故障排查及解决方法
RK平台网络问题排查指南:从初始化到吞吐量,一文搞定常见故障
评论