Firefly RK3399开发板:从官方镜像到自编译uboot,一个嵌入式小白的踩坑与填坑全记录
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波特率而非常见的115200eMMC配置优化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.py3. ATFARM Trusted Firmware集成RK3399启动流程中BL31ARM 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_COMPILEaarch64-none-linux-gnu- PLATrk3399需要额外安装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 ARCHarm CROSS_COMPILEaarch64-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 rksdRockchip SD卡启动格式-d指定输入文件5. 烧录实战两种方法对比5.1 使用AndroidTool烧录Windows环境开发板进入Loader模式按住Recovery键插入USB线保持按键3秒后松开烧录配置文件类型起始扇区对应文件IDBLoader0x40idbloader.imgU-Boot FIT0x4000u-boot.itb5.2 直接在Linux系统下烧写eMMC如果开发板已运行Linux系统可以直接使用dd命令sudo dd ifidbloader.img of/dev/mmcblk0 seek64 convnotrunc sudo dd ifu-boot.itb of/dev/mmcblk0 seek16384 convnotrunc重要提示务必确认/dev/mmcblk0是eMMC设备而非主机SD卡6. 启动验证与调试技巧成功烧录后通过串口观察启动日志波特率1500000U-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加载内核和设备树。