香橙派Zero 3主线Linux移植避坑实录:手把手搞定BL31、Crust与U-Boot编译

📅 2026/7/1 4:42:34
香橙派Zero 3主线Linux移植避坑实录:手把手搞定BL31、Crust与U-Boot编译
香橙派Zero 3主线Linux移植避坑指南BL31、Crust与U-Boot编译实战解析最近在折腾香橙派Zero 3的全志H618芯片想给它移植主线Linux系统。本以为照着官方文档一步步来就能轻松搞定结果在BL31、Crust和U-Boot编译环节踩了不少坑。这篇文章就是我的踩坑实录希望能帮到同样遇到问题的朋友。1. 环境准备与工具链选择在开始编译之前环境配置是第一个容易出问题的地方。我最初使用的是Ubuntu 20.04结果发现有些依赖库版本不够新导致后续编译频频报错。后来换到Ubuntu 22.04才顺利通过。必备工具清单交叉编译工具链两个版本都需要gcc-arm-11.2-2022.02用于编译TF-A、U-Boot和内核or1k-linux-musl专门用于编译Crust固件开发工具build-essential、bison、flex等基础编译工具libssl-devU-Boot编译必需device-tree-compiler设备树处理工具注意工具链路径设置错误是新手最常见的错误之一。确保在编译每个组件前正确设置了PATH环境变量。工具链版本兼容性对比表组件推荐工具链不兼容版本典型错误表现BL31gcc-arm-11.2gcc-arm-8.x链接阶段失败Crustor1k-linux-musl其他架构工具链无法识别指令集U-Bootgcc-arm-11.2gcc-arm-9.x设备树编译错误2. BL31编译常见问题与解决BL31作为ARM可信固件是整个启动流程的第一环。全志H618的BL31编译有几个特别需要注意的地方。典型错误1PLAT参数选择不当# 错误示例会导致后续U-Boot无法正常加载 make PLATsun50i_h6 DEBUG1 bl31 # 正确示例H618应使用H616配置 make PLATsun50i_h616 DEBUG1 bl31全志H618实际上是H616的超频版本所以应该使用sun50i_h616平台配置。如果使用H6的配置虽然能编译通过但会导致后续U-Boot启动异常。典型错误2工具链路径未正确设置# 必须确保工具链路径正确设置 export PATH$PATH:/opt/gcc-arm-11.2/bin export CROSS_COMPILEaarch64-none-linux-gnu-如果遇到类似aarch64-none-linux-gnu-gcc: command not found的错误就是路径设置问题。建议使用绝对路径更可靠。编译成功后生成的BL31.bin文件位于build/sun50i_h616/debug/bl31.bin3. Crust电源管理固件编译陷阱Crust是全志SoC特有的电源管理固件编译过程有几个特别容易出错的地方。问题1错误的交叉编译链# 必须使用or1k架构专用工具链 export PATH$PATH:/opt/or1k-linux-musl/bin export CROSS_COMPILEor1k-linux-musl-使用错误的工具链会导致编译失败报错信息通常是无法识别的指令集。问题2配置文件选择不当# 正确配置命令 make orangepi_3_defconfig make -j$(nproc) scp虽然我们用的是Zero 3但应该选择orangepi_3_defconfig而不是orangepi_zero3_defconfig因为两者都是H6系列芯片电源管理需求相似。编译成功后关键文件位于build/scp/scp.bin4. U-Boot编译与烧录实战U-Boot是整个启动流程中最复杂的部分也是问题最多的环节。关键环境变量设置# 必须正确设置BL31和SCP路径 export BL31/path/to/bl31.bin export SCP/path/to/scp.bin # 或者如果不想使用电源管理功能 export SCP/dev/null # 工具链设置 export PATH$PATH:/opt/gcc-arm-11.2/bin export CROSS_COMPILEaarch64-none-linux-gnu-编译命令make ARCHarm orangepi_zero3_defconfig make ARCHarm menuconfig # 可选用于自定义配置 make ARCHarm -j$(nproc)常见问题排查BL31未正确引用如果启动时卡在BL31阶段检查BL31路径是否正确以及是否使用了适合H616的BL31版本。设备树编译错误如果遇到dtc相关的错误尝试更新设备树编译器或检查设备树源文件是否有语法错误。双重启动现象有时U-Boot会启动两次这通常是因为SPL和U-Boot配置不一致导致的检查defconfig文件中的配置项。烧录技巧# 烧录命令注意seek8参数很重要 sudo dd ifu-boot-sunxi-with-spl.bin of/dev/sdX bs1024 seek8 convfsync烧录前确保TF卡已正确分区建议至少分两个区第一个分区(FAT32)200MB用于存放内核和设备树第二个分区(EXT4)剩余空间用于根文件系统5. 调试技巧与高级问题解决当系统无法正常启动时串口调试是最有效的排查手段。香橙派Zero 3的调试串口是UART0波特率115200。常见启动问题分析卡在BL31阶段检查BL31是否针对H616正确编译确认U-Boot中引用的BL31版本正确电源管理异常如果系统无法正常关机/重启检查Crust固件是否正确编译和引用或者尝试export SCP/dev/null禁用电源管理DDR初始化失败这通常表示BL31与硬件不兼容尝试调整BL31中的DDR参数或使用更新的TF-A版本性能优化建议在U-Boot配置中启用CONFIG_ARM_CPU_SUSPEND可以改善电源管理调整BL31中的CPU频率设置可以获得更好的性能6. 实际项目中的经验分享在最近的一个项目中我们需要为香橙派Zero 3定制一个工业级Linux系统。除了基本的启动组件外还需要考虑以下因素可靠启动方案使用冗余设计在TF卡上保留两个U-Boot副本实现启动失败后的自动回滚机制生产环境优化# 生产环境烧录脚本示例 #!/bin/bash set -e echo 正在烧录U-Boot... dd ifu-boot-sunxi-with-spl.bin of/dev/sdX bs1024 seek8 convfsync echo 正在验证烧录结果... cmp -n $(stat -c%s u-boot-sunxi-with-spl.bin) u-boot-sunxi-with-spl.bin /dev/sdX -i 8192长期维护建议记录每次编译使用的确切版本号和配置为每个版本保留完整的构建环境快照使用git管理所有定制修改