从Vivado到上电启动手把手教你用Petalinux 2022.1为Zynq Nano板卡制作可启动SD卡在嵌入式系统开发领域Xilinx Zynq系列SoC因其独特的ARM处理器FPGA架构而广受欢迎。然而许多开发者在从硬件设计转向系统部署时常常会在制作启动镜像这一环节遇到各种坑。本文将基于最新的Petalinux 2022.1工具链为你呈现一个完整、可靠的SD卡制作流程特别针对Zynq-7000系列中的Nano板卡。与网上大量过时的教程不同我们将重点关注2020.1版本后的工具链变化特别是boot.scr文件的必要性以及正确的分区方案。无论你是刚从Vivado完成硬件设计还是已经尝试过几次启动失败这篇文章都将帮助你避开那些隐藏的陷阱建立起标准化的开发流程。1. 环境准备与项目创建在开始之前确保你的Ubuntu系统推荐20.04 LTS已安装好Petalinux 2022.1工具链。与旧版本不同2022.1对系统依赖有更严格的要求特别是以下关键组件sudo apt-get install -y gcc g build-essential \ python3-dev device-tree-compiler bison flex \ libssl-dev libncurses5-dev libssl-dev重要提示避免在WSL环境中运行Petalinux因为其文件系统性能问题和设备访问限制可能导致构建失败。我们推荐使用物理机或完整虚拟机安装的Ubuntu系统。创建项目时模板选择至关重要。对于Zynq Nano属于Zynq-7000系列正确的创建命令是source ~/petalinux/2022.1/settings.sh petalinux-create --type project --template zynq --name z7nano cd z7nano2. 硬件描述导入与系统配置从Vivado导出硬件描述文件时务必选择.xsa格式Xilinx Support Archive这是2020.1版本后取代.hdf的新标准。假设你的design_1_wrapper.xsa文件位于当前目录导入命令应为petalinux-config --get-hw-description.配置界面中需要特别关注以下参数配置项推荐值说明Subsystem AUTO Hardware Settings → Memory Settings根据.xsa自动填充确保与Vivado设计一致Image Packaging Configuration → Root filesystem typeEXT4SD卡根文件系统格式Device Drivers → Generic Driver Options → Size in MB根据SD卡容量设置建议至少预留2GB注意如果硬件设计中包含自定义IP核需在此阶段通过petalinux-config -c kernel启用相应驱动支持。3. 系统构建与镜像生成执行构建命令前建议先清理可能存在的中间文件petalinux-build -x mrproper petalinux-build构建完成后images/linux目录将包含以下关键文件zImage压缩的内核镜像rootfs.cpio.gz初始RAM文件系统system.dtb设备树二进制文件u-boot.elfU-Boot引导加载程序生成可启动镜像的关键步骤是正确打包BOOT.BIN。与旧版本不同2022.1需要明确指定FSBLFirst Stage Bootloader和PMUPlatform Management Unit固件petalinux-package --boot --fsbl images/linux/zynq_fsbl.elf \ --u-boot images/linux/u-boot.elf \ --pmufw images/linux/pmufw.elf \ --force4. SD卡分区与文件部署这是最容易出错的环节。现代Petalinux要求SD卡必须包含两个特定分区FAT32引导分区建议100MB必须设置为可启动标志包含文件BOOT.BIN,image.ub,boot.scrEXT4根文件系统分区剩余空间包含解压后的rootfs.tar.gz内容使用fdisk进行分区的典型操作流程sudo fdisk /dev/sdX # 在fdisk交互界面中依次执行 # o (创建新DOS分区表) # n (新建分区), p, 1, 回车, 100M # a (设置启动标志), 1 # n, p, 2, 回车, 回车 # w (写入更改)格式化并挂载分区sudo mkfs.vfat -F 32 -n BOOT /dev/sdX1 sudo mkfs.ext4 -L ROOTFS /dev/sdX2 mkdir -p /mnt/{boot,rootfs} sudo mount /dev/sdX1 /mnt/boot sudo mount /dev/sdX2 /mnt/rootfs文件部署的正确顺序sudo cp images/linux/BOOT.BIN /mnt/boot/ sudo cp images/linux/image.ub /mnt/boot/ sudo cp images/linux/boot.scr /mnt/boot/ sudo tar xvf images/linux/rootfs.tar.gz -C /mnt/rootfs关键区别2020.1版本后boot.scr成为必需文件它包含了U-Boot的环境变量和启动命令。直接拷贝旧教程中的uImagedevicetree.dtb组合将无法启动。5. 常见问题排查当开发板无法启动时可通过串口控制台查看错误信息。以下是几种典型故障的解决方法现象1卡在Starting kernel...检查image.ub是否包含正确版本的内核和设备树确认boot.scr中的bootargs与硬件匹配现象2无法挂载根文件系统检查SD卡EXT4分区的完整性sudo fsck.ext4 -f /dev/sdX2确认bootargs中的root参数正确指向第二个分区如root/dev/mmcblk0p2现象3U-Boot无法找到image.ub验证FAT分区是否设置为启动分区检查文件命名是否准确区分大小写对于更复杂的调试可以修改U-Boot环境变量setenv bootargs earlyprintk consolettyPS0,115200 root/dev/mmcblk0p2 rw setenv bootcmd mmc dev 0 fatload mmc 0 0x3000000 image.ub bootm 0x3000000 saveenv6. 高级技巧与优化建议加速后续构建使用petalinux-build -c kernel -x compile可仅重新编译内核模块节省90%以上的构建时间。自定义boot.scr创建boot.cmd文件echo setenv bootargs consolettyPS0,115200 root/dev/mmcblk0p2 rw earlyprintk boot.cmd echo bootm 0x8000000 boot.cmd mkimage -c none -A arm -T script -d boot.cmd boot.scr空间优化在petalinux-config中启用INITRAMFS选项可以合并内核和根文件系统省去单独的rootfs分区。实际项目中我发现最稳定的组合是Petalinux 2022.1 Vivado 2022.1U-Boot 2022.01Linux kernel 5.15使用SanDisk Extreme Pro系列SD卡工业级稳定性