RK3566安卓11开发板千兆网卡RTL8211F移植避坑全记录:从原理图到吞吐量测试
RK3566安卓11开发板千兆网卡RTL8211F移植实战:从硬件验证到性能调优
当一块搭载RK3566的开发板放在你面前,而千兆网卡却无法正常工作时,那种挫败感只有经历过的人才能体会。本文将带你完整复盘RTL8211F PHY在安卓11系统上的移植过程,从硬件原理图验证到最终的吞吐量测试,重点分享那些官方文档里找不到的实战经验。
1. 硬件接口验证:从原理图到DTS配置
移植千兆网卡的第一步是确保硬件连接与软件配置的完美匹配。RTL8211F支持RGMII和RMII两种接口模式,而RK3566的GMAC控制器同样兼容这两种标准。但问题往往出在细节上。
1.1 时钟配置的陷阱
根据原理图,我们的开发板采用RGMII模式,MAC端GMAC1_MCLKINOUT_M0悬空,PHY端XTAL_IN/XTAL_OUT由25MHz晶体提供时钟。这对应瑞芯微文档中的"PLL output 125M for TX_CLK, Crystal 25M for PHY"配置。
但在实际配置DTS时,我们发现一个关键细节:
&gmac1 { phy-mode = "rgmii"; clock_in_out = "input"; // 实测output也能工作 snps,reset-gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_LOW>; assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>, <&gmac1_clkin>; };有趣的是,无论clock_in_out设置为input还是output,网卡都能正常工作。这背后的原因是RTL8211F的时钟电路具有自动适应能力。但为了符合硬件设计规范,我们最终选择了与原理图匹配的input模式。
1.2 延时参数的奥秘
RGMII接口的tx_delay和rx_delay配置直接影响信号完整性。瑞芯微提供了《RGMII Delayline配置指南》,但实际值需要根据PCB布局调整:
tx_delay = <0x4d>; rx_delay = <0x2d>;我们通过示波器观察眼图,发现当tx_delay超过0x50时会出现数据包丢失。这个经验值比官方推荐值小15%,可能与我们的PCB叠层设计有关。
2. 驱动与电源管理:那些容易忽略的细节
2.1 驱动配置的隐藏关卡
虽然RK3566内核默认包含RTL8211F驱动,但编译时需要注意:
CONFIG_REALTEK_PHY=y这看起来简单,但我们遇到了一个坑:当同时启用CONFIG_RTL8211F_PHY_SEPARATE时,驱动会初始化失败。原因是安卓11内核版本中的realtek.c驱动存在兼容性问题,需要打补丁才能支持模块化加载。
2.2 电源管理的致命陷阱
最隐蔽的问题往往与电源相关。我们的原理图中GMAC IO电压由1.8V提供,但默认DTS配置为3.3V:
&pmu_io_domains { vccio5-supply = <&vcc_1v8>; // 原为vcc_3v3 };错误配置的症状非常诡异:ifconfig能看到网卡,但无法获取IP地址。通过示波器测量发现,当IO电压不匹配时,MDIO通信虽然能读取PHY ID,但后续寄存器访问会随机失败。
3. 性能调优:从基础功能到极致吞吐量
3.1 吞吐量测试方法论
我们使用iperf3进行双向测试,发现几个影响性能的关键因素:
| 测试场景 | 预期速率 | 实测速率 | 瓶颈点 |
|---|---|---|---|
| TCP发送 | 940Mbps | 890Mbps | TCP窗口大小 |
| TCP接收 | 940Mbps | 920Mbps | 中断负载均衡 |
| UDP发送 | 940Mbps | 935Mbps | PHY缓冲区 |
安卓端的测试命令需要特别优化:
./iperf3 -c 192.168.1.100 -w 2M -t 60 -l 16K -P 4增加并行连接数(-P)可以更好地利用千兆带宽,但要注意安卓系统的线程调度开销。
3.2 中断亲和性调优
默认情况下,所有网卡中断都集中在CPU0上。我们通过以下设置将中断分散到各核心:
echo 1 > /proc/irq/123/smp_affinity_list echo 2 > /proc/irq/124/smp_affinity_list配合RPS/XPS设置,TCP接收性能提升了18%:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus echo 1 > /sys/class/net/eth0/queues/tx-0/xps_cpus4. 功能完善:LED状态指示与热插拔
4.1 PHY寄存器编程技巧
RTL8211F的LED控制需要通过页选择寄存器访问扩展寄存器空间。我们的实现方案:
static int phy_rtl8211f_led_fixup(struct phy_device *phydev) { phy_write(phydev, 0x1F, 0x0D04); // 选择LED控制页 phy_write(phydev, 0x10, phy_read(phydev, 0x10) | (1<<8) | (1<<13)); return 0; }这段代码需要注册为PHY fixup,在驱动初始化时自动执行:
phy_register_fixup_for_uid(PHY_ID_RTL8211F, 0xffffffff, phy_rtl8211f_led_fixup);4.2 热插拔支持的关键配置
为了让网卡支持热插拔,需要在DTS中添加:
&gmac1 { phy-handle = <&rgmii_phy1>; phy-mode = "rgmii"; snps,reset-delays-us = <0 50000 100000>; phy-supply = <&vcc_phy>; };同时确保电源控制器能快速响应插拔事件。我们实测发现,复位延时小于50ms会导致热插拔识别不稳定。
