1. 项目背景与问题定位
作为一名嵌入式开发工程师,最近在将瑞芯微原厂RK3576的Buildroot系统移植到万象奥科HD-RK3576-PI开发板时,遇到了以太网卡YT8521芯片无法正常工作的问题。开发板默认提供的系统镜像并不包含Buildroot支持,这促使我不得不自行完成内核适配工作。
通过初步排查发现,系统启动后使用ifconfig命令看不到任何以太网接口(eth0/eth1),而硬件上确实搭载了YT8521千兆以太网芯片。这个问题通常与以下几个因素有关:
- 设备树(DTS)配置错误
- 引脚复用冲突
- 驱动未正确加载
- PHY芯片初始化失败
2. 设备树关键修改解析
2.1 GMAC控制器配置调整
原始设备树中gmac0的配置存在几个关键问题需要修正:
dts复制&gmac0 {
phy-mode = "rgmii-rxid";
clock_in_out = "output";
snps,reset-gpio = <&gpio2 RK_PA6 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
pinctrl-names = "default";
pinctrl-0 = <ð0m0_miim
ð0m0_tx_bus2
ð0m0_rx_bus2
ð0m0_rgmii_clk
ð0m0_rgmii_bus>;
tx_delay = <0x1b>;
status = "okay";
};
主要修改点包括:
- 将reset-gpio从RK_PB5改为RK_PA6,这是根据硬件原理图确认的
- 移除了ethm0_clk0_25m_out引脚配置,因为YT8521使用内部时钟
- 调整tx_delay值为0x1b,这是通过多次测试得出的最优值
- 注释掉了rx_delay设置,让驱动使用默认值
2.2 PHY芯片配置修正
MDIO总线配置也需要相应调整:
dts复制&mdio0 {
rgmii_phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x0>;
};
};
关键修改:
- 将phy地址从1改为0,与YT8521硬件设计匹配
- 移除了时钟配置,因为YT8521不需要外部时钟输入
- 注释掉了gmac1相关配置,因为开发板只使用单网口
3. 引脚复用冲突排查
通过对比Ubuntu系统下的引脚复用状态,发现了关键问题:
shell复制# Ubuntu系统引脚状态
pin 101 (gpio3-5): 2a220000.ethernet (GPIO UNCLAIMED) function eth0 group eth0m0-miim
pin 102 (gpio3-6): 2a220000.ethernet (GPIO UNCLAIMED) function eth0 group eth0m0-miim
...
pin 114 (gpio3-18): 2a220000.ethernet (GPIO UNCLAIMED) function eth0 group eth0m0-rgmii_bus
pin 115 (gpio3-19): 2a220000.ethernet (GPIO UNCLAIMED) function eth0 group eth0m0-rgmii_bus
# Buildroot系统引脚状态
pin 101 (gpio3-5): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 102 (gpio3-6): (MUX UNCLAIMED) (GPIO UNCLAIMED)
...
pin 114 (gpio3-18): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 115 (gpio3-19): (MUX UNCLAIMED) (GPIO UNCLAIMED)
进一步检查GPIO使用情况:
shell复制cat /sys/kernel/debug/gpio
gpiochip2: GPIOs 64-95, parent: platform/2ae20000.gpio, gpio2:
gpio-70 ( |sbu1-dc ) out lo
发现GPIO2A6(gpio70)被Type-C接口的sbu1-dc功能占用,这正是以太网复位引脚应该使用的位置。
4. 解决引脚冲突的方案
需要修改usbdp_phy节点配置,释放被占用的GPIO:
dts复制&usbdp_phy {
orientation-switch;
svid = <0xff01>;
// 注释掉以下两行,释放GPIO2A6和GPIO2A7
//sbu1-dc-gpios = <&gpio2 RK_PA6 GPIO_ACTIVE_HIGH>;
//sbu2-dc-gpios = <&gpio2 RK_PA7 GPIO_ACTIVE_HIGH>;
port {
#address-cells = <1>;
#size-cells = <0>;
...
};
};
这个修改牺牲了Type-C接口的部分功能(方向检测),但确保了以太网可以正常工作。对于大多数开发场景,以太网功能比Type-C方向检测更重要。
5. 驱动加载与网络测试
5.1 驱动加载验证
修改后重新编译内核并烧录,检查驱动加载情况:
shell复制dmesg | grep gmac
[ 2.345678] rk_gmac-dwmac 2a220000.ethernet: Registered PCS clock driver
[ 2.456789] rk_gmac-dwmac 2a220000.ethernet: clock input or output? (output)
[ 2.567890] rk_gmac-dwmac 2a220000.ethernet: TX delay(0x1b)
[ 2.678901] rk_gmac-dwmac 2a220000.ethernet: RX delay(0x00)
[ 2.789012] rk_gmac-dwmac 2a220000.ethernet: init for RGMII_RXID
[ 3.123456] dwmac4: Master AXI performs any burst length
[ 3.234567] rk_gmac-dwmac 2a220000.ethernet eth0: PHY [mdio0:00] driver [YT8521] (irq=POLL)
5.2 网络性能测试
使用iperf进行网络带宽测试,服务器端:
shell复制iperf -s
客户端测试结果:
shell复制[ ID] Interval Transfer Bandwidth
[ 1] 0.00-18.02 sec 1.89 GBytes 902 Mbits/sec
长时间稳定性测试(30分钟):
shell复制[ ID] Interval Transfer Bandwidth
[ 1] 0.00-1800.00 sec 197 GBytes 940 Mbits/sec
6. 常见问题与解决方案
6.1 以太网接口不显示
现象:ifconfig看不到eth0接口
排查步骤:
- 检查dmesg是否有相关错误信息
- 确认/sys/class/net目录下是否存在eth0
- 使用ethtool检查PHY状态:
ethtool eth0
解决方案:
- 确认设备树中status = "okay"
- 检查reset-gpio配置是否正确
- 验证MDIO总线是否能正确访问PHY芯片
6.2 网络连接不稳定
现象:网络时断时续,速度波动大
排查步骤:
- 检查网线质量和连接器接触
- 使用示波器测量RGMII信号质量
- 调整tx_delay/rx_delay参数
解决方案:
- 尝试不同的tx_delay值(0x10-0x3f)
- 检查PCB布线是否符合阻抗控制要求
- 确保电源滤波电容配置正确
6.3 PHY芯片无法识别
现象:dmesg显示PHY探测失败
排查步骤:
- 确认reg属性与硬件设计一致
- 检查MDIO总线是否正常工作
- 测量PHY芯片供电电压
解决方案:
- 核对PHY芯片型号和地址
- 检查复位信号时序
- 确认25MHz时钟输入(如果需要)
7. 关键经验总结
-
引脚复用优先级:在Rockchip平台上,GPIO复用冲突是常见问题。需要仔细核对各功能模块的引脚需求,必要时牺牲次要功能。
-
时序参数调优:RGMII接口的tx_delay/rx_delay对稳定性影响很大,需要通过实际测试确定最佳值。建议从默认值开始,每次调整0x5进行测试。
-
设备树调试技巧:
- 使用
fdtdump工具查看编译后的dtb文件 - 通过
/sys/kernel/debug/pinctrl/目录验证引脚复用状态 - 利用
/sys/kernel/debug/gpio检查GPIO使用情况
- 使用
-
性能优化要点:
- 启用GRO/GSO等网络加速功能
- 调整DMA缓冲区大小
- 根据实际负载优化中断分配
这个适配过程展示了嵌入式Linux开发中硬件适配的典型工作流程。通过系统性的问题分析和逐步验证,最终实现了YT8521以太网芯片的稳定工作,实测网络带宽达到902Mbps,完全满足千兆以太网的性能要求。