【认识 i.MX RT】RT1060 的启动映像文件

        前一篇博文介绍了 RT1060 的最小系统硬件设计的一些要求和注意事项,接下来我们就来看看RT1060 的启动映像文件。

        学习 RT 的启动映像文件是每个做 RT 软件设计的工程师的必修课。在上一篇博文中介绍过,RT1060 片内有一个 Boot ROM,而且支持 6 种外部存储器:

              ① Serial NOR Flash via FlexSPI

              ② Serial NAND Flash via FlexSPI

              ③ Parallel NOR Flash via SEMC

              ④ RAW NAND Flash via SEMC

              ⑤ SD/MMC via µSDHC

              ⑥ SPI NOR/EEPROM via LPSPI

        其中 Serial/Parallel NOR 这两种 Device 可以 XIP,其他 4 种 Device 无法 XIP,需要拷贝到内部 RAM 或外接 SDRAM 里运行。

        i.MX RT Boot 方式主要是借助 Boot ROM 从外部存储器加载 Application 到内部 SRAM / 外部 SDRAM / 原地 XIP 执行。Boot ROM 是固化在芯片内部的一段启动代码,这个代码会在系统上电时被执行。

        Boot ROM 先对芯片进行必要的初始化后,会根据各个 GPIO 电平来选择一个启动方式,然后再从外部存储器中读取启动映像文件(Bootable Image)。Bootable Image 是由一些额外的信息数据与 Application Binary 共同组成的,那些额外的信息数据按功能分有 6 类,但这 6 类信息数据并不都是必须的,其中有 4 类是可选的,因此一个 Bootable Image 最多由 7 部分组成,最少由 3 部分组成。下面按在 FLASH 里存储位置从低到高的顺序逐一介绍组成 Bootable Image 的 7 大部分:

  1. 偏移 0x0000: FDCB(Flash Device Configuration Block)

        第一个组成部分叫 FDCB,是个可选组成,目前只用于 Serial/Parallel NOR FLASH,FDCB 是从 FLASH 的起始地址处开始存放的,也是 Bootable Image 最开始部分。FDCB 最大 4KB,是一组没有统一的、与 FLASH 有关的结构体数据,具体组成结构根据启动 FLASH 的接口类型(Serial/Parallel)而定,其一般是用来存储当前连接的 FLASH 的具体特性参数,Boot ROM 上电会使用通用且可靠的 FLASH 接口控制器配置(即 Boot ROM 中默认参数配置,一般是比较低速的配置)去访问外接 FLASH 并获取 FDCB,然后根据 FDCB 存储的参数去重新配置 FLASH 接口控制器再去进一步访问 FLASH。

  1. 偏移0x0400/0x1000: IVT(Image Vector Table)

        第二个组成部分叫 IVT,是个必备组成,也是 6 类信息数据里的最核心数据,IVT 是一个统一的与 FLASH 无关的结构体数据,其原型如下面结构体所示,从结构体定义我们得知,IVT 中记录了Application、DCD、BD、CSF 的位置信息,这些信息对 Boot ROM 加载启动至关重要。IVT 大小固定为 32byte,其在 Bootable image 中的偏移位置也是固定的(对于 XIP FLASH 而言偏移是 0x1000,对于 Non-XIP FLASH 而言偏移是 0x400)。       

typedef struct _ivt_ {
/** @ref hdr with tag #HAB_TAG_IVT, length and HAB version fields
* (see @ref data)
*/
uint32_t hdr;
/** Absolute address of the first instruction to execute from the
* image
*/
uint32_t entry;
/** Reserved in this version of HAB: should be NULL. */
uint32_t reserved1;
/** Absolute address of the image DCD: may be NULL. */
uint32_t dcd;
/** Absolute address of the Boot Data: may be NULL, but not interpreted
* any further by HAB
*/
uint32_t boot_data;
/** Absolute address of the IVT.*/
uint32_t self;
/** Absolute address of the image CSF.*/
uint32_t csf;
/** Reserved in this version of HAB: should be zero. */
uint32_t reserved2;
} ivt;

        下图是包含 IVT、BD、DCD、Application、CSF 的 Bootable Image的Layout,很好地诠释了IVT 的作用。

        

  1. 偏移0x0420/0x1020: BD(Boot Data)

        第三个组成部分叫 BD,是个必备组成,是仅次于 IVT 的核心数据,BD 也是一个统一的与FLASH 无关的结构体数据,其原型如下面结构体所示,BD 中记录了 Bootable Image 的起始地址与总长度。BD 大小固定为 16 字节。BD 位置信息虽然记录在了 IVT 中,但其在 Bootable Image 中的偏移位置并不是任意的,它紧挨着 IVT。

typedef struct _boot_data_ {
uint32_t start; /* boot start location */
uint32_t size; /* size */
uint32_t plugin; /* plugin flag - 1 if downloaded application is plugin */
uint32_t placeholder; /* placehoder to make even 0x10 size */
}BOOT_DATA_T;
  1. DCD(Device Configuration Data)

        第四个组成部分叫 DCD,是个可选组成,目前主要用于 SDRAM 接口控制器(SEMC)的配置。由于 i.MX RT 内部 SRAM 空间通常是够用的,且访问速度也很快,所以 SDRAM 并不一定要被使能。 DCD 允许占用的最大空间是 1768 字节。下面是 DCD 示例:

const uint8_t dcd_data[] = {
/* HEADER */
/* Tag */
0xD2,
/* Image Length */
0x04, 0x30,
/* Version */
0x41,

/* COMMANDS */

/* group: 'Imported Commands' */
/* #1.1-117, command header bytes for merged 'Write - value' command */
0xCC, 0x03, 0xAC, 0x04,
/* #1.1, command: write_value, address: CCM_CCGR0, value: 0xFFFFFFFF, size: 4 */
0x40, 0x0F, 0xC0, 0x68, 0xFF, 0xFF, 0xFF, 0xFF,
……
};
  1. 偏移0x2000: Application Binary

        第五个组成部分是最熟悉的 Application Binary,当然是个必备组成,其在 Bootable Image 中的偏移位置固定(0x2000),关于 Application 本身这里就不再赘述了。只特别提一点,那就是i.MX RT 的 Application 只读段(主要指 ARM 中断向量表)并不可以从任意地址开始链接,有一个小小的限制,必须从选定的存储器地址空间偏移 0x2000 之后开始链接(如选中 ITCM,则必须要链接在 0x00002000 之后;如选中 DTCM,则必须链接在 0x20002000 之后...),因为要预留至少 8KB 空间给 IVT、BD、DCD 等数据,这个限制是 Boot ROM自身决定的,务必要注意。

  1. CSF(Command Sequence File)

        第六个组成部分叫 CSF,是个特性组成,主要用于安全启动的认证相关特性。

  1. Key Blob

        第七个组成部分叫 Key Blob,是个特性组成,主要用于安全启动的加密相关特性。

        以上 7 大组成部分在实际应用中,主要形成如下三种常用分类:

              ① Unsigned Image: 这是最简单的 Image 类型,由 IVT + BD + Application 组成,主要用于产品开发阶段。

              ② Signed Image: 这是较复杂的 Image 类型,由 IVT + BD + Application + CSF 组成,一般用于产品发布阶段。

              ③ Encrypted Image: 这是最复杂的 Image 类型,由 IVT + BD + Application + CSF + Key Blob组成,主要用于对安全要求较高的产品中。

        Boot ROM 首先读取启动映像文件(Bootable Image)前 4KB 数据进 SRAM 临时缓存区(OCRAM:0x20208000 - 0x20208FFF),这 4KB 数据里包含了 IVT 和 BD。Boot ROM 从 IVT和 BD 里获取到 Bootable Image 的目标地址(BOOT_DATA_T.start)以及总长度(BOOT_DATA_T.size),此时便可以开始做进一步加载。把这 4KB 数据首先复制到 Bootable Image 的目标地址(ITCM)之后,Boot ROM 会接着将剩下的 Bootable Image(BOOT_DATA_T.size - 4KB)从外部 Flash  中全部读取出来存到目标区域(ITCM)完成全部加载。

        以上就是关于启动映像文件(Bootable Image)的组成和加载过程,感谢 NXP 的痞子衡提供的资料。在后续的博文中,我会继续写一些关于 RT1060 的设计笔记,请多多来大大通关注我哦。

参考资料

  1. i.MX RT1060 Processor Reference Manual - https://www.nxp.com.cn/products/processors-and-microcontrollers/arm-microcontrollers/i-mx-rt-crossover-mcus/i-mx-rt1060-crossover-mcu-with-arm-cortex-m7-core:i.MX-RT1060?tab=Documentation_Tab
  2. i.MX RT系列MCU启动那些事(1)- Boot简介 - https://www.nxpic.org.cn/module/forum/thread-615826-1-1.html
  3. i.MX RT Bootable image格式与加载过程 - https://www.nxpic.org.cn/module/forum/thread-619219-1-1.html

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论