1. 项目背景与核心目标
最近在折腾OrangePi Zero2这块开发板时,发现官方提供的Uboot、Kernel和Buildroot文件系统虽然能用,但直接拿来部署总有些水土不服。比如默认内核配置缺少某些驱动模块,Buildroot生成的文件系统又过于精简。于是决定从官方源码出发,完整移植一套适配Zero2的开发环境。
这个项目的核心价值在于:
- 掌握从零构建嵌入式Linux系统的完整流程
- 根据实际需求定制内核功能模块
- 构建恰到好处的根文件系统
- 最终获得一个可二次开发的基线版本
2. 环境准备与源码获取
2.1 硬件准备清单
- OrangePi Zero2开发板(全志H616芯片)
- Type-C电源(5V/2A以上)
- TF卡(建议16GB Class10以上)
- 串口调试工具(CP2102等USB转TTL模块)
- 网线(用于网络调试)
2.2 软件环境搭建
推荐使用Ubuntu 20.04 LTS作为编译主机,需要安装的依赖包:
bash复制sudo apt update
sudo apt install -y git make gcc bison flex libssl-dev \
bc swig python3-dev python3-distutils
2.3 官方源码下载
官方维护的源码仓库地址:
bash复制git clone --depth=1 https://github.com/orangepi-xunlong/orangepi-build
cd orangepi-build
这个仓库包含了uboot、kernel和buildroot的配置脚本,采用Kbuild系统管理。
注意:国内用户建议添加
--depth=1参数避免克隆完整历史记录,同时可使用镜像源加速:bash复制git config --global url."https://mirror.ghproxy.com/https://github.com".insteadOf https://github.com
3. U-Boot移植与定制
3.1 配置编译环境
进入uboot目录并切换分支:
bash复制cd u-boot
make distclean
make orangepi_zero2_defconfig
关键配置参数解析:
CONFIG_ARM=y:ARM架构支持CONFIG_ARCH_SUNXI=y:全志平台支持CONFIG_MACH_SUN50I_H616=y:指定H616芯片
3.2 设备树修改
需要特别关注arch/arm/dts/sun50i-h616-orangepi-zero2.dts文件:
dts复制&mmc0 {
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>;
vmmc-supply = <®_vcc3v3>;
bus-width = <4>;
status = "okay";
};
这里配置了SD卡控制器的电压和总线宽度。
3.3 编译与烧写
执行编译:
bash复制make -j$(nproc) CROSS_COMPILE=aarch64-linux-gnu-
生成的关键文件:
u-boot-sunxi-with-spl.bin:带SPL的完整镜像u-boot.img:U-Boot主体镜像
使用dd命令烧写到TF卡:
bash复制sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8 conv=fsync
实测技巧:首次启动建议连接串口,观察uboot输出。常见的启动失败原因包括:
- 电源供电不足(表现为反复重启)
- SD卡接触不良(卡在MMC初始化)
- 设备树配置错误(外设初始化失败)
4. Linux内核定制化编译
4.1 内核配置
进入kernel目录并配置:
bash复制cd linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- sunxi_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
需要重点关注的配置项:
- Device Drivers > Network device support > Ethernet PHY:选择RTL8211E驱动
- Device Drivers > Input device support > Touchscreens:添加电阻屏支持
- File systems > DOS/FAT/NT Filesystems:启用VFAT支持
4.2 设备树覆盖
对于OrangePi Zero2,需要确保以下设备树配置:
dts复制&emac0 {
phy-handle = <&ext_rgmii_phy>;
phy-mode = "rgmii";
status = "okay";
};
4.3 内核编译与安装
编译命令:
bash复制make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=output modules_install
生成的关键文件:
arch/arm64/boot/Image:内核镜像arch/arm64/boot/dts/allwinner/sun50i-h616-orangepi-zero2.dtb:设备树二进制
5. Buildroot文件系统构建
5.1 基础配置
进入buildroot目录并配置:
bash复制cd buildroot
make orangepi_zero2_defconfig
make menuconfig
关键配置项:
- Target options:
- ARM64 (AArch64)架构
- Little endian字节序
- Toolchain:
- External toolchain使用Linaro GCC
- System configuration:
- 设置root密码
- 添加普通用户
5.2 软件包选择
建议添加的软件包:
text复制Target packages ->
Networking applications ->
dropbear:轻量级SSH服务器
iperf3:网络性能测试
Hardware handling ->
alsa-utils:音频工具
raspberrypi-userland:GPU加速库
5.3 文件系统生成
执行编译:
bash复制make -j$(nproc)
输出文件位于output/images/rootfs.ext4,可直接写入SD卡分区。
6. 系统整合与部署
6.1 分区方案设计
推荐的分区布局:
code复制/dev/mmcblk0p1: FAT32 (boot, 256MB)
/dev/mmcblk0p2: EXT4 (rootfs, 剩余空间)
使用fdisk创建分区:
bash复制sudo fdisk /dev/sdX
# 依次输入:n p 1 2048 +256M n p 2 526336 <默认> t 1 c w
6.2 文件系统部署
格式化并写入文件系统:
bash复制sudo mkfs.vfat /dev/sdX1
sudo mkfs.ext4 /dev/sdX2
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1k seek=8
sudo mount /dev/sdX1 /mnt/boot
sudo mount /dev/sdX2 /mnt/root
sudo cp Image sun50i-h616-orangepi-zero2.dtb /mnt/boot/
sudo tar -xpf output/images/rootfs.tar -C /mnt/root
6.3 启动配置
在boot分区创建boot.scr:
bash复制cat <<EOF > boot.cmd
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
load mmc 0:1 \$kernel_addr_r Image
load mmc 0:1 \$fdt_addr_r sun50i-h616-orangepi-zero2.dtb
booti \$kernel_addr_r - \$fdt_addr_r
EOF
mkimage -C none -A arm -T script -d boot.cmd boot.scr
7. 常见问题排查指南
7.1 启动卡在U-Boot
现象:串口输出停在Starting kernel...
排查步骤:
- 检查
boot.scr是否正确生成 - 确认内核镜像和设备树文件路径正确
- 使用
mmc list和fatls mmc 0:1命令验证文件系统可访问
7.2 网络接口无法启用
现象:ifconfig看不到eth0
解决方法:
- 检查内核配置中的PHY驱动
- 确认设备树中emac0节点状态为okay
- 测量PHY芯片供电电压(正常应为3.3V)
7.3 文件系统挂载失败
现象:内核报错VFS: Unable to mount root fs
处理方案:
- 检查SD卡分区表是否正确
- 确认root=参数与实际分区一致
- 尝试在U-Boot中使用
ext4ls mmc 0:2 /验证文件系统
8. 进阶优化方向
8.1 内核裁剪技巧
使用make savedefconfig生成最小配置后:
bash复制./scripts/diffconfig .config.old .config.new > config-changes
这样可以清晰看到所有配置变更。
8.2 构建速度优化
在buildroot中启用ccache:
bash复制make menuconfig
# Build options -> Enable compiler cache
8.3 无线网络支持
需要额外配置:
- 内核中启用SDIO和WiFi驱动
- 安装firmware(如rtl8723ds_fw)
- 在buildroot中添加wpa_supplicant
移植过程中最大的体会是:全志平台的文档虽然零散,但社区支持很活跃。遇到问题时多查查linux-sunxi社区的wiki,往往能找到解决方案。另外建议在每次重大修改前做好备份,我就曾因为一个设备树配置错误浪费了半天时间回滚。