QNX实战笔记1:SMP启动之IMX8系统控制单元

IMX8的系统控制单元(SCU)

在这里插入图片描述

  上图所示为IMX8系统架构图,IMX8QM系列采用大小核架构,有2个A72大核,4个A53小核,2个M4核还有DSP核,那么多核如果没有一个管理单体来管理,那就乱套了。
  所以NXP加入了SCU模块来管理芯片的启动和关键外设初始化,这样一来,像GPIO和时钟初始化这种操作,只能交给SCU去做,其他核无权限修改,就避免了每个cpu都去各自初始化GPIO和时钟,最终配置混乱的问题了,然而SCU的功能不止这些。

1. SCU的组成单元

  SCU的架构如下
在这里插入图片描述

  SCU由双核构成(M4+M0),二人(M4和M0)分工不同。M4核作为一个标准的打工仔,主要负责镜像的加载,M0核更像一个权威的认证机构,M0核位于SECO模块,负责校验SCU M4模块所加载的镜像,并授权运行,对M4搬运过来的镜像,M0具有一票否决权(前提是M4搬运过来的镜像有问题)。

1.1 SCU(M4)

  上电后,SCU以外的所有核都是Power down状态,SCU的M4核首先运行,此时运行的IMX8原厂固化的ROM中的程序,将各个核的Image搬移至对应的内存地址,通知SECO验证Image,当SECO验证完所有的Image后,ROM程序的工作完成,随后马上跳转至SCU FW,我们的初始化GPIO等一系列操作,就是在SCU固件中完成的。
  SCU固件是NXP为我们提供的半开源软件,为开发者提供了一些列API函数,如初始化GPIO、甚至RPC服务等操作。

1.2 SECO(M0)

负责对SCU M4加载的各个核的镜像进行验证,并决定是否授权这个镜像运行

2. IMX8的启动镜像的结构

在讲解启动流程之前,需要先了解SCU加载的Image镜像的结构,镜像结构如下图所示
在这里插入图片描述

2.1 container与image

  取自docker中的概念,container为image的集合,在多核处理器中可以认为每一个image都是其中一个核要运行的可执行文件,所以在单核处理器中很少能看到这种结构。

2.2 镜像结构

Container Header:容器的头信息包含了容器内所有镜像的加载信息
在这里插入图片描述

Signature Block:一些与HAB加密相关的信息
在这里插入图片描述

Image Array:SECO FW、SCU FW(包含DDR初始化 FW)、CM4 Image、AP IPL

一共有2个container,其中container1装载的是SECO FW Image,container2装载的是SCU FW、CM4 Image和AP IPL,其中:
SECO FW Image:运行于SCU的SECO模块
SC FW:运行于SCU的SCC模块
CM4 Image:IMX8的M4核运行的镜像
AP IPL:IMX8 Cortex核运行的镜像

2.2.1 SECO FW

首先被加载的镜像是SECO FW,SECO FW由NXP提供,代码并未开源,它的主要工作就是负责对SCC加载的各个核的镜像进行验证,并决定是否授权这个镜像运行

2.2.2 SC FW

运行于SCU M4核心的firmware,用于启动管理和外设初始化等任务,可以进行定制修改。

2.2.3 CM4 Image

iMX8支持2x Cortex-M4 核心,运行于这些M4核心的固件可以一起集成到boot container image里面去

2.2.4 AP IPL

AP IPL为Cortex-A52/72上运行的程序,在mkimage打包镜像时指定运行于A72还是A53,IPL以uboot为例

2.2.4.1 在A53核上运行

在这里插入图片描述

make SOC=iMX8QM flash
在这里插入图片描述

2.2.4.2 在A72核上运行

在这里插入图片描述

make SOC=iMX8QM flash_ca72
在这里插入图片描述

2.2.4.3 两份IPL的区别

Compare对比,只有一个字节有差异,而这个字节的含义就是启动的cpu的编号。
在这里插入图片描述

参考SCU FW固件手册第6章节,下表对各个核的Index索引进行了描述
在这里插入图片描述

Guess you like

Origin blog.csdn.net/weixin_42314225/article/details/120192080