Skip to content

Commit d0fc8df

Browse files
committed
还差bootable image就完成了
Signed-off-by: latercomer <latercomer@qq.com>
1 parent 47fa829 commit d0fc8df

4 files changed

Lines changed: 48 additions & 20 deletions

File tree

111 KB
Loading
180 KB
Loading
163 KB
Loading

‎docs/develop/02.硬件设计/pixhawk-v6xrt/system-boot.md‎

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,15 @@
22

33
I.MXRT1170 系列单片机,内部固化了最基础的“开机程序”,也就是 [BootROM](#boot-rom)。你一上电,BootROM 永远第一个醒来,但这时候它两眼一抹黑:该从哪里找你的主程序?是旁边的 NOR Flash,还是 SD 卡,或者是通过串口送进来?找到了程序,又该怎么把它搬到合适的地方跑起来?这一连串的问题,都需要一套明确的“行动指南”。
44

5-
这套指南,就藏在芯片的启动模式([BOOT_MODE](#boot-mode))、OPT熔丝([eFuse](#efuse))、引脚配置([BOOT_CFG](#boot-cfg))和你精心准备的程序镜像([Bootable Image](#bootable-image))里。整个流程环环相扣,任何一个环节配置错了,你的板子就可能“变砖”,或者卡在启动的门口死活进不去。所以,理解它,不仅是学习知识,更是实战调试的必备技能。
5+
这套指南,就藏在芯片的启动模式([BOOT_MODE](#boot-mode))、OPT熔丝([eFUSE](#opt-efuse))、引脚配置([BOOT_CFG](#boot-cfg))和你精心准备的程序镜像([Bootable Image](#bootable-image))里。整个流程环环相扣,任何一个环节配置错了,你的板子就可能“变砖”,或者卡在启动的门口死活进不去。所以,理解它,不仅是学习知识,更是实战调试的必备技能。
66

77
不少工程师,程序编译得好好的,一下载进去就不运行,最后折腾半天发现是启动头没配置对。所以,咱们今天的目标就是让你彻底搞懂这套流程,以后遇到启动问题,能自己顺藤摸瓜找到原因。咱们先不急着看代码,先从宏观上把握几个核心角色:负责发号施令的 BootROM、提供硬件配置信息的 BOOT_CFG 引脚和熔丝 eFuse、以及承载你心血的那个最终的可启动镜像(Bootable Image)文件。
88

99
本文主要参考 [i.MX RT1170 Processor Reference Manual](./IMXRT1170RM.pdf) 中 `Chapter 10 System Boot` 章节,来讲解 `RT1170` 的系统启动流程。
1010

11-
## Boot ROM
11+
## BOOT ROM
1212

13-
BootROM 其实是芯片在出厂前固化在 ROM 里的一段启动程序(__不可改变和擦除__),它的目的就相当于一个引导程序。i.MX RT1170系列 BootROM 物理内存映射地址范围:`0x0000_0000 ~ 0x0003_FFFF`(共 `0x40000` 字节,256 KB),注意 BootROM 执行完毕后会将`0x0000_0000 ~ 0x0003_FFFF`重新映射为 `ITCM` 使用。
14-
15-
!!! note
16-
BootROM 是工厂一次性掩膜固化的片内 ROM,物理只读,没有擦写电路,任何工具(J-Link、MfgTool、MCUBootUtility、SDP 协议)都无法修改、升级、替换 BootROM 固件,__也就是出厂版本终身固定__。不过 NXP 给 i.MX RT 系列预留了eFuse ROM 补丁入口,仅用于修复 ROM 少量已知硬件 Bug,属于运行时内存替换,无法整体更新 BootROM。
17-
18-
根据参考手册`10.2 Overview`章节,可知 BootROM 可以帮助你完成:
13+
BootROM 其实是芯片在出厂前固化在 ROM 里的一段启动程序(__不可改变和擦除__),它的相当于一个引导程序。根据参考手册`10.2 Overview`章节,可知 BootROM 可以帮助你完成:
1914

2015
- 支持从多种启动存储设备启动,比如Nor Flash、 NAND Flash、eMMC等
2116
- Serial NOR Flash via FlexSPI
@@ -31,26 +26,30 @@ BootROM 其实是芯片在出厂前固化在 ROM 里的一段启动程序(__
3126
- 内嵌式硬件加密引擎(IEE)
3227
- 实时 AES 硬件解密引擎(OTFAD,片上硬件流解密,读取 Flash 时自动解密)
3328

34-
芯片复位触发后,启动流程正式开始,硬件复位逻辑强制 ARM 内核从片内 BootROM 开始执行代码:
29+
!!! note
30+
- BootROM 是工厂一次性掩膜固化的片内 ROM,物理只读,没有擦写电路,任何工具(J-Link、MfgTool、MCUBootUtility、SDP 协议)都无法修改、升级、替换 BootROM 固件,__也就是出厂版本终身固定__。不过 NXP 给 i.MX RT 系列预留了eFuse ROM 补丁入口,仅用于修复 ROM 少量已知硬件 Bug,属于运行时内存替换,无法整体更新 BootROM。
31+
- i.MX RT1170系列 BootROM 物理内存映射地址范围:`0x0000_0000 ~ 0x0003_FFFF`(共 `0x40000` 字节,256 KB),注意 BootROM 执行完毕后会将`0x0000_0000 ~ 0x0003_FFFF`重新映射为 `ITCM` 使用。
32+
33+
当芯片复位触发后,启动流程正式开始,硬件复位逻辑强制 ARM 内核从片内 BootROM 开始执行代码:
3534

3635
1. 首先 BootROM 根据熔丝位 `BT_CORE_SEL` 的配置决定从 M7 还是 M4 核启动:若 `BT_CORE_SEL = 1` (默认是 0),BootROM 将由 M4 内核执行,而非默认 M7 内核。因为 M4 运行 ROM 代码的执行效率更低,因此从 M4 内核启动的速度会更慢,若开启 HAB 高可信启动功能,耗时差异会尤为明显。
3736

38-
2. 接着 BootROM 代码会读取内部寄存器 BOOT_MODE[1:0] 的电平状态,同时结合各类 eFuse 熔丝配置、BOOT_CFG 引脚电平(开发阶段BOOT_CFG引脚电平可以覆盖eFuse设置),综合判定芯片的完整启动流程分支。
37+
2. 接着 BootROM 代码会读取内部寄存器 BOOT_MODE[1:0] 的电平状态,同时结合各类 eFUSE 熔丝配置、BOOT_CFG 引脚电平(开发阶段BOOT_CFG引脚电平可以覆盖eFuse设置),综合判定芯片的完整启动流程分支。
3938

40-
### Boot MODE
39+
## BOOT MODE
4140

4241
BOOT_MODE 是告诉 BootROM 本次启要执行什么“模式的行动”。RT1170 共提供 4 种启动模式:熔丝启动、串行下载器启动、片内内置启动、预留。各模式配置详见下表:
4342

4443
| BOOT_MODE[1:0] | 启动方式 | 说明 |
4544
| --- | --- | --- |
46-
| 00 | Boot From Fuses,从熔丝启动,一般用于量产阶段 | BootROM 完全忽略 BOOT_CFG 引脚配置,直接根据 eFuse 的配置决定如何启动:<br />1. BT_FUSE_SEL=0,自动进入串行下载,这个状态没有实际意义和使用价值,就算下载了程序,每次重启还是停留在串行下载,而不会运行Flash上的程序<br />2. BT_FUSE_SEL=1 ,根据 eFuse 进行启动,用于量产阶段 |
45+
| 00 | Boot From Fuses,从熔丝启动,一般用于量产阶段 | BootROM 完全忽略 BOOT_CFG 引脚配置,直接根据 eFUSE 的配置决定如何启动:<br />1. BT_FUSE_SEL=0,自动进入串行下载,这个状态没有实际意义和使用价值,就算下载了程序,每次重启还是停留在串行下载,而不会运行Flash上的程序<br />2. BT_FUSE_SEL=1 ,根据 eFUSE 进行启动,用于量产阶段 |
4746
| 01 | Serial Downloader,串行下载 | 这是一个“救援”和“烧录”模式。BootROM 初始化 USB 或 UART1 接口,等待主机(你的电脑)通过特定协议发送数据并写入Flash |
48-
| 10 | Internal Boot,从内部启动,一般用于开发阶段 | 根据 BT_FUSE_SEL 的值决定选择哪个配置来启动:<br />1. BT_FUSE_SEL=0,按照 BOOT_CFG 引脚启动,用于开发阶段<br />2. BT_FUSE_SEL=1,按照 eFuse 进行启动,类似量产阶段 |
47+
| 10 | Internal Boot,从内部启动,一般用于开发阶段 | BootROM 根据 BT_FUSE_SEL 的值决定选择哪个配置来启动:<br />1. BT_FUSE_SEL=0,按照 BOOT_CFG 引脚启动,用于开发阶段<br />2. BT_FUSE_SEL=1,按照 eFUSE 进行启动,类似量产阶段 |
4948
| 11 | Reserved | 保留模式 |
5049

51-
启动模式 BOOT_MODE[1:0] 由片内 SRC_SBMR2 寄存器 BMOD[1:0] 位的数值决定。当上电复位信号 POR_B 上升沿阶段,芯片会采集 BOOT_MODE0(复用引脚GPIO_LPSR_02)与 BOOT_MODE1(复用引脚GPIO_LPSR_03)两个引脚的电平,以此完成 SRC_SBMR2.BMOD[1:0] 寄存器的初始化。引脚电平采集完成后,后续引脚状态变化将不再改变片内 SRC_SBMR2.BMOD[1:0] 寄存器的值。
50+
启动模式(BOOT_MODE)由片内 `SRC_SBMR2` 寄存器 BMOD[1:0] 位的数值决定。当上电复位信号 POR_B 上升沿阶段,芯片会采集 BOOT_MODE0(复用引脚GPIO_LPSR_02)与 BOOT_MODE1(复用引脚GPIO_LPSR_03)两个引脚的电平,以此完成 SRC_SBMR2.BMOD[1:0] 寄存器的初始化。引脚电平采集完成后,后续引脚状态变化将不再改变片内 SRC_SBMR2.BMOD[1:0] 寄存器的值。
5251

53-
| BOOT_MODE | 引脚 | 寄存器 | 说明 |
52+
| 启动模式 | 引脚 | 寄存器 | 说明 |
5453
| --- | --- | --- | --- |
5554
| BT_FUSE_SEL | / | SRC->SBMR2.BT_FUSE_SEL,bit20 | eFuse一次性烧入 |
5655
| BOOT_MODE0 | GPIO_LPSR_02 | SRC->SBMR2.BMOD[0],bit24 | 从引脚读取 |
@@ -86,17 +85,46 @@ BOOT_CFG 是一组专用的GPIO引脚(例如RT1170上的GPIO_AD_00到GPIO_AD_0
8685
- 接口实例和配置:如果是FlexSPI,用的是哪个实例(FlexSPI1还是FlexSPI2),Flash是几线制的(1-bit, 2-bit, 4-bit, 8-bit)
8786
- 其他设备参数:比如NAND Flash的页大小、ECC配置等。
8887

89-
另外芯片内部还有一块叫做 eFuse(一次性可编程熔丝)的存储区,其中有一部分 eFuses 位,其定义和 BOOT_CFG 引脚完全一样。在特定 BOOT_MODE 启动模式下,BOOT_CFG 能够 覆盖 eFuses 的配置:
88+
另外芯片内部还有一块叫做 eFuse(一次性可编程熔丝)的存储区,其中有一部分 eFUSE 位,其定义和 BOOT_CFG 引脚完全一样。在 `BOOT_MODE=0b10 且 BT_FUSE_SEL=0` 时,BOOT_CFG 能够 覆盖 eFUSE 的配置:
89+
90+
- `BOOT_MODE=0b10 且 BT_FUSE_SEL=0`时,BOOT_CFG 引脚的电平覆盖 eFUSE 的配置,BootROM 根据 BOOT_CFG 引脚启动,用电阻配置 BOOT_CFG 引脚,灵活方便,一般用户开发阶段。
91+
- `BOOT_MODE=0b10 且 BT_FUSE_SEL=1`时,BootROM 不再看 BOOT_CFG 引脚了,直接读 eFUSE 熔丝里的配置吧! 把确定好的配置烧进 eFUSE,这样就能防止生产焊接或用户误触改变启动方式,提高了可靠性,一般用于量产阶段。
9092

91-
- `BOOT_MODE=0b10 且 BT_FUSE_SEL=0`时,BOOT_CFG 引脚的电平覆盖 eFuses 的配置,BootROM 根据 BOOT_CFG 引脚启动,用电阻配置 BOOT_CFG 引脚,灵活方便,一般用户开发阶段。
92-
- `BOOT_MODE=0b10 且 BT_FUSE_SEL=1`时,BootROM 不再看 BOOT_CFG 引脚了,直接读 eFuses 熔丝里的配置吧! 把确定好的配置烧进 eFuses,这样就能防止生产焊接或用户误触改变启动方式,提高了可靠性,一般用于量产阶段。
93+
参考手册 `Table 10-7. GPIO Boot Overrides` 、`Table 10-10. Fuse definition for Serial NOR over FlexSPI` 和 `Table 11-1. Muxing Options` 表格给出了 BOOT_CFG 对应的引脚以及各功能:
9394

94-
## eFuse
95+
| eFUSE | 端口信号名 | 焊盘引脚 | 复用模式 | 针对 Flex Nor Flash 的定义 |
96+
| --- | --- | --- | --- | --- |
97+
| BOOT_CFG1[0] | SRC_BT_CFG0 | GPIO_DISP_B1_06 | ALT6 | BOOT_CFG1[0] => xSPI FLASH Auto Probe<br /> 0 – Disabled<br />1 – Enabled|
98+
| BOOT_CFG1[1] | SRC_BT_CFG1 | GPIO_DISP_B1_07 | ALT6 | BOOT_CFG1[1] => Encrypted XIP<br />0 – Disabled<br />1 – Enabled |
99+
| BOOT_CFG1[2] | SRC_BT_CFG2 | GPIO_DISP_B1_08 | ALT6 | BOOT_CFG1[3:2] => xSPI FLASH Auto Probe Type<br />0 – QuadSPI NOR<br />1 – MXIC Octal<br />2 – Micron Octal<br />3 – Adesto Octal |
100+
| BOOT_CFG1[3] | SRC_BT_CFG3 | GPIO_DISP_B1_09 | ALT6 | |
101+
| BOOT_CFG1[4] | SRC_BT_CFG4 | GPIO_DISP_B1_10 | ALT6 | BOOT_CFG1[7:4] => Boot device<br />0000b – FlexSPI(Serial NOR)<br />01xxb - SD<br />10xx - MMC/eMMC<br />001xb - SEMC(NAND)<br />11xx - FlexSPI(Serial NAND)|
102+
| BOOT_CFG1[5] | SRC_BT_CFG5 | GPIO_DISP_B1_11 | ALT6 | |
103+
| BOOT_CFG1[6] | SRC_BT_CFG6 | GPIO_DISP_B2_00 | ALT6 | |
104+
| BOOT_CFG1[7] | SRC_BT_CFG7 | GPIO_DISP_B2_01 | ALT6 | |
105+
| BOOT_CFG2[0] | SRC_BT_CFG8 | GPIO_DISP_B2_02 | ALT6 | BOOT_CFG2[2:0] => xSPI Flash Type<br /> 000b–Boot with default 0x03 Read Enabled<br />001b–Reserved<br />010b–HyperFlash 1V8<br />011b–HyperFlash 3V0<br />100b–MXIC Octal Read<br />101b–Micron Octal Read|
106+
| BOOT_CFG2[1] | SRC_BT_CFG9 | GPIO_DISP_B2_03 | ALT6 | |
107+
| BOOT_CFG2[2] | SRC_BT_CFG10 | GPIO_DISP_B2_04 | ALT6 | |
108+
| BOOT_CFG2[3] | SRC_BT_CFG11 | GPIO_DISP_B2_05 | ALT6 | BOOT_CFG2[3] => FLEXSPI instance<br />0 – FLEXSPI1<br />1 – FLEXSPI2|
95109

96-
eFUSE是 I.MXRT1170 内嵌的一块OTP(One time Programmable) memory,初始状态下所有bit均为0,仅能被烧写1次。eFUSE 的本质就是一块OTP(One Time Programmable)memory,也就是只可以烧写一次的储存区域,__初始状态下所有 bit 均为 0,仅能被烧写 1 次__。
110+
## OPT eFUSE
111+
112+
eFUSE 是 I.MXRT1170 内嵌的一块OTP(One time Programmable) memory,初始状态下所有bit均为0,仅能被烧写1次。eFUSE 的本质就是一块OTP(One Time Programmable)memory,也就是只可以烧写一次的储存区域,__初始状态下所有 bit 均为 0,仅能被烧写 1 次__。
113+
114+
- eFuse中部分位的定义在参考手册`26.2 Boot Fusemap`中有介绍,对于所有位的介绍,比如加密启动的一些字段,需要参考`Secure Reference Manual`,这个手册需要找FAE要,自己是下载不了的。
115+
- eFuse除了有OTP特性外,还有Lock特性,它包含三层:写保护、覆盖保护和访问保护
116+
- eFuse空间有两类:一类受冗余保护(牺牲一半的空间保存数据的备份以防止数据损坏),一类受ECC保护(可纠正损坏位)
117+
- eFuse空间的读写由RT1170中的OCOTP控制器来实现,如果想要修改eFuse,用户可以参考SDK中OCOTP相关代码自己来实现。也可以通过集成了eFuse烧写的工具:blhost、sdphost或MCUBootUtility(通过Flashloader)来修改。
97118

98119
RT1170 系列单片机的 eFUSE 有 8Kb,分为 32 个 Bank,每个 Bank 有 8 个 word(1个 word 为 4 字节),即 32 字节。下图 0~0x8F 为 eFUSE 的 bank word 索引地址。
99120

121+
![](./imgs/opt-memory-footprint.png)
122+
123+
FlexSPI (Serial NOR) boot fusemap (启动相关的eFUSE)见下图:
124+
125+
![](./imgs/flexspi-norflash-boot-fusemap1.png)
126+
![](./imgs/flexspi-norflash-boot-fusemap2.png)
127+
100128
## Bootable Image
101129

102130
Bootable image通俗的来说就是APP镜像,里面集成了除了机器执行码(也就是我们经常说的bin文件)之外,还有其他各种信息。以STM32举例来说,通常我们只要将Bin文件下载到其内部的FLASH中,芯片上电后即可读取程序并运行,但是对于RT系列来说则是不不可以,必须将可执行文件加上其他信息(如FDCB, IVT,BD, DCD,CSF等,其中IVT和BD包含了image的目标地址和总长度)打包成规定格式的image文件下载进外部存储器中,RT才能顺利运行。(关于Bootable image的具体介绍大家可参考文章:痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(6)- Bootable image格式与加载(elftosb/.bd)…)

0 commit comments

Comments
 (0)