Firefly RK3399开发板:从官方镜像到自编译uboot的实战指南
第一次拿到Firefly RK3399开发板时,我和大多数嵌入式新手一样,只会用官方提供的镜像文件进行烧录。直到某天突发奇想——为什么不试试自己编译uboot?这个决定让我在接下来两周里经历了无数次环境配置失败、编译报错和深夜debug。本文将用真实踩坑记录,带你走通这条充满挑战却收获满满的技术路径。
1. 环境准备:工具链与依赖项
1.1 交叉编译工具链配置
Arm架构的开发板需要专用的交叉编译工具链。我选择了Arm官方提供的arm-gnu-toolchain-13.2.Rel1版本,这个选择后来证明非常关键——太旧的版本会导致后续编译出现兼容性问题。
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 /usr/local/arm环境变量配置是第一个坑点。很多教程建议修改/etc/profile,但这可能导致系统级影响。更安全的做法是在用户目录的.bashrc中添加:
echo 'export PATH=/usr/local/arm/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH' >> ~/.bashrc source ~/.bashrc验证安装时,别被简单的版本检查迷惑:
aarch64-none-linux-gnu-gcc -v # 应该看到类似输出: # gcc version 13.2.1 20231011 (Arm GNU Toolchain 13.2.rel1)1.2 Python环境陷阱
编译uboot时遇到的第一个"惊喜"是Python依赖问题。现代uboot的某些组件需要Python 3.6+环境,而Ubuntu 18.04等老系统默认版本可能不满足要求。
典型错误示例:
ModuleNotFoundError: No module named 'setuptools'解决方案是安装完整的Python开发环境:
sudo apt update sudo apt install python3-setuptools python3-pip swig python3-dev pip3 install pyelftools --user注意:务必使用
pip3而非pip,避免与系统Python 2.x环境冲突
2. uboot源码配置的艺术
2.1 获取与解压源码
官方uboot源码更新频繁,我选择2023.07这个稳定版本:
wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2 tar -jxf u-boot-2023.07.tar.bz2 cd u-boot-2023.072.2 关键配置调整
Firefly RK3399有官方提供的默认配置:
make firefly-rk3399_defconfig但以下几个定制化配置直接影响启动成功率:
串口波特率调整:
Device Drivers → Serial → (1500000) Default baudrateFirefly开发板默认使用1.5M波特率而非常见的115200
eMMC配置优化:
Device Drivers → MMC Host controller Support → [ ] enable HS400 support [ ] Support SDHCI SDMA关闭这两项可避免早期启动阶段的eMMC读取问题
FIT镜像生成脚本: 需要从Rockchip官方仓库获取专用脚本:
git clone https://github.com/rockchip-linux/u-boot.git cp rockchip-linux/u-boot/arch/arm/mach-rockchip/make_fit_atf.py ./arch/arm/mach-rockchip/然后在menuconfig中指定路径:
Boot options → Boot images → [*] Use a script to generate the .its script (.its file generator script for U-Boot FIT image) arch/arm/mach-rockchip/make_fit_atf.py
3. ATF(ARM Trusted Firmware)集成
RK3399启动流程中,BL31(ARM Trusted Firmware)是uboot的前置条件。虽然可以跳过自编译直接使用预编译版本,但了解整个过程很有必要。
3.1 获取BL31的两种方式
方法一:官方预编译版本(推荐新手)
git clone https://github.com/rockchip-linux/rkbin.git cp rkbin/bin/rk33/rk3399_bl31_v1.36.elf ./ mv rk3399_bl31_v1.36.elf atf-bl31方法二:自行编译(适合深入学习)
git clone https://github.com/ARM-software/arm-trusted-firmware.git --depth 1 cd arm-trusted-firmware make CROSS_COMPILE=aarch64-none-linux-gnu- PLAT=rk3399需要额外安装
gcc-arm-none-eabi工具链
3.2 常见编译错误解决
当看到如下错误时:
fatal error: Python.h: No such file or directory需要安装Python开发头文件:
sudo apt install python3.8-dev # 根据系统Python版本调整4. 编译与生成启动镜像
4.1 完整编译命令
make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)关键产物:
tpl/u-boot-tpl.bin:初始内存控制器初始化代码spl/u-boot-spl.bin:二级加载程序u-boot.itb:包含完整uboot的FIT镜像
4.2 生成idbloader.img
这是Rockchip平台特有的启动镜像组合:
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:指定输入文件
5. 烧录实战:两种方法对比
5.1 使用AndroidTool烧录(Windows环境)
开发板进入Loader模式:
- 按住Recovery键
- 插入USB线
- 保持按键3秒后松开
烧录配置:
文件类型 起始扇区 对应文件 IDBLoader 0x40 idbloader.img U-Boot FIT 0x4000 u-boot.itb
5.2 直接在Linux系统下烧写eMMC
如果开发板已运行Linux系统,可以直接使用dd命令:
sudo dd if=idbloader.img of=/dev/mmcblk0 seek=64 conv=notrunc sudo dd if=u-boot.itb of=/dev/mmcblk0 seek=16384 conv=notrunc重要提示:务必确认
/dev/mmcblk0是eMMC设备而非主机SD卡!
6. 启动验证与调试技巧
成功烧录后,通过串口观察启动日志(波特率1500000):
U-Boot SPL 2023.07 (Oct 15 2023 - 16:20:33 +0800) Trying to boot from MMC1常见问题排查:
卡在TPL阶段:
- 检查DDR初始化配置
- 确认idbloader.img生成正确
SPL加载失败:
- 验证eMMC/SD卡读写配置
- 检查烧录的扇区位置是否正确
uboot无法启动:
- 确认u-boot.itb包含所有必要组件
- 检查FIT镜像生成脚本路径
7. 进阶:自定义启动参数
修改include/configs/firefly-rk3399.h可以定制默认环境变量:
#define CONFIG_BOOTCOMMAND \ "mmc dev 0; " \ "ext4load mmc 0:1 0x00200000 /boot/Image; " \ "ext4load mmc 0:1 0x08300000 /boot/rk3399-firefly.dtb; " \ "booti 0x00200000 - 0x08300000"这个配置让开发板直接从eMMC加载内核和设备树。