保姆级教程:在Ubuntu 22.04上为Firefly RK3399编译带TPL/SPL的U-Boot 2023.07
深度实战:在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-pipArm架构的交叉编译工具链选择直接影响最终生成的固件质量。推荐使用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.02. 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 options | 5秒 | 设置自动启动延迟时间 |
| Device Drivers → Serial → Default baudrate | 1500000 | 匹配RK3399调试串口速率 |
| Boot images → .its file generator script | arch/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.itb6. 烧录到开发板
Firefly RK3399支持多种烧录方式,推荐使用Rockchip官方工具进行烧录:
进入Loader模式:
- 断开开发板电源
- 按住Recovery键不放
- 连接USB OTG接口到PC
- 保持按键按住状态通电
使用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=2048MB7. 高级调试技巧
当U-Boot无法正常启动时,可以尝试以下调试方法:
1. 启用详细日志在menuconfig中开启:
Boot options → [*] Enable verbose U-Boot console Device Drivers → Serial → [*] Debug UART2. 使用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 0x10001fff3. 关键信号测量点
| 测试点 | 正常值 | 测量工具 |
|---|---|---|
| PMIC_VDD_CPU | 0.9V | 万用表 |
| DDR_VREF | 0.75V | 示波器 |
| CLK_DDR | 800MHz | 频谱仪 |
4. 常见故障代码对照表
| 错误代码 | 可能原因 | 解决方案 |
|---|---|---|
| TPL无输出 | 电源异常 | 检查PMIC配置 |
| SPL卡住 | DDR初始化失败 | 验证DRAM参数 |
| U-Boot崩溃 | 镜像损坏 | 重新烧录 |
在实际项目中,我发现最常出现的问题是DDR初始化失败。通过调整include/configs/rk3399_common.h中的CONFIG_ROCKCHIP_SDRAM_COMMON相关参数,可以优化内存稳定性。另一个实用技巧是在spl/u-boot-spl.lds中增加调试符号,便于分析启动流程。
