RT600 BootROM RM解析 (2)
RT600 RM CH41:RT6xx 非安全启动 ROM(2)
41.3 概述
内部 ROM 存储器用于存储启动代码。复位后,ARM 处理器从该存储器开始执行代码。每次器件上电或复位时,都会执行BootROM代码。
由于 RT6xx 没有用于代码和数据存储的内部 Flash,因此必须将image存储在其他位置,以便在复位时下载,或者 CPU 可以从外部存储器(XIP)执行。image可以从外部 Flash 加载到片上 SRAM 中,也可以通过串行端口(UART、SPI、I2C、USB)下载。然后对代码进行验证,引导 ROM 会将向量指向片上 SRAM。
引导加载程序根据 OTP 位和 ISP 引脚的值,以及image header类型定义,决定是将代码下载到片上 SRAM 中还是从外部存储器运行。
- BootROM 首先检查 OTP 位设置,然后检查 ISP 引脚。
- 如果 OTP 字 BOOT_CFG [0] 中的位 [3:0] 未编程(4b’0000),则引导源由 ISP 引导引脚(PIO1_15、PIO1_16 和 PIO1_17)的状态决定,见表 994。
表 994. 基于 BOOT_CFG [0] 中 PRIMARY_BOOT_SRC 位的主引导源
引导模式字段 | 字段 | 主引导源(又称主引导源) |
---|---|---|
ISP_PIN_BOOT | b’0000 | ISP 引脚将决定引导源。 |
FLEXSPI_BOOT_PORT_A | b’0001 | 从 FlexSPI0 端口 A 的八 / 四路 SPI 闪存设备引导。 |
SDHC0_BOOT | b’0010 | 从连接到 SDHC0 端口的 eMMC 设备或 SD 卡引导。 |
SDHC1_BOOT | b’0011 | 从连接到 SDHC1 端口的 eMMC 设备或 SD 卡引导。 |
SPI_SLV_BOOT | b’0100 | 通过使用主引导模式的 SPI 从接口引导。 |
FLEXSPI_BOOT_PORT_B | b’0101 | 从 FlexSPI0 端口 B 的八 / 四路 SPI 闪存设备引导。 |
UART_BOOT | b’0110 | 通过使用主引导模式的 UART 接口引导。 |
SPI_FLASH_BOOT | b’0111 | 通过 SPI 接口从 1 位 NOR 闪存引导。使用的 SPI 实例由熔丝字 0x60 的位 17 到 19 选择,更多细节请参考熔丝图。 |
USB_HID | b’1000 | 通过使用主引导模式的 USB HID 接口引导。 |
ISP_BOOT | b’0101 | 进入 ISP 模式,熔丝字 0x60 的位 4 到 6 决定 ISP 模式使用的外设,更多细节请参考熔丝图。 |
– | b’1010 | 保留 |
FLEXSPI_REC_BOOT_PORT_B | b’1011 | 从 FlexSPI0 端口 B 的八 / 四路 SPI 闪存设备引导;如果未找到image,则通过 FlexComm 使用 SPI 闪存设备检查恢复引导。使用的 FlexComm 实例由熔丝字 0x60 的位 17 到 19 选择,更多细节请参考熔丝图。 |
FLEXSPI_REC_BOOT_PORT_A | b’1100 | 从 FlexSPI0 端口 A 的八 / 四路 SPI 闪存设备引导;如果未找到image,则通过 FlexComm 使用 SPI 闪存设备检查恢复引导。使用的 FlexComm 实例由熔丝字 0x60 的位 17 到 19 选择,更多细节请参考熔丝图。 |
SDHC0_REC_BOOT | b’1101 | 从 SDHC0 端口设备引导。如果未找到image,则通过 FlexComm 使用 SPI 闪存设备检查恢复引导。使用的 FlexComm 实例由熔丝字 0x60 的位 17 到 19 选择,更多细节请参考熔丝图。 |
SDHC1_REC_BOOT | b’1110 | 从 SDHC1 端口设备引导。如果未找到image,则通过 FlexComm 使用 SPI 闪存设备检查恢复引导。使用的 FlexComm 实例由熔丝字 0x60 的位 17 到 19 选择,更多细节请参考熔丝图。 |
– | b’1111 | 保留 |
如果未设置 PRIMARY_BOOT_SRC
位,RT6xx 将读取 ISP 引脚的状态以确定引导源。见表 995。
表 995. 基于 ISP 引脚的引导模式和 ISP 下载器模式
引导模式 | ISP2 引脚 PIO1_17 |
ISP1 引脚 PIO1_16 |
ISP0 引脚 PIO1_15 |
描述 |
---|---|---|---|---|
- | 低 | 低 | 低 | 保留 |
SDIO0(SD 卡) | 低 | 低 | 高 | 从连接到 SDIO 1 接口的 SD 卡设备引导。RT6xx 将在 SD 卡设备中查找有效image。如果未找到有效image,RT6xx 将根据表 1114“BOOT_CFG [0] 位字段” 中定义的 OTP DEFAULT_ISP_MODE 位(6:4,BOOT_CFG [0])进入 ISP 引导模式。 |
FlexSPI 从端口 B 引导 | 低 | 高 | 低 | 从连接到 FlexSPI 接口 0 端口 B 的四路或八路 SPI 闪存设备引导。RT6xx 将在外部四路 / 八路 SPI 闪存设备中查找有效image。如果未找到有效image,RT6xx 将进入恢复引导或 ISP 引导模式。 |
FlexSPI 从端口 A 引导 | 低 | 高 | 高 | 从连接到 FlexSPI 接口 0 端口 A 的四路或八路 SPI 闪存设备引导。RT6xx 将在外部四路 / 八路 SPI 闪存设备中查找有效image。如果未找到有效image,RT6xx 将进入恢复引导或 ISP 引导模式。 |
SDIO 0(eMMC) | 高 | 低 | 低 | 从连接到 SDIO 0 接口的 eMMC 设备引导。RT6xx 将在 eMMC 设备中查找有效image。如果未找到有效image,RT6xx 将根据表 1114“BOOT_CFG [0] 位字段” 中定义的 OTP DEFAULT_ISP_MODE 位(6:4,BOOT_CFG [0])的值进入 ISP 引导模式。 |
- | 高 | 低 | 高 | 保留 |
串行 ISP(UART、SPI、I2C、USB-HID) | 高 | 高 | 低 | 串行接口(UART、SPI 和 I2C、USB-HID)用于对 OTP、外部 Flash、SD 或 eMMC 设备进行编程。 |
111 | 高 | 高 | 高 | 串行主引导(SPI 从机、I2C 从机或 UART、USB-HID)用于通过串行接口(SPI 从机、I2C 从机或 UART、USB-HID)下载引导image。 |
表 996 列出了 ISP 引脚分配,这些是 ROM 代码使用的默认引脚分配,无法更改。
表 996. ISP 引脚分配
引导接口 | 引脚 (s) | 功能 / 注释 |
---|---|---|
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 | |
USB | USB1_VBUS | |
VDD1V8 | ||
USB1_VDD3V3 | ||
USB1_DM | ||
USB1_DP | ||
SPI 从机 | PIO1_11 | HS_SPI_SCK(Flexcomm 14) |
PIO1_12 | HS_SPI_MISO(Flexcomm14) | |
PIO1_13 | HS_SPI_MOSI(Flexcomm14) | |
PIO1_14 | HS_SPI_SSEL0(Flexcomm14) | |
I2C 从机 | PIO0_15 | FC2_TXD_SCL_MISO_WS |
PIO0_16 | FC2_RXD_SDA_MOSI_DATA | |
UART | PIO0_1 | FC0_TXD_SCL_MISO_WS |
PIO0_2 | FC0_RXD_SDA_MOSI_DATA |
表 996. ISP 引脚分配(续)
引导接口 | 引脚 (s) | 功能 / 注释 |
---|---|---|
SDIO0 | PIO1_30 | SD0_CLK |
PIO1_31 | SD0_CMD | |
PIO2_0 | SD0_D[0] | |
PIO2_1 | SD0_D[1] | |
PIO2_2 | SD0_D[2] | |
PIO2_3 | SD0_D[3] | |
PIO2_4 | SD0_WR_PRT | |
PIO2_5 | SD0_D[4] | |
PIO2_6 | SD0_D[5] | |
PIO2_7 | SD0_D[6] | |
PIO2_8 | SD0_D[7] | |
PIO2_9 | SD0_CARD_DET_N | |
PIO2_10 | SD0_RESET_N | |
PIO2_11 | SD0_VOLT | |
SDIO1 | PIO3_8 | SD1_CLK |
PIO3_9 | SD1_CMD | |
PIO3_10 | SD1_D[0] | |
PIO3_11 | SD1_D[1] | |
PIO3_12 | SD1_D[2] | |
PIO3_13 | SD1_D[3] | |
PIO3_14 | SD1_WR_PRT | |
PIO3_15 | SD1_D[4] | |
PIO3_16 | SD1_D[5] | |
PIO3_17 | SD1_D[6] | |
PIO3_18 | SD1_D[7] | |
PIO3_19 | SD1_CARD_DET_N | |
PIO3_20 | SD1_RESET_N | |
PIO3_21 | SD1_VOLT | |
SPI 闪存(恢复引导) | - | 用于恢复 SPI 闪存引导的 Flexcomm 端口。 |
FC0 | 使用 Flexcomm0 引脚 PIO0_0(SCK)、PIO0_1(MISO)、PIO0_2(MOSI)、PIO0_3(SSEL) | |
FC1 | 使用 Flexcomm1 引脚 PIO0_7(SCK)、PIO0_8(MISO)、PIO0_9(MOSI)、PIO0_10(SSEL)[1] | |
FC2 | 使用 Flexcomm2 引脚 PIO0_14(SCK)、PIO0_15(MISO)、PIO0_16(MOSI)、PIO0_17(SSEL) | |
FC3 | 使用 Flexcomm3 引脚 PIO0_21(SCK)、PIO0_22(MISO)、PIO0_23(MOSI)、PIO0_24(SSEL) | |
FC4 | 使用 Flexcomm4 引脚 PIO0_28(SCK)、PIO0_29(MISO)、PIO0_30(MOSI)、PIO0_31(SSEL) | |
FC5 | 使用 Flexcomm5 引脚 PIO1_3(SCK)、PIO1_4(MISO)、PIO1_5(MOSI)、PIO1_6(SSEL) | |
FC6 | 使用 Flexcomm6 引脚 PIO3_25(SCK)、PIO3_26(MISO)、PIO3_27(MOSI)、PIO3_28(SSEL) | |
FC7 | 使用 Flexcomm 7 引脚 PIO4_0(SCK)、PIO4_1(MISO)、PIO4_2(MOSI)、PIO4_3(SSEL) | |
ISP | PIO1_17 | ISP 选择位 2 |
PIO1_16 | ISP 选择位 1 | |
PIO1_15 | ISP 选择位 0 |
[1] 注:SPI 闪存恢复引导引脚功能与 JTAG 边界扫描功能复用。为确保不会意外进入边界扫描模式,应使用弱下拉电阻(100 kohm)将 TRST 引脚外部拉低,以确保 SPI 闪存恢复引导操作正常。

图 187. 顶层引导流程
图 187 显示了顶层引导流程。引导流程在复位释放后开始。CPU 时钟由 OTP 字段 BOOT_CLK_SPEED
决定,默认情况下为来自 IRC48M 时钟源的 48 MHz。如果 PRIMARY_BOOT_SRC
= 4b’0000,引导 ROM 将根据 PRIMARY_BOOT_SRC
或复位期间 ISP 引脚的状态确定引导模式。当 Cortex-M33 启动引导加载程序时,SWD 访问将被禁用,直到引导image开始执行或引导加载程序进入 ISP 模式。
一旦确定引导模式,并且在所选外部 Flash 设备(SD、eMMC 或串行 NOR Flash)上存在引导image,ROM 引导加载程序将开始将image 头的前 64 字节从外部 Flash 设备复制到片上 SRAM 中。image的开头遵循表 997 中提到的格式。如果boot image通过串行接口(通过 UART、SPI 或 USB)下载,则包括image头在内的整个image已加载到 SRAM 中。
BootROM 检查以下内容以确保image完整性:
- 使用头和image标记验证image。
- 使用 CRC32 验证image(如果image头中启用了 CRC 检查功能)。
引导加载程序通过检查位于偏移量 0x24
(imageType
)的image类型开始扫描用户image。如果检测到有效image类型,则开始验证image头。通过读取image头中偏移量 0x34
(imageLoadAddress
)处的image加载地址并将其用作指向有效image头结构的指针,继续对image头进行鉴定。如果 imageType 和 imageLoadAddress 均不为零,则 imageLoadAddress 指向的地址必须包含正在检查的image头。
image头验证完成后,通过检查image类型字段继续进行鉴定。更多详细信息请参见表 998。如果可引导(非 XIP)image位于外部闪存中,整个image将首先加载到片上 SRAM 中,然后如果启用了 CRC 校验功能,将使用image头中的 imageLength 字段作为长度来执行 CRC 校验。
如果 CRC 功能启用,将对image(片上或外部 XIP image)执行 CRC 校验。CRC 计算从image起始偏移 0x0 处开始,持续到 imageLength 字段指定的字节数(不包括 crcChecksum 字段)。CRC 计算完成后,通过将结果与image头中的 crcChecksum 字段进行比较来确定image有效性:若匹配,则判定image有效,否则判定为无效。
表 997. image header 格式
偏移量 | 字段 | 描述 |
---|---|---|
0x00-0x1F | 保留 | - |
0x20 | imageLength | image长度 |
0x24 | imageType | image类型 0x0000 - 普通image 0x0001 - 普通签名image 0x0002 - 普通 CRC image 0x0003 - 加密签名image 0x0004 - 普通签名 XIP image 0x0005 - 普通 CRC XIP image 0x8001 - 包含KeyStore的普通签名image 0x8003 - 包含KeyStore的加密签名image |
0x28 | authBlockOffset/crcChecksum | 认证块偏移量 或 CRC32 校验和 |
0x2C-0x33 | 保留 | - |
0x34 | imageLoadAddress |
image加载地址 |
0x38-0x3F | 保留 | - |
表 998. Plain image布局
偏移量 | 字段 | 描述 |
---|---|---|
0x00 | 堆栈指针 Stack Pointer | 普通 CM33 内核异常处理程序 |
0x04 | 复位处理程序 Reset Handler | |
0x08 | NMI_Handler | 不可屏蔽中断处理程序 |
0x0C | HardFault_Handler | 硬错误处理程序 |
0x10 | MemManage_Handler | 内存管理错误处理程序 |
0x14 | BusFault_Handler | 总线错误处理程序 |
0x18 | UsageFault_Handler | 使用错误处理程序 |
0x1C | SecureFault_Handler | 安全错误处理程序 |
0x20 | imageLength |
image长度 |
0x24 | imageType |
image类型 0x0000 - 普通image 0x0001 - 普通签名image 0x0002 - 普通 CRC image 0x0004 - 普通签名 XIP image 0x0005 - 普通 CRC XIP image 0x8001 - 包含密钥存储的普通签名image |
0x28 | authBlockOffset | 认证块偏移量或 CRC32 校验和 |
0x2C | SVC Handler | 普通 CM33 内核异常处理程序 |
0x30 | DebugMon_Handler | 调试监控处理程序 |
0x34 | imageLoadAddress |
image加载地址 注:imageLoadAddress 必须 ≥ 0x1C000 。地址 0x0 - 0x1BFFF 由 ROM 使用,直至用户代码启动。 |
0x38 | PendSV_Handler | PendSV 处理程序(普通 CM33 内核异常处理程序) |
0x3C | SysTick_Handler | 系统滴答定时器处理程序 |
表 999. XIP 镜像布局(FlexSPI)
偏移量 | 宽度(字节) | 字段 | 描述 |
---|---|---|---|
0x0000_0000 | 256 | KeyBlob用于 OTFAD | 可选。若未启用 OTFAD,则全部编程为 0x00。 |
0x0000_0400 |
512 | 闪存配置块(FCB) | OSPI 闪存配置块。若 OTP 中的 FLEXSPI_AUTO_PROBE_EN 未熔断,则需要此块。 |
0x0000_0600 | 4 | Boot image version | 使用双镜像乒乓引导时,此字段用于存储引导镜像版本。更多细节请参考 FlexSPI 引导。 |
0x0000_0800 |
2048 | KeyStore | 固定 KeyStore 字段。若启用 KeyStore 功能,则需要此字段。 |
0x0000_1000 |
image大小 | Bootable image | 引导镜像,以有效image header开始。 |
RT600 BootROM RM解析 (2)
https://dustofstars.github.io/NXP/RT600/BootROM/rt600-bootrom-rm解析-2/