4. U-Boot编译与烧录:U-Boot源码结构、RK平台U-Boot配置、编译流程、烧录工具使用
U-Boot 是嵌入式系统的第一道门槛。说白了,它就是上电后第一个跑起来的程序,负责初始化硬件、加载内核。瑞芯微平台用的 U-Boot 是官方维护的一个分支,叫 rk-u-boot。我刚开始接触时也觉得这东西挺复杂,但拆开来看,其实就几个核心模块。
4.1 U-Boot 源码结构
瑞芯微的 U-Boot 源码,你从 GitHub 拉下来后,目录结构是这样的:
u-boot/
├── arch/ # 架构相关代码
│ └── arm/ # ARM 架构
│ ├── cpu/ # CPU 初始化
│ ├── dts/ # 设备树
│ └── mach-rockchip/ # 瑞芯微平台特有
├── board/ # 板级支持
│ └── rockchip/ # 瑞芯微各开发板
├── configs/ # 默认配置文件
├── drivers/ # 驱动
├── include/ # 头文件
├── scripts/ # 编译脚本
└── tools/ # 烧录工具
我个人习惯重点关注三个目录:
- arch/arm/mach-rockchip/:芯片级初始化,比如时钟、DDR、复位。
- board/rockchip/:板级配置,比如 GPIO 复用、电源管理。
- configs/:编译开关,决定了 U-Boot 支持哪些功能。
小技巧: 我一般先看
configs/ 下的配置文件,能快速了解这块板子开了哪些功能。比如 rk3588_defconfig 里有没有开 CONFIG_USB,一眼就知道支不支持 USB 烧录。
4.2 RK平台U-Boot配置
瑞芯微的 U-Boot 配置分两层:
- 默认配置:在
configs/目录下,比如rk3588_defconfig。 - 设备树:在
arch/arm/dts/目录下,比如rk3588-evb1.dts。
配置流程很简单:
# 1. 加载默认配置
make rk3588_defconfig
# 2. 进入菜单配置(可选)
make menuconfig
# 3. 保存配置
make savedefconfig
这里有个坑。我曾经在 menuconfig 里改了一堆选项,结果编译出来 U-Boot 起不来。后来发现是设备树里某个 GPIO 的 pinctrl 没配好。所以我的建议是:能用默认配置就别乱改,真要改,先改设备树,再改配置。
| 配置项 | 说明 | 常见值 |
|---|---|---|
CONFIG_SYS_TEXT_BASE |
U-Boot 加载地址 | 0x00200000 |
CONFIG_BOOTDELAY |
启动延时(秒) | 2 |
CONFIG_BAUDRATE |
串口波特率 | 1500000 |
CONFIG_USB_FUNCTION_MASS_STORAGE |
USB 烧录支持 | y |
4.3 编译流程
编译 U-Boot 其实就三步。但每一步都有讲究。
4.3.1 设置交叉编译工具链
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
你想想看,如果不设 CROSS_COMPILE,系统会用本机的 gcc 去编译 ARM 代码,那肯定报错。我见过不少新手卡在这一步。
4.3.2 执行编译
make rk3588_defconfig
make -j$(nproc)
-j$(nproc) 是并行编译,能快不少。但注意,如果内存不够(比如 4GB 的虚拟机),建议用 -j2,否则容易 OOM。
4.3.3 生成烧录文件
编译完成后,会生成几个关键文件:
- u-boot.bin:原始二进制,一般不用。
- u-boot.itb:包含 FIT 结构的镜像,瑞芯微常用。
- idbloader.img:一级引导加载器,必须烧录。
- uboot.img:U-Boot 主镜像,必须烧录。
- trust.img:ATF(ARM Trusted Firmware),可选。
关键点: 瑞芯微的启动流程是:
idbloader.img → uboot.img → trust.img(如果启用安全启动)。缺一个都起不来。
4.4 烧录工具使用
瑞芯微官方烧录工具叫 RKDevTool(Windows)和 rkdeveloptool(Linux)。我个人更推荐 Linux 下的命令行工具,稳定且可控。
4.4.1 安装 rkdeveloptool
git clone https://github.com/rockchip-linux/rkdeveloptool
cd rkdeveloptool
autoreconf -i
./configure
make
sudo make install
4.4.2 进入烧录模式
瑞芯微的板子有两种方式进入烧录模式:
- 按住 RECOVERY 键,再上电:最常用。
- 通过 ADB 命令:
adb reboot loader(如果系统已启动)。
进入后,用 lsusb 能看到设备:
Bus 001 Device 003: ID 2207:350a Rockchip
4.4.3 烧录命令
# 烧录 idbloader
sudo rkdeveloptool db idbloader.img
# 烧录 uboot
sudo rkdeveloptool wl 0x4000 uboot.img
# 烧录 trust
sudo rkdeveloptool wl 0x6000 trust.img
# 重启设备
sudo rkdeveloptool rd
这里 wl 后面的地址是分区偏移量。不同芯片不一样,RK3588 的偏移是:
| 分区 | 偏移地址 | 说明 |
|---|---|---|
| idbloader | 0x0 |
起始扇区 |
| uboot | 0x4000 |
第 16384 扇区 |
| trust | 0x6000 |
第 24576 扇区 |
警告: 烧录前一定要确认偏移地址。我曾经在 RK3399 上用了 RK3588 的偏移,结果板子变砖,只能短接 Flash 引脚救回来。所以,先看芯片手册,再动手。
4.5 知识结构图
下面这张图总结了 U-Boot 从源码到烧录的完整流程:
4.6 避坑指南
最后,分享几个我踩过的坑:
- 编译报错找不到
libpython:装python3-dev就行。我一开始以为是 Python 版本问题,折腾了半天。 - 烧录后串口无输出:先检查波特率。瑞芯微默认是 1500000,很多终端工具默认 115200,肯定没输出。
- U-Boot 启动卡在
DRAM初始化:大概率是 DDR 参数不对。检查board/rockchip/下的rk3588.c里的ddr_init配置。 - 烧录时提示
No such file or directory:路径问题。我习惯把烧录文件放在/tmp/下,避免权限和路径问题。
嗯,U-Boot 这块内容就这些。你只要把源码结构、配置、编译、烧录这四个环节串起来,基本就能搞定瑞芯微平台的 U-Boot 了。