小猫爪:i.MX RT1050学习笔记16-启动流程(Boot Flow)

1 前言

前面基本上已经把关于RT启动的需要的知识都已经梳理完毕,前面也对RT的启动作了一个非常简单的介绍,今天就来系统的学习一下RT1050的启动流程。

2 bootROM的流程

下图显示了bootROM整个发起启动的过程。
在这里插入图片描述可以看到RT的启动流程非常的复杂,就像一个小迷宫一样,接下来咋们就一点点不留情的撕开它。

启动后,第一步就是检测启动类型,判断此次启动是低功耗唤醒还是正常启动。接下来就看看两种情况下的启动。

2.1低功耗唤醒启动

如果是低功耗唤醒,BootROM则会通过SNVS模块完成模块的重启,中间通过检测判断这次唤醒源是否合法,合法则直接执行镜像,如果不合法,则会直接进入正常启动流程继续执行。

2.2 正常启动

正常启动后,通过检测boot mode(通过引脚也可通过eFUSE)得知设备启动类型是Internal Boot还是Serial Download。

2.2.1 Serial Download

如果是Serial Download模式,这时候bootROM就会一直等待USB1或者LPUART1接收可执行文件,存放在RAM中,校验成功后执行程序,bootROM放弃控制权。

(注意:这个时候就有人问了,放在RAM中,那掉电不就消失了吗,所以这个模式有啥用呢?其实更多时候Serial Download是为下载程序使用的,我们先通过Serial Download将Flashloader程序下载进RAM执行,然后再通过Flashloader将镜像下载进FLASH。)

2.2.1 Internal Boot

如果是Internal Boot模式,这时BootROM则会直接从外部存储器中读取镜像,如果镜像校验通过后则开始执行程序,bootROM放弃控制权,如果校验没有通过,则会进行尝试从二级存储器进行恢复启动(如果该功能使能的话),如果都失败了,则bootROM会直接进入Serial Download模式等待。

3 加载镜像流程

(注意:查看本章建议先看一下前面写的镜像分解文章:《小猫爪:i.MX RT1050学习笔记9-镜像文件分解》)

对于Internal Boot来说,最重要且复杂的即是加载镜像的过程,因为RT支持的外部启动存储器种类很多,每一种的特性也不一样,所以加载镜像的过程也会有点东西,接下来我们看看对于不同存储器加载镜像的过程。

BootROM会从BOOT_CFG信息了解启动设备信息,然后开始读取镜像。

下面我们针对几种情况进行详细说明。

3.1 FlexSPI Serial NOR Flash

对于通过FlexSPI外设外接Serial NOR Flash来说,启动流程图如下:
在这里插入图片描述首先以单线SDR模式50MHz的FlexSPI配置读取前4K数据,得到FCB信息,然后重新初始化FlexSPI,接下来再获取IVT+BootData+DCD,如果有DCD数据则按照DCD数据初始化SEMC,根据BootData判断是否XIP执行,如果XIP执行,则直接跳转到IVT的APP entry地址,如果是non-XIP,则会将镜像拷贝至OCRAM,再跳转至APP entry地址,至此启动结束。

3.2 FlexSPI Serial NAND Flash

对于NAND型的存储器,它有一个特性,就是NAND会存在一些坏块,所以在读取镜像的时候,就需要预先知道坏块的信息,读取镜像时需要跳过这些坏块,而这些坏块的信息就存储在DBBT(Discovered Bad Block Table)中。而DBBT所在的地址信息存储在FCB中,FCB中还存储了镜像存放的位置。因为坏块的存在一般会在NAND中存储多份镜像,如果其中一个损坏了,可以继续使用第二个镜像启动。具体启动流程如下:

①首先bootROM会从NAND的起始page读取FCB,校验成功后(如果校验失败,则会自动寻找下一个FCB),再从FCB中获取DBBT和镜像的存放位置,并且根据FCB中的信息二次初始化FlexSPI。(如果在指定区域内没有找到有效FCB,则会直接判定启动失败进入Serial Download模式。)

②根据FCB中的信息读取DBBT,获取坏块信息。

③根据FCB中的应用程序起始位置和DBBT中的坏块信息读取镜像,读取后校验,如果校验失败,说明产生新的坏块,会在DBBT中记录坏块信息,则接下来会发起重启,尝试读取镜像2。

④成功读取镜像后,获取IVT信息后,跳转至APP entry地址,至此启动结束。

注意:说到这里,就会产生一个疑问,FCB/DBBT数据怎么去指定呢?其实我们只需要指定12个字节的信息,在下载过程中,Flashloader会自动生成FCB/DBBT的数据,并下载进NAND中,所以它也是不支持IDE下载的。)

3.3 SEMC Parallel NOR Flash

对于SEMC NOR Flash启动来说,启动流程与 FlexSPI Serial NOR Flash启动流程是差不多的,唯一的区别就是 Parallel NOR 接口的统一,所以可以不需要FCB数据来对SEMC进行二次初始化,仅仅依靠BOOT_CFG的信息即可完成启动。

3.4 SEMC Raw NAND Flash

对于SEMC Raw NAND Flash启动来说,启动流程与 FlexSPI Serial NAND Flash启动流程是差不多的。

3.5 SDHC SD/MMC

对于SDHC接口启动的设备就比较简单了,这里就不存在上面说的FCB和DBBT等这些花里胡哨的数据,启动流程也是比较的简单,BootROM根据BOOT_CFG知道启动设备的种类后,则会直接进入启动流程。部分启动流程如下图:
在这里插入图片描述可以看到经过以上的试探后,会得到存储设备是SD卡还是MMC,然后再进入相应的读取流程,在这里我就不详细展开了,毕竟一般不会使用该种方式。一句话概括就是经过一系列的试探后得到最终的信息,然后针对不同的设备做不同的操作,最终读取数据。

3.6 LPSPI NOR/EEPROM

对于 LPSPI NOR/EEPROM,它一般都是用来做二次启动使用的,当第一次启动失败后,则可以通过LPSPI NOR/EEPROM做二次启动,比如如果主启动设备损坏,RT可以通过该接口进行二次启动。还比如在代码量很小的情况下,则可以使用该接口降低成本。

该启动流程也是非常的简单,不需要FCB数据了,启动时,BootROM会直接读取前4K的数据获取IVT+BootData+DCD(IVT的偏移地址为0x400),然后根据BootData将整个镜像拷贝至RAM中,再跳转至APP entry地址,至此启动结束。

注意:不管是哪一种启动,BOOT_CFG的配置是非常重要的,任何的疏漏都会造成启动失败。当然前面说的都是没有经过加密的情况下的镜像加载流程,如果有加密的情况下,其启加载流程则会多解密认证的过程,关于RT的加密解密操作我们后面会做详细介绍。)

END

猜你喜欢

转载自blog.csdn.net/Oushuwen/article/details/109668891