无论是什么芯片里的 BootROM,其最核心的功能无非两个:一、从存放 Application 的存储器中加载执行;二、通过支持的通信接口接收来自 Host 的 Application 数据完成更新或直接跳转执行,所以 Boot 配置也主要围绕这两个核心功能。
一、Boot 行为模式选择
芯片内部 OTP memory 中的 PRIMARY_BOOT_SRC[3:0]位和芯片外部管脚 ISP[2:0]状态共同决定了 i.MXRTxxx Boot 行为的最顶层配置,但是与上一篇文章里介绍的 Kinetis/LPC/STM32 Boot Mode 配置不同的是,i.MXRTxxx 上电永远是从 ROM 里开始启动,此处的 PRIMARY_BOOT_SRC[3:0]和 ISP[2:0]决定的仅是 BootROM 程序的不同行为模式(执行代码分支),而 Kinetis/LPC/STM32 Boot Mode 侧重的是决定 CPU 从 ROM 还是 FLASH 里启动。
1.1 行为模式定义
i.MXRTxxx 的 Boot 行为模式和接口非常丰富,甚至毫不夸张地说,其 Boot 行为模式可以让你眼花缭乱。在讲具体 Boot 模式功能前,有必要先看一下各行为模式是怎么确定的:
1.1.1 PRIMARY_BOOT_SRC[3:0]值定义
PRIMARY_BOOT_SRC[3:0]是最高优先级的行为模式定义,下表是 PRIMARY_BOOT_SRC[3:0]相关值定义,可在参考手册的 Non-Secure Boot ROM 章节中找到。至于 PRIMARY_BOOT_SRC 具体在 OTP memory 中的位置(暂且先透露一下吧,其位于 BOOT_CFG[0]的低 4bit,BOOT_CFG[0]是第 97 个 OTP Word(fuse index=0x60)),痞子衡会在后面的文章细聊。
i.MXRT600 PRIMARY_BOOT_SRC[3:0] bits:
1.1.2 ISP[2:0]管脚状态定义
当 PRIMARY_BOOT_SRC[3:0] bits 未烧写时(即 4'b0000),ISP[2:0] pins 开始决定行为模式。ISP[2:0]管脚状态是在 BootROM 里软件采样的,所以每一次系统软复位去重新执行 BootROM 时,ISP[2:0]状态都会被重新采样。
i.MXRT600 ISP[2:0] pins:
1.2 行为模式分类
不管是 PRIMARY_BOOT_SRC[3:0]位还是外部管脚 ISP[2:0]状态,他们决定的最终 Boot 行为模式是相似的,区别只是一个通过烧 OTP 决定(一般用于量产阶段),另一个通过切换引脚状态决定(一般用于研发阶段)。Boot 行为模式看起来非常多,但概括而言总共就三大类:
1.2.1 Serial ISP 模式(UART/SPI/I2C/USB-HID)
Serial ISP 模式顾名思义即串行编程模式,在这种模式下,BootROM 通过指定的 UART/SPI/I2C/USB-HID 口来接收来自 Host(恩智浦提供了上位机工具 blhost.exe 或者 MCUBootUtility)的 Application 数据,并将数据下载到支持启动的外部 Device 中(Serial NOR/SD/eMMC/1bit Recovery SPI NOR),这种模式其实就是用于代替专用 Flash 编程器去烧录可执行程序文件的 。
关于 Serial ISP 模式具体如何应用,痞子衡会在下一篇文章里进一步介绍。
1.2.2 Serial Boot 模式(UART/SPI/I2C/USB-HID/USB-DFU)
Serial Boot 模式即串行启动模式,这种模式看起来与第一种 Serial ISP 模式有点相似,因为在通信接口上是共用的(上位机工具也都是 blhost.exe),除了多了个 USB-DFU 方式(上位机工具是开源的 dfu-util)。不过两者最大的区别在于 Application 下载位置,Serial ISP 是往外部非易失 Device 里下载,而 Serial Boot 是往芯片内部 SRAM 里下载并立即跳转执行。如果你了解 i.MXRTyyyy 的 Serial Downloader 模式(详见 飞思卡尔 i.MX RTyyyy 系列 MCU 启动那些事(2)- Boot 配置(BOOT Pin/eFUSE) 第 1.2.1 节),你会发现这种模式从功能上更像 i.MXRTyyyy 的 Serial Downloader 模式。
i.MXRTyyyy 里做 Serial Downloader 模式最主要的原因是其没有实现 ISP 模式,BootROM 里无法提供外部 Device 的下载支持,而 i.MXRTxxx 的 BootROM 里既然做了 ISP 模式,为什么还要做 Serial Boot 这种行为模式呢?并且 Serial Boot 支持的通信接口竟多达五种,这种模式的应用场景到底是什么?痞子衡为你解惑:
快速验证 Non-XIP image 的执行:Serial Boot 模式可以帮助快速验证 Non-XIP image 的执行,不需要操作外部 Device。
作协处理器使用可省外部 Device:如果系统设计里有两颗 MCU,i.MXRTxxx 作为协处理器,在 Serial Boot 模式下可省去存放 Application 的外部 Device,Application 直接由主处理器来加载。
1.2.3 Device Boot 模式(Serial NOR/SD/eMMC/1bit Recovery SPI NOR)
Device Boot 模式就是直接从选定的外部非易失 Device 加载 Application 启动,这种模式才是 i.MXRTxxx 最核心的模式,毕竟离线运行 Application 才是最重要的任务。Device Boot 又分为 Master Boot(Serial NOR/SD/eMMC)和 Recovery Boot(1bit SPI NOR),前者是主动启动设备,后者是备份启动设备。当主动启动设备中的 Application 失效时,芯片会从备份启动设备中再尝试去启动一次 Application,实现双重保障。
二、Boot Device 具体配置
当 Boot 行为模式选定的是从某一类 Boot Device 启动,底下就是配置该 Device 具体属性了。假设我们选择了 Serial NOR FLASH,但是 Serial NOR 只是一类 FLASH 的统称,市面上有非常多的 Serial NOR 芯片,每个芯片特性可能不完全一样,那么 BootROM 怎么知道这些不同的 Serial NOR 芯片的特性呢?还是通过 OTP memory 来指定。
OTP 是 i.MXRTxxx 里一块特殊的存储区域,用于存放全部芯片配置信息,其中有一部分区域分配给 Boot。参考手册的 OTP 相关章节中可见所有 bit 具体定义,这里痞子衡仅贴出一部分用于示例:
从上表中我们可以看到 i.MXRT600 上 BOOT_CFG[1],BOOT_CFG[2]共 64bit 的完整定义,这些定义确实是与具体 Boot Device 属性相关的。
这些 Boot 相关的 Fuse 定义,在这里逐一解释意义不大,需要结合具体 Boot Device 一起来看,痞子衡后续会在介绍每个 Boot Device 启动的文章里再进一步分析。