版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SilverFOX111/article/details/86615700
start.S代码分析笔记
13. 288行代码(CPU相关硬件初始化)
bl lowlevel_init
lowlevel_init 函数在…/uboot/board/samsung/x210/lowlevel_init.S 文件中,该函数主要是初始化CPU相关的硬件,具体实现过程如下:
- 时钟初始化的配置值可以在…/uboot/include/configs/x210_sd.h 文件中第301行注释定义宏来修改,当前配置值为CLK_1000_200_166_133。
- DRAM初始化配置值也可以在…/uboot/include/configs/x210_sd.h 文件中第440行和448行修改,当前DRAM配置了DMC0_MEMCONFIG_0(0x30F01313)和DMC1_MEMCONFIG_0(0x40F01313),初始化了从0x30000000-0x3FFFFFFF(DRAM0)和0x40000000-0x4FFFFFFF(DRAM1)连续的512M空间。
- 串口初始化的配置值也可以在…/uboot/include/configs/x210_sd.h 文件中第165行注释定义修改,当前初始化的是串口2。
14. 292-294行代码(开发板电源上锁)
ldr r0, =0xE010E81C /* PS_HOLD_CONTROL register */
ldr r1, =0x00005301 /* PS_HOLD output high */
str r1, [r0]
该段操作其实是多余的,因为在lowlevel_init 函数中已经操作好了。
15. 297-299行代码(二次设置栈)
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0
该段将栈设置到了DRAM中,避免了先前设置到SRAM中所引起的栈空间不足,代码执行后,由于ARM为满减栈,所以栈的空间为0x30000000-0x33E00000。
16. 重定位(1)
16.1 305-310行代码
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中,并进行重定位。
16.2 314-318行代码
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,准备重定位。
16.3 321-332行代码
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执行。
16.3 343-354行代码(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 文件中。