RK3568双网口配置实战:如何用DTS同时启用两个百兆RMII以太网(gmac0 gmac1)
RK3568双网口深度配置指南:从DTS优化到实战排错
在工业控制、边缘计算和网络设备开发领域,多网口设计已成为基础需求。RK3568作为一款高性能处理器,其双GMAC控制器为开发者提供了灵活的以太网连接方案。但当两个百兆RMII接口需要同时工作时,时钟分配、引脚冲突和PHY配置等问题会接踵而至。本文将带您从硬件原理出发,逐步构建一个稳定可靠的双网口系统。
1. 理解RK3568的网络子系统架构
RK3568内置两个独立的GMAC控制器(gmac0和gmac1),每个控制器都支持多种接口模式。在RMII百兆模式下,两个控制器共享部分时钟资源,这是配置时需要特别注意的关键点。
核心硬件资源分配:
- 时钟树结构:
- gmac0主时钟源:可选择内部PLL或外部输入
- gmac1主时钟源:依赖独立的gmac1_clkin
- 引脚复用情况:
- gmac0默认使用GPIO4组引脚
- gmac1默认使用GPIO3组引脚
- 中断分配:
- 每个GMAC使用独立的中断线
典型的硬件连接方案中,两个RMII PHY芯片需要正确连接到处理器的对应引脚。以下是推荐的最小硬件配置:
// 外部时钟定义 &gmac0_clkin { clock-frequency = <50000000>; }; &gmac1_clkin { clock-frequency = <50000000>; };2. 双网口DTS配置的完整实现
完整的DTS配置需要考虑时钟、引脚、PHY和电源管理等多个方面。下面是一个经过生产验证的双网口配置模板:
&gmac0 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio2 RK_PD3 GPIO_ACTIVE_LOW>; snps,reset-active-low; snps,reset-delays-us = <0 20000 100000>; 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>, <&gmac0_clkinout>, <&gmac0_rx_bus2>, <&gmac0_tx_bus2>, <&gmac0_rx_er>; phy-handle = <&rmii_phy0>; status = "okay"; }; &gmac1 { phy-mode = "rmii"; clock_in_out = "input"; snps,reset-gpio = <&gpio2 RK_PD1 GPIO_ACTIVE_LOW>; snps,reset-active-low; snps,reset-delays-us = <0 20000 100000>; assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; assigned-clock-parents = <&cru SCLK_GMAC1_RMII_SPEED>, <&gmac1_clkin>; assigned-clock-rates = <0>, <50000000>; pinctrl-names = "default"; pinctrl-0 = <&gmac1m1_miim>, <&gmac1m1_clkinout>, <&gmac1m1_rx_bus2>, <&gmac1m1_tx_bus2>, <&gmac1m1_rx_er>; phy-handle = <&rmii_phy1>; status = "okay"; };关键参数对比表:
| 配置项 | gmac0 | gmac1 |
|---|---|---|
| 时钟源 | SCLK_GMAC0_RMII_SPEED | gmac1_clkin外部输入 |
| 复位GPIO | GPIO2_D3 | GPIO2_D1 |
| 引脚控制组 | gmac0_* | gmac1m1_* |
| PHY连接方式 | 通过MDIO总线访问phy0 | 通过MDIO总线访问phy1 |
3. 内核驱动与接口命名策略
Linux内核会根据设备树中的定义顺序为网络接口分配名称。在双网口系统中,确保接口命名稳定非常重要。
控制命名顺序的方法:
- 修改udev规则:
# /etc/udev/rules.d/70-persistent-net.rules SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", NAME="lan0" - 使用网络管理器重命名:
# /etc/NetworkManager/conf.d/99-rename.conf [connection] match-device=interface-name:eth* name=wan0
常见问题排查命令:
# 检查时钟状态 cat /sys/kernel/debug/clk/clk_summary | grep gmac # 验证PHY连接 mii-tool -v # 查看中断分配 cat /proc/interrupts | grep eth4. 实战调试技巧与性能优化
当双网口配置完成后,还需要进行系统级优化才能达到最佳性能。
稳定性调优参数:
# 增加RX/TX缓冲区 ethtool -G eth0 rx 2048 tx 2048 ethtool -G eth1 rx 2048 tx 2048 # 调整中断亲和性 echo 2 > /proc/irq/$(cat /proc/interrupts | grep eth0 | awk '{print $1}' | cut -d: -f1)/smp_affinity echo 4 > /proc/irq/$(cat /proc/interrupts | grep eth1 | awk '{print $1}' | cut -d: -f1)/smp_affinity常见故障处理指南:
网口无法识别:
- 检查DTS中status是否为"okay"
- 验证时钟配置是否正确
- 测量PHY芯片的电源和复位信号
网络时断时续:
- 调整MDIO总线时序
&mdio { status = "okay"; #address-cells = <1>; #size-cells = <0>; phy0: ethernet-phy@0 { compatible = "ethernet-phy"; reg = <0>; max-speed = <100>; }; phy1: ethernet-phy@1 { compatible = "ethernet-phy"; reg = <1>; max-speed = <100>; }; };吞吐量不达标:
- 优化DMA缓冲区大小
&gmac0 { rx-fifo-depth = <4096>; tx-fifo-depth = <4096>; };
在完成所有配置后,建议运行以下测试验证双网口性能:
# 双向吞吐量测试 iperf3 -c 192.168.1.100 -B 192.168.1.1 -t 60 iperf3 -c 192.168.2.100 -B 192.168.2.1 -t 60 -R