LV04-01-IMX6ULL启动流程-02-启动流程
本文主要是I.MX6ULL启动流程——启动流程的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows版本 | windows11 |
Ubuntu版本 | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
终端软件 | MobaXterm(Professional Edition v23.0 Build 5042 (license)) |
Linux开发板 | 正点原子 i.MX6ULL Linux 阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
Win32DiskImager | Win32DiskImager v1.0 |
点击查看本文参考资料
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.nxp.com.cn/ | NXP官方网站 | |
https://www.nxpic.org.cn/ | NXP 官方社区 | |
https://u-boot.readthedocs.io/en/latest/ | u-boot官网 | |
https://www.kernel.org/ | linux内核官网 |
点击查看相关文件下载
分类 | 网址 | 说明 |
NXP | https://github.com/nxp-imx | NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库 |
nxp-imx/linux-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP linux内核仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
nxp-imx/uboot-imx/releases/tag/rel_imx_4.1.15_2.1.0_ga | NXP u-boot仓库tags中的rel_imx_4.1.15_2.1.0_ga | |
I.MX6ULL | i.MX 6ULL Applications Processors for Industrial Products | I.MX6ULL 芯片手册(datasheet,可以在线查看) |
i.MX 6ULL Applications ProcessorReference Manual | I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网) | |
Source Code | https://elixir.bootlin.com/linux/latest/source | linux kernel源码 |
https://elixir.bootlin.com/u-boot/latest/source | uboot源码 |
i.MX6UL支持多种启动方式,而具体硬件平台支持的启动方式与选择的存储器有关,前面一节的笔记已经学习了如何选择启动设备以及设置启动设备的参数,这里我们来了解一下系统如何启动,更详细说明请参考《i.MX 6UltraLite Applications Processor Reference Manual》第8 章 System Boot。
一、启动流程
1. 流程图
这一部分我们参考一下《i.MX 6ULL Applications Processor Reference Manual 》的 8.2.2 High-level boot sequence ,这里有一张流程图:
这个流程图是一个大概的流程,总结一下就是:
(1)检查 CPU ID。
(2)检查 Reset Type,就是检查一下复位状态。复位或者上电、唤醒的启动过程是不一样的。
(3)检查启动模式寄存器 BOOT_MODE,检查 eFUSE 或 GPIO,获取启动方式。
(4)根据上述检查从 USB 口、 UART 口或是某个启动设备下载 boot image,也就是加载程序映像。
(5)认证 image,就是校验一下映像。
(6)跳转到映像执行。
对于具体的启动设备,《i.MX 6ULL Applications Processor Reference Manual 》的《Chapter 8: System Boot》中有对应章节描述更为细致的启动流程。基本上就是对这些启动设备根据 eFUSE或 GPIO 的设置进行初始化,尝试更高的工作频率等。
2、流程分析
2.1 检查CPU的ID
系统上电或硬件复位后,CPU从0x0000 0000 地址开始 执行boot ROM代码。boot ROM代码首先会检查CPU的ID。 这一步官方手册中也没有过多介绍,这里默认检测通过。
2.2 检查复位状态
一种情况是正常的硬件复位另外一种情况是从低功耗模式唤醒。这里先忽略低功耗模式唤醒的情况,继续向下执行。
2.3 检查启动方式
前面已经学习过启动方式了,在开发阶段我们可以通过设置i.MX6UL启动相关引脚的电平状态来改变芯片的启动方式。 BOOT_MODE[1:0] = 10B ,i.MX6UL将会从“内部”启动,所谓“内部”是相对于“Serial Download”来说的, “内部”可以认为是i.MX6UL支持的启动存储设备,例如emmc、nandflash、SD card、norFlash等等。 具体从那种“内部”设备启动,由BOOT_CFG1[7:4]决定,如下表所示:
BOOT_CFG1[7:4] | Boot device |
---|---|
0000 | NOR/OneNAND (EIM) (本教程配套开发板没有用到) |
0001 | QSPI(norFlash启动) |
0011 | Serial ROM (SPI)(本教程配套开发板没有用到) |
010x | SD/eSD/SDXC(SD卡启动) |
011x | MMC/eMMC(emmc启动) |
1xxx | Raw NAND(nandflash启动) |
2.4 加载程序映像
知道启动方式后boot ROM代码并不能立即加载启动映像,因为我们的代码保存在芯片外部存储设备, 从这些存储设备读数据之前首先要进行初始化。在Boot ROM程序根据保存在芯片中的默认配置信息配置这些存储器接口。 使用默认的配置信息配置存储器接口大多数情况下并不能发挥外设的最大性能, 还需要使用DCD(Device Configuration Data)进行二次配置。
DCD是一个表,表中包含的配置信息,它用于配置各种外围设备,例如NOR flash、DDR等等。既然DCD保存在 程序映像中,Boot ROM怎么找到DCD呢? DCD地址信息保 存在IVT(Image Vector Table)中,boot ROM通过读取IVT得到DCD地址信息。
同样IVT是也是一个表或者说是一个数据结构,它保存有DCD数据的地址、程序的入口等等信息。 启动方式确定后boot ROM从固定地址读取IVT。如下表所示(在《i.MX 6UltraLite Applications Processor Reference Manual》的8.7.1 Image Vector Table and Boot Data ):
从上表可知,IVT在存储器中的偏移值是固定的。以SD卡为例,如果从SD卡启动,那么IVG位于SD卡的0x400偏移地址处,也就是1KB的位置。初始化完成后,boot ROM便可以加载我们编写的程序。
上面的DCD和IVT后面还会详细再学习。
2.5 校验映像
在程序执行之前还要进行HAB校验。 HAB可以防止攻击者修改可编程内存中的代码或数 据区域,HAB校验更详细的内容请参 考《i.MX 6UltraLite Applications Processor Reference Manual》 8.3.1 High-Assurance Boot (HAB)。
2.6 跳转到映像去执行
以SD卡启动为例,在执行跳转之前boot ROM已经将代码从SD卡加载到了DDR,所以直接跳转到程序的入口地址即可。
二、串行下载流程
这一部分我们参考一下《i.MX 6ULL Applications Processor Reference Manual 》的8.2.4 Serial Downloader ,这里有一张流程图:
这个大概就是这样子,其实跟前边学习STM32的时候那个流程是很类似的。
doc.embedfire.com/linux/imx6/base/zh/latest/bare_metal/before_developing.html#