1. 项目概述与准备工作
最近在Orange Pi Zero2(全志H616平台)上成功移植了官方提供的uboot、kernel和buildroot文件系统,整个过程踩了不少坑,也积累了一些实用经验。这个板子性价比很高,但资料相对零散,特别适合喜欢折腾的嵌入式开发者。
硬件准备清单:
- Orange Pi Zero2开发板(全志H616主控)
- 至少8GB的TF卡(建议Class10以上速度)
- USB转TTL串口调试器(CP2102/CH340等)
- 5V2A电源适配器
软件环境要求:
- Ubuntu 20.04 LTS(推荐原生系统,非WSL)
- 磁盘剩余空间≥20GB
- 内存≥4GB
注意:全志H616是Cortex-A53四核处理器,属于64位ARM架构,必须使用aarch64工具链。32位工具链会导致编译失败。
2. 交叉编译工具链配置
2.1 工具链选型
经过对比测试,最终选择gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu,原因有三:
- 对ARMv8架构支持完善
- 与uboot 2021.10版本兼容性好
- 官方buildroot验证过稳定性
2.2 安装与验证
下载并解压工具链:
bash复制wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
tar xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
配置环境变量(建议写入~/.bashrc):
bash复制export PATH=$PATH:/path/to/toolchain/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
验证安装:
bash复制aarch64-none-linux-gnu-gcc --version
正常应显示类似:gcc version 9.2.1 20191025 (GNU Toolchain for the AArch64 Architecture)
3. ATF(ARM Trusted Firmware)编译
3.1 获取源码
全志平台需要ATF提供BL31阶段支持:
bash复制git clone https://github.com/ARM-software/arm-trusted-firmware.git -b v2.4
cd arm-trusted-firmware
注意:必须使用v2.4版本,主线代码可能不兼容H616
3.2 编译配置
H616需要特殊补丁,先应用官方补丁:
bash复制wget https://github.com/orangepi-xunlong/orangepi-build/raw/master/external/config/atf/sun50iw9p1/add_sun50i_h616.patch
git apply add_sun50i_h616.patch
编译命令:
bash复制make CROSS_COMPILE=aarch64-none-linux-gnu- PLAT=sun50i_h616 DEBUG=1 bl31
关键参数说明:
PLAT=sun50i_h616:指定H616平台DEBUG=1:启用调试符号(首次编译建议开启)
编译产物为build/sun50i_h616/debug/bl31.bin,后续uboot编译需要用到。
4. U-Boot移植与烧录
4.1 源码获取
使用香橙派官方维护的uboot分支:
bash复制git clone https://github.com/orangepi-xunlong/u-boot-orangepi.git -b v2021.10-sunxi64
4.2 编译配置
先配置默认参数:
bash复制make orangepi_zero2_defconfig
关键配置项检查:
bash复制make menuconfig
确保以下配置:
code复制ARM architecture --> Enable LTO (LTO=y)
Boot images --> [*] Enable ATF BL31 support
Boot images --> BL31 binary path --> 填写之前编译的bl31.bin路径
编译命令:
bash复制make CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)
4.3 烧录到TF卡
先识别TF卡设备(假设为/dev/sdb):
bash复制lsblk
使用dd写入uboot:
bash复制sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 conv=notrunc
警告:务必确认设备名正确,错误的设备名可能导致系统磁盘数据丢失!
4.4 启动测试
连接串口调试(波特率115200),上电后应看到类似输出:
code复制U-Boot SPL 2021.10 (May 20 2023 - 15:30:25 +0800)
DRAM: 1 GiB
Trying to boot from MMC1
5. Linux内核编译与配置
5.1 源码获取
使用官方维护的linux 6.1分支:
bash复制git clone https://github.com/orangepi-xunlong/linux-orangepi.git -b orange-pi-6.1-sunxi64
5.2 内核配置
生成默认配置:
bash复制make ARCH=arm64 orangepi_zero2_defconfig
建议开启的模块:
bash复制make ARCH=arm64 menuconfig
关键选项:
code复制Device Drivers -->
[*] Network device support -->
[*] USB Network Adapters -->
[*] Realtek RTL8152/RTL8153 Based USB Ethernet Adapters
File systems -->
[*] FUSE (Filesystem in Userspace) support
编译命令:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)
生成产物:
- 内核镜像:
arch/arm64/boot/Image - 设备树:
arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dtb
6. TF卡分区与系统部署
6.1 分区方案设计
推荐分区方案(使用fdisk):
code复制/dev/sdb1 - 256M (FAT32, boot分区)
/dev/sdb2 - 剩余空间 (ext4, rootfs)
分区操作:
bash复制sudo fdisk /dev/sdb
# 依次输入:o, n, p, 1, 回车, +256M, n, p, 2, 回车, 回车, w
格式化分区:
bash复制sudo mkfs.vfat /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
6.2 文件系统部署
挂载并拷贝文件:
bash复制sudo mount /dev/sdb1 /mnt/boot
sudo mount /dev/sdb2 /mnt/rootfs
sudo cp arch/arm64/boot/Image /mnt/boot/
sudo cp arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dtb /mnt/boot/
7. Buildroot文件系统构建
7.1 基础配置
获取2021.11版本:
bash复制wget https://buildroot.org/downloads/buildroot-2021.11.tar.xz
tar xvf buildroot-2021.11.tar.xz
配置基础选项:
bash复制make menuconfig
关键配置:
code复制Target options -->
Target Architecture = AArch64 (little endian)
Target Variant = cortex-A53
Toolchain -->
Toolchain type = External toolchain
Toolchain = Custom toolchain
Toolchain path = 指向之前安装的工具链
Toolchain prefix = aarch64-none-linux-gnu
7.2 定制化配置
建议添加的软件包:
code复制System configuration -->
[*] Enable root login with password
(orangepi) Root password
Target packages -->
[*] BusyBox
[*] sudo
[*] htop
编译命令:
bash复制make -j$(nproc)
7.3 部署到TF卡
解压rootfs到第二分区:
bash复制sudo tar xvf output/images/rootfs.tar -C /mnt/rootfs
sync
8. 常见问题与解决方案
8.1 U-Boot无法加载内核
现象:卡在"Starting kernel..."无输出
解决方法:
- 检查uboot环境变量:
bash复制setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait setenv bootcmd 'load mmc 0:1 0x40200000 Image; load mmc 0:1 0x4fa00000 sun50i-h616-orangepi-zero2.dtb; booti 0x40200000 - 0x4fa00000' saveenv - 确认设备树文件名与实际一致
8.2 网络接口不工作
现象:USB网卡无反应
解决方法:
- 检查内核配置是否包含RTL8152驱动
- 加载驱动:
bash复制
modprobe r8152
8.3 文件系统挂载失败
现象:内核panic提示VFS无法挂载root
解决方法:
- 确认root参数正确(如mmcblk0p2)
- 检查ext4文件系统是否完整:
bash复制
fsck.ext4 -f /dev/sdb2
9. 优化与进阶配置
9.1 固化uboot环境变量
创建自定义环境脚本:
bash复制setenv ipaddr 192.168.1.100
setenv serverip 192.168.1.1
setenv bootdelay 3
setenv stdin serial,usbkbd
setenv stdout serial,vga
setenv stderr serial,vga
saveenv
9.2 内核启动参数优化
在bootargs中添加:
code复制console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait fsck.repair=yes net.ifnames=0
9.3 构建SDK包
后续开发建议生成工具链SDK:
bash复制make sdk
生成的SDK包位于output/images/arm-buildroot-linux-gnueabi_sdk-buildroot.tar.gz
整个移植过程中最耗时的部分是内核驱动调试,特别是H616的GPU和视频输出部分。建议首次启动时通过串口观察内核日志,逐步排查各子系统初始化情况。这个板子的GPIO定义与树莓派不同,使用时需要特别注意引脚映射关系。