最近开始学习Uboot,但是在学习Uboot时产生了一个疑惑——Uboot是怎么被加载起来的?抱着这个疑惑,分析了下IMX6ULL上电流程。
几乎所有芯片内部都有一块BootROM,或者叫RomCode。RomCode存储介质为eFUSE(熔丝,只能烧写一次)。
RomCode中会初始化部分外设,比如串口,DDR,FLASH之类。RomCode的作用有:
1、把时钟打开,配置和时钟有关的寄存器。
2、读取和启动有关的几个引脚的电平,根据这个电平确定CPU接下来要去哪里读用户代码,可以是Nand,SD卡等,这个是我们根据自己的需要进行配置的。
有些RomCode会从存储介质中读用户代码到片内RAM(OCRAM)中去,并执行该部分代码。比如三星的部分芯片。
ROMcode是真正意义上的上电首次启动的代码,一般会用BL0代称,表明为Bootloader 0。由BL0加载BL1,BL1可以是UBoot也可以是裸机程序。
那么ROMcode是怎么被加载起的呢?
在设计芯片时,规定芯片一上电,CPU会去0x00000000地址去取指令,这个地址就是BootROM的起始地址。
3、从存储介质中拷贝用户代码到片内RAM(OCRAM)中
拷贝多少用户代码呢?
如下图所示:
最后一列列出了初始加载的区域大小,以SD卡和EMMC这俩我们常用的大容量存储介质为例,Boot ROM程序都是先读4K到片内RAM(OCRAM)中。
这4K的数据是什么?IVT表+Boot Data+DCD表
IVT表全称是:Image Vector Table,其中存放的是各种地址信息,比如bin文件的起始地址(这个也叫镜像程序的入口地址,该地址由链接脚本指定,称为链接起始地址,可以是内部RAM也可以是外部DDR),Boot Data的地址,DCD表的地址等。
Boot Data包含了整个imx文件的起始地址以及整个bin文件的大小信息。
DCD表全称是:Device Config Data,其中包含的是要配置SoC的外设控制器的寄存器地址,以及要写入的值。有了DCD表,就可以初始化一部分外设了,一般要初始化外设的有GPIO,时钟,DDR。
通过这4K的信息,就知道了要把真正的bin文件放到哪里去,是内部RAM还是DDR,具体大小是多少也就知道了。
如果在IMX6ULL上运行裸机程序,除了自己的c文件以外,必须还要有一个start.S这个启动文件,就类似STM32里面的启动文件。这个启动文件用于设置处理器运行模型,设置堆栈,跳转到C程序去执行。
参考资料:
IMX6ULL启动过程详解 https://blog.csdn.net/Priscilla_cola/article/details/124892098
3_IMX6ULL启动流程 https://blog.csdn.net/thisway_diy/article/details/122476595
i.MX6处理器u-boot.imx文件解析 https://blog.csdn.net/eurphan_y/article/details/105324455
原文始发于微信公众号(TreeNewBeer):IMX6上电流程分析
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/115082.html