1. RK3506mini开发板uboot网络功能独立配置实战
作为一名嵌入式开发老鸟,最近在折腾RK3506mini开发板时遇到个典型需求:要让uboot在不依赖内核设备树的情况下支持tftp网络功能,方便裸机程序调试。这个需求在早期开发阶段特别实用,能省去反复烧录的麻烦。下面就把我的完整配置过程记录下来,包含你可能遇到的坑和解决方案。
先说说为什么需要这个功能。传统开发流程中,uboot通常依赖内核设备树来获取硬件配置信息。但在裸机开发阶段,我们可能频繁修改和测试小程序,每次都要编译完整内核显然效率太低。通过让uboot独立支持网络功能,可以直接用tftp加载裸机程序到内存运行,调试效率能提升好几倍。
2. 核心配置步骤详解
2.1 基础环境准备
在开始前,请确保你已经具备:
- 编译好的RK3506mini开发板uboot源码
- 交叉编译工具链(建议使用官方推荐的版本)
- 开发板串口调试工具(我用的CP2102模块)
- 网线连接开发板与路由器(确保在同一局域网)
- TFTP服务器软件(文中用MobaXterm内置的)
注意:不同版本的uboot可能存在配置差异,本文基于2023.04版本的uboot源码,其他版本可能需要调整。
2.2 关键配置修改
2.2.1 禁用内核设备树依赖
首先修改uboot配置文件rk3506_tb.config,添加以下两行:
makefile复制CONFIG_USING_KERNEL_DTB_V2=n
CONFIG_USING_KERNEL_DTB=n
这两行配置的作用是告诉uboot不要尝试加载内核设备树。在RK平台的uboot中,USING_KERNEL_DTB系列配置控制着设备树的加载行为。设为n后,uboot会完全使用自己内置的设备树描述。
踩坑记录:早期版本可能只有其中一个配置项,新版uboot增加了V2版本配置。如果只改一个可能会导致配置不彻底,出现奇怪的内存错误。
2.2.2 启动延时设置(可选)
为了方便调试,建议在配置文件末尾添加:
makefile复制CONFIG_SPL_KERNEL_BOOT=n
CONFIG_BOOTDELAY=5
SPL_KERNEL_BOOT=n禁用SPL阶段自动启动内核BOOTDELAY=5设置5秒等待时间,方便打断自动启动
如果不设置延时,你需要在启动时快速按Ctrl+C进入uboot命令行。对于频繁调试的场景,设置延时会更方便。
实测技巧:开发阶段建议设5秒,量产时再改回0。我曾因为忘记改回来导致产品启动慢被客户投诉...
2.3 以太网驱动设备树配置
这是最关键的步骤,需要在u-boot/arch/arm/dts/rk3506-u-boot.dtsi文件末尾添加以太网配置:
dts复制&gmac0 {
u-boot,dm-pre-reloc;
status = "okay";
phy-mode = "rmii";
clock_in_out = "input";
snps,reset-gpio = <&gpio0 RK_PC2 GPIO_ACTIVE_LOW>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru CLK_MAC0>;
assigned-clock-rates = <25000000>;
pinctrl-names = "default";
pinctrl-0 = <ð_rmii0_mdc_pins ð_rmii0_mdio_pins
ð_rmii0_rmii0_tx_bus2_pins ð_rmii0_rmii0_rx_bus2_pins
ð_rmii0_clk_pins>;
phy-handle = <&rmii_phy0>;
};
&mdio0 {
u-boot,dm-pre-reloc;
status = "okay";
rmii_phy0: phy@1 {
compatible = "ethernet-phy-ieee802.3-c22";
u-boot,dm-pre-reloc;
reg = <0x1>;
clocks = <&cru CLK_MAC_OUT>;
};
};
这段配置做了以下几件事:
- 启用GMAC0以太网控制器
- 配置为RMII接口模式
- 设置复位GPIO和时序参数
- 配置时钟频率为25MHz
- 设置正确的引脚复用
- 启用MDIO总线并连接PHY芯片
硬件原理小课堂:RMII(Reduced Media Independent Interface)是简化版的MII接口,只用7根数据线而不是MII的16根,适合低速以太网应用。RK3506的MAC控制器通过RMII接口连接外部PHY芯片。
3. 网络环境配置与验证
3.1 编译与烧写
完成配置后,重新编译uboot:
bash复制make CROSS_COMPILE=aarch64-linux-gnu- rk3506_tb_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- -j8
编译成功后,使用RK官方工具将u-boot-rockchip.bin烧写到开发板。
3.2 IP地址设置
在uboot命令行中设置网络参数:
bash复制setenv ipaddr 192.168.31.100
setenv serverip 192.168.31.10
setenv gatewayip 192.168.31.1
setenv netmask 255.255.255.0
saveenv
参数说明:
ipaddr:开发板IP地址serverip:TFTP服务器IPgatewayip:网关地址netmask:子网掩码
网络调试经验:建议先用ping命令测试网络连通性。我曾花了2小时调试不成功的tftp,最后发现是网线接触不良...
3.3 TFTP服务器配置
在PC端(192.168.31.10)启动TFTP服务器:
- 我用的MobaXterm内置TFTP服务
- 设置共享目录为存放裸机程序的文件夹
- 确保防火墙放行UDP 69端口

替代方案:如果不用MobaXterm,也可以使用tftpd32等专用TFTP服务器,但要注意路径不要有中文和空格。
4. 裸机程序加载与运行
4.1 裸机程序准备
编写一个简单的裸机程序(比如LED闪烁),编译生成.bin文件,放到TFTP共享目录。确保编译时指定了正确的加载地址(这里用0x01000000)。
4.2 加载与运行
在uboot命令行中执行:
bash复制tftp 0x01000000 led_blink.bin
go 0x01000000
这两条命令的作用:
tftp:从TFTP服务器下载led_blink.bin到内存0x01000000处go:跳转到指定地址执行程序
如果一切正常,你应该能看到开发板上的LED开始闪烁。
调试技巧:如果程序没反应,先用md命令检查内存内容是否正确加载。我遇到过因为内存地址冲突导致程序无法运行的情况。
5. 常见问题与解决方案
5.1 网络连接失败
现象:执行tftp命令时报"Timeout"或"Bad MAC"错误
排查步骤:
- 检查网线连接和指示灯状态
- 确认PHY芯片型号与驱动匹配
- 用
ping $serverip测试基础网络 - 检查设备树中的复位GPIO配置是否正确
典型解决方案:
bash复制# 重新初始化网络
mw.l 0xff540000 0x00010000 # 复位MAC控制器
mw.l 0xff540004 0x00010000
mw.l 0xff540008 0x00010000
dhcp
5.2 裸机程序无法运行
现象:go命令执行后无反应或报错
可能原因:
- 内存地址冲突(uboot自身占用)
- 程序入口点不正确
- 编译时没有指定-nostdlib
解决方案:
- 尝试不同的加载地址(如0x02000000)
- 检查链接脚本中的入口地址
- 确保编译命令包含
-nostartfiles -nostdlib
5.3 性能优化建议
对于需要频繁加载调试的场景,可以优化uboot环境:
bash复制setenv autostart yes # 自动运行下载的程序
setenv bootcmd 'tftp 0x01000000 myapp.bin; go 0x01000000'
saveenv
这样上电后会自动加载并运行指定程序。
6. 进阶应用:结合gdb远程调试
对于复杂裸机程序,可以配合gdb进行调试:
- 在uboot中加载程序:
bash复制tftp 0x01000000 debug_app.bin
- 在主机端启动gdb:
bash复制aarch64-linux-gnu-gdb debug_app.elf
target remote :1234 # 连接开发板
- 在uboot中启动gdbserver:
bash复制gdbserver 0x01000000
这套组合拳特别适合调试RTOS移植或硬件异常问题。我曾用它定位过一个棘手的DMA传输问题,节省了至少两天时间。
最后提醒下,量产时记得恢复默认配置,移除调试延时和自动启动设置。这个方案最适合用在开发调试阶段,能大幅提升裸机开发的效率。