大家好, 我是痞子衡, 是正经搞技术的痞子. 今天痞子衡给大家介绍的是恩智浦 i.MX RTxxx 系列 MCU 的 Boot 配置.
在上一篇文章 Boot 简介 里痞子衡为大家介绍了 Boot 基本原理以及 i.MXRTxxx Boot 方式简介. 今天痞子衡就来重点聊一聊 i.MXRTxxx Boot 方式具体由哪些配置决定的.
无论是什么芯片里的 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 启动的文章里再进一步分析.
至此, 恩智浦 i.MX RTxxx 系列 MCU 的 Boot 配置痞子衡便介绍完毕了, 掌声在哪里~~~
来源: https://www.cnblogs.com/henjay724/p/11990219.html