RT600 BootROM RM解析 (3)

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_PORTFLEXSPI_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_CFG2BOOT_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 模式。下图是乒乓引导流程图。

FlexSPI_boot_image_selection

图 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
typedef struct _serial_nor_config_option {
union {
struct {
uint32_t max_freq : 4; //!< 最大支持频率
uint32_t misc_mode : 4; //!< 杂项模式
uint32_t quad_mode_setting : 4; //!< 四线模式设置
uint32_t cmd_pads : 4; //!< 命令焊盘
uint32_t query_pads : 4; //!< SFDP读取焊盘
uint32_t device_type : 4; //!< 设备类型
uint32_t option_size : 4; //!< 选项大小(以uint32_t为单位,大小=(option_size + 1))
uint32_t tag : 4; //!< 标签,必须为0x0C
} B;
uint32_t U;
} option0;
union {
struct {
uint32_t dummy_cycles : 8; //!< 读取前的哑周期
uint32_t status_override : 8; //!< 设备模式配置期间覆盖状态寄存器值
uint32_t pinmux_group : 4; //!< 引脚复用组选择
uint32_t dqs_pinmux_group : 4;//!< DQS引脚复用组选择
uint32_t drive_strength : 4; //!< FlexSPI焊盘驱动强度
uint32_t flash_connection : 4; //!< 闪存连接选项:0-单闪存连接到端口A,1-并行模式,2-单闪存连接到端口B
} B;
uint32_t U;
} option1;
} serial_nor_config_option_t;

表 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 为例:

  1. 配置参数存储到 RAM:首先将配置参数存储在 RAM 中,供下一步配置 FlexSPI 使用。如图 192 所示,FlexSPI 的配置参数为 0xc0000002,该参数根据闪存类型选择。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 fill-memory 0x1c0004 0xc0000002
    # 响应:成功注入命令,状态0(成功)
  2. 使用 RAM 中的参数配置 FlexSPI:如图 193 所示,配置完成后可读取、擦除、编程闪存。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 configure-memory 0x9 0x1c000
    # 响应:成功配置内存,状态0(成功)
  3. 读取闪存:如图 194 所示,使用 blhost 工具读取闪存数据。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 read-memory 0x08000400 0x100
    # 响应:读取256字节,状态0(成功)
  4. 擦除闪存:如图 195 所示,擦除指定区域。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 flash-erase-region 0x08000400 0x200
    # 响应:成功擦除,状态0(成功)
  5. 编程引导镜像:如图 196 所示,将引导镜像写入闪存。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 write-memory 0x08001000 boot_image.bin
    # 响应:写入5796字节,状态0(成功)
  6. 验证读取:如图 197 所示,读取已编程的镜像数据。

    1
    2
    C:\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)生成。

  1. 存储 FCB 生成参数到 RAM:如图 198 所示,将参数存入 RAM。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 fill-memory 0x1d0004 0xf000000f
    # 响应:成功注入命令,状态0(成功)
  2. 生成并编程 FCB 到闪存:如图 199 所示,ROM 自动生成 FCB 并编程到偏移量 0x08000400 处。

    1
    2
    C:\blhost\blhost>blhost.exe -p com3 configure-memory 0x9 0x1d000
    # 响应:成功配置,状态0(成功)
  3. 验证 FCB:如图 200 所示,读取 FCB 数据验证。

    1
    2
    C:\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
2
3
• blhost.exe -p com3 – fill-memory 0x1c000 4 0xC1503051 //配置option0
• blhost.exe -p com3 – fill-memory 0x1c004 4 0x20000014 //option1
• blhost.exe -p com3 – configure-memory 0x9 0x1c000 // 应用配置参数

表 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更新。
image-20250520131728026

图 201. PortB 连接的闪存启用Octal DDR 模式示例

FCB 准备就绪后,使用以下命令将闪存启用到 DDR 模式–>

操作步骤

  1. 写入 FCB 二进制文件到 RAM:

    1
    blhost.exe -p comxx write-memory 0x1c000 MX25UM51345G_DDR_FCB.bin
  2. 配置 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_CFG2BOOT_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_STARTSDHC_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 引导流程

作者

Gavin

发布于

2025-05-19

更新于

2025-05-19

许可协议

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×