Skip to content

Commit bedee10

Browse files
committed
调整boot文档结构
Signed-off-by: latercomer <latercomer@qq.com>
1 parent d0fc8df commit bedee10

1 file changed

Lines changed: 81 additions & 32 deletions

File tree

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

Lines changed: 81 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,17 @@ I.MXRT1170 系列单片机,内部固化了最基础的“开机程序”,也
1010

1111
## BOOT ROM
1212

13-
BootROM 其实是芯片在出厂前固化在 ROM 里的一段启动程序(__不可改变和擦除__),它的相当于一个引导程序。根据参考手册`10.2 Overview`章节,可知 BootROM 可以帮助你完成:
13+
Boot是任何一款MCU都有的特性。提及Boot,首先应该联想到的是FLASH,通常Cortex-M微控制器芯片内部一般都会集成FLASH(从FLASH分类上来看应该属于Parallel NOR FLASH),你的Application代码都是保存在FLASH里,每次上电CPU会自动从FLASH里获取Application代码并执行,这个行为就是Boot。
14+
15+
I.MXRT1170 系列 BootROM 其实是芯片在出厂前固化在 ROM 里的一段 Bootloader 程序(__不可改变和擦除__)。这个 Bootloader 程序可以帮助你完成 Flash 里的 Application 的更新,而不需要使用额外的外部编程/调试器(比如JLink),也可以完成 Application 的启动。
16+
17+
!!! note
18+
- BootROM 是工厂一次性掩膜固化的片内 ROM,物理只读,没有擦写电路,任何工具(J-Link、MfgTool、MCUBootUtility、SDP 协议)都无法修改、升级、替换 BootROM 固件,__也就是出厂版本终身固定__。不过 NXP 给 i.MX RT 系列预留了eFuse ROM 补丁入口,仅用于修复 ROM 少量已知硬件 Bug,属于运行时内存替换,无法整体更新 BootROM。
19+
- i.MX RT1170系列 BootROM 物理内存映射地址范围:`0x0000_0000 ~ 0x0003_FFFF`(共 `0x40000` 字节,256 KB),注意 BootROM 执行完毕后会将`0x0000_0000 ~ 0x0003_FFFF`重新映射为 `ITCM` 使用。
20+
21+
根据参考手册`10.2 Overview`章节,可知 BootROM 可以帮助你完成:
1422

1523
- 支持从多种启动存储设备启动,比如Nor Flash、 NAND Flash、eMMC等
16-
- Serial NOR Flash via FlexSPI
17-
- Serial NAND Flash via FlexSPI
18-
- SLC RAWNAND Flash via SEMC
19-
- SD/MMC via uSDHC
20-
- SPI NOR/EEPROM via LPSPI
2124
- 内置串行下载器,用来更新程序(不需要使用Jlink等调试器),支持 USB-HID、UART 两种下载通道
2225
- 设备配置数据(DCD,BootROM 外设 / 内存初始化指令段)
2326
- 基于数字签名的高可信安全启动(HAB,NXP 原厂安全启动框架)
@@ -26,38 +29,36 @@ BootROM 其实是芯片在出厂前固化在 ROM 里的一段启动程序(__
2629
- 内嵌式硬件加密引擎(IEE)
2730
- 实时 AES 硬件解密引擎(OTFAD,片上硬件流解密,读取 Flash 时自动解密)
2831

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-
3332
当芯片复位触发后,启动流程正式开始,硬件复位逻辑强制 ARM 内核从片内 BootROM 开始执行代码:
3433

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

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

39-
## BOOT MODE
38+
## BOOT Device
4039

41-
BOOT_MODE 是告诉 BootROM 本次启要执行什么“模式的行动”。RT1170 共提供 4 种启动模式:熔丝启动、串行下载器启动、片内内置启动、预留。各模式配置详见下表:
40+
BootROM 支持从以下外设启动 Application 程序:
4241

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

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] 寄存器的值。
50+
`BOOT_MODE` 和 `BT_FUSE_SEL` 联合起来告诉 BootROM 本次启要执行什么“模式的行动”。
5151

52-
| 启动模式 | 引脚 | 寄存器 | 说明 |
52+
!!! info
53+
- 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[25:24]) 寄存器的初始化。引脚电平采集完成后,后续引脚状态变化将不再改变片内 SRC_SBMR2.BMOD[1:0] 寄存器的值。
54+
- BT_FUSE_SEL 是 eFUSE 一次性熔丝烧入,出厂默认0,可以通过 SRC_SBMR2[20] 寄存器读取。
55+
56+
| BOOT_MODE | 引脚 | 寄存器 | 说明 |
5357
| --- | --- | --- | --- |
54-
| BT_FUSE_SEL | / | SRC->SBMR2.BT_FUSE_SEL,bit20 | eFuse一次性烧入 |
5558
| BOOT_MODE0 | GPIO_LPSR_02 | SRC->SBMR2.BMOD[0],bit24 | 从引脚读取 |
5659
| BOOT_MODE1 | GPIO_LPSR_03 | SRC->SBMR2.BMOD[1],bit25 | 从引脚读取 |
5760

58-
> SRC_SBMR2 是 32 位只读寄存器,其中Bit25~24 => BMOD[1:0],Bit20 => BT_FUSE_SEL
59-
60-
可以使用以下代码,读取启动模式 BOOT_MODE:
61+
`SRC_SBMR2 是 32 位只读寄存器,其中Bit25~24 => BOOT_MOD[1:0],Bit20 => BT_FUSE_SEL`,可以使用以下代码,读取启动模式 BOOT_MODE:
6162

6263
```c
6364
// 读取启动模式
@@ -77,18 +78,66 @@ switch(boot_mode)
7778
}
7879
```
7980

80-
## BOOT CFG
81+
RT1170 共提供 4 种启动模式:熔丝启动、串行下载器启动、片内内置启动、预留。各模式启动行为详见下表:
82+
83+
| BOOT_MODE[1:0] | 启动方式 | 说明 |
84+
| --- | --- | --- |
85+
| 00 | Boot From Fuses,从熔丝启动,一般用于量产阶段 | BootROM 完全忽略 BOOT_CFG 引脚配置,直接根据 eFUSE 的配置决定如何启动:<br />1. BT_FUSE_SEL=0,自动进入串行下载,这个状态没有实际意义和使用价值,就算下载了程序,每次重启还是停留在串行下载,而不会运行Flash上的程序<br />2. BT_FUSE_SEL=1 ,根据 eFUSE 进行启动,用于量产阶段 |
86+
| 01 | Serial Downloader,串行下载 | 这是一个“救援”和“烧录”模式。BootROM 初始化 USB 或 UART1 接口,等待主机(你的电脑)通过特定协议发送数据(比如flashloader)并写 RAM,然后通过 falshloader下载 app 到 flash,注意 BootROM 不具备直接将 app 写 Flash的能力,需要flashloader |
87+
| 10 | Internal Boot,从内部启动,一般用于开发阶段 | BootROM 根据 BT_FUSE_SEL 的值决定选择哪个配置来启动:<br />1. BT_FUSE_SEL=0,按照 BOOT_CFG 引脚启动,用于开发阶段<br />2. BT_FUSE_SEL=1,按照 eFUSE 进行启动,类似量产阶段 |
88+
| 11 | Reserved | 保留模式 |
89+
90+
### Boot From Fuses
91+
92+
  Boot From Fuses 模式从名字来看其实会让人误解,这个模式并不是从 eFuse 里加载 Application 启动的意思,而是根据 eFuse 里的一些 Boot 配置值来决定从哪个外部存储器Boot。eFuse 是 i.MXRT1xxx里一块特殊的存储区域,用于存放全部芯片配置信息,其中有一部分配置信息和 Boot 相关。
93+
94+
  在参考手册Fusemap这一章节,可以看到完整的Fuse Map表,其中偏移 `0x460` 处的 32bit 配置数据的 bit4 是 `BT_FUSE_SEL`,这个bit至关重要,决定了Boot From Fuses模式的主要行为,具体表现如下:
95+
96+
- `BT_FUSE_SEL=0`:表明所有外部存储器中均没有 Application,此时 Boot From Fuses 模式等同于 Serial Downloader 模式。
97+
- `BT_FUSE_SEL=1`:表明有外部存储器中存在有效 Application,此时 BootROM 会根据 eFuse 中其他 Boot 配置信息进一步选择指定的外部存储器(Boot Device)去Boot。
98+
99+
### Serial Downloader
100+
101+
Serial Downloader 模式顾名思义即串行下载模式,在这种模式下,BootROM 通过指定的USB或者UART口来接收来自Host(恩智浦提供了上位机工具 sdphost.exe 或者 mfgtool 或者 MCUBootUtility)的 Application 数据,并将数据存储在 SRAM 中执行,__这种模式其实就是从SRAM启动__,但是如果用这种模式去 Boot Application 缺点很明显,每次上电都需要将 Application 重新下载进 SRAM,无法做到脱机自动 Boot,所以显然这种模式的主要目的并不是从 SRAM 启动 Application,那它到底有什么用?
102+
103+
其实 Serial Downloader 模式主要是用来从 SRAM中 启动 Flashloader,恩智浦官方提供了 Flashloader 程序,Flashloader 程序可以用来将你的 Application 下载进 i.MXRT1xxx 支持的所有外部非易失性存储器中,为后续从外部存储器启动做准备。除此以外 Serial Downloader 模式还可以用来查看 eFuse 值。
104+
105+
### Internal Boot
106+
107+
Internal Boot模式其实跟Boot From Fuses模式(BT_FUSE_SEL=1时)很类似,只是这个模式下BT_FUSE_SEL的意义有点不同,具体表现如下:
108+
109+
- `BT_FUSE_SEL=0`:BootROM根据BOOT_CFG[x:0] pins和Fuse中Boot配置综合决定Boot Device,其中BOOT_CFG[x:0] pins的配置会覆盖Fuse中意义相同的Boot配置信息。
110+
- `BT_FUSE_SEL=1`:BootROM完全根据Fuse中Boot配置信息选择指定的Boot Device去Boot。
111+
112+
我们可以通过更改BOOT_CFG[x:0] pins输入状态来切换Boot配置,这部分Boot配置在Fuse里也同样存在,但是使用BOOT_CFG[x:0]来更改Boot配置显然比烧写Fuse更方便快捷(也可以认为BOOT_CFG[x:0]主要用于产品开发过程中,待产品开发结束后,应直接用Fuse来锁定Boot配置)。
113+
114+
## BOOT CFG 和 eFUSE
115+
116+
BOOT_CFG 是一组专用的GPIO引脚(例如RT1170上的GPIO_AD_00到GPIO_AD_07等)。在上电复位时,BootROM 会立刻采样这些引脚的电平状态,并将其解读为一组配置字。eFUSE 是内嵌的一块OTP(One time Programmable) memory,其中有一部分 eFUSE 位,其定义和 BOOT_CFG 引脚完全一样。在 `BOOT_MODE=10b 且 BT_FUSE_SEL=0` 时,BOOT_CFG 能够 覆盖 eFUSE 的配置,即:
117+
118+
- `BOOT_MODE=10b 且 BT_FUSE_SEL=0`时,BOOT_CFG 引脚的电平覆盖 eFUSE 的配置,BootROM 根据 BOOT_CFG 引脚启动,用电阻配置 BOOT_CFG 引脚,灵活方便,一般用户开发阶段。
119+
- `BOOT_MODE=10b 且 BT_FUSE_SEL=1`时,BootROM 不再看 BOOT_CFG 引脚了,直接读 eFUSE 熔丝里的配置吧! 把确定好的配置烧进 eFUSE,这样就能防止生产焊接或用户误触改变启动方式,提高了可靠性,一般用于量产阶段。
120+
121+
### BOOT CFG
81122

82123
BOOT_CFG 是一组专用的GPIO引脚(例如RT1170上的GPIO_AD_00到GPIO_AD_07等)。在上电复位时,BootROM 会立刻采样这些引脚的电平状态,并将其解读为一组配置字。这组配置里面至少包含了以下关键信息:
83124

84-
- 启动设备类型:是从串行NOR Flash(FlexSPI)启动,还是从NAND Flash(SEMC),或者是从SD卡启动?
85-
- 接口实例和配置:如果是FlexSPI,用的是哪个实例(FlexSPI1还是FlexSPI2),Flash是几线制的(1-bit, 2-bit, 4-bit, 8-bit)
125+
- 启动设备类型(BOOT_CFG1[7:4]):是从串行NOR Flash(FlexSPI)启动,还是从NAND Flash(SEMC),或者是从SD卡启动?
126+
- 接口实例和配置(BOOT_CFG2[3]):如果是FlexSPI,用的是哪个实例(FlexSPI1还是FlexSPI2),Flash是几线制的(1-bit, 2-bit, 4-bit, 8-bit)
86127
- 其他设备参数:比如NAND Flash的页大小、ECC配置等。
87128

88-
另外芯片内部还有一块叫做 eFuse(一次性可编程熔丝)的存储区,其中有一部分 eFUSE 位,其定义和 BOOT_CFG 引脚完全一样。在 `BOOT_MODE=0b10 且 BT_FUSE_SEL=0` 时,BOOT_CFG 能够 覆盖 eFUSE 的配置:
129+
BOOT_CFG[x:0] 引脚其实是跟 eFuse 里是偏移 `0x450`处 32bit 配置数据里的 bit0-x 是对应的:
130+
131+
- BOOT_CFG[7:0] 引脚对应的是 eFuse BOOT_CFG1[7:0]
132+
- BOOT_CFG[11:8] 引脚对应的是 eFuse BOOT_CFG2[3:0]
133+
134+
其中 BOOT_CFG1[7:4] 用于选择具体 Boot Device:
89135

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,这样就能防止生产焊接或用户误触改变启动方式,提高了可靠性,一般用于量产阶段。
136+
- 0000b – FlexSPI(Serial NOR)
137+
- 01xxb - SD
138+
- 10xx - MMC/eMMC
139+
- 001xb - SEMC(NAND)
140+
- 11xx - FlexSPI(Serial NAND)
92141

93142
参考手册 `Table 10-7. GPIO Boot Overrides` 、`Table 10-10. Fuse definition for Serial NOR over FlexSPI` 和 `Table 11-1. Muxing Options` 表格给出了 BOOT_CFG 对应的引脚以及各功能:
94143

@@ -107,9 +156,9 @@ BOOT_CFG 是一组专用的GPIO引脚(例如RT1170上的GPIO_AD_00到GPIO_AD_0
107156
| BOOT_CFG2[2] | SRC_BT_CFG10 | GPIO_DISP_B2_04 | ALT6 | |
108157
| BOOT_CFG2[3] | SRC_BT_CFG11 | GPIO_DISP_B2_05 | ALT6 | BOOT_CFG2[3] => FLEXSPI instance<br />0 – FLEXSPI1<br />1 – FLEXSPI2|
109158

110-
## OPT eFUSE
159+
### OPT eFUSE
111160

112-
eFUSE 是 I.MXRT1170 内嵌的一块OTP(One time Programmable) memory,初始状态下所有bit均为0,仅能被烧写1次。eFUSE 的本质就是一块OTP(One Time Programmable)memory,也就是只可以烧写一次的储存区域,__初始状态下所有 bit 均为 0,仅能被烧写 1 次__。
161+
eFUSE 是 I.MXRT1170 内嵌的一块OTP(One time Programmable) memory,__初始状态下所有 bit 均为 0,仅能被烧写 1 次的储存区域__。
113162

114163
- eFuse中部分位的定义在参考手册`26.2 Boot Fusemap`中有介绍,对于所有位的介绍,比如加密启动的一些字段,需要参考`Secure Reference Manual`,这个手册需要找FAE要,自己是下载不了的。
115164
- eFuse除了有OTP特性外,还有Lock特性,它包含三层:写保护、覆盖保护和访问保护

0 commit comments

Comments
 (0)