s5pv210启动过程
s5pv210启动过程
1. 启动过程如下图:
1)BL0位于IROM中,其选择引导的介质受外围引脚OM
电平所决定。
其能引导的介质包括:nor,nand,onenand,SD/MMC等等。如下图,0x2表示nand(page为2k byte,5个command周期,8bit ECC)启动,0xc表示SD/MMC。OM的值可以通过读寄存器0xE000-0004得到
2)根据OM的值,IROM中的BL0选择其固话的对应驱动将对应介质的前16K代码数据读到IRAM中。引导代码之后会进行校验,校验和BL1的长度信息放在16K代码数据的最前面16个字节。为什么需要长度?因为校验是对确定长度的内容进行计算得到,而BL1的有效代码数据可能并没有16K。
3)加载BL1之后,BL0会将给PC赋值为0xd0020010,即BL1代码真正的入口应该设置链接到0xd0020010。在编译链接生存BL1之后需要用专门的工具计算出BL1的长度和校验码,并填充到BL1的头部,在uboot中称为NAND_SPL.BIN。
BL1执行时会先初始化好SDRAM,然后将BL2引导到SDRAM
2. IROM除了引导之后,还做了一些硬件和软件环境初始化工作。主要流程包括:
1)关闭看门狗
2)初始化指令cache,开启指令cache
3)初始化 IRAM中的栈(中断栈、SVC栈)和堆,异
常向量注册表等。具体如下图:
IROM运行是处于SVC模式。这里的exception vector table并不是异常向量表,而应该称为异常向量注册表。因为异常向量表是在IROM的起始位置上,即0x00000000开始的地方,如下所示,IROM建立起的环境只能支持中断(异常的一种)注册,即注册到0xd0037418,对于其他异常的支持需要在启动或者OS
阶段进行重建,并将其定位到
SDRAM区域,并设置异常向量的基地址(通过改变协处理器P15的C12-Vector Base Address Register)指向该区域。
_start: b reset
.word 0x0
.word 0x0
.word 0x0
.word 0x0
.word 0x0
ldr pc, _irq
.word 0x0
4)填充好IRAM的块设备读接口区域。如上图,0xd0037f80开始的128个字节存放的是块设备的拷贝函数地址,如nand,sd/mmc等的读接口地址。其用于后续BL1和BL2使用。即BL1和BL2代码不需要实现外存设备的读驱动函数,只需要调用IROM的接口就可以了。SPEC的p14-p18具体描述了各种不同的介质设备的操作接口地址以及相关的信息。
5)开启PLL,初始化系统时钟。
6)copy 16k字节的BL1到SRAM。
7)对BL1进行校验,即计算BL1的校验值,并与BL1的头部的校验值进行比较,失败即会跳到2nd boot中去引导,成功即跳到BL1的0xd0020010执行。