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執行板級初始化。


發佈了26 篇原創文章 · 獲贊 21 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章