I.MX6ULL启动详解:Boot配置、Bootable image启动头的组成

2023-12-21 08:44

本文主要是介绍I.MX6ULL启动详解:Boot配置、Bootable image启动头的组成,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章来了解一下I.MX6ULL的启动方式,实际上之前我介绍了NXP的跨界MCU RT1170的启动方式:I.MX RT1170启动详解:Boot配置、Bootable image头的组成,两个芯片虽然一个是Cortex-M,一个是Cortex-A,但是都是来源于NXP,所以有类似的BootROM代码,在启动的引导方式上是类似的,下面就来详细介绍一下。

文章目录

  • 1 基础知识
  • 2 Boot配置
    • 2.1 BOOT_MODE
    • 2.2 BOOT_CFG配置
  • 3 Bootable image启动头
    • 3.1 组成
    • 3.2 实例
      • 3.2.1 程序结构
      • 3.2.2 程序镜像内容分析

1 基础知识

1、BootROM

在上电后,会执行一段固定的BootROM程序,这段程序是由NXP官方写好的,主要是用来根据用户提供的信息对镜像进行引导。比如说用户希望将代码从Nand/EMMC/SD拷贝到SDRAM执行、用户希望上电时能初始化好SDRAM…这都可以交给BootROM完成。

2、image头

那BootROM要怎么知道用户希望做哪些初始化呢?我们就需要在编译出来的.bin文件的开头添加一些头信息,以提供给BootROM,让它知道如何引导程序启动。

3、eFuse

eFuse顾名思义就是熔丝,它的状态只能由0转为1,这是不可逆的。比如说对于不同的启动方式来说,我们可以将手册中指定的硬件上的几个启动引脚拉高或拉低,从而表示设备会从哪里启动。对于这些,在硬件上我们飞个线或者去掉一个电阻就能更改这些启动方式了,那有什么办法可以固定这个启动方式而不被更改呢?

在eFuse中就有和几个启动引脚相对应的位,然后我们只要烧写eFuse中的BT_FUSE_SEL位,就表示以后上电就是从eFuse中对应的配置读取启动配置,而不会从硬件中读取。

2 Boot配置

2.1 BOOT_MODE

在这里插入图片描述

  • Boot From Fuses:通过熔丝的配置来Boot。如果是这种启动方式,就会根据刚刚所说的BT_FUSE_SEL来判断要不要使用eFuse的配置进行启动引导,如果想根据eFuse的配置进行启动,则需要烧写BT_FUSE_SEL位。默认BT_FUSE_SEL为0,在该模式下,会进入Serial Downloader模式。
  • Serial Downlaoder:我们可以通过串口或USB与BootROM进行通信,我们就可以根据此功能烧写一段代码到内置的RAM里然后运行,这段代码可以完成Flash的擦写、eFuse的烧写等操作。
  • Internal Boot:与Boot From Fuses模式类似,也会根据BT_FUSE_SEL位来读取配置,只是BT_FUSE_SEL为0时候的定义和Boot From Fuses不同,如果为0,则使用GPIO的配置进行引导。

2.2 BOOT_CFG配置

前面有了启动方式后,BootROM还需要知道从哪里读取代码启动,如果是从NOR Flash启动的话,那就直接在NOR Flash运行,如果是从EMMC、SD等存储设备启动,则还需要拷贝代码到SRAM/SDRAM等RAM中运行。这些都是根据BOOT_CFG来配置的。在I.MX6ULL中支持以下几种存储设备启动:

  • NOR Flash
  • NAND Flash
  • OneNAND Flash
  • SD/MMC
  • Serial (SPI) NOR Flash and EEPROM
  • QuadSPI (QSPI) Flash

BOOT_CFG引脚包括BOOT_CFGx[0]-BOOT_CFGx[7](x=1,2,3),共24个引脚。

在这里插入图片描述

对于不同的启动设备来说,BOOT_CFG1[7:4]配置如下:

在这里插入图片描述

至于其它的24个引脚的配置,我们不用对每个引脚都进行配置,因为在不同的启动设备下,仅需要配置个别的配置引脚,大家可以根据自己的启动设备,参考8.5 Boot Device(Internal Boot)章节中的配置。比如使用NOR Flash启动,我们只需要再配置表格中的这些引脚即可:

在这里插入图片描述

  • 同样的,BOOT_CFG引脚在eFuse中也有对应的位来表示

3 Bootable image启动头

3.1 组成

既然BootROM需要引导程序,它并不知道程序中断向量表所在的位置,如果程序需要从存储设备拷贝到RAM中,那是从哪个地址拷贝到哪个地址呢?另外,前面我们有提到BootROM还可以对SDRAM等外设进行初始化,那不同的SDRAM参数不同,应该如何让BootROM知道呢?我们就可以在启动头中添加这些信息,这个启动头称为IVT(Image Vector Table)。

对于不同的启动设备来说,启动头存放的位置也不同,如下图所示:

在这里插入图片描述

如下所示,包括IVT的字段,BootROM就通过这些字段将程序从Boot Device拷贝到Dest Memory。

在这里插入图片描述

各个字段的含义如下:

FieldDescription
header执行镜像中第一条指令的绝对地址
reserved1保留字段,应设为0
dcd镜像DCD的绝对地址。DCD是可选的,如果不需要,则此字段可以设置为0。
boot data启动数据的绝对地址
selfIVT 的绝对地址。ROM内部使用
csf用于加密启动,不用的话设置为0
reserved2保留字段,应设为0
  • 这里的CSF用于HAB认证,可以参考我写的这一篇文章RT1170加密启动详解(2):HAB认证原理

实际上这些字段和RT1170中的IVT启动头一模一样,这里就不做详细介绍了,可以参考I.MX RT1170启动详解:Boot配置、Bootable image头的组成。下面直接举一个实际的例子,来看看这些字段是如何配置的。

3.2 实例

3.2.1 程序结构

这里我们假设Boot Device为SD,我们希望将代码拷贝到DDR中运行。根据前面这张图,我们知道从SD启动的话整个头的大小为4KB,其中IVT的偏移为0x400。

在这里插入图片描述

由下图可知,DDR的起始地址为0x80000000。

在这里插入图片描述
另外I.MX6ULL属于ARMv7内核,来看一下CP15协处理器中的向量表字段:
在这里插入图片描述
也就是说在ARMv7中,向量表地址的低5位有别的作用,实际上就是可以指定上电后进入的异常(默认为Reset异常)。如果低5位用不了的话,也就代表着我们的向量表地址要32位对齐。


所以我们可以这样设计镜像格式:
在这里插入图片描述

最终DDR的0x80000000开始的内存内容就是以上的格式。由于我们设置了从SD启动,所以我们只需要把这整个固件放在SD中就行了,上电后BootROM会帮我们拷贝到0x80000000处,然后去运行0x80100000处的代码。

  • 由于程序放在0x80100000,所以我们在编译的时候,需要修改链接脚本的链接地址,将程序链接到0x80100000
  • 这里仅是举一个极端的情况,让大家可以更好地理解这个启动头的作用。我们完全可以把向量表放在0x80100000-0x1000的位置。否则这样的话,如果一次烧写整个镜像到SD卡,那至少要烧写0x100000的大小。同样地,BootROM拷贝也会非常慢。

3.2.2 程序镜像内容分析

(1)0~0x400:暂时没有用到,填0

在这里插入图片描述

2、IVT(Image Vector Table):偏移0x400

在这里插入图片描述
其中TAG为d1,IVT Length为0x20(这个字段大端表示),version为0x40,entrypoint Address(程序的链接地址或程序reset_handler的地址)为0x80100000,DCD的绝对地址为0x8000042C,Boot Data链接地址为0x80000420,IVT链接地址为0x80000400。

3、BD(Boot Data):偏移0x420

在这里插入图片描述

其中镜像的绝对起始地址为0x80000000,程序镜像的大小为0x200000(2M,可以根据DDR最大的大小填写)。

4、DCD:偏移0x42C

在这里插入图片描述

从0x42C开始都是DCD的配置了,实际上就是使用指定的格式来配置寄存器,比如可以配置SDRAM的寄存器,这样BootROM就能帮我们初始化好SDRAM。

  • 具体格式参考手册:8.7.2 Device Configuration Data

5、程序镜像:偏移0x100000
在这里插入图片描述

最后就是我们编译出来的原始bin文件了。

这篇关于I.MX6ULL启动详解:Boot配置、Bootable image启动头的组成的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/519318

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal