ZYNQ无SD卡纯NAND Flash启动Linux全攻略

ZYNQ无SD卡纯NAND Flash启动Linux全攻略

文章目录

  • [ZYNQ无SD卡纯NAND Flash启动Linux全攻略](#ZYNQ无SD卡纯NAND Flash启动Linux全攻略)
    • [💡 核心思路提前看](#💡 核心思路提前看)
    • [🛠️ 第一步:Vivado硬件配置 (开启NAND控制器)](#🛠️ 第一步:Vivado硬件配置 (开启NAND控制器))
    • [🐧 第二步:PetaLinux系统配置 (划分Flash分区)](#🐧 第二步:PetaLinux系统配置 (划分Flash分区))
      • [1. 创建工程并导入硬件](#1. 创建工程并导入硬件)
      • [2. 配置NAND Flash分区(关键!)](#2. 配置NAND Flash分区(关键!))
      • [3. 配置系统从NAND启动](#3. 配置系统从NAND启动)
      • [4. 配置文件系统打包进内核 (最稳妥的方案)](#4. 配置文件系统打包进内核 (最稳妥的方案))
    • [⚙️ 第三步:编译与生成文件](#⚙️ 第三步:编译与生成文件)
      • [生成 BOOT.bin](#生成 BOOT.bin)
    • [⚡ 第四步:通过JTAG烧录文件到NAND Flash](#⚡ 第四步:通过JTAG烧录文件到NAND Flash)
      • [1. 准备烧录环境](#1. 准备烧录环境)
      • [2. 使用 Program Flash 工具烧录](#2. 使用 Program Flash 工具烧录)
    • [🚀 第五步:见证奇迹的时刻](#🚀 第五步:见证奇迹的时刻)
    • [💡 常见问题排坑 (FAQ)](#💡 常见问题排坑 (FAQ))

在ZYNQ开发中,大家最常用的是SD卡启动。但如果在实际产品或特定项目中, 板子上没有SD卡槽,只有NAND Flash ,我们该如何把Linux系统跑起来呢?

很多新手遇到这个问题会一头雾水:.elf文件怎么来?BOOT.bin怎么生成?内核又该放在哪?别慌,这篇教程将手把手教你如何配置、生成文件并烧录,带你彻底打通NAND Flash启动的任督二脉!


💡 核心思路提前看

在NAND Flash启动模式下,我们需要把所有启动文件烧录到Flash的特定 分区(地址偏移量) 中。

ZYNQ启动分为几个阶段,对应的文件和生成方式如下:

  1. BOOT.bin :包含FSBL (.elf)、FPGA比特流 (.bit)、U-Boot (.elf)。放在Flash起始地址。
  2. image.ub:包含Linux内核、设备树(Device Tree)和根文件系统(Rootfs)。放在Flash的Kernel分区。

注意:为了让小白最快成功,本文采用initramfs(根文件系统打包进内核镜像)的方式,这样只需要烧录BOOT.binimage.ub两个文件即可!


🛠️ 第一步:Vivado硬件配置 (开启NAND控制器)

要在NAND中启动,ZYNQ的PS端必须开启NAND控制器。

  1. 打开Vivado,进入Block Design,双击ZYNQ7 Processing System IP核。
  2. 点击 Peripheral I/O Pins
  3. 找到 Memory Interfaces -> 勾选 SMC (NAND)
  4. 检查你的原理图,配置正确的NAND引脚和Bank电平(通常是Bank 500, 1.8V或3.3V)。
  5. 正常进行 Run Synthesis -> Run Implementation -> Generate Bitstream
  6. 导出硬件:点击 File -> Export -> Export Hardware务必勾选"Include bitstream" ,生成 .xsa 文件(老版本叫 .hdf)。

🐧 第二步:PetaLinux系统配置 (划分Flash分区)

将生成的 .xsa 文件拷贝到Ubuntu虚拟机中,开始PetaLinux的配置。

1. 创建工程并导入硬件

bash 复制代码
petalinux-create --type project --template zynq --name nand_boot_test
cd nand_boot_test
petalinux-config --get-hw-description=<你的xsa文件所在目录>

2. 配置NAND Flash分区(关键!)

在弹出的配置界面中,我们需要对NAND Flash进行"切蛋糕":

进入 Subsystem AUTO Hardware Settings -> Flash Settings

在这里,配置你的NAND分区表。假设你的NAND比较大(比如128MB或256MB),我们可以这样分:

  • Partition 0 : name = boot, size = 0x500000 (5MB,用来放BOOT.bin)
  • Partition 1 : name = bootenv, size = 0x20000 (128KB,用来放U-Boot环境变量)
  • Partition 2 : name = kernel, size = 0x2000000 (32MB,用来放image.ub,包含了内核和文件系统)
  • Partition 3 : name = spare, size = 剩余大小 (留作后用)

(记下kernel分区的起始偏移量:0x500000 + 0x20000 = 0x520000,后面烧录要用!)

3. 配置系统从NAND启动

仍在刚才的菜单中:

  • 进入 Subsystem AUTO Hardware Settings -> Advanced bootable images storage Settings
  • boot image settingskernel image settings 的启动介质都改为 primary flash

4. 配置文件系统打包进内核 (最稳妥的方案)

  • 退回主菜单,进入 Image Packaging Configuration
  • Root filesystem type 设置为 INITRAMFS
  • 保存并退出 (Save -> Exit)。

⚙️ 第三步:编译与生成文件

配置完成后,一键编译:

bash 复制代码
petalinux-build

等待编译完成后,所有的原材料就准备好了!

生成 BOOT.bin

在终端输入以下命令,PetaLinux会自动把 fsbl.elfsystem.bitu-boot.elf 打包成一个 BOOT.bin 文件:

bash 复制代码
petalinux-package --boot --fsbl --fpga --u-boot --force

打包成功后,你需要的文件都在 images/linux/ 目录下:

  1. BOOT.bin (系统引导文件)
  2. image.ub (内核+设备树+根文件系统)

将这两个文件拷贝到你的Windows电脑上。


⚡ 第四步:通过JTAG烧录文件到NAND Flash

因为没有SD卡,我们不能把文件拷进卡里让它自己更新。我们需要借助下载器(JTAG)和 Vitis (或 Xilinx SDK) 将文件硬写进NAND Flash。

1. 准备烧录环境

  1. 用JTAG连接开发板和电脑。
  2. 将开发板的启动模式拨码开关拨到 JTAG 模式(很重要!不然可能连不上)。
  3. 开发板上电。
  4. 打开 Vitis (或者 Vivado 中点击 Tools -> Launch Vitis IDE)。

2. 使用 Program Flash 工具烧录

在 Vitis 菜单栏点击 Xilinx -> Program Flash (老版本SDK是 Xilinx Tools -> Program Flash)。

我们需要烧录两次(或者合并烧录):

第一次烧录:BOOT.bin

  • Hardware Platform: 选择你的XSA导出的平台(如果有的话,没有可留空,工具会自动检测)。
  • Image File : 选择你刚生成的 BOOT.bin
  • Offset : 填入 0x0 (BOOT.bin永远在Flash的最开头)。
  • Flash Type : 选择 nand
  • FSBL File : 选择 images/linux/zynq_fsbl.elf(烧录工具需要借助FSBL来操作Flash)。
  • 点击 Program。等待进度条走完。

第二次烧录:image.ub

  • Image File : 选择你刚生成的 image.ub
  • Offset : 填入 0x520000 (这是我们在第二步划分的 kernel 分区起始地址!千万别填错,否则会覆盖BOOT.bin)。
  • Flash Type : 选择 nand
  • FSBL File: 同上。
  • 点击 Programimage.ub 比较大,烧录需要一些时间,耐心等待。

🚀 第五步:见证奇迹的时刻

  1. 烧录完成后,关闭开发板电源
  2. 将开发板的启动模式拨码开关拨到 NAND 启动模式(具体参考你的开发板手册)。
  3. 打开串口调试助手(MobaXterm、Putty等),波特率通常设为 115200
  4. 重新给开发板上电!

如果在串口终端中,你看到了熟悉的 U-Boot 倒计时,接着跑出 Linux 的企鹅图标和启动日志,最后停在 petalinux login: 提示符前......

🎉 恭喜你!你已经成功掌握了ZYNQ从NAND Flash启动的全套流程!


💡 常见问题排坑 (FAQ)

Q1:烧录时提示 "Flash Operation Failed" 怎么办?

A:请检查:1. JTAG是否连接稳定;2. 启动拨码是否在JTAG模式;3. 烧录界面填入的FSBL文件是否正确;4. 原理图NAND引脚是否在Vivado中配置正确。

Q2:U-Boot启动了,但是提示找不到 image.ub?

A:大概率是偏移地址填错了 。U-Boot去 0x520000 找内核,但你烧录到了别的地方,或者在PetaLinux配置分区时,kernel分区的地址和烧录地址不一致。去比对一下U-Boot打印的分区表信息。

Q3:这种initramfs方式关机后保存的文件会丢失吗?

A:会丢失。 initramfs是在内存中解压运行的临时根文件系统。如果你想让修改的文件永久保存,后续需要学习如何挂载 JFFS2UBIFS 文件系统。但对于小白打通"从0到1"的启动流程,本教程的方案是最不易出错的!

相关推荐
ChengQianO1 小时前
ROS2 导航播报 & 轨迹模拟 —— 计划
linux·ubuntu·ros
扛枪的书生2 小时前
Jenkins 学习总结
linux
strive programming2 小时前
Linux从入门到精通——基础IO(简洁清晰版)
linux·运维·服务器
节点小宝2 小时前
一站式部署:支持Windows、macOS、Linux三端的统一方案
linux·运维·macos
乌鸦9442 小时前
《库制作与原理》
linux·动态库
ZhengEnCi3 小时前
L1D-Linux系统Node.js部署Claude Code完全指南 🚀
linux·ai编程·claude
hnxaoli3 小时前
统信小程序(十一)快捷地址栏
linux·python·小程序
黄昏晓x3 小时前
Linux----网络
linux·网络·arm开发