在嵌入式開發中,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平臺網絡開發中還遇到過哪些疑難問題?歡迎在評論區留言討論,一起踩坑避坑!
-
嵌入式
+關注
關注
5198文章
20449瀏覽量
334048 -
以太網
+關注
關注
41文章
5998瀏覽量
180844 -
瑞芯微
+關注
關注
27文章
794瀏覽量
54321
發布評論請先 登錄
網卡吞吐量測試解決方案
綜合模塊化航空電子平臺網絡故障注入策略
如何提高無線傳感器網絡的吞吐量
debug 吞吐量的辦法
debug 吞吐量的辦法
Keithley吉時利6511常見故障排查及解決方法
RK平臺網絡問題排查指南:從初始化到吞吐量,一文搞定常見故障
評論