1. 香橙派Zero 3与U-Boot移植概述
香橙派Zero 3作为一款搭载全志H618处理器的嵌入式开发板,其启动流程依赖于BL31、SCP固件和U-Boot的协同工作。对于想要深度定制系统的开发者而言,掌握U-Boot的编译与烧录是必经之路。这个过程看似复杂,但拆解后其实就像搭积木——只要按步骤拼接关键组件,就能让板子顺利跑起主线Linux。
全志H618平台的特殊性在于需要三个核心固件配合:
- BL31:Arm可信固件,负责安全启动和硬件初始化
- SCP固件(Crust):全志特有的电源管理模块
- U-Boot:主引导程序,加载操作系统内核
我刚开始折腾时,最头疼的就是BL31和SCP的交叉编译环境配置。后来发现只要理清工具链的对应关系(aarch64-none-linux-gnu用于BL31/U-Boot,or1k-linux-musl用于SCP),问题就迎刃而解。下面我会用实际操作的视角,带你走通从源码到TF卡的全流程。
2. 开发环境搭建实战
2.1 基础服务配置
在Ubuntu 22.04上建议配置NFS和TFTP服务,后续调试会方便很多。NFS适合传输大体积文件(比如根文件系统),TFTP则适合快速测试内核镜像。配置NFS时最容易踩的坑是权限问题,记得在/etc/exports里加上no_root_squash选项:
sudo vim /etc/exports # 添加以下内容(假设你的共享目录是/home/share) /home/share *(rw,sync,no_root_squash,no_subtree_check)TFTP服务配置更要注意路径权限,建议单独创建/tftpboot目录并赋予777权限。xinetd的配置文件有个隐藏陷阱——等号两边的空格会导致服务启动失败,正确的格式应该是:
server tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot disable = no }2.2 工具链与源码准备
全志H618需要两套交叉编译工具链:
- aarch64-none-linux-gnu:从ARM官网下载gcc-arm-11.2版本
- or1k-linux-musl:用于编译SCP固件,推荐用stffrdhrn维护的版本
源码仓库建议这样组织:
~/toolchains/ # 存放交叉编译工具链 ~/src/ ├── arm-trusted-firmware # BL31 ├── crust # SCP固件 ├── u-boot # 主引导程序 └── linux # 内核源码关键命令示例:
# 下载ARM官方工具链 wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz tar xvf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz -C ~/toolchains/3. 三大固件编译详解
3.1 BL31编译技巧
BL31的编译参数PLAT需要指定为sun50i_h616,虽然H618是H616的超频版,但硬件寄存器完全兼容。遇到过编译报错的同学可以尝试增加DEBUG=1参数查看详细日志:
export PATH=$PATH:~/toolchains/gcc-arm-11.2/bin make PLAT=sun50i_h616 DEBUG=1 bl31编译完成后,产物路径在build/sun50i_h616/debug/bl31.bin。有个实用技巧:用hexdump验证生成文件是否有效:
hexdump -C build/sun50i_h616/debug/bl31.bin | head -n 5 # 正常应显示ARM架构的魔数3.2 SCP固件特殊处理
Crust固件默认配置里没有orangepi_zero3的选项,实测使用orangepi_3_defconfig完全兼容。编译时要注意or1k工具链的路径设置:
export PATH=$PATH:~/toolchains/or1k-linux-musl/bin make orangepi_3_defconfig && make -j$(nproc) scp如果不需要电源管理功能(比如你的项目只用直流供电),可以在U-Boot编译时设置SCP=/dev/null跳过。
3.3 U-Boot定制化编译
香橙派Zero 3有官方支持的defconfig(orangepi_zero3_defconfig),编译前需要先导出BL31和SCP路径:
export BL31=~/src/arm-trusted-firmware/build/sun50i_h616/debug/bl31.bin export SCP=~/src/crust/build/scp/scp.bin make orangepi_zero3_defconfig建议通过menuconfig开启以下选项:
- CONFIG_CMD_MMC:启用MMC命令
- CONFIG_CMD_USB:USB设备支持
- CONFIG_NETDEVICES:网络功能
最终生成的u-boot-sunxi-with-spl.bin包含了所有引导阶段需要的二进制。
4. TF卡分区与烧录实战
4.1 分区方案设计
使用fdisk分区时,建议采用以下布局:
/dev/sdb1 : 200M FAT32 (存放内核和设备树) /dev/sdb2 : 剩余空间 ext4 (根文件系统)关键操作命令:
sudo fdisk /dev/sdb # 依次输入:d -> n -> p -> 1 -> 2048 -> +200M -> n -> p -> 2 -> 默认 -> 默认 -> w sudo mkfs.vfat /dev/sdb1 sudo mkfs.ext4 /dev/sdb24.2 烧录技巧
烧录U-Boot时seek=8参数不能改,这是全志芯片的启动偏移量。用dd命令前务必确认设备名(/dev/sdb还是/dev/mmcblk0):
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 sync验证烧录是否成功的小技巧:用hexdump查看TF卡第8KB位置:
sudo hexdump -C /dev/sdb -n 512 -s 81925. 上电调试与问题排查
首次启动时建议连接串口控制台(波特率115200),常见的异常现象和解决方法:
- U-Boot重复加载:通常是BL31没有正确传递控制权,检查BL31编译参数
- CPU识别错误:确认设备树文件sun50i-h618-orangepi-zero3.dts是否被正确编译
- 卡在Starting kernel:检查内核镜像和设备树的加载地址是否正确
调试时可以灵活使用U-Boot命令:
# 查看内存映射 md 0x40000000 0x100 # 测试设备树加载 load mmc 0:1 0x43000000 dtb; fdt addr 0x43000000通过以上步骤,你应该已经能让香橙派Zero 3跑通主线U-Boot。如果遇到卡顿问题,不妨检查下散热——H618在高负载时发热量不小,贴个散热片会有奇效。