保姆级教程:在RK3568开发板上手把手配置RMII百兆以太网DTS节点
RK3568开发板RMII百兆以太网配置实战指南
刚拿到RK3568开发板时,看到密密麻麻的设备树配置是不是有点发怵?特别是当需要为外接的百兆PHY芯片(比如常见的RTL8201F)配置以太网功能时,那些陌生的DTS节点参数简直像天书一样。别担心,本文将手把手带你完成从零开始的完整配置流程,包括如何定位正确的DTS文件、理解每个参数的实际意义、根据具体硬件调整GPIO引脚,以及最后的编译测试和常见问题排查。不同于网上零散的代码片段,我们会用真实开发板的配置过程作为案例,让你真正掌握这项实用技能。
1. 准备工作与环境搭建
在开始修改DTS之前,我们需要先准备好开发环境。假设你已经有一块搭载RK3568芯片的开发板(比如Firefly ROC-RK3568-PC或友善之臂NanoPi R5S),并且已经安装了基本的Linux开发工具链。
首先确认你的开发主机已安装以下工具:
sudo apt update sudo apt install build-essential git device-tree-compiler接下来需要获取RK3568的Linux内核源码。推荐使用官方维护的版本:
git clone https://github.com/rockchip-linux/kernel.git -b develop-5.10 cd kernel对于大多数开发板,预编译的SDK中已经包含了适配的DTS文件。但为了确保我们修改的是正确的文件,需要先确定你的开发板使用的是哪个DTS文件。可以通过以下命令查看当前运行的设备树:
cat /proc/device-tree/model输出可能类似于"Firefly ROC-RK3568-PC Board (Linux)",这表示我们需要修改的DTS文件是arch/arm64/boot/dts/rockchip/rk3568-roc-pc.dts。
提示:不同厂商的开发板DTS文件命名规则可能不同,建议查阅开发板文档确认
2. 理解RMII接口的基本原理
在动手修改DTS之前,有必要先了解RMII接口的工作原理。RMII(Reduced Media Independent Interface)是百兆以太网常用的简化版MII接口,相比标准MII接口,它有以下特点:
- 信号线数量减少:从MII的16根减少到7根(2根数据线+1根时钟线+控制信号)
- 时钟频率:使用50MHz参考时钟(MII为25MHz)
- 数据传输速率:支持10/100Mbps速率
RK3568芯片内置了两个GMAC(Gigabit MAC)控制器,每个都可以配置为RMII模式。典型的硬件连接方式如下:
| RK3568引脚 | PHY芯片引脚 | 信号说明 |
|---|---|---|
| GMAC0_RX0 | RXD0 | 接收数据0 |
| GMAC0_RX1 | RXD1 | 接收数据1 |
| GMAC0_TX0 | TXD0 | 发送数据0 |
| GMAC0_TX1 | TXD1 | 发送数据1 |
| GMAC0_REFCLK | REFCLK | 50MHz参考时钟 |
| GMAC0_RSTN | RESET | PHY复位信号 |
| GMAC0_MDIO | MDIO | 管理数据IO |
| GMAC0_MDC | MDC | 管理数据时钟 |
3. 配置DTS节点的详细步骤
现在我们来实际修改DTS文件。打开你的开发板对应的DTS文件(如rk3568-roc-pc.dts),找到gmac0或gmac1节点进行修改。以下是完整的RMII配置示例:
&gmac0_clkin { clock-frequency = <50000000>; // RMII需要50MHz时钟 status = "okay"; }; &gmac0 { phy-mode = "rmii"; // 设置为RMII模式 clock_in_out = "input"; // 使用外部时钟输入 // PHY复位引脚配置,根据实际硬件连接修改 snps,reset-gpio = <&gpio2 RK_PD3 GPIO_ACTIVE_LOW>; snps,reset-active-low; // 复位信号低电平有效 snps,reset-delays-us = <0 20000 100000>; // 复位时序:0us准备, 20ms复位脉冲, 100ms稳定等待 // 时钟配置 assigned-clocks = <&cru SCLK_GMAC0_RX_TX>, <&cru SCLK_GMAC0>; assigned-clock-parents = <&cru SCLK_GMAC0_RMII_SPEED>; assigned-clock-rates = <0>, <50000000>; // 引脚复用配置 pinctrl-names = "default"; pinctrl-0 = <&gmac0_miim // MDIO/MDC管理接口 &gmac0_clkinout // 时钟引脚 &gmac0_rx_bus2 // 接收数据线 &gmac0_tx_bus2 // 发送数据线 &gmac0_rx_er>; // 接收错误指示 phy-handle = <&rmii_phy0>; // 指向PHY设备节点 status = "okay"; // 启用该接口 };关键参数解析:
- phy-mode:必须设置为"rmii"以启用RMII模式
- clock_in_out:通常设置为"input"表示使用外部PHY提供的时钟
- snps,reset-gpio:这是最重要的硬件相关参数,需要根据你的实际电路连接修改:
&gpio2表示GPIO控制器RK_PD3表示GPIO2组的D3引脚(具体引脚号需查阅RK3568 datasheet)GPIO_ACTIVE_LOW表示低电平有效
- pinctrl-0:包含所有需要复用的引脚组,必须与硬件连接完全匹配
4. PHY设备节点配置
除了GMAC控制器本身的配置,我们还需要定义PHY设备节点。通常在DTS文件的末尾添加:
mdio0 { compatible = "snps,dwmac-mdio"; #address-cells = <1>; #size-cells = <0>; rmii_phy0: ethernet-phy@0 { compatible = "ethernet-phy"; reg = <0>; // PHY地址,根据硬件跳线设置 phy-supply = <&vcc3v3_sys>; reset-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_LOW>; reset-assert-us = <10000>; // 复位保持时间10ms reset-deassert-us = <20000>; // 复位释放后等待20ms }; };PHY地址(reg属性)需要根据你的硬件设计确定。常见的RTL8201F PHY芯片地址可以通过硬件跳线设置为0或1,如果不确定,可以尝试扫描:
dmesg | grep mdio5. 编译与测试
完成DTS修改后,需要重新编译内核和设备树:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_defconfig make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs编译完成后,新的设备树文件位于arch/arm64/boot/dts/rockchip/目录下。将其复制到开发板的/boot目录并重启:
scp arch/arm64/boot/dts/rockchip/rk3568-roc-pc.dtb user@192.168.x.x:/boot/重启后检查以太网接口是否正常工作:
ifconfig eth0 dmesg | grep gmac0如果一切正常,你应该能看到类似下面的输出:
[ 2.345678] rk_gmac-dwmac fe2a0000.ethernet: IRQ eth_wake_irq not found [ 2.345679] rk_gmac-dwmac fe2a0000.ethernet: IRQ eth_lpi not found [ 2.346789] rk_gmac-dwmac fe2a0000.ethernet: PTP uses main clock [ 2.347890] rk_gmac-dwmac fe2a0000.ethernet: clock input or output? (input) [ 2.348901] rk_gmac-dwmac fe2a0000.ethernet: TX delay(0x30). [ 2.349912] rk_gmac-dwmac fe2a0000.ethernet: RX delay(0x10). [ 2.350923] rk_gmac-dwmac fe2a0000.ethernet: integrated PHY? (no) [ 2.351934] rk_gmac-dwmac fe2a0000.ethernet: cannot get clock clk_mac_speed [ 2.352945] rk_gmac-dwmac fe2a0000.ethernet: clock input from PHY [ 2.354956] rk_gmac-dwmac fe2a0000.ethernet: init for RMII [ 2.355967] rk_gmac-dwmac fe2a0000.ethernet: User ID: 0x10, Synopsys ID: 0x35 [ 2.356978] rk_gmac-dwmac fe2a0000.ethernet: DWMAC1000 [ 2.357989] rk_gmac-dwmac fe2a0000.ethernet: DMA HW capability register supported [ 2.359000] rk_gmac-dwmac fe2a0000.ethernet: RX Checksum Offload Engine supported [ 2.360011] rk_gmac-dwmac fe2a0000.ethernet: COE Type 2 [ 2.361022] rk_gmac-dwmac fe2a0000.ethernet: TX Checksum insertion supported [ 2.362033] rk_gmac-dwmac fe2a0000.ethernet: Wake-Up On Lan supported [ 2.363044] rk_gmac-dwmac fe2a0000.ethernet: Normal descriptors [ 2.364055] rk_gmac-dwmac fe2a0000.ethernet: Ring mode enabled [ 2.365066] rk_gmac-dwmac fe2a0000.ethernet: Enable RX Mitigation via HW Watchdog Timer [ 2.366077] libphy: stmmac: probed [ 2.367088] rk_gmac-dwmac fe2a0000.ethernet eth0: PHY [stmmac-0:00] driver [Generic PHY] (irq=POLL) [ 2.368099] rk_gmac-dwmac fe2a0000.ethernet eth0: No Safety Features support found [ 2.369110] rk_gmac-dwmac fe2a0000.ethernet eth0: PTP not supported by HW [ 2.370121] rk_gmac-dwmac fe2a0000.ethernet eth0: configuring for phy/rmii link mode6. 常见问题排查
即使按照上述步骤配置,在实际操作中仍可能遇到各种问题。以下是几个常见问题及解决方法:
6.1 以太网接口无法识别
现象:ifconfig看不到eth0接口,dmesg中也没有相关日志
可能原因:
- DTS中status未设置为"okay"
- 时钟配置错误
- PHY复位信号不正确
解决方法:
- 确认DTS中status = "okay"
- 检查时钟配置,确保clock-frequency = <50000000>
- 用万用表测量PHY复位信号,确认复位时序符合要求
6.2 能识别接口但无法连接
现象:ifconfig显示eth0存在,但无法获取IP或连接网络
可能原因:
- PHY地址(reg)设置错误
- MDIO/MDC线路连接问题
- 网线或对端设备问题
解决方法:
- 尝试不同的PHY地址(通常是0或1)
- 检查MDIO/MDC线路是否连接正确
- 更换网线或测试对端设备
6.3 连接不稳定或速度慢
现象:连接时断时续,或速度明显低于100Mbps
可能原因:
- 时钟信号质量差
- 阻抗匹配问题
- 电磁干扰
解决方法:
- 用示波器检查50MHz时钟信号质量
- 检查PCB走线阻抗是否符合要求
- 尝试缩短网线长度或使用屏蔽网线
7. 高级调试技巧
当遇到难以解决的问题时,可以使用更深入的调试方法:
7.1 启用内核调试信息
重新配置内核,启用以下选项:
CONFIG_DEBUG_FS=y CONFIG_DWMAC_DEBUGFS=y CONFIG_PHYLIB_DEBUG=y然后可以查看详细的调试信息:
cat /sys/kernel/debug/stmmaceth/eth0/descriptors cat /sys/kernel/debug/stmmaceth/eth0/dma_cap7.2 使用ethtool工具
ethtool是诊断以太网问题的强大工具:
# 安装ethtool sudo apt install ethtool # 查看接口信息 ethtool eth0 # 查看PHY寄存器 ethtool -d eth0 # 测试链路 ethtool -t eth07.3 逻辑分析仪抓包
对于硬件层面的问题,可以使用逻辑分析仪抓取RMII接口信号:
- 连接逻辑分析仪到RMII信号线
- 设置采样率至少200MHz(因为RMII时钟是50MHz)
- 分析数据包是否符合IEEE 802.3标准
8. 性能优化建议
完成基本功能配置后,可以考虑以下优化措施:
启用硬件校验和卸载:减少CPU负载
&gmac0 { snps,no-pbl-xgmac; snps,pbl = <16>; snps,txpbl = <16>; snps,rxpbl = <16>; snps,multicast-filter-bins = <256>; snps,perfect-filter-entries = <1>; };调整DMA缓冲区大小:提高吞吐量
&gmac0 { max-frame-size = <9000>; // 支持Jumbo Frame rx-fifo-depth = <4096>; tx-fifo-depth = <4096>; };优化中断处理:减少延迟
echo 1 > /proc/irq/$(cat /proc/interrupts | grep eth0 | awk '{print $1}' | tr -d :) /smp_affinity
在实际项目中,我遇到过RMII时钟信号质量导致的不稳定问题,最终通过调整PCB布局和增加时钟缓冲器解决了问题。另一个常见陷阱是忘记配置PHY的复位信号,这会导致PHY无法正确初始化。
