• 正文
  • 相关推荐
申请入驻 产业图谱

飞凌嵌入式ElfBoard ELF 1板卡-uboot启动流程分析之boot ROM阶段

05/28 15:14
913
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

CPU上电之后执行的第一段代码并不是uboot代码,因为uboot存储在启动介质(存储介质),如eMMC Flash、NAND Flash、SD卡,CPU想要执行启动介质中的uboot代码,就需要将uboot代码从启动介质取出,加载到内存中去执行。那么就需要某个程序来做这些工作。i.MX6ULL内部有一块ROM,存储着一段代码,这部分代码是SOC设计时实现的,上电后会首先运行,uboot的引导就由这段代码实现,我们称这段代码为boot ROM。boot ROM会去读取设置好的硬件启动信息(硬件启动信息一般通过拨码开关进行配置,不同的引脚电平,对应不同的启动模式,不同的启动介质,关于启动这部分内容可以去参考硬件手册),判断启动介质,然后初始化内存以及启动介质,最后读取uboot代码程序到内存中开始运行,因此boot ROM需要做这么几个工作:CPU初始化,时钟初始化,内存初始化,启动介质初始化,加载uboot程序并执行。

将uboot程序从启动介质加载到内存中是boot ROM完成的,所以boot ROM就需要知道,从哪里拷贝程序,程序有多大,拷贝到哪里。这些信息都存储在启动介质起始的一片区域,boot ROM从此区域获取到这些信息后,才进行后续的加载工作。因此,我们烧写到启动介质上的镜像文件,除了应用程序uboot.bin本身,还需要包含一些额外的头信息,配合boot ROM的工作。这些额外的头信息,包括IVT、Boot data、DCD(Device Configuration Data)。

所以一个完整的镜像主要由IVT(Image Vector Table offset)、Boot Data、DCD(Device Configuration Data)、User code and data(Application+CSF)几部分组成,如下图的左半部分。

一、IVT(Image Vector Table)

IVT(Image Vector Table)是一个统一格式的structure,其原型如下面结构体所示,从结构体定义我们得知,IVT中记录了Boot data、Application、DCD、CSF以及IVT本身在内存中的位置信息:

这些信息对boot ROM加载启动至关重要。IVT大小固定为32byte,其在Bootable image中的偏移位置也是固定的,例如对于eMMC版,IVT在eMMC中的偏移地址为1Kbyte=0X400 bytes。其他启动介质如下图:

二、Boot data

Boot data也是一个structure,其组成如下图所示:

BD(Boot data)中记录了Bootable image的起始地址与总长度。BD大小固定为16byte,BD信息虽然记录在了IVT中,但其在Bootable image中的偏移位置并不是任意的,BD是紧挨着IVT的。

三、DCD

CPU上电之后,在进入uboot之前,需要对内存进行初始化,以便将uboot从启动介质引导到内存中。这些外设的一些初始化配置信息就存储在DCD中。下面这个表就是可以在DCD中可配置的一些寄存器地址范围,从表中看出,DCD区域中不仅可以初始化内存,也可以对其他的一些外设或者其他功能进行初始化:

四、User code and data

User code就是我们的app即uboot.bin程序,data指的是CSF,certificates and signatures,跟安全启动相关的签证证书信息,目前没有用到,这里不再讲解。boot ROM在完成一些初始化工作之后,将uboot.bin加载到内存指定地址中,最终跳转到该地址执行uboot.bin,此时boot ROM生命周期结束,开启uboot生命周期。

相关推荐