目录
1.前言
本文主要就Hi3556v200的U-boot+Liteos方案的启动流程做简要介绍, 前面主要分析了Hi3556v200下的start.S文件,在这之后它将解压通用uboot的代码执行,执行的入口位于通用uboot的start.S文件。
U-boot版本:u-boot-2016.11
2.主要流程
2.1 _start
上文分析到从Hi3556v200下的start.S文件执行的最后会通过start_armboot函数解压通用uboot的压缩文件,然后跳转到首地址进行执行,这个首地址就是通用uboot的链接地址0x80800000,通过链接脚本u-boot-2016.11/arch/arm/cpu/u-boot.lds可以知道入口地址为_start.位于u-boot-2016.11/arch/arm/cpu/armv7/start.S
2.2 reset
reset:
#ifndef CONFIG_MINI_BOOT
/* Allow the board to save important registers */
ENTRY(save_boot_params)
b save_boot_params_ret @ back to my caller
ENDPROC(save_boot_params)
.weak save_boot_params
#endif
save_boot_params_ret:
#ifdef CONFIG_ARMV7_LPAE
/*
* check for Hypervisor support
*/
mrc p15, 0, r0, c0, c1, 1 @ read ID_PFR1
and r0, r0, #CPUID_ARM_VIRT_MASK @ mask virtualization bits
cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT)
beq switch_to_hypervisor
switch_to_hypervisor_ret:
#endif
2.3 set SVC32 mode
/*
* disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
* except if in HYP mode already
*/
mrs r0, cpsr
and r1, r0, #0x1f @ mask mode bits
teq r1, #0x1a @ test for HYP mode
bicne r0, r0, #0x1f @ clear all mode bits
orrne r0, r0, #0x13 @ set SVC mode
orr r0, r0, #0xc0 @ disable FIQ and IRQ
msr cpsr,r0
2.4 Setup vector
/*
* Setup vector:
* (OMAP4 spl TEXT_BASE is not 32 byte aligned.
* Continue to use ROM code vector only in OMAP4 spl)
*/
#if !(defined(CONFIG_OMAP44XX) && defined(CONFIG_SPL_BUILD))
/* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
mrc p15, 0

本文详细解析了Hi3556v200平台的U-Boot启动流程,包括start.S的执行、reset处理、设置SVC32模式、vector设置、CPU初始化以及main函数中的环境设置和内存管理。重点介绍了board_init_f中的内存分配和初始化过程。
最低0.47元/天 解锁文章
1079

被折叠的 条评论
为什么被折叠?



