uboot启动第一阶段–start.S代码分析笔记(1)
bl lowlevel_init
lowlevel_init 函数在…/uboot/board/samsung/x210/lowlevel_init.S 文件中,该函数主要是初始化CPU相关的硬件,具体实现过程如下:
ldr r0, =0xE010E81C /* PS_HOLD_CONTROL register */
ldr r1, =0x00005301 /* PS_HOLD output high */
str r1, [r0]
该段操作其实是多余的,因为在lowlevel_init 函数中已经操作好了。
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0
该段将栈设置到了DRAM中,避免了先前设置到SRAM中所引起的栈空间不足,代码执行后,由于ARM为满减栈,所以栈的空间为0x30000000-0x33E00000。
ldr r0, =0xff000fff
bic r1, pc, r0 /* r0 <- current base addr of code */
ldr r2, _TEXT_BASE /* r1 <- original base addr in ram */
bic r2, r2, r0 /* r0 <- current base addr of code */
cmp r1, r2 /* compare r0, r1 */
beq after_copy /* r0 == r1 then skip flash copy */
该段判断了当前程序运行的位置是否在DRAM中,如果在说明已经重定位了,直接执行copy后的代码即可,否则需要复制Uboot代码到DRAM中,并进行重定位。
ldr r0, =0xD0037488
ldr r1, [r0]
ldr r2, =0xEB200000
cmp r1, r2
beq mmcsd_boot
查阅文档 S5PV210_IROM_APPLICATION NOTE_REV 0.3 ,可以找到地址0xD0037488的信息,其是MMC启动通道,若从SD2通道启动,该地址内的值为0xEB200000。所以,最后跳转函数到mmcsd_boot,准备重定位。
ldr r0, =INF_REG_BASE
ldr r1, [r0, #INF_REG3_OFFSET]
cmp r1, #BOOT_NAND /* 0x0 => boot device is nand */
beq nand_boot
cmp r1, #BOOT_ONENAND /* 0x1 => boot device is onenand */
beq onenand_boot
cmp r1, #BOOT_MMCSD
beq mmcsd_boot
cmp r1, #BOOT_NOR
beq nor_boot
cmp r1, #BOOT_SEC_DEV
beq mmcsd_boot
这段其实是赘余的,作用与上一段一样是选择启动通道,其中地址INF_REG_BASE+INF_REG3_OFFSET中的值在start.S代码分析笔记(1)的11点中提及,是BOOT_MMCSD(0x3),所以最后跳转到mmcsd_boot执行。
mmcsd_boot:
#if DELETE
ldr sp, _TEXT_PHY_BASE
sub sp, sp, #12
mov fp, #0
#endif
bl movi_bl2_copy
b after_copy
nor_boot:
bl read_hword
b after_copy
DELETE 未定义,所以直接执行movi_bl2_copy 函数进行从SD卡(SD2)复制uboot代码到DRAM中,具体是将SD卡第49号扇区开始的512KB内容复制到DRAM地址0x33E00000开始的单元中,然后执行after_copy开始处的代码。movi_bl2_copy 函数代码在…/uboot/cpu/s5pc11x/Movi.c 文件中。
uboot启动第一阶段–start.S代码分析笔记(3)