RT600 BootROM RM解析 (2)

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 闪存恢复引导操作正常。

TopLevelBootFlow

图 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 检查功能)。

引导加载程序通过检查位于偏移量 0x24imageType)的image类型开始扫描用户image。如果检测到有效image类型,则开始验证image头。通过读取image头中偏移量 0x34imageLoadAddress)处的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开始。
作者

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

×