通过该段代码根据不同的启动模式进行不同的启动方式:
如果是nand会自动读取uboot前4k的代码到片内sdram执行,该代码要完成cpu的初始化和ram初始化(初始化ram为外围的)等。
——————————————————————————
i.mx51没有nand但有SD卡,但都是作为存储设备!
——————————————————————————
一直困惑自己的是,一直以为uboot的前4k是拷贝到外围ram执行的,但片外的ram需要前4k去初始化这样造成了死锁
拿Freescale的imx51为例 片内ROM 36k 片内RAM128k
iMX51启动机制如下(在实际开发中不会涉及到该内容写下这些只是让你更好的了解系统的启动过程,系统的启动过程不单单只有uboot这一块在uboot之前还做了很多的工作):
imx51在系统重启时,会采样启动模式的GPIO管脚(BOOT_MODE[1:0]),采样所得到的值存储在SBMR寄存器中(System Reset Controller Boot Mode Register)。imx51支持的启动模式包括:内部启动模式(通过启动模式的GPIO管脚判断启动外设)、测试模式、下载模式(通过USB/UART下载代码)、内部启动模式(通过启动模式fuse位判断启动外设)。
BOOT_MODE[1:0] | 启动模式类型 | 启动模式细节 |
00 | 内部启动模式 (通过启动模式GPIO管脚判断启动外设) | iMX51执行芯片内部的启动代码,可以从以下设备启动
|
01 | 测试模式 | |
10 | 内部启动模式 (通过启动模式fuse位判断启动外设) | 与00模式相同,只是不通过启动模式GPIO管脚来判断启动外设,而是通过iMX51的内部fuse位,这些fuse位可以一次性写入。 |
00 | USB/UART下载启动模式 | 下载并执行代码,可以通过以下接口 l USB(全速) l UART |
imx51在系统重启时,会读取GPIO_BT_SEL的内部fuse位:
a)如果GPIO_BT_SEL=1(被烧写过),在芯片内部启动代码会通过读取内部fuse位来判断外设相关性。
b)如果GPIO_BT_SEL=0,imx51会在启动时采样外设相关特性的GPIO管脚,并存储在SBMR寄存器中。芯片内部启动代码会通过读取该寄存器判断外设相关性。所以,芯片内部fuse位与启动相关GPIO管脚是一一对应的。
IMX51内部启动代码
imx51内部有一段ROMcode,在内部启动模式下,系统启动时,会执行这段代码,这段代码会初始化最基本的硬件,然后判断系统的外部存储设备信息(通过读取SBMR寄存器)。然后系统会初始化相应的外设,并将外设中的第一部分代码拷贝到芯片内部RAM中,并跳转到其头地址并执行。
通过这种方式,imx51可以支持从多种外设启动,从而增加启动灵活性,imx51 ROMcode流程如下
我们是按照从SD卡
1) 通过采样SBMR寄存器读取fuse位或者采用启动模式的管脚 <——Reset
2)通过BOOT_MODE[1:0]来判断是否是那种启动模式
为了保持稳定性BOOT_MODE[1:0]=10,内部启动模式(通过启动模式fuse位判断启动外设),将外部信息烧写到芯片内部fuse中,这样系统将从内部fuse中读取相关外设信息。
3)因为是从SD卡启动所以 boot memo ctrol SD/MMC/MoviNAND?
BT_MEM_CTL = 外设接口扩展存储设备
‘00’=SD/MMC HDD
4)配置SD/MMC的控制器 eSDHC1 Controller
5)basic config and obtain base addr of boot device
基本的配置和获取启动硬件的基地址
6)执行镜像
讲这些的作用:imx51的Romcode固化在芯片内部,不能修改,以上分析Romcode主要可以帮助大家理解以下几点:
1)imx51最初是如何启动的
2)在bootloader开始执行前,系统处于何种状态,由以上分析可见
a)imx51已经初始化了硬件部分,包括部分时钟,内部总线以及外部存储设备的控制器,以及外部存储设备本身
b)bootloader的头2k已经被拷贝到imx51内部的RAM了,除开1k的MBR头,以及flash文件头,剩下的部分就是可执行代码。由此可知剩下部分已经不能放下整个bootloader了,所以必须把bootloader分成两个部分:XLDR和Eboot本身。
c)可以利用DCD段来初始化某些寄存器,例如AndroidBSP利用它来初始化系统DDR2控制器。