uboot启动第一阶段--start.S代码分析笔记(2)


uboot启动第一阶段–start.S代码分析笔记(1)


start.S代码分析笔记

    • 13. 288行代码(CPU相关硬件初始化)
    • 14. 292-294行代码(开发板电源上锁)
    • 15. 297-299行代码(二次设置栈)
    • 16. 重定位(1)
        • 16.1 305-310行代码
        • 16.2 314-318行代码
        • 16.3 321-332行代码
        • 16.3 343-354行代码(mmcsd_boot)


13. 288行代码(CPU相关硬件初始化)

bl	lowlevel_init

lowlevel_init 函数在…/uboot/board/samsung/x210/lowlevel_init.S 文件中,该函数主要是初始化CPU相关的硬件,具体实现过程如下:

Created with Raphaël 2.2.0 检查复位状态 不是睡眠? 不是深度睡眠? I/O复位 关看门狗 SRAM与SROM相关引脚初始化 开发板电源上锁 当前运行位置在DRAM中 (判断是否已经重定位)? 串口初始化,发送字符'O' tzpc初始化 nand初始化 ABB禁止,打印字符‘K’ 结束 时钟初始化 DRAM初始化 深度睡眠苏醒相关操作 睡眠苏醒相关操作 yes no yes no yes no
  • 时钟初始化的配置值可以在…/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,准备重定位。
uboot启动第一阶段--start.S代码分析笔记(2)_第1张图片

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 文件中。


uboot启动第一阶段–start.S代码分析笔记(3)

你可能感兴趣的:(嵌入式/uboot,uboot整体架构的分析)