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 配置分两层:

  1. 默认配置:在 configs/ 目录下,比如 rk3588_defconfig。
  2. 设备树:在 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 进入烧录模式

瑞芯微的板子有两种方式进入烧录模式:

  1. 按住 RECOVERY 键,再上电:最常用。
  2. 通过 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 从源码到烧录的完整流程:

U-Boot 编译与烧录流程 U-Boot 编译与烧录流程 U-Boot 源码 配置 (defconfig) 编译 (make) 编译输出文件 idbloader.img uboot.img trust.img u-boot.itb 烧录工具 RKDevTool (Windows) rkdeveloptool (Linux) 烧录到 Flash

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 了。