当前位置: 首页 > news >正文

荔枝派Zero上16MB NOR Flash从零到启动:全志V3s SPI Flash完整配置与烧录避坑指南

荔枝派Zero全志V3s SPI Flash开发实战:从零构建嵌入式Linux系统

荔枝派Zero作为一款基于全志V3s处理器的超小型开发板,凭借其出色的性价比和丰富的外设接口,在物联网和嵌入式领域广受欢迎。本文将带您完成一个完整的开发流程:在16MB NOR Flash上构建可启动的嵌入式Linux系统。不同于常见的SD卡启动方案,SPI Flash启动具有体积小、功耗低、稳定性高的特点,特别适合量产产品。

1. 开发环境搭建与工具链配置

在开始之前,我们需要准备一个稳定的开发环境。推荐使用Ubuntu 20.04 LTS作为开发主机系统,这个版本对各种开发工具的支持最为完善。

首先安装基础依赖包:

sudo apt update sudo apt install -y build-essential git bison flex libssl-dev libncurses5-dev

全志V3s采用ARM Cortex-A7架构,需要配置交叉编译工具链。我们选择Linaro提供的6.3.1版本,这个版本经过社区验证与V3s兼容性良好:

wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf.tar.xz sudo mv gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf /opt/ echo 'export PATH=$PATH:/opt/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc source ~/.bashrc

验证工具链是否安装成功:

arm-linux-gnueabihf-gcc -v

接下来需要安装SPI Flash相关的工具:

sudo apt install -y mtd-utils device-tree-compiler

对于全志系列芯片,我们还需要专用的烧录工具sunxi-tools:

git clone -b spi-rebase https://github.com/Icenowy/sunxi-tools.git cd sunxi-tools make && sudo make install

2. U-Boot移植与SPI Flash支持配置

U-Boot是嵌入式系统的引导加载程序,我们需要对其进行定制以支持SPI Flash启动。荔枝派社区维护了一个包含SPI驱动的特殊分支:

git clone -b v3s-spi-experimental https://github.com/Lichee-Pi/u-boot.git cd u-boot

配置U-Boot支持XT25F128B Flash芯片:

make ARCH=arm menuconfig

在配置界面中,需要确保以下选项被正确设置:

  • Device Drivers → SPI Flash Support → Macronix SPI flash support
  • 如果Flash容量大于16MB,需要启用CONFIG_SPI_FLASH_BAR

关键配置对比表

配置项推荐值说明
CONFIG_SPI_FLASH_MACRONIXy芯天下Flash兼容此驱动
CONFIG_SPI_FLASH_BARy大容量Flash必须启用
CONFIG_SPI_FLASH_USE_4K_SECTORSnXT25F128B不支持4K擦除

接下来需要配置默认环境变量,编辑include/configs/sun8i.h文件,在#include <configs/sunxi-common.h>之前添加:

#define CONFIG_BOOTCOMMAND "sf probe 0; " \ "sf read 0x41800000 0x100000 0x10000; " \ "sf read 0x41000000 0x110000 0x400000; " \ "bootz 0x41000000 - 0x41800000" #define CONFIG_BOOTARGS "console=ttyS0,115200 earlyprintk panic=5 rootwait " \ "mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 rw rootfstype=jffs2"

编译U-Boot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log

编译完成后会生成u-boot-sunxi-with-spl.bin文件,这是后续烧录的关键文件。

3. Linux内核配置与设备树修改

Linux内核需要针对SPI Flash进行特殊配置。我们使用荔枝派社区维护的4.13.y分支:

git clone https://github.com/Lichee-Pi/linux.git -b zero-4.13.y cd linux

内核配置要点:

make ARCH=arm menuconfig

确保以下选项被启用:

  • Device Drivers → Memory Technology Device (MTD) support → Command line partition table parsing
  • Device Drivers → Memory Technology Device (MTD) support → SPI-NOR device support
  • File systems → Miscellaneous filesystems → Journalling Flash File System v2 (JFFS2) support

修改设备树文件arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dts,添加SPI Flash节点:

&spi0 { status = "okay"; xt25f128b: xt25f128b@0 { compatible = "jedec,spi-nor"; reg = <0>; spi-max-frequency = <50000000>; #address-cells = <1>; #size-cells = <1>; }; };

编译内核和设备树:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc) make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

编译完成后,内核镜像位于arch/arm/boot/zImage,设备树文件位于arch/arm/boot/dts/sun8i-v3s-licheepi-zero.dtb

4. 根文件系统制作与镜像打包

SPI Flash通常使用JFFS2文件系统,这是专门为NOR Flash设计的日志型文件系统。我们以Buildroot生成的根文件系统为例:

tar xzvf rootfs-brmin.tar.gz mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs-brmin/ -o jffs2.img

参数说明:

  • -s 0x100:页大小256字节
  • -e 0x10000:擦除块大小64KB
  • -p 0xAF0000:文件系统分区大小(16MB-1MB-64KB-4MB)

接下来将所有组件打包成一个完整的Flash镜像:

#!/bin/sh dd if=/dev/zero of=flashimg.bin bs=1M count=16 dd if=u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc dd if=sun8i-v3s-licheepi-zero.dtb of=flashimg.bin bs=1K seek=1024 conv=notrunc dd if=zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 conv=notrunc

分区布局表

分区起始地址大小内容
uboot0x0000001MBSPL + U-Boot
dtb0x10000064KB设备树
kernel0x1100004MBLinux内核
rootfs0x510000剩余空间JFFS2根文件系统

5. 烧录与启动测试

全志V3s芯片有一个特殊的USB下载模式称为FEL模式,进入方法有三种:

  1. 不插入SD卡且SPI Flash为空
  2. 使用SD卡中的fel-sdboot.sunxi工具
  3. 上电时将SPI_MISO引脚拉低

进入FEL模式后,通过USB连接电脑,使用sunxi-fel工具烧录:

sudo sunxi-fel version sudo sunxi-fel spiflash-info sudo sunxi-fel -p spiflash-write 0 flashimg.bin

烧录完成后断开USB连接,重新上电即可从SPI Flash启动。通过串口终端可以看到启动日志,正常情况应该能进入Linux系统。

6. 常见问题与调试技巧

在实际开发中,可能会遇到以下典型问题:

问题1:U-Boot无法识别Flash

  • 检查make menuconfig中的SPI Flash驱动配置
  • 确认设备树中的SPI节点配置正确
  • 测量Flash芯片的供电电压(应为3.3V)

问题2:内核挂载根文件系统失败

  • 检查内核配置中的JFFS2支持是否启用
  • 确认mtdparts参数与实际分区一致
  • 使用mtd_debug工具检查Flash读写是否正常

问题3:系统运行不稳定

  • 降低SPI时钟频率(修改设备树中的spi-max-frequency)
  • 检查电源供电是否充足
  • 在U-Boot中使用sunxi_flash dump命令验证数据完整性

调试时可以充分利用U-Boot的命令行工具:

# 查看Flash信息 sf probe 0 sf info # 读写测试 sf read 0x43000000 0x100000 0x1000 md 0x43000000 # 擦除测试 sf erase 0x100000 0x1000

通过以上步骤,我们完成了从零开始在荔枝派Zero的SPI Flash上构建完整Linux系统的全过程。这种方案特别适合需要小体积、低功耗的嵌入式应用场景。

http://www.jsqmd.com/news/679764/

相关文章:

  • Allegro 17.4布线完成后,这5个DRC之外的检查项千万别漏了(附丝印调整参数)
  • STC8单片机驱动ESP-01S联网实战:从AT指令调试到获取苏宁时间(含完整代码)
  • 从零解析RK3588 PWM驱动:Linux子系统框架与实战调试
  • 点云数据预处理避坑指南:为什么你的模型训练效果差?可能忽略了这三点(尺度/旋转/排列)
  • 2026年刚玉莫来石匣钵源头厂家梯队盘点:氧化铝匣钵/刚玉莫来石匣钵/莫来石匣钵/耐高温匣钵/刚玉匣钵/堇青石匣钵/选择指南 - 优质品牌商家
  • 从AlexNet到VGG19:为什么说‘小卷积核+深度’是CNN进化的关键一步?
  • 碧蓝航线自动化助手:5步轻松实现24/7智能托管
  • ABAP选择屏幕F4帮助填坑记:从‘系统自带’到‘函数调用’的完整避雷指南
  • 输入法词库迁移终极解决方案:深蓝词库转换工具完整指南
  • 第6章 交互方式与基础命令
  • 51单片机IO口不够用?实战对比:74HC595串转并 vs 74HC165并转串,哪个更适合你的项目
  • 从鸟群到推荐系统:粒子群算法(PSO)在机器学习调参中的保姆级教程
  • 2026年电话光端机选购指南:商业级光纤收发器/园区全光网/多业务PCM复用设备/工业级光纤收发器/电话光端机/选择指南 - 优质品牌商家
  • 别再只算平均值了!用鲍鱼数据集教你5种高级数据探索技巧(附Python代码)
  • 告别网盘限速困扰:八大主流平台直链解析工具全攻略
  • 自动化设备在生升农业育秧场的应用与效率提升研究
  • 电器维修系统小程序pf(文档+源码)_kaic
  • 告别Three.js卡顿:用Potree在Web端流畅渲染百万级点云(附Vue集成踩坑实录)
  • 如何三步实现蓝奏云直链解析:LanzouAPI完整开发指南
  • wireshark抓包看ip协议
  • 3步彻底告别激活烦恼:KMS_VL_ALL_AIO智能激活方案实战指南
  • 为什么92%的团队在EF Core 10向量部署中失败?——来自37家金融/医疗客户生产环境的11项合规性避坑清单
  • 保姆级教程:在Ubuntu 22.04上快速配置Intel RealSense D405开发环境(含realsense-viewer安装)
  • AIOps探索:Hermes可能是现阶段最适合做AIOps的Agent(附可行性落地思路)
  • 如何在3分钟内完成Windows系统激活:智能激活脚本完整教程
  • 终极iOS 15-16 iCloud绕过方案:如何重新激活被锁定的苹果设备?
  • C#怎么操作WPF数据模板 C#如何用DataTemplate定义集合项的显示样式和布局【控件】
  • AI模型热更新失败?.NET 11 AssemblyLoadContext + ONNX模型热重载方案(含Assembly卸载泄漏检测工具)
  • 如何快速调整任何窗口大小:WindowResizer终极免费窗口调整工具指南
  • mysql如何配置临时账号权限_mysql带期限的用户授权