保姆级教程:在Ubuntu 22.04上为Firefly RK3399编译带TPL/SPL的U-Boot 2023.07
2026/5/6 1:23:30 网站建设 项目流程

深度实战:在Ubuntu 22.04上为Firefly RK3399构建定制化U-Boot全流程

当开发者拿到一块Firefly RK3399开发板时,官方预编译的U-Boot镜像虽然开箱即用,但往往无法满足深度定制需求。本文将完整演示从工具链配置到最终烧录的全过程,特别针对TPL/SPL启动方式这一RK3399的特色机制进行详细剖析。不同于常规教程只展示成功路径,我们会重点分析可能遇到的依赖问题和编译错误解决方案。

1. 环境准备与工具链配置

在开始编译之前,需要确保Ubuntu 22.04系统已安装基本开发工具。以下命令将安装编译所需的底层依赖:

sudo apt update && sudo apt install -y build-essential bison flex \ libssl-dev libncurses5-dev python3-dev swig python3-pip

Arm架构的交叉编译工具链选择直接影响最终生成的固件质量。推荐使用Arm官方维护的GNU Toolchain 13.2版本,其优势在于:

  • 对Cortex-A72/A53架构的优化支持
  • 包含最新的安全补丁
  • 提供完整的调试工具链

下载并配置工具链的具体步骤:

wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz sudo tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt

永久性添加环境变量到~/.bashrc文件末尾:

echo 'export PATH="/opt/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH"' >> ~/.bashrc source ~/.bashrc

验证安装是否成功:

aarch64-none-linux-gnu-gcc --version

预期应看到类似输出:

aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 13.2.rel1) 13.2.0

2. U-Boot源码获取与基础配置

Rockchip平台的U-Boot有其特殊性,需要特别注意版本兼容性。2023.07版本对RK3399的支持较为完善:

wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2 tar -xjf u-boot-2023.07.tar.bz2 cd u-boot-2023.07

应用Firefly官方提供的默认配置:

make firefly-rk3399_defconfig

进入菜单配置界面进行关键参数调整:

make menuconfig

需要特别关注的配置项:

配置路径推荐值作用说明
Boot options → Autoboot options5秒设置自动启动延迟时间
Device Drivers → Serial → Default baudrate1500000匹配RK3399调试串口速率
Boot images → .its file generator scriptarch/arm/mach-rockchip/make_fit_atf.py指定FIT镜像生成脚本

提示:在menuconfig界面中,使用/键可以快速搜索配置项。保存配置时建议使用mv .config my_rk3399_defconfig备份配置文件。

3. 获取ARM可信固件(ATF)

RK3399采用TrustZone技术,需要ARM Trusted Firmware提供安全环境。虽然可以自行编译ATF获取bl31.elf,但更推荐使用Rockchip官方预编译版本:

git clone --depth 1 https://github.com/rockchip-linux/rkbin.git cp rkbin/bin/rk33/rk3399_bl31_v1.36.elf ./bl31.elf

自行编译ATF的备选方案(需额外工具链):

sudo apt install gcc-arm-none-eabi git clone --depth 1 https://github.com/ARM-software/arm-trusted-firmware.git cd arm-trusted-firmware make PLAT=rk3399

编译成功后可在build/rk3399/release目录找到bl31.elf。

4. 解决编译过程中的典型问题

U-Boot编译过程可能遇到多种环境问题,以下是常见错误及解决方案:

问题1:Python模块缺失

ModuleNotFoundError: No module named 'setuptools'

解决方案:

sudo apt install python3-setuptools python3-pip pip3 install pyelftools

问题2:SWIG工具缺失

unable to execute 'swig': No such file or directory

解决方案:

sudo apt install swig

问题3:头文件缺失

fatal error: Python.h: No such file or directory

解决方案:

sudo apt install python3-dev

问题4:文件权限问题

make: *** No rule to make target 'include/config/auto.conf'

解决方案:

chmod 755 scripts/* && chmod 755 include/config

完整编译命令:

make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)

成功编译后将生成以下关键文件:

  • tpl/u-boot-tpl.bin:初始引导加载程序
  • spl/u-boot-spl.bin:二级程序加载器
  • u-boot.bin:主U-Boot镜像

5. 构建启动镜像文件

RK3399采用独特的启动流程:BootROM → TPL → SPL → U-Boot。需要生成特殊的镜像组合:

生成idbloader.img

tools/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin idbloader.img cat spl/u-boot-spl.bin >> idbloader.img

参数说明:

  • -n rk3399:指定芯片型号
  • -T rksd:设置Rockchip SD卡启动格式
  • -d:指定输入文件

生成FIT镜像

make u-boot.itb ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu-

该命令将生成包含U-Boot和ATF的u-boot.itb文件。可以通过以下命令验证镜像完整性:

tools/mkimage -l u-boot.itb

6. 烧录到开发板

Firefly RK3399支持多种烧录方式,推荐使用Rockchip官方工具进行烧录:

  1. 进入Loader模式:

    • 断开开发板电源
    • 按住Recovery键不放
    • 连接USB OTG接口到PC
    • 保持按键按住状态通电
  2. 使用rkdeveloptool命令行工具烧录:

sudo apt install libusb-1.0-0-dev git clone https://github.com/rockchip-linux/rkdeveloptool.git cd rkdeveloptool && autoreconf -i && ./configure && make sudo ./rkdeveloptool db rkbin/rk33/rk3399_loader_v1.24.126.bin sudo ./rkdeveloptool wl 0x40 idbloader.img sudo ./rkdeveloptool wl 0x4000 u-boot.itb sudo ./rkdeveloptool rd

注意:扇区偏移量(0x40和0x4000)是RK3399的固定要求,不可更改。如果使用eMMC存储,建议先擦除原有内容:

sudo ./rkdeveloptool ef

作为质量检查,成功烧录后串口输出应该包含类似信息:

U-Boot TPL 2023.07 (Sep 01 2023 - 15:30:45) Channel 0: LPDDR4, 50MHz BW=32 Col=10 Bk=8 CS0 Row=16 CS1 Row=16 CS=2 Die BW=16 Size=2048MB

7. 高级调试技巧

当U-Boot无法正常启动时,可以尝试以下调试方法:

1. 启用详细日志在menuconfig中开启:

Boot options → [*] Enable verbose U-Boot console Device Drivers → Serial → [*] Debug UART

2. 使用JTAG调试OpenOCD配置示例:

source [find interface/jlink.cfg] transport select jtag set _CHIPNAME rk3399 jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x10001fff

3. 关键信号测量点

测试点正常值测量工具
PMIC_VDD_CPU0.9V万用表
DDR_VREF0.75V示波器
CLK_DDR800MHz频谱仪

4. 常见故障代码对照表

错误代码可能原因解决方案
TPL无输出电源异常检查PMIC配置
SPL卡住DDR初始化失败验证DRAM参数
U-Boot崩溃镜像损坏重新烧录

在实际项目中,我发现最常出现的问题是DDR初始化失败。通过调整include/configs/rk3399_common.h中的CONFIG_ROCKCHIP_SDRAM_COMMON相关参数,可以优化内存稳定性。另一个实用技巧是在spl/u-boot-spl.lds中增加调试符号,便于分析启动流程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询