AM335x的启动过程

2019-04-13 15:27发布

u-boot简介

简单的说,u-boot的核心功能是加载内核。 
为什么需要它,上电之后直接加载内核不可以吗? 
虽然目前的内核没有这么做且理论上也可以实现,但没有必要这么做。 
这就类似于几十万大军在行军,通常的做法是派出几千人的不断在前面探路,而非几十万大军一股脑的往前走。 
总结一下,u-boot的作用,初始化各类的硬件,加载内核,在加载内核的同时,把硬件的基本信息通过参数的形式传递给内核。

启动过程

AM335x通常的启动分为三个阶段,ROM Code、SPL、u-boot,最终加载内核。

ROM Code

顾名思义,这块的代码是TI内置的。上电后,硬件去加载该代码。这块的代码作用,是根据启动选项来从不同的启动源启动。目前支持的启动源有MMC、Nand、Uart、USB、net等方式。如,我们的项目用的Nand,ROM Code运行后,会初始化Nand,然后在Nand的0x0的位置加载下一阶段的代码,即SPL的代码。把SPL的代码,加载到内部存储器中运行。

SPL

SPL和MLO有什么区别,可以认为是没有区别。具体的区别是SPL代码中包含了调试等描述信息,MLO作为裁剪后的代码,烧写进Nand中。最大的疑问是,为什么需要SPL阶段,直接ROM Code启动u-boot不是更快吗?因为硬件,目前,ROM Code只能把代码加载到内部存储器中运行,而内部存储器资源非常有限,运行不了正常的u-boot,所以先运行精简版的u-boot,再去加载正常的u-boot。 
所以,SPL阶段的使命很明确,初始化外存,加载u-boot到外存。

u-boot

不必多言了,这就是正常的u-boot,一是提供交互界面,供用户进行配置;二是初始化硬件环境加载内核运行。当然,核心功能上面也说了,是加载内核。 
另外,目前AM335x也支持Falcon模式,在该模式下,SPL直接加载内核启动,后面会有详细的介绍。本文转载自donglicaiju76152的博客:https://blog.csdn.net/donglicaiju76152/article/details/77917196