4412uboot启动过程分析之二

load_uboot:
	ldr	r0, =INF_REG_BASE
	ldr	r1, [r0, #INF_REG3_OFFSET]	//read_om将判断结果放在寄存器INF_REG3_OFFSET
	cmp 	r1, #BOOT_MMCSD
	beq 	mmcsd_boot
	cmp	r1, #BOOT_EMMC
	beq	emmc_boot
	cmp	r1, #BOOT_EMMC_4_4
	beq	emmc_boot_4_4
	cmp     r1, #BOOT_SEC_DEV
	beq     mmcsd_boot

load_uboot函数根据前面read_om获取到的启动信息判断从哪个设备启动,我的板子设为OM[5:1]=10100,第0位接地,所以为0x28=BOOT_EMMC_4_4,从EMMC启动

emmc_boot_4_4:
	/* read TCBCNT to get Transferred CIU card byte count */
	ldr r0, =0x1255005c
	ldr r1, [r0]
	ldr r2, =0x6000
	cmp r1, r2	//4412所谓的第二启动项应该是根据这里来判断的,r1<r2则代码地址为1,跳转到mmcsd_boot
	/* store second boot information in DRAM */
	ldr r0, =CONFIG_PHY_UBOOT_BASE	//_TEXT_BASE
	sub r0, r0, #8
	mov r3, #0
	movlo r3, #1
	str r3, [r0]	

	/* if transferred CIU card byte count >= 0x6000 (24 KB)  */
	/* BL1 and BL2 are loaded from emmc 4.4 			     */
	/* Otherwise BL1 and BL2 are loaded from sdmmc ch2.      */
	blo mmcsd_boot	//这里的blo和上面的movlo都是根据cpm r1,r2的结果来确定的,r1<r2则进行相应操作

	/* mmc ch4 devider value change */
	bl	mmc_ch4_devider_change

	mov	r0, #EMMC_4_4
	str	r0, _boot_device
	bl	load_uboot_image

	b	cold_boot
	b	after_copy
进入emmc_boot_4_4后,还要根据TCBCNT寄存器的值判断是执行第一还是第二启动项,如果寄存器的值小于0x6000,则执行第二启动项,从sd卡启动,这里我们选择从emmc启动。确定启动项后,_boot_device作为参数传入到c函数load_uboot_image和cold_boot中(smc.c),据网上的大神说这两个函数将uboot从emmc拷贝到SDRAM,但我跟进去怎么看都理解不了是怎么实现的,如果有知道的希望能指点一二 ???拷贝uboot进入after_copy函数

after_copy:
	bl uart_asm_init

	/* set up C2C */	
	ldr r0, =S5PV310_SYSREG_BASE
	ldr r2, =GENERAL_CTRL_C2C_OFFSET
	ldr r1, [r0, r2]
	ldr r3, =0x4000
	orr r1, r1, r3
	str r1, [r0, r2]

#ifdef CONFIG_ENABLE_MMU
	bl enable_mmu
#endif

	/* store second boot information in u-boot C level variable */
	ldr r0, =CONFIG_PHY_UBOOT_BASE
	sub r0, r0, #8
	ldr r1, [r0]	//将CONFIG_PHY_UBOOT_BASE-8处的数据保存到r1
	ldr r0, _second_boot_info	//将_second_boot_info的值,即second_boot_info地址给r0
	str r1, [r0]	//将CONFIG_PHY_UBOOT_BASE-8处的数据保存到内存second_boot_info处

	/* Print 'K' */
	ldr	r0, =S5PV310_UART_CONSOLE_BASE
	ldr	r1, =0x4b4b4b4b
	str	r1, [r0, #UTXH_OFFSET]

	ldr r0, _board_init_f
	mov pc, r0	//执行board.c中board_init_f函数
after_copy初始化串口,设置C2C最终进入board_init_f执行板级初始化。


你可能感兴趣的:(4412uboot启动过程分析之二)