Hi3556v200 u-boot+Liteos方案启动流程分析--2.通用uboot start.S分析

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值