最近,关于恩智浦i.MXRT1xxx系列MCU从Serial NAND启动的咨询越来越多,使这一相对小众的启动方式受到了更多关注。根据观察,客户的主要目的是在应用中基于Serial NAND构建文件系统(在文件存储或多媒体数据应用方面,Raw NAND的传统优势正在减弱),并顺带将其用于应用程序代码的启动。
借此机会,本文将详细介绍在Serial NAND上制作、下载和启动程序的全流程方法。
Note:文中贴图与代码示例主要以 i.MXRT1050 为例,其余 i.MXRT1xxx 系列原理相似。
一、支持的Serial NAND型号
Serial NAND的供应商和具体型号非常繁多。如果你在为i.MXRT选型时感到困惑,可以考虑以下四款经过实测验证的芯片:
Macronix MX35LF2G24AD (120MHz, x4 bits, 2KB Page/128KB Block/2Gb Device, 8-bit/544byte ECC, 3.3V)
Winbond W25N01GV (104MHz, x4 bits, 2KB Page/128KB Block/1Gb Device, 1-bit/528byte ECC, 3.3V)
GigaDevice GD5F1GQ5UEYIG (133MHz, x4 bits, 2KB Page/128KB Block/1Gb Device, 4-bit/528byte ECC, 3.3V)
Micron MT29F1G01ABA (133MHz, x4 bits, 2KB Page/128KB Block/1Gb Device, 8-bit/Sector ECC, 3.3V)
一个需要特别注意的关键点是:与《i.MXRT从Raw NAND启动》一文中既可使用软件ECC也可利用Flash自带硬件ECC不同,从Serial NAND启动必须依赖Flash自带的硬件ECC功能。
二、Serial NAND的硬件连接
除了i.MXRT1010/1024/1064不支持Serial NAND启动外,其余i.MXRT1xxx系列均支持。其中,i.MXRT10xx系列仅支持一组固定的引脚连接组合,而i.MXRT11xx则支持多组组合。以i.MXRT1050为例,其BootROM支持通过以下引脚复用(PinMux)连接Serial NAND进行启动:

下图是IMXRT1050EVK12_Rev.A开发板上四线QSPI Flash的连接设计。板载默认的U33芯片是Serial NOR Flash,我们可以将其替换为同封装的Serial NAND。例如,可以将其更换为MX35LF2G24AD进行测试,同时需要将FLASH_VCC的供电相应地改为3.3V:

三、Serial NAND的加载与启动过程
我们知道,Serial NAND中只能放置非就地执行(Non-XIP)的应用程序(这些程序需链接到内部SRAM或外部RAM空间)。其启动加载流程与《从 Serial(1-bit SPI) NOR/EEPROM恢复启动》一文中描述的流程类似(可参考该文第3节)。
i.MXRT的BootROM处理Serial NAND启动的流程与处理Raw NAND启动几乎一致,都依赖于FCB(Flash Configuration Block)和DBBT(Discovery Bad Block Table)这两个核心数据结构。当然,Serial NAND和Raw NAND对这两个数据结构的具体成员定义有所不同。关于FCB和DBBT的详细作用与机制,在《i.MXRT从Raw NAND启动》一文的第三、四小节已有清晰阐述,此处不再重复。
i.MXRT1050参考手册的System Boot章节描绘了上电启动时,BootROM代码搜索FCB和DBBT的流程图。只有成功找到这两个数据结构,应用程序才能被正常加载。这里有一个至关重要的细节:FCB和DBBT是在配套的Flashloader执行过程中动态生成的,因为它们涉及NAND Flash内部具体的坏块分布信息。这意味着我们无法像对待NOR Flash那样,在PC端预先制作出一个包含完整启动头(FCB、DBBT、IVT、BD)的NAND可启动镜像。

四、将应用程序下载至Serial NAND
现在假设你已经制作好一个可启动镜像(Bootable image),并且使用blhost工具与Flashloader建立了基本通信,正准备开始将镜像下载到Serial NAND中。此时,我们只需要提供简化的12到44字节配置数据,即可完成Serial NAND的全部配置。以下是以MX35LF2G24AD为例的应用程序下载更新命令序列:
// 在SRAM中临时存储Serial NAND配置数据(FCB选项)
blhost -u -- fill-memory 0x20202000 0x4 0xC2000103 // searchCount=2, searchStride = 64 pages, 地址类型:块地址, 选项块大小:3个长字
blhost -u -- fill-memory 0x20202004 0x4 0x2020200C // NAND选项地址
blhost -u -- fill-memory 0x20202008 0x4 0x4004 // image0 从第4个块开始,最大长度为4个块
// 在SRAM中临时存储Serial NAND配置数据(NAND选项)
blhost -u -- fill-memory 0x2020200C 0x4 0xC0020023 // Flash容量:2Gbit, 1个平面, 每块64页, 页大小:2KB, 最大频率:60MHz
// 使用Serial NAND配置数据配置FlexSPI接口并写入完整的FCB、DBBT数据
blhost -u -- configure-memory 0x101 0x20202000
上述 fill-memory 命令中的FCB选项配置数据组织格式详见下表:

上述 fill-memory 命令中的NAND选项配置数据组织格式详见下表:

上述表格描述的12-44字节数据主要提供了FCB和NAND设备属性的配置信息。configure-memory 命令成功执行后,后续只需从Serial NAND对应的块地址开始下载可启动镜像即可,具体步骤如下:
// 擦除Serial NAND并将镜像下载到Serial NAND中
blhost -u -- flash-erase-region 0x4 0x4 0x101 // 从第4个块开始擦除,擦除范围为4个块
blhost -u -- write-memory 0x4 bt_image.bin 0x101 // 从第4个块开始下载包含ivt、bd的镜像文件
当然,以上所有繁琐的命令行操作都可以使用MCUBootUtility工具(v5.2.1及以上版本)一键完成,其图形化界面使配置和烧录过程更加直观便捷:

五、进入Serial NAND启动模式
应用程序成功下载到Serial NAND后,我们就可以开始设置芯片从Serial NAND启动了。
首先,需要确保BOOT_MODE[1:0] = 2‘b10,即芯片处于内部启动(Internal Boot)模式。然后,再来选择启动设备。启动设备由BOOT_CFG1[7:4]这四个引脚的电平输入状态决定,其中Serial NAND启动模式对应为4’b11xx。
六、配置eFuse以从Serial NAND启动
设置好芯片从Serial NAND启动的模式后,我们还需要最后关注与Serial NAND相关的具体特性配置,这些配置主要集中在芯片内部的eFuse区域0x6e0/0x450中。根据前面的配置,这里我们只需要将BOOT_SEARCH_COUNT位设置为1,其余位保持默认值0即可。

这里单独解释一下COL_ADDRESS_WIDTH,其默认值为0,即12位。这看起来对应了4KB的页大小,但由于ECC特性,在这种设置下,低2KB的页空间用于存储真实数据,而高2KB的页空间实际上属于所谓的“备用(Spare)”区域,会被Flash自动用于存放ECC校验码。不过,这个Spare区域的有效范围在64字节到128字节之间不等(对于MX35LF2G24AD则是128字节)。

完成上述所有步骤后,复位芯片,你应该就能看到存放在Serial NAND中的应用程序正常启动了。
希望这篇关于恩智浦i.MXRT1xxx系列MCU串行NAND启动的详细指南能对你的项目开发有所帮助。如果在实践过程中遇到任何问题,欢迎到专业的开发者社区与其他工程师交流探讨。