荔枝派Zero V3s开发板:手把手教你编译和烧录主线U-Boot(含SPI Flash启动配置)
荔枝派Zero V3s开发板:从零构建U-Boot的完整实战指南
当你第一次拿到荔枝派Zero V3s这块小巧而强大的开发板时,最令人兴奋的莫过于让它运行起自己编译的系统。作为嵌入式开发的"敲门砖",U-Boot的编译与烧录往往是新手面临的第一个技术挑战。不同于市面上大多数教程的碎片化讲解,本文将带你体验一条清晰、完整的实践路径——从交叉编译环境的搭建,到U-Boot源码的获取与配置,再到两种主流烧录方式的详细对比,最后深入解析SPI Flash启动的定制化配置。无论你是刚接触嵌入式开发的初学者,还是希望从主线代码构建系统的进阶用户,这篇指南都将成为你桌边最实用的技术手册。
1. 为什么需要定制U-Boot?
在嵌入式系统中,U-Boot扮演着硬件与操作系统之间的桥梁角色。官方提供的预编译镜像虽然开箱即用,但存在三个显著局限:首先,默认配置可能不匹配特定外设(如不同尺寸的LCD屏幕);其次,无法根据实际需求裁剪功能模块,导致镜像体积膨胀;最重要的是,当需要从非标准存储设备(如SPI Flash)启动时,必须修改U-Boot源码的硬件初始化流程。
以荔枝派Zero V3s为例,其全志V3s芯片支持多种启动方式:
- FEL模式:通过USB直接烧录运行,适合快速调试
- TF卡启动:传统方式,适合大多数Linux系统引导
- SPI Flash启动:节省板载空间,适合量产环境
实际项目中,我曾遇到一个典型案例:客户要求将系统镜像压缩到16MB SPI Flash中,而默认的U-Boot配置仅支持TF卡启动。通过修改
include/configs/sun8i.h中的CONFIG_BOOTCOMMAND参数,最终实现了直接从SPI设备加载内核。
2. 构建编译环境:避坑指南
2.1 交叉编译工具链选择
全志V3s采用ARM Cortex-A7架构,需要arm-linux-gnueabihf工具链。推荐使用Linaro官方构建的稳定版本:
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz tar xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz export PATH=$PATH:$(pwd)/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin验证安装是否成功:
arm-linux-gnueabihf-gcc --version2.2 依赖库安装
U-Boot编译需要以下基础组件:
- build-essential:基础编译工具
- bison/flex:语法分析器生成工具
- libssl-dev:加密算法支持
- device-tree-compiler:dtc版本需≥1.4
Ubuntu/Debian系统安装命令:
sudo apt update sudo apt install build-essential bison flex libssl-dev常见问题解决方案:
- dtc版本过低:下载最新源码编译安装
git clone git://git.kernel.org/pub/scm/utils/dtc/dtc.git cd dtc && make && sudo make install - Python3兼容性问题:设置默认Python版本
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
3. U-Boot源码获取与配置
3.1 源码仓库选择
荔枝派官方维护了两个重要分支:
- v3s-current:稳定版,支持基础功能
- v3s-spi-experimental:实验性分支,包含SPI Flash支持
克隆命令:
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current # 或使用SPI支持分支 git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-spi-experimental3.2 屏幕配置选择
根据连接的LCD型号选择对应defconfig:
| 屏幕尺寸 | 分辨率 | 编译配置命令 |
|---|---|---|
| 默认 | - | make LicheePi_Zero_defconfig |
| 4.3寸 | 480×272 | make LicheePi_Zero_480x272LCD_defconfig |
| 5寸 | 800×480 | make LicheePi_Zero_800x480LCD_defconfig |
编译示例:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_800x480LCD_defconfig3.3 高级配置技巧
通过menuconfig界面调整关键参数:
make ARCH=arm menuconfig重点配置项:
- Boot media→ 启用SPI Flash支持
- Environment→ 设置环境变量存储位置
- USB Support→ 启用FEL模式检测
为提高编译效率,可在Makefile中预设编译参数:
# 在顶层Makefile中添加 ARCH ?= arm CROSS_COMPILE ?= arm-linux-gnueabihf-4. 烧录实战:两种核心方法对比
4.1 FEL模式烧录(调试首选)
FEL是全志芯片特有的USB烧录模式,操作流程:
进入FEL模式:
- 按住板载FEL按钮上电
- 或短接FLASH的1-4引脚后上电
安装sunxi-tools工具:
git clone https://github.com/linux-sunxi/sunxi-tools cd sunxi-tools && make && sudo make install烧录命令对比:
烧录类型 命令 特点 内存运行 sunxi-fel uboot u-boot-sunxi-with-spl.bin 断电消失,适合快速测试 SPI Flash烧录 sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin 永久保存,需硬件支持 验证烧录结果:
sunxi-fel ver dmesg | grep usb # 查看设备识别情况
4.2 TF卡烧录(生产环境)
TF卡需要特殊的分区布局:
sudo fdisk -l /dev/sdX # 确认卡设备 sudo dd if=/dev/zero of=/dev/sdX bs=1M count=1 # 清空开头1MB # 烧录SPL+U-Boot sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8关键参数解析:
- bs=1024:块大小设为1KB
- seek=8:跳过8KB(全志芯片的启动头保留区域)
曾有个调试案例:用户烧录后屏幕无输出,最终发现是TF卡接触不良。建议使用品牌卡并确保完全插入卡槽(靠近USB接口的那个)。
5. SPI Flash启动深度配置
5.1 硬件准备
SPI Flash型号需在U-Boot的drivers/mtd/spi/spi_flash_ids.c中注册。常见支持型号:
static const struct spi_device_id spi_flash_ids[] = { {"w25q128", INFO(0xef4018, 0x0, 64*1024, 256, ...)}, {"gd25q64", INFO(0xc84017, 0x0, 64*1024, 128, ...)}, };5.2 关键代码修改
修改include/configs/sun8i.h:
#define CONFIG_BOOTCOMMAND "sf probe 0; " \ "sf read 0x41800000 0x100000 0x8000; " \ "bootm 0x41800000"调整环境变量存储位置:
#define CONFIG_ENV_OFFSET 0x80000 #define CONFIG_ENV_SIZE 0x10000 #define CONFIG_ENV_SECT_SIZE 0x1000启用SPI驱动:
make menuconfig # 选择 Device Drivers → SPI Flash Support → Enable SPI Flash
5.3 烧录验证
完整SPI烧录流程:
make # 生成u-boot-sunxi-with-spl.bin sunxi-fel -p spiflash-write 0 u-boot-sunxi-with-spl.bin启动日志分析:
U-Boot SPL 2023.07-rc2 (Aug 01 2023 - 15:22:34 +0800) Trying to boot from SPI6. 典型问题排查手册
6.1 编译阶段问题
报错:dtc版本过低
make dtbs # 单独编译设备树验证 dtc -v # 确认版本≥1.4报错:undefined reference to `xxxx'
make clean # 清理后重新编译
6.2 运行阶段问题
现象:屏幕无输出
- 检查LCD排线连接
- 确认选择了正确的defconfig
现象:SPI设备未识别
sf probe 0 # 手动探测SPI Flash mtdparts # 查看MTD分区
6.3 烧录工具问题
- sunxi-fel无法识别设备
lsusb -v -d 1f3a:efe8 # 检查全志USB VID/PID sudo modprobe usb_phy # 加载USB PHY驱动
在完成首次烧录后,建议备份有效的U-Boot镜像。我通常会按日期命名如u-boot-20230801-spi.bin,并记录对应的git commit hash。当需要批量生产时,这种版本管理方式能避免很多混乱。
