Zynq-7000 系列基于 NAND Flash 的 Linux 系统网络在线更新 BOOT.BIN 教程(Petalinux 2017.4) Zynq-7000 系列基于 NAND Flash 的 Linux 系统网络在线更新 BOOT.BIN 教程Petalinux 2017.4文章目录Zynq-7000 系列基于 NAND Flash 的 Linux 系统网络在线更新 BOOT.BIN 教程Petalinux 2017.4一、 基本原理与注意事项二、 准备工作Petalinux 配置1. 配置 Rootfs 启用 mtd-utils2. 确认网络服务3. 编译并烧录三、 具体操作步骤第一步确认 NAND Flash 分区信息第二步将新的 BOOT.BIN 通过网络传输到板子方法 A使用 SCP推荐方法 B使用 TFTP第三步在 Linux 中擦除并烧写 NAND Partition1. 擦除原有的 Boot 分区2. 将 BOOT.BIN 写入分区第四步重启验证四、 常见问题与注意事项FAQ在嵌入式开发中经常需要对设备的固件进行升级。对于使用 NAND Flash 并运行 LinuxUBIFS 文件系统的 Zynq-7000 系统如果每次更新BOOT.BIN都要通过 JTAG 烧写或者拆卸芯片效率会非常低。本文将介绍如何利用 Zynq PS 端的网络接口在 Linux 系统运行状态下远程将新的BOOT.BIN写入 NAND Flash 的启动分区。一、 基本原理与注意事项BOOT.BIN 的存储位置在 Zynq NAND Flash 启动模式下BootROM 只能识别未格式化的原始 MTD 分区Raw MTD Partition。因此虽然你的 Linux 根文件系统使用的是UBIFS但BOOT.BIN必须直接烧写在 MTD 的起始分区通常是/dev/mtd0而不是放在 UBIFS 文件系统中。NAND Flash 的特殊性NAND Flash 存在坏块管理和 OOBOut of Band区。因此不能使用普通的dd命令直接写入必须使用专门的 MTD 工具如flash_erase和nandwrite它们能够自动处理坏块。二、 准备工作Petalinux 配置为了实现网络传输和 NAND 写入Linux 系统中需要具备以下工具网络传输服务SSH/SCP推荐默认集成且安全或 TFTP。MTD 分区操作工具mtd-utils包含flash_erase、nandwrite等。1. 配置 Rootfs 启用mtd-utils在 Petalinux 工程根目录下运行配置命令petalinux-config-crootfs在弹出的菜单中使能以下工具进入Filesystem Packages-base-mtd-utils勾选mtd-utils。确保mtd-utils-flash-erase和mtd-utils-nandwrite被选中通常勾选mtd-utils后会自动选中相关子项。2. 确认网络服务Petalinux 默认集成了dropbear一个轻量级的 SSH 服务器支持 SCP。可以在Filesystem Packages-console/network-dropbear中确认其是否处于使能状态。3. 编译并烧录配置完成后重新编译并生成新的系统镜像petalinux-build将更新后的系统部署到板子上确保系统能够正常启动并联网。三、 具体操作步骤第一步确认 NAND Flash 分区信息连接到 Zynq 板子的串口或通过 SSH 登录输入以下命令查看 MTD 分区表cat/proc/mtd输出信息大致如下dev: size erasesize name mtd0: 00800000 00020000 boot mtd1: 00800000 00020000 bootenv mtd2: 02000000 00020000 kernel mtd3: 1d000000 00020000 rootfs解释在这个例子中mtd0分区名为boot大小为 8MB这就是用来存放BOOT.BIN的分区。请根据你实际的设备树Device Tree分区命名来确认对应的mtdX编号。第二步将新的BOOT.BIN通过网络传输到板子你可以选择SCP或TFTP方式将 PC 上的BOOT.BIN传输到 Zynq 板子的/tmp目录/tmp是内存文件系统读写速度快且不占用 Flash 寿命。方法 A使用 SCP推荐在 Windows PC 上可以使用WinSCP、MobaXterm等可视化工具或者直接在主机命令行执行scpBOOT.BIN root板子IP地址:/tmp/(注意Petalinux 默认的用户名为root密码通常在第一次启动时会要求设置或者默认为空/root)方法 B使用 TFTP如果在 PC 上搭建了 TFTP 服务器如 tftpd64可以在 Zynq 板子上执行cd/tmp tftp-g-rBOOT.BINPC的IP地址第三步在 Linux 中擦除并烧写 NAND Partition请注意以下操作涉及底层 Flash 写入请确保写入的分区对应无误且中途不要断电。1. 擦除原有的 Boot 分区在写入新数据之前必须先擦除 MTD 分区NAND Flash 的物理特性决定了只能将 1 写为 0写数据前必须擦除为全 1。使用flash_erase命令flash_erase /dev/mtd000参数解释/dev/mtd0是目标分区第一个0表示从偏移量 0 开始第二个0表示擦除整个分区。2. 将BOOT.BIN写入分区使用nandwrite命令将临时目录中的BOOT.BIN写入mtd0nandwrite-p/dev/mtd0 /tmp/BOOT.BIN参数解释-por--pad表示如果文件大小未对齐到 NAND 的页大小则自动填充Padding这是 NAND 烧写常用的参数。如果终端显示类似如下信息说明写入完成Writing data to block 0 at offset 0x0 Writing data to block 1 at offset 0x20000 ...第四步重启验证确认无报错后可以安全重启板子以验证新的BOOT.BIN是否生效reboot四、 常见问题与注意事项FAQ为什么不用dd命令dd命令是直接进行按字节复制它既不关心 NAND Flash 的坏块Bad Blocks也不会妥善处理 OOB 数据。如果写入区域刚好有坏块使用dd可能会导致系统无法启动。而nandwrite会跳过坏块并进行标记。如果更新失败导致无法开机怎么办网络更新如果因为断电或分区写错导致损坏BootROM 将无法引导。此时需要通过底线手段恢复使用 JTAG如 Vivado/SDK 的 Program Flash 工具重新烧写基础的BOOT.BIN。BOOT.BIN 文件大小超出了分区限制如果新的BOOT.BIN大小超过了mtd0的分区大小例如分区只有 8MB而文件有 9MBnandwrite会报错提示空间不足。遇到这种情况需要修改设备树dts中的分区定义重新规划 Flash 空间。