RT600 BootROM RM解析 (3)
RT600 RM CH41:RT6xx 非安全BootROM (3)
41.4 引导模式
ROM 引导加载程序支持以下引导模式:
- Master Boot 模式
- Recovery Boot 模式
- Serial Boot 模式
- ISP Boot 模式
41.5 主引导模式
主引导模式支持以下引导设备:
- FlexSPI 引导
- SD 引导
- eMMC 引导
- SPI NOR 引导
引导加载程序从引导介质上的指定偏移量查找引导镜像。详情见表 1000。
表 1000. 不同引导介质上的镜像偏移量
引导介质 | 镜像偏移量 |
---|---|
FlexSPI 引导(串行 NOR 闪存设备) | 0x1000 |
SD 引导(SD 卡) | 0x1000 |
eMMC 引导(eMMC 存储器) | 0x1000 |
SPI 1 位 NOR 引导 | 0x1000 |
41.5.1 FlexSPI 引导
引导加载程序通过 FlexSPI 接口,使用位于闪存设备偏移量 0x400
处的闪存配置块(FCB)或 OTP 中指定的闪存自动探测功能,支持访问各种厂商的不同 Quad/Octal SPI NOR 闪存设备,可使用 1 位、2 位(双)、4 位(四)或 8 位(八)模式。FCB 的详细信息见表 1001。
- 若
FLEXSPI_AUTO_PROBE_EN
已熔断,引导加载程序将使用FLEXSPI_FLASH_PROBE_TYPE
字段(定义闪存自动探测类型)、FLEXSPI_FLASH_TYPE
字段(定义闪存类型)和FLEXSPI_FLASH_BOOT_FREQ
字段(定义闪存访问速度)中熔断的参数执行闪存自动探测序列。 - 若未熔断,引导加载程序将查看闪存设备上的偏移量
0x400
。若偏移量0x400
处的数据等于0x42464346
,引导加载程序将把整个 512 字节的 FCB 读入片上 SRAM,并使用该 FCB 相应地配置 FlexSPI 控制器。
上述操作完成后,引导加载程序开始执行正常引导流程。更多细节见 图 187。
表 1001. FlexSPI 闪存配置块
字段 | 偏移量 | 大小(字节) | 描述 |
---|---|---|---|
tag | 0x000 | 4 | 配置块标签,必须为 0x42464346 。 |
version | 0x004 | 4 | 配置块版本,供引导 ROM 内部使用,固定为 0x56020000 。 |
reserved | 0x008 | 4 | 保留。 |
readSampleClkSrc |
0x00C | 1 | 读取采样时钟源选项: 0 - 内部环回 1 - 来自 DQS 焊盘的环回 2 - 来自 SCK 焊盘的环回 3 - 外部 DQS 信号 |
csHoldTime | 0x00D | 1 | CS 保持时间(以闪存时钟周期为单位),推荐值为 3。 |
csSetupTime | 0x00E | 1 | CS 建立时间(以闪存时钟周期为单位),推荐值为 3。 |
columnAddressWidth | 0x00F | 1 | 列地址宽度: HyperFLASH 设为 3 其他闪存设备设为 0 |
deviceModeCfgEnable | 0x010 | 1 | 启用 Device Mode Configuration 序列。 |
reserved | 0x011 | 1 | 保留。 |
deviceModeSeq | 0x014 | 4 | 设备模式配置序列: 字节 0:所需序列数 字节 1:序列索引 |
deviceModeArg | 0x018 | 4 | 设备模式配置参数(如某些 QSPI 闪存设备状态寄存器 2 中的 QE 设置)。 |
configCmdEnable | 0x01C | 1 | 配置命令使能: 0 - 忽略配置命令 1 - 启用配置命令 |
configModeType | 0x01D | 3 | 配置命令类型,支持最多 3 种类型,每种类型与一个配置命令序列组合。 |
configCmdSeqs | 0x020 | 12 | 配置命令序列,支持最多 3 个序列。 |
reserved | 0x02C | 4 | 保留。 |
configCmdArgs | 0x030 | 12 | 配置命令参数,支持最多 3 个参数。 |
reserved | 0x03C | 4 | 保留。 |
表 1001. FlexSPI 闪存配置块(续)
字段 | 偏移量 | 大小(字节) | 描述 |
---|---|---|---|
controllerMiscOption | 0x040 | 4 | 控制器杂项配置选项: 位 0 - 差分时钟使能,HyperFLASH 1V8 设备设为 1,其他设备设为 0 位 3 - 字地址使能,HyperFLASH 设为 1,其他设备设为 0 位 4 - 安全配置频率使能,若期望用安全频率配置设备则设为 1 位 6 - DDR 模式使能,若需要 DDR 读取则设为 1 其他位 - 保留,设为 0 |
deviceType | 0x044 | 1 | 设备类型: 1 - 串行 NOR |
sflashPadType | 0x045 | 1 | 读取命令中使用的数据焊盘: 1 - 单焊盘 2 - 双焊盘 4 - 四焊盘 8 - 八焊盘 |
serialClkFreq | 0x046 | 1 | Flash Frequency. In Normal boot mode BOOT_CFG[0]:bit7=0 - SDR 模式:1 - 24 MHz,2 - 48 MHz - DDR 模式:1 - 12 MHz 高速引导模式 BOOT_CFG [0]:bit7=1: SDR 模式:1-30 MHz,2-50 MHz,3-60 MHz,4-80 MHz,5-100 MHz,6-120 MHz,7-133 MHz,8-166 MHz,9-200 MHz DDR 模式:1-30 MHz,2-50 MHz,3-60 MHz,4-80 MHz,5-100 MHz,6-120 MHz,7-133 MHz,8-166 MHz,9-200 MHz |
lutCustomSeqEnable | 0x047 | 1 | LUT 自定义使能:若编程 / 擦除无法在 SDR 模式下用 1 个 LUT 序列完成,则需要此功能(当前仅适用于 HyperFLASH) |
reserved | 0x048 | 8 | 保留,供未来使用。 |
sflashA1Size | 0x050 | 4 | 连接到 A1 的闪存大小。 |
sflashA2Size | 0x054 | 4 | 连接到 A2 的闪存大小。 |
sflashB1Size | 0x058 | 4 | 连接到 B1 的闪存大小。 |
sflashB2Size | 0x05C | 4 | 连接到 B2 的闪存大小。 |
表 1001. FlexSPI 闪存配置块(续)
字段 | 偏移量 | 大小(字节) | 描述 |
---|---|---|---|
csPadSettingOverride | 0x060 | 4 | CS 引脚的焊盘覆盖值。若非零,则使用此值配置 CS 引脚;否则使用默认 ROM 设置。 |
sclkPadSettingOverride | 0x064 | 4 | SCK 焊盘设置覆盖值。 |
dataPadSettingOverride | 0x068 | 4 | 数据焊盘设置覆盖值。 |
dqsPadSettingOverride | 0x06C | 4 | DQS 焊盘设置覆盖值。 |
timeoutInMs | 0x070 | 4 | 终止忙检查的超时值(以毫秒为单位)。 |
commandInterval | 0x074 | 4 | 两个命令之间的 CS 取消选择间隔。 |
dataValidTime | 0x078 | 4 | 端口 A 和端口 B 的时钟边沿到数据有效时间。 |
busyOffset | 0x07C | 2 | 忙标志偏移量,有效值:0-31。 |
busyBitPolarity | 0x07E | 2 | 忙标志极性: 0 - 闪存设备忙时忙标志为 1 1 - 闪存设备忙时忙标志为 0 |
lookupTable | 0x080 | 256 | 16 个 LUT 序列,每个序列由 4 个字组成。更多细节见第 33 章 “RT6xx FlexSPI 闪存接口”。 |
lutCustomSeq |
0x180 | 48 | 可自定义的 LUT 序列。 |
reserved | 0x1B0 | 16 | 保留,供未来使用。 |
pageSize | 0x1C0 | 4 | 闪存页大小。 |
sectorSize | 0x1C4 | 4 | 闪存扇区大小。 |
ipcmdSerialClkFreq | 0x1C8 | 1 | IP 命令的串行时钟频率: 0 - 与读取命令相同 其他值 - 与 serialClkFreq 定义相同 |
isUniformBlockSize | 0x1C9 | 1 | 扇区大小是否与块大小相同。 |
isDataOrderSwapped |
0x1CA | 1 | 数据顺序(D0, D1, D2, D3)是否交换为(D1, D0, D3, D2): 0 - 否 1 - 是 |
reserved | 0x1CB | 1 | 保留,供未来使用。 |
serialNorType | 0x1CC | 1 | 串行 NOR 闪存类型: 0 - 标准 SPI 1 - HyperBus 2 - XPI 3 - NoCmd |
needExitNoCmdMode | 0x1CD | 1 | 执行其他 IP 命令前是否需要退出 NoCmd 模式。 |
halfClkForNonReadCmd | 0x1CE | 1 | 非读取命令是否使用半速串行时钟:是 / 否。 |
needRestoreNoCmdMode | 0x1CF | 1 | IP 命令执行后是否需要恢复 NoCmd 模式。 |
blockSize | 0x1D0 | 4 | 闪存块大小。 |
flashStateCtx | 0x1D4 | 4 | 闪存状态上下文,用于将闪存恢复为默认状态。 |
reserved | 0x1D8 | 40 | 保留,供未来使用。 |
41.5.1.1 FlexSPI 闪存复位
在 FlexSPI 引导期间,引导过程要求 FlexSPI 闪存设备处于特定模式(如 1 位 SPI 兼容模式)。上电复位(POR)后,闪存设备自然会进入此模式,因为上电序列会将其与 RT6xx 设备一起复位。然而,若闪存设备在非 POR 复位(如看门狗定时器或外部引脚复位)时被配置为 DPI 模式、QPI 模式或八进制模式,则不会处于 1 位 SPI 兼容模式。在这种情况下,引导过程需要进行特殊处理,以在继续访问闪存设备之前将其恢复为 1 位 SPI 兼容模式。通常,这可以通过使用 GPIO 断言闪存设备上的复位引脚来实现。
如果 FLEXSPI_RESET_PIN_EN
已熔断,引导加载程序可以使用 FLEXSPI_RESET_PIN_PORT
和 FLEXSPI_RESET_PIN_GPIO
组合指定的 GPIO 执行复位过程,将闪存设备复位为 1 位 SPI 兼容模式。
41.5.1.1.1 闪存掉电
闪存设备可配置为Power-Down模式以降低待机电流。对于 FlexSPI 引导,RT6xx 引导代码访问闪存之前,必须先将闪存从掉电模式中释放。在这种情况下,FLEXSPI_RESET_PIN
可用于在引导过程中切换闪存上的复位引脚,以将闪存从掉电模式中释放。
如果闪存不支持复位引脚,可以设计专用电路为闪存提供 VCC。FLEXSPI_RESET_PIN
可用于控制电路在引导时为闪存上电 / 断电,以将闪存恢复为初始状态。
41.5.1.2 FlexSPI 引导在 OTP 中的配置
与 FlexSPI 引导相关的配置分配在 BOOT_CFG1
OTP 字中,分配详情见 表 1002。
表 1002. OTP 中的 FlexSPI 引导配置
字段名称 | 枚举名称 | 描述 | 偏移量 | 宽度 | 值 |
---|---|---|---|---|---|
FLEXSPI_AUTO_PROBE_EN |
- | Quad/Octal-SPI 闪存自动探测功能使能。 | 0 | 1 | - |
FLEXSPI_PROBE_TYPE | - | Quad/Octal-SPI 闪存探测类型: 000b - QSPI NOR 001b - Macronix Octal Flash 010b - Micron Octal Flash 011b - Adesto Octal Flash 100b-111b - 保留 |
1 | 3 | - |
FLEXSPI_FLASH_TYPE | - | 定义典型串行 NOR 闪存类型: 000b - 设备默认支持 3B 读取 010b - HyperFlash 1V8 011b - HyperFlash 3V3 100b - MXIC Octal DDR 101b - Micron Octal DDR 其他值 - 保留 |
4 | 3 | - |
FLEXSPI_DUMMY_CYCLES | - | 读取命令的 Quad/Octal-SPI 哑周期: 0000b - 自动探测哑周期 其他值 - 指定哑周期数 |
7 | 4 | - |
FLEXSPI_FREQUENCY | - | Quad/Octal-SPI 闪存接口频率: 000b - 100 MHz 001b - 120 MHz 010b - 133 MHz 011b - 166 MHz 100b - 200 MHz 101b - 80 MHz 110b - 60 MHz 111b - 50 MHz | 11 | 3 | - |
FLEXSPI_RESET_PIN_ENABLE | - | 使用 FLEXSPI_RESET_PIN 复位闪存设备: 0 - 未连接或不可用(NO_RESET) 1 - 连接到 GPIO(EN_RESET) |
14 | 1 | - |
FLEXSPI_RESET_PIN | - | 用于 Quad/Octal SPI 复位功能的 GPIO 端口和引脚号: 位 0-2:GPIO 端口 位 3-7:GPIO 引脚号 |
15 | 8 | - |
FLEXSPI_HOLD_TIME | - | 访问串行闪存前的等待时间: 00b - 500 微秒 01b - 1 毫秒 10b - 3 毫秒 11b - 10 毫秒 | 23 | 2 | - |
表 1002. OTP 中的 FlexSPI 引导配置(续)
字段名称 | 枚举名称 | 描述 | 偏移量 | 宽度 | 值 |
---|---|---|---|---|---|
FLEXSPI_PWR_HOLD_TIME | - | 除 FLEXSPI_HOLD_TIME 字段定义的延迟外,上电后访问 Quad/Octal-SPI 闪存设备前的延迟: 0000b - 无延迟 0001b - 额外等待 100 微秒 0010b - 额外等待 500 微秒 0011b - 额外等待 1 毫秒 0100b - 额外等待 10 毫秒 其他值 - 更多延迟(详见文档) | 25 | 4 | - |
RESERVED | - | 保留 | 29 | 3 | - |
41.5.1.3 FlexSPI 引导流程
下图说明了简要的 FlexSPI 引导流程。Keyblob
的详细信息见第 42 章 “RT6xx 安全引导 ROM”。正常镜像加载和认证流程的详细信息见图 188。

图 188. FlexSPI 闪存引导流程
41.5.1.4 FlexSPI 双镜像乒乓引导
FlexSPI 控制器支持重映射功能,可将串行 NOR 闪存的 AHB 访问地址重映射到另一个带偏移量的地址,从而在第一个镜像引导失败时支持第二个镜像引导。
41.5.1.4.1 FlexSPI 重映射的基本功能
下图是 FlexSPI 重映射功能的简单示意图
图 189. FlexSPI 镜像重映射(偏移量 = 0x200000)
也就是说,有Remap功能的MCU的FlexSPI可以有两个image,一个在0x8000_0000,一个在0x8000_2000。它们可以有不同的FCB和KeyBlob。
设置重映射偏移量后,FlexSPI 内存访问将按如下方式更改访问地址:添加偏移量。例如,当偏移量设置为 2MB(0x200000)时,通过 FlexSPI 对 0x08000000 的访问将重映射到 0x08200000。通过这种方式,可以使用两个镜像实现双镜像引导。偏移量和镜像1的大小由用户通过 OTP 熔丝设置。
41.5.1.4.2 OTP 中的 FlexSPI 重映射大小和引导镜像 1 偏移量配置
FlexSPI 双镜像引导相关配置分配在 BOOT_CFG2
和 BOOT_CFG3
OTP 字中,更多细节见表 1003 和表 1004。
表 1003. 引导镜像 1 偏移量(BOOT_CFG3
)
字段名称 | 偏移量 | 宽度 | 值 | 描述 |
---|---|---|---|---|
image1的偏移量 | 22 | 10 | x | x * 256 KB |
Note:image1是第二镜像,从image0开始!!
表 1004. 从 0x08001000
开始的 FlexSPI 重映射大小
字段名称 | 偏移量 | 宽度 | 值 | 描述 |
---|---|---|---|---|
FlexSPI 重映射大小 [1] | 28 | 4 | 0:与第二镜像偏移量大小相同 13 - 256 KB 14 - 512 KB 15 - 768 KB x - x * 1 MB |
[1]:注意:FlexSPI 重映射大小不能超过 引导镜像1的起始地址。
41.5.1.4.3 双镜像乒乓引导
对于双镜像乒乓引导,每个引导镜像都有自己的镜像版本,ROM 使用该版本首先选择最新的引导镜像。如果最新镜像引导失败,将尝试使用旧镜像引导。
乒乓引导流程 对于 FlexSPI 引导,ROM 始终尝试查找最新的引导镜像并引导。如果引导失败,ROM 将尝试查找旧的引导镜像。如果旧镜像引导仍失败,则 ROM 将进入 ISP Boot 模式。下图是乒乓引导流程图。

图 190. FlexSPI 引导镜像选择

图 191. FlexSPI 乒乓引导流程
41.5.1.4.4 Boot image 版本
每个引导镜像版本位于 FlexSPI 引导设备的偏移量 0x600
处(如图 189 所示)。镜像版本用 4 字节定义,低 2 字节为实际镜像版本号,高 2 字节为低 2 字节版本号的取反值。不遵循此规则的任何其他值都将被视为无效值。如果引导镜像版本无效,ROM 将完全不引导该镜像。
但如果镜像版本为全 0xFFFFFFFF
(用户未编程镜像版本的情况),也将被视为有效值。当一个镜像版本为 0xFFFFFFFF,另一个为有效版本时,ROM 始终优先引导有效版本的镜像,而非 0xFFFFFFFF 的镜像。如果两个镜像版本均为 0xFFFFFFFF,ROM 始终引导 FlexSPI NOR 闪存设备中低地址的第一个镜像。
以下是引导镜像版本的一些示例:
- 0xFFFE0001:有效引导镜像版本,版本号为 1。
- 0xFFFD0002:有效引导镜像版本,版本号为 2。
- 0x00000003:无效引导镜像版本,不遵循版本规则。
- 0xFFFFFFFF:有效镜像版本,但引导顺序较低。
- 0x0000FFFF:有效镜像版本,版本号为最大 0xFFFF。
41.5.1.5 为 RT6xx 设备配置 FlexSPI NOR 设备
ROM 支持从外部 FlexSPI NOR 闪存设备引导镜像。本节介绍如何使用 blhost
工具将镜像编程到外部非易失性存储器中以进行引导。更多细节请参考第 41.8.16 节 “外部存储器支持”。blhost 工具通过 ROM ISP 模式使用 UART、SPI、I2C、USB HID 与 ROM 代码通信,RT6xx 上的引脚连接见表 1005。
表 1005. blhost 工具通信的引脚分配
外设 | 端口 | 引脚 |
---|---|---|
USB | - | USB1_VBUS USB1_VDD1V8 USB1_VDD3V3 USB1_DM USB1_DP |
SPI 从机 | PIO1_11 | HS_SPI_SCK (FC14) |
PIO1_12 | HS_SPI_MISO (FC14) | |
PIO1_13 | HS_SPI_MOSI (FC14) | |
PIO1_14 | HS_SPI_SSELN0 (FC14) | |
I2C 从机 | PIO0_15 | FC2_TXD_SCL_MISO |
PIO0_16 | FC2_RXD_SDA_MOSI | |
UART | PIO0_1 | FC0_TXD_SCL_MISO |
PIO0_2 | FC0_RXD_SDA_MOSI |
41.5.1.5.1 FlexSPI NOR 闪存引导镜像编程
RT6xx ROM 支持从不同类型的 NOR 闪存(如连接到 FlexSPI 引脚的 Quad Flash、Octal Flash、Hyper Flash)引导,FlexSPI 引脚分配见表 1006。对于 FlexSPI NOR 引导,FCB 应编程在偏移量 0x08000400
处,引导镜像应编程在偏移量 0x08001000
处。以下部分将介绍如何为 5 种常见 NOR 闪存类型配置和编程引导镜像。
表 1006. NOR 闪存连接的 FlexSPI 引脚分配
外设 | 端口 | 引脚 |
---|---|---|
FlexSPI0 端口 A | PIO1_18 | FLEXSPI0A_SCLK |
PIO1_19 | FLEXSPI0A_SS0_N |
|
PIO1_20 | FLEXSPI0A_DATA0 | |
PIO1_21 | FLEXSPI0A_DATA1 | |
PIO1_22 | FLEXSPI0A_DATA2 | |
PIO1_23 | FLEXSPI0A_DATA3 | |
PIO1_24 | FLEXSPI0A_DATA4 | |
PIO1_25 | FLEXSPI0A_DATA5 | |
PIO1_26 | FLEXSPI0A_DATA6 | |
PIO1_27 | FLEXSPI0A_DATA7 | |
PIO1_28 | FLEXSPI0A_DQS |
|
PIO1_29 | FLEXSPI0A_SS1_N |
|
FlexSPI0 端口 B | PIO1_29 | FLEXSPI0B_SCLK |
PIO2_19 | FLEXSPI0B_SS0_N |
|
PIO1_11 | FLEXSPI0B_DATA0 | |
PIO1_12 | FLEXSPI0B_DATA1 | |
PIO1_13 | FLEXSPI0B_DATA2 | |
PIO1_14 | FLEXSPI0B_DATA3 | |
PIO2_17 | FLEXSPI0B_DATA4 | |
PIO2_18 | FLEXSPI0B_DATA5 | |
PIO2_22 | FLEXSPI0B_DATA6 | |
PIO2_23 | FLEXSPI0B_DATA7 | |
PIO2_21 | FLEXSPI0B_SS1_N |
41.5.1.5.2 FlexSPI NOR 闪存配置参数
不同 NOR 闪存需要不同的配置参数来启用和编程。以下是 NOR 闪存的配置参数定义。serial_nor_config_option_t
结构体的详细信息见表 1007、表 1008 和表 1009。
1 | typedef struct _serial_nor_config_option { |
表 1007. serial_nor_config_option_t 定义
偏移量 | 字段 | 描述 |
---|---|---|
0 | Option0 | 详见 option0 定义。 |
4 | Option1 | 可选,仅当 Option0 中的 option_size 字段非零时有效。详见 option1 定义。 |
表 1008. Option0 定义
字段 | 位 | 描述 |
---|---|---|
tag | 31:28 | 配置选项标签,固定为 0x0C 。 |
option_size | 27:24 | 大小(字节)=(Option Size + 1) × 4。若仅需要 option0,则为 0。 – 实际就是4字节或者8字节两个选项! |
device_type | 23:20 | 设备检测类型: 0 - 读取 SFDP 用于 SDR 命令 1 - 读取 SFDP 用于 DDR 读取命令 2 - HyperFLASH 1V8 3 - HyperFLASH 3V 4 - Macronix Octal DDR 5 - Macronix Octal SDR 6 - Micron Octal DDR 7 - Micron Octal SDR 8 - Adesto EcoXiP DDR 9 - Adesto EcoXiP SDR |
query_pad | 19:16 | 查询命令(读取 SFDP 或 MID)期间的数据焊盘: 0 - 1 位 2 - 4 位 3 - 8 位 |
cmd_pad | 15:12 | 闪存访问命令期间的数据焊盘: 0 - 1 位 2 - 4 位 3 - 8 位 |
表 1008. Option0 定义(续)
字段 | 位 | 描述 |
---|---|---|
quad_mode_setting |
11:8 | 四线模式使能设置: 0 - 未配置 1 - 设置状态寄存器1的 bit 6 2 - 设置状态寄存器 2 的位 1 3 - 设置状态寄存器 2 的位 7 4 - 通过 0x31 命令设置状态寄存器 2 的位 1 (此设置将闪存配置为 QPI 模式,用户代码必须将闪存重置为 SPI 模式,ROM 不会自动执行此操作。 注意:此字段仅适用于符合 JESD216 的设备(9 长字 SFDP 表)) |
misc_mode | 7:4 | 杂项模式: 0 - 未启用 1 - 启用 0-4-4 模式以提高随机读取性能 3 - 数据顺序交换模式(仅适用于 MXIC OctaFlash) 5 - 选择 FlexSPI 数据采样源为内部环回(详见 FlexSPI 使用说明) 6 - 配置 FlexSPI NOR 闪存以标准 SPI 模式运行 (注意:实验性功能,产品中请勿使用,保持为 0。) |
max_freq | 3:0 | 最大闪存操作速度: 0 - 不更改 FlexSPI 时钟设置 其他值 - 见 FlexSPI 时钟设置熔丝图 |
表 1009. Option1 定义
字段 | 位 | 描述 |
---|---|---|
flash_connection |
31:28 | 闪存连接选项: 0 - 单闪存连接到端口 A 1 - 并行模式 2 - 单闪存连接到端口 B |
drive_strength | 27:24 | FlexSPI 焊盘驱动强度。 |
dqs_pinmux_group | 23:20 | DQS 引脚复用组选择。 |
pinmux_group | 19:16 | 引脚复用组选择。 |
status_override | 15:8 | 设备模式配置期间覆盖状态寄存器值。 |
dummy_cycles | 7:0 | 读取命令的哑周期: 0 - 使用检测到的哑周期 其他值 - 闪存数据表中提供的哑周期数 |
41.5.1.5.3 NOR 闪存配置、擦除和编程
以连接到 FlexSPI 端口A 的 Macronix MX25L25645G 为例:
配置参数存储到 RAM:首先将配置参数存储在 RAM 中,供下一步配置 FlexSPI 使用。如图 192 所示,FlexSPI 的配置参数为 0xc0000002,该参数根据闪存类型选择。
1
2C:\blhost\blhost>blhost.exe -p com3 fill-memory 0x1c0004 0xc0000002
# 响应:成功注入命令,状态0(成功)使用 RAM 中的参数配置 FlexSPI:如图 193 所示,配置完成后可读取、擦除、编程闪存。
1
2C:\blhost\blhost>blhost.exe -p com3 configure-memory 0x9 0x1c000
# 响应:成功配置内存,状态0(成功)读取闪存:如图 194 所示,使用 blhost 工具读取闪存数据。
1
2C:\blhost\blhost>blhost.exe -p com3 read-memory 0x08000400 0x100
# 响应:读取256字节,状态0(成功)擦除闪存:如图 195 所示,擦除指定区域。
1
2C:\blhost\blhost>blhost.exe -p com3 flash-erase-region 0x08000400 0x200
# 响应:成功擦除,状态0(成功)编程引导镜像:如图 196 所示,将引导镜像写入闪存。
1
2C:\blhost\blhost>blhost.exe -p com3 write-memory 0x08001000 boot_image.bin
# 响应:写入5796字节,状态0(成功)验证读取:如图 197 所示,读取已编程的镜像数据。
1
2C:\blhost\blhost>blhost.exe -p com3 read-memory 0x08001000 0x100
# 响应:读取256字节,显示镜像数据,状态0(成功)
生成并编程 FlexSPI NOR FCB 到闪存
对于 FlexSPI 启动,需要在偏移量 0x08000400
处放置 FCB(闪存配置块),该 FCB 用于从外部 NOR 闪存通过 FlexSPI 接口引导镜像时配置 FlexSPI 接口。FCB 将根据之前的 FlexSPI 配置参数(如 0xc0000002
)生成。
存储 FCB 生成参数到 RAM:如图 198 所示,将参数存入 RAM。
1
2C:\blhost\blhost>blhost.exe -p com3 fill-memory 0x1d0004 0xf000000f
# 响应:成功注入命令,状态0(成功)生成并编程 FCB 到闪存:如图 199 所示,ROM 自动生成 FCB 并编程到偏移量
0x08000400
处。1
2C:\blhost\blhost>blhost.exe -p com3 configure-memory 0x9 0x1d000
# 响应:成功配置,状态0(成功)验证 FCB:如图 200 所示,读取 FCB 数据验证。
1
2C:\blhost\blhost>blhost.exe -p com3 read-memory 0x08000400 0x100
# 响应:读取FCB数据(如标签0x42464346等),状态0(成功)
这里有个误区,为什么执行了两次?
讲解:
Step1:只是写入不含FCB的image到0x1000,写入时使用了RAM中存储的FlexSPI配置参数,但这是一次性的写入,并没有固化FCB;
Step2:写入自动生成的FCB到0x400,这是固化FCB的过程。而生成FCB是blhost和ROM一起完成的!
41.5.1.5.4 典型 NOR 闪存配置参数
不同 NOR 闪存类型需要不同的配置参数,下表显示了一些典型闪存的配置参数。
表 1010. 典型 NOR 闪存配置参数(闪存连接到 FlexSPI 端口A)
设备厂商 | 设备类型 | 闪存类型 | 配置参数 | 闪存模式 | 备注 |
---|---|---|---|---|---|
Aesto | Octal Flash | ATXP032 | 0xC0803006 | DDR | ATXP032 有 3 个版本(REVA/B/C)。 对于 REV A 版本,ROM 仅支持自动探测引导, OTP 熔丝字 BOOT_CFG [0] 应设为 0x7,且无需配置 FCB。 |
Spansion | Hyper Flash | S26KS512S | 0xC0233006 | DDR | 对于 Hyper Flash 引导,引导前 BOOT_CFG [0] 应设为 0x20 。 |
Macronix | Quad Flash | MX25L25645G | 0xC0000002 | SDR | - |
Macronix | Quad Flash | MX25L25645G | 0xC0100002 | DDR | - |
Macronix | Octal Flash | MX25UM51345G | 0xC0403006 | DDR | - |
Micron | Octal Flash | MT35XL512ABA | 0xC0603006 | DDR | - |
41.5.1.5.5 连接到 FlexSPI 端口 B 的典型 NOR 闪存配置参数
对于连接到 FlexSPI 端口 B 的闪存设备,配置时用户需指定参数以告知 ROM 闪存连接到端口 B。由于 FlexSPI 端口 B 没有 DQS 引脚,用户需根据闪存数据表为连接的闪存配置dummy cycle,参数存储在 Option1 中(见表 1009)。以下是配置连接到 FlexSPI 端口 B 的 MX25UM51345G 闪存的示例。
1 | • blhost.exe -p com3 – fill-memory 0x1c000 4 0xC1503051 //配置option0 |
表 1011. 典型 NOR 闪存配置参数(闪存连接到 FlexSPI 端口 B)
设备厂商 | 设备类型 | 闪存类型 | 配置参数 | 闪存模式 | 备注 |
---|---|---|---|---|---|
Adesto | Octal Flash | ATXP032 | 0xC1903001 0x20000008 | SDR | ATXP032 有 REVA/B/C 三个版本,REV A 仅支持自动探测引导,BOOT_CFG [0] 需设为 0x7,无需配置 FCB。 |
Macronix | Quad Flash | MX25L25645G | 0xC1000001 0x20000008 | SDR | - |
Macronix | Octal Flash | MX25UM513(2)45G | 0xC1503051 0x20000014 | SDR | - |
Micron | Octal Flash | MT35XL512ABA | 0xC1703001 0x20000018 | SDR | - |
41.5.1.6 为 PortB 连接的闪存启用 Octal DDR 模式
考虑到 FlexSPI 性能和易用性,ROM 假定八进制闪存在 DDR 模式下始终使用 DQS 引脚。
- 若支持外部 DQS 焊盘,FlexSPI IP 可自动检测dummy cycle数。
- 使用配置选项Option0/1配置设备时,不支持自定义Octal DDR Read的Dummy Cycle数,必须使用 DQS 焊盘。
- 然而,RT6xx 系列的 FlexSPI PortB 没有 DQS 引脚。要在端口 B 上启用Octal DDR Read支持,用户必须准备完整的 FCB(闪存配置块)并在 LUT 中配置适当的Dummy Cycle。
以 MX25UM51345G 为例: 以下是用于在 FlexSPI 端口 B 上启用 DDR 模式的 FCB 二进制文件示例。请注意 FCB 中的两个字段需特别处理:
sflashA1Size
应设为0x0
,**sflashB1Size
** 应设为外部闪存大小。- FlexSPI LUT 表 :需使用读取命令的正确Dummy Cycle更新。

图 201. PortB 连接的闪存启用Octal DDR 模式示例
FCB 准备就绪后,使用以下命令将闪存启用到 DDR 模式–>
操作步骤:
写入 FCB 二进制文件到 RAM:
1
blhost.exe -p comxx write-memory 0x1c000 MX25UM51345G_DDR_FCB.bin
配置 FlexSPI 以应用 FCB:
1
blhost.exe -p comxx configure-memory 0x9 0x1c000
41.5.2 SD/eMMC 启动
BootROM支持将镜像从 SD/eMMC 加载到片上 SRAM,然后从片上 SRAM 引导。
41.5.2.1 SD/eMMC 引导特性
SD/eMMC 引导可通过 uSDHC 端口执行。BootROM支持以下标准卡类型(其他类型卡不保证支持):
- eMMC 5.0 或更早版本
- MMC 4.4 或更早版本
- SD 3.0 或更早版本
支持的标准模式:
- eMMC/MMC:4 位 / 8 位;全速率 SDR(26 MHz),高速 SDR/DDR(52 MHz);
- eMMC 4.4 或更高版本:支持快速引导。
- SD:1 位 / 4 位;SDR12、SDR25、SDR50 和 SDR104。
BootROM从 SD/eMMC 的固定地址加载用户应用镜像。为避免主引导记录(MBR)与用户应用镜像冲突,BootROM从 SD/eMMC 地址 4096(字节地址,块索引 8)加载镜像。
41.5.2.2 OTP 中的 SD/eMMC 引导配置
与 SD/eMMC 引导相关的配置分配在 BOOT_CFG2
和 BOOT_CFG3
OTP 字中,分配详情见表 1002。
表 1012. BOOT_CFG2 引导配置
字段名称 | 枚举名称 | 描述 | 偏移量 | 宽度 | 值 |
---|---|---|---|---|---|
SDHC_DEVICE_TYPE | eMMC_DEV SD_DEV |
连接到 SDHC 端口的设备类型: 0b - eMMC 设备 1b - SD 卡设备 |
0 | 1 | |
SDHC_BUS_WIDTH | - | 连接到 SDHC 的设备总线宽度: 00b - SD 卡使用 1 位数据总线,eMMC 使用 4 位 01b - SD 卡使用 4 位,eMMC 使用 8 位 10b - eMMC 使用 4 位 DDR 模式(需 SDHC_SPEED =HIGH) 11b - eMMC 使用 8 位 DDR 模式(需 SDHC_SPEED =HIGH) |
1 | 2 | |
SDHC_SPEED | - | eMMC 设备和 SD 卡的速度等级: 00b - 正常速度(eMMC)/SDR12(SD) 01b - 高速(eMMC)/SDR25(SD) 10b - SDR50(SD,需 SDHC_BUS_WIDTH =SD_4B_MMC_8B )11b - SDR104(SD,需 SDHC_BUS_WIDTH =SD_4B_MMC_8B ) |
3 | 2 | |
SDHC_PWR_CYCLE_EN | - | 通过 USDHC_RST 焊盘启用 SDHC 电源循环: 0b - 禁用 1b - 启用 |
5 | 1 | |
SDHC0_PWR_POL | - | SDHC0 端口电源使能信号极性: 0b - 高有效 1b - 低有效 |
6 | 1 | - |
SDHC1_PWR_POL | - | SDHC1 端口电源使能信号极性: 0b - 高有效 1b - 低有效 |
7 | 1 | - |
表 1012. BOOT_CFG2 引导配置(续)
字段名称 | 枚举名称 | 描述 | 偏移量 | 宽度 | 值 |
---|---|---|---|---|---|
SDHC_PWR_CYCLE_WAIT | - | 关闭 SDHC 设备电源后的等待时间: 00b - 20 毫秒 01b - 10 毫秒 10b - 5 毫秒 11b - 2.5 毫秒 |
8 | 2 | - |
SDHC_PWR_STABLE_WAIT | - | 启用 SDHC 设备电源后电源稳定等待时间: 0b - 5 毫秒 1b - 2.5 毫秒 |
10 | 1 | - |
SDHC0_CARD_VOLTAGE | - | 通过 USDHC_VSELECT 选择 SDHC0 电压:0b - 3.3V 1b - 1.8V |
11 | 1 | - |
SDHC1_CARD_VOLTAGE | - | 通过 USDHC_VSELECT 选择 SDHC1 电压: 0b - 3.3V 1b - 1.8V |
12 | 1 | - |
MMC_RESET_PRE_IDLE_STATE | - | 启动引导模式前将 MMC 复位到预空闲状态: 0b - 复位到预空闲状态 1b - 不复位 |
13 | 1 | - |
SDHC_FASTBOOT_MODE | - | 启用 eMMC 快速引导模式: 0b - 正常模式(传输模式) 1b - 引导模式 |
14 | 1 | - |
SDHC_FASTBOOT_ACK_EN | - | eMMC 快速引导确认功能: 0b - 禁用引导模式确认 1b - 启用引导模式确认 |
15 | 1 | - |
SDHC_PAD | - | SDHC 焊盘设置: 0b - 默认 SDIOPADCTL 1b - SDIOPADCTL=val(val 为自定义值) |
16 | 1 | - |
表 1013. BOOT_CFG3 引导配置
字段名称 | 枚举名称 | 描述 | 偏移量 | 宽度 | 值 |
---|---|---|---|---|---|
SDHC_DLL_TUNING_OVERRIDE_ENABLE | - | DLL 延迟调整覆盖使能: 0 - 默认(DLL 延迟起始 10,步长 2) 1 - 通过 SDHC_DLL_TUNING_START 和 SDHC_DLL_TUNING_STEP 覆盖 |
7 | 1 | - |
SDHC_DLL_TUNING_START | - | DLL 延迟起始值(需 SDHC_DLL_TUNING_OVERRIDE_ENABLE =1) |
8 | 8 | - |
SDHC_DLL_TUNING_STEP | - | DLL 延迟步长值(需 SDHC_DLL_TUNING_OVERRIDE_ENABLE =1): 0 - 步长 = 1 非 0 - 步长 = val |
16 | 3 | - |
41.5.2.3 SD/eMMC 引导流程
图 202 说明了 SD/eMMC 的简要引导流程。

图 202. SD/eMMC 引导流程
RT600 BootROM RM解析 (3)
https://dustofstars.github.io/NXP/RT600/BootROM/rt600-bootrom-rm解析-3/