大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动。
接着上篇文章 《了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点》 继续聊。对于i.MXRT1050为代表的第一代型号,Flash里必须要放置用户FDCB配置块,存储在这颗Flash里的App才能被正常启动。这个设计在i.MXRT1060为代表的第二代型号里有了改良,BootROM中增加了一个新特性,叫Auto Probe(自动识别),这个特性可以在不放置用户FDCB配置块的情况下App也能被正常启动。今天痞子衡就跟大家好好聊聊这个特性:
- 备注:本文主角是i.MXRT1060,内容也基本适用i.MXRT1170,仅细节微小差别。
一、自动识别功能意义
先从整体FlexSPI NOR启动初始化流程图上来看,自动识别(步骤X)被插入了初始化流程中,安排在FlexSPI外设第一次初始化之后,BootROM此时会尽力尝试去识别外接的Flash信息,如果识别成功则会得到一个自识别FDCB配置块,然后直接跳到FlexSPI NOR第二次初始化流程。如果识别失败,则继续按原来方式尝试读取用户FDCB配置块来获取外接Flash信息。
有了Flash自动识别功能,BootROM可以不必再强制客户在Flash里放置FDCB块,很多时候客户未必特别了解Flash以及这个FDCB块结构,不用提供FDCB可以为客户省去很多耗费在Flash上的研发时间,客户仅需要全心关注App功能设计。
二、开启自动识别功能
Flash自动识别功能开启位在fuse_0x450[0](或者BT_CFG[0]引脚),默认是不使能的。想要开启这个功能需要拉高相关CFG引脚或者烧写相应Fuse位。
fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自动识别功能开启
三、自动识别依赖的配置
虽说是Flash自动识别,但其实还是依赖Fuse里一些配置的,一共有如下四处配置,BootROM会根据这四处配置去进入Flash自动识别程序从而得到一个匹配的FDCB配置块,所以其实这个功能更准确的说法应该是FDCB自动生成。
fuse 0x450[10:8] - FLASH_TYPE,决定当前连接的Flash类型 fuse 0x450[3:2] - FLASH_PROBE_TYPE,当FLASH_TYPE=0/1/7时,取代FLASH_TYPE来决定当前连接的Flash类型 fuse 0x6e0[3:1] - xSPI_FLASH_BOOT_FREQUENCY,决定FlexSPI工作频率 fuse 0x6e0[11:8] - xSPI_FLASH_DUMMY_CYCLE,配置Flash读访问时序前需要的Dummy周期
关于FDCB自动生成,其实就是利用了BootROM里那一套经典的FlexSPI NOR驱动(详见痞子衡之前的文章 《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可轻松IAP》 里的2.2和2.3节),自动识别就是根据配置值组合出一个匹配的 serial_nor_config_option_t option参数,经由flexSpiNorDriver->get_config()函数运行后便可得到完整的flexspi_nor_config_t config结构体(即FDCB)。
serial_nor_config_option_t option参数组合规则如下表所示:
FLASH TYPE | FLASH PROBE TYPE | option值 | 备注 |
---|---|---|---|
3'b000 3'b111 |
2'b00 | 0xc0000001 | 可进一步dummy cycle设置 |
2'b01 | 0xc0603001 | ||
2'b10 | 0xc0403001 | ||
2'b11 | 0xc0803001 | ||
3'b001 | 2'b00 | 0xc0100001 | 可进一步dummy cycle设置 |
2'b01 | 0xc0700001 | ||
2'b10 | 0xc0503001 | ||
2'b11 | 0xc0903001 | ||
3'b010 | N/A | 0xc0233001 | |
3'b011 | N/A | 0xc0333001 | |
3'b100 | N/A | 0xc0433001 | |
3'b101 | N/A | 0xc0633001 | |
3'b110 | N/A | 未定义 |
四、自动识别功能测试
了解了这个自动识别功能细节之后,让我们在MIMXRT1060-EVK上测试一下,首先需要将BT_CFG[0]引脚拉高(R325电阻焊上去,默认DNP),这就开启了自动识别功能。
MIMXRT1060-EVK上默认连接的是IS25WP064AJBLE,这是一颗经典的133MHz QuadSPI NOR Flash,Fuse里的初始自动识别配置(FLASH_TYPE = 000 - Device supports 3B read,FLASH BOOT FREQ = 0 - 100MHz)适合这颗Flash,因此无需再烧录任何Fuse或拉高其他BT_CFG[x]引脚。
随便选一个例程 \SDK\boards\evkmimxrt1060\demo_apps\led_blinky 。编译这个 led_blinky 工程(可以选择 flexspi_nor_debug build,工程选项里XIP_BOOT_HEADER_ENABLE=1现在可以去掉了),使用 NXP-MCUBootUtility 工具将其一键下载进Flash中,下载完成后注意擦除掉Flash前1KB的数据(即没有FDCB),切换启动模式后复位板子,可以看到LED正常闪烁,说明自动识别功能生效了。
如果我们将MIMXRT1060-EVK上的Flash改为S26KS512SDPBHI02,这是一颗典型的1.8V HyperFlash,那么还需要将BT_CFG2[2:0]设为 3'b010 - HyperFlash 1V8才能正常自识别。
至此,自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动痞子衡便介绍完毕了,掌声在哪里~~~