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启动分为几个阶段,对应的文件和生成方式如下:
- BOOT.bin :包含FSBL (
.elf)、FPGA比特流 (.bit)、U-Boot (.elf)。放在Flash起始地址。 - image.ub:包含Linux内核、设备树(Device Tree)和根文件系统(Rootfs)。放在Flash的Kernel分区。
注意:为了让小白最快成功,本文采用initramfs(根文件系统打包进内核镜像)的方式,这样只需要烧录BOOT.bin和image.ub两个文件即可!
🛠️ 第一步:Vivado硬件配置 (开启NAND控制器)
要在NAND中启动,ZYNQ的PS端必须开启NAND控制器。
- 打开Vivado,进入Block Design,双击
ZYNQ7 Processing SystemIP核。 - 点击 Peripheral I/O Pins。
- 找到 Memory Interfaces -> 勾选 SMC (NAND)。
- 检查你的原理图,配置正确的NAND引脚和Bank电平(通常是Bank 500, 1.8V或3.3V)。
- 正常进行
Run Synthesis->Run Implementation->Generate Bitstream。 - 导出硬件:点击
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 settings和kernel image settings的启动介质都改为 primary flash。
4. 配置文件系统打包进内核 (最稳妥的方案)
- 退回主菜单,进入
Image Packaging Configuration。 - 将
Root filesystem type设置为 INITRAMFS。 - 保存并退出 (
Save->Exit)。

⚙️ 第三步:编译与生成文件
配置完成后,一键编译:
bash
petalinux-build
等待编译完成后,所有的原材料就准备好了!
生成 BOOT.bin
在终端输入以下命令,PetaLinux会自动把 fsbl.elf、system.bit 和 u-boot.elf 打包成一个 BOOT.bin 文件:
bash
petalinux-package --boot --fsbl --fpga --u-boot --force
打包成功后,你需要的文件都在 images/linux/ 目录下:
- BOOT.bin (系统引导文件)
- image.ub (内核+设备树+根文件系统)
将这两个文件拷贝到你的Windows电脑上。
⚡ 第四步:通过JTAG烧录文件到NAND Flash
因为没有SD卡,我们不能把文件拷进卡里让它自己更新。我们需要借助下载器(JTAG)和 Vitis (或 Xilinx SDK) 将文件硬写进NAND Flash。
1. 准备烧录环境
- 用JTAG连接开发板和电脑。
- 将开发板的启动模式拨码开关拨到 JTAG 模式(很重要!不然可能连不上)。
- 开发板上电。
- 打开 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: 同上。
- 点击 Program 。
image.ub比较大,烧录需要一些时间,耐心等待。

🚀 第五步:见证奇迹的时刻
- 烧录完成后,关闭开发板电源。
- 将开发板的启动模式拨码开关拨到 NAND 启动模式(具体参考你的开发板手册)。
- 打开串口调试助手(MobaXterm、Putty等),波特率通常设为
115200。 - 重新给开发板上电!
如果在串口终端中,你看到了熟悉的 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是在内存中解压运行的临时根文件系统。如果你想让修改的文件永久保存,后续需要学习如何挂载 JFFS2 或 UBIFS 文件系统。但对于小白打通"从0到1"的启动流程,本教程的方案是最不易出错的!