告别MFGTool!手把手教你用U-Boot命令给NAND版IMX6ULL烧写内核和设备树

张开发
2026/4/18 5:13:06 15 分钟阅读

分享文章

告别MFGTool!手把手教你用U-Boot命令给NAND版IMX6ULL烧写内核和设备树
告别MFGTool手把手教你用U-Boot命令给NAND版IMX6ULL烧写内核和设备树在嵌入式Linux开发中IMX6ULL处理器的NAND版本开发板是许多开发者的首选。传统上我们依赖NXP官方的MFGTool工具来完成系统镜像的烧写但这种黑盒操作方式往往让开发者感到束手束脚。今天我将分享一种更透明、更可控的方法——完全在U-Boot命令行环境下完成Linux内核和设备树的更新。这种方法特别适合那些系统已初步运行但需要进行内核调试或升级的开发者。通过直接操作U-Boot命令你不仅能更深入地理解系统启动流程还能在开发过程中获得更大的灵活性和控制权。更重要的是当MFGTool无法使用时比如在远程调试场景下这种方法将成为你的救命稻草。1. 准备工作与环境搭建在开始烧写之前我们需要确保开发环境已经正确配置。首先确认你的开发板是NAND版本并且已经能够正常启动到U-Boot命令行界面。如果你是从头开始配置需要特别注意以下几点开发板连接通过串口连接开发板与主机确保能够接收U-Boot输出并输入命令网络配置开发板与主机需要在同一局域网并配置好TFTP服务文件准备准备好要烧写的内核镜像(zImage)和设备树文件(.dtb)提示建议在操作前备份当前系统中的重要数据避免意外擦除导致数据丢失1.1 确认NAND信息在U-Boot命令行中我们可以使用以下命令查看NAND Flash的基本信息nand info这个命令会输出NAND的页大小、OOB区域大小和擦除块大小等关键参数。对于IMX6ULL开发板典型的输出可能如下参数名称典型值说明Page Size2048 bytes单页大小OOB Size64 bytes每页的OOB区域大小Erase Size128 KB最小擦除块大小1.2 网络配置与文件传输为了将内核和设备树文件传输到开发板我们需要配置TFTP服务。在U-Boot中首先设置开发板的IP地址和服务器IPsetenv ipaddr 192.168.1.100 # 开发板IP setenv serverip 192.168.1.10 # TFTP服务器IP saveenv # 保存环境变量然后使用ping命令测试网络连接ping 192.168.1.10如果网络连接正常就可以使用tftp命令下载文件到开发板的DRAM中。例如下载内核镜像tftp 0x87800000 zImage2. 理解NAND分区布局在IMX6ULL开发板上NAND Flash通常被划分为几个固定的分区每个分区有明确的用途和地址范围。典型的NAND分区表如下分区名称起始地址结束地址大小用途boot0x000000000x004000004MBU-Bootkernel0x004000000x006000002MBLinux内核dtb0x006000000x007000001MB设备树rootfs0x007000000x0200000025MB根文件系统理解这个分区表至关重要因为它决定了我们应该将内核和设备树文件烧写到哪个地址范围。错误的地址可能导致系统无法启动或数据损坏。2.1 查看当前分区在U-Boot中可以使用以下命令查看NAND的分区信息mtdparts这个命令会显示当前配置的MTD分区表包括每个分区的名称、地址范围和大小。如果输出为空或不符合预期可能需要先设置正确的分区表。2.2 地址对齐的重要性NAND操作有一个关键特性所有操作都必须对齐到擦除块边界。对于IMX6ULL典型的擦除块大小是128KB。这意味着擦除操作必须从擦除块边界开始擦除大小必须是擦除块大小的整数倍写入操作也应当遵循这些对齐规则不遵守这些规则可能导致操作失败或数据损坏。例如如果你尝试从0x400010地址开始擦除很可能会收到错误提示。3. 内核镜像的烧写流程现在我们进入实际操作阶段。首先从内核镜像开始这是系统启动的核心组件。3.1 下载内核镜像使用TFTP将内核镜像下载到DRAM中。我们通常选择0x87800000作为加载地址这是IMX6ULL的内存映射中一个安全的位置tftp 0x87800000 zImage下载完成后可以检查文件大小iminfo 0x87800000这个命令会显示镜像的头部信息包括大小和校验和。记录下实际的镜像大小后续擦除和写入操作需要参考这个值。3.2 擦除目标区域根据分区表内核分区从0x00400000开始。我们需要先擦除这个区域nand erase 0x00400000 0x00200000这里我们擦除了整个2MB的内核分区。虽然实际内核镜像可能只有600-700KB但擦除整个分区可以确保足够的空间也避免了复杂的尺寸计算。注意擦除操作是不可逆的执行前请确认地址和大小正确3.3 写入内核镜像现在可以将DRAM中的内核镜像写入NANDnand write 0x87800000 0x00400000 0x00200000这个命令将把从0x87800000开始的2MB数据写入NAND的0x00400000地址处。虽然我们可能只下载了600KB的内核但写入整个2MB是安全的多余的空白区域不会影响系统运行。4. 设备树文件的烧写方法设备树文件虽然小但对系统启动同样关键。它的烧写流程与内核类似但有一些特殊注意事项。4.1 下载设备树文件使用TFTP下载设备树文件到DRAMtftp 0x87800000 imx6ull-alientek-nand.dtb设备树文件通常很小几十KB但我们需要确保下载的版本与内核兼容。下载后可以检查文件头fdt addr 0x87800000 fdt header4.2 擦除设备树分区设备树分区从0x00600000开始大小通常为1MBnand erase 0x00600000 0x001000004.3 写入设备树文件将设备树文件写入NANDnand write 0x87800000 0x00600000 0x00100000由于设备树文件很小我们实际上可以只写入实际大小而不是整个分区。但为了简单起见写入整个分区也是可行的。5. 验证与调试技巧烧写完成后我们需要验证操作是否成功。以下是一些实用的验证方法和调试技巧。5.1 读取验证最简单的验证方法是读取刚写入的内容nand read 0x83000000 0x00400000 0x00200000 # 读取内核 nand read 0x83000000 0x00600000 0x00100000 # 读取设备树然后可以使用iminfo和fdt命令检查读取到的内容iminfo 0x83000000 # 检查内核镜像 fdt addr 0x83000000 # 设置设备树地址 fdt print # 打印设备树内容5.2 常见问题排查在实际操作中可能会遇到各种问题。以下是一些常见错误及解决方法TFTP下载失败检查网络连接和IP设置确认TFTP服务器已启动且文件路径正确尝试使用不同的DRAM地址如0x82000000NAND操作错误确认地址对齐到擦除块边界检查分区大小是否足够确保NAND没有写保护启动失败确认烧写的镜像与硬件兼容检查启动参数是否正确设置验证设备树是否匹配当前硬件5.3 高级技巧对于需要频繁调试的开发者可以设置U-Boot环境变量来简化操作setenv update_kernel tftp 0x87800000 zImage; nand erase 0x00400000 0x00200000; nand write 0x87800000 0x00400000 0x00200000 setenv update_dtb tftp 0x87800000 imx6ull-alientek-nand.dtb; nand erase 0x00600000 0x00100000; nand write 0x87800000 0x00600000 0x00100000 saveenv之后更新内核和设备树只需要分别执行run update_kernel run update_dtb6. 安全注意事项与最佳实践NAND操作具有一定的风险性不当的操作可能导致系统无法启动或数据丢失。以下是一些重要的安全注意事项。6.1 避免全片擦除最重要的规则是永远不要执行nand erase.chip命令。这个命令会擦除整个NAND Flash包括U-Boot本身导致系统完全无法启动只能通过专业的编程器恢复。6.2 备份关键数据在进行任何修改前建议备份当前的关键数据nand read 0x83000000 0x00400000 0x00200000 # 备份内核 tftpput 0x83000000 0x00200000 kernel_backup.bin nand read 0x83000000 0x00600000 0x00100000 # 备份设备树 tftpput 0x83000000 0x00100000 dtb_backup.dtb6.3 操作确认流程建议建立一套标准的操作确认流程确认当前分区布局mtdparts确认要写入的文件大小iminfo/fdt header计算并确认擦除区域执行擦除操作执行写入操作验证写入结果6.4 性能优化建议对于需要频繁烧写的情况可以考虑以下优化使用RAM文件系统减少NAND写入次数合理设置擦除块大小避免过度擦除考虑使用UBI文件系统提高NAND管理效率在实际项目中我发现最常遇到的问题是不匹配的内核和设备树版本。一个实用的技巧是在文件名中加入版本号或日期如zImage_v1.2和imx6ull_v1.2.dtb这样可以避免混淆。另外在远程更新时建议先在本地测试确认镜像的兼容性再部署到现场设备。

更多文章