(1)头文件分析
#config.h文件是配置的时候生成的,它里面的内容是configs/x210_sd.h里的内容
#include <config.h>
#version.h是配置过程生成的,他里面是uboot的版本好(在Makefile里面生成的)
#include <version.h>
#if defined(CONFIG_ENABLE_MMU)
#asm/proc/domain.h是配置的时候生成的符号链接,它实际指向的是asm-arm/proc-armv/domain.h文件
#include <asm/proc/domain.h>
#endif
#regs.h文件的内容实际上是x210_sd.h里面的内容
#include <regs.h>
#ifndef CONFIG_ENABLE_MMU
#ifndef CFG_PHY_UBOOT_BASE
#define CFG_PHY_UBOOT_BASE CFG_UBOOT_BASE
#endif
#endif
(2)启动代码的16个字节头
#这里只是留下16个字节的空间,没有进行填充,当我们是SD卡启动的时候,mkvimage.c会填充16字节的校验头
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
#.word可以看成unsigned int的类型,0x2000可以看成一个值
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif
(3)异常向量表构成
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
(4)异常向量表处理
_undefined_instruction:
.word undefined_instruction
_software_interrupt:
.word software_interrupt
_prefetch_abort:
.word prefetch_abort
_data_abort:
.word data_abort
_not_used:
.word not_used
_irq:
.word irq
_fiq:
.word fiq
_pad:
.word 0x123456
(5)内存16字节对齐
#balignl是内存对齐,16代表16个字节,如果没对齐用0xdeadbeef填充
.balignl 16,0xdeadbeef
(7)链接地址
#TEXT_BASE是配置是生成的文件,里面存放了一个地址,_TEXT_BASE相当于一个指针,当要使用时用来指向地址
_TEXT_BASE:
.word TEXT_BASE
(8)复位
#cpsr是程序状态寄存器,_c代表是bit0-bit7,#0xd3 的含义是:禁止FIQ和 IRQ,状态是ARM状态,SVC模式
reset:
msr cpsr_c, #0xd3 @ I & F disable, Mode: 0x13 - SVC
(9)设置L1,L2cache和MMU
#禁止L2cache
bl disable_l2cache
#初始化L2cache
bl set_l2cache_auxctrl_cycle
#打开L2cache
bl enable_l2cache
#打开L1的icache和dcache
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
(10)判断启动方式
#这三句是用来得到启动的值r2
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET]
bic r2, r1, #0xffffffc1
#判断r2是否等于0xc,等于是SD卡启动
cmp r2, #0xc
#将#BOOT_MMCSD里的值赋给r3
moveq r3, #BOOT_MMCSD
(11)设置栈并且调用lowlevel_init
#将栈设置到0xd0036000处
ldr sp, =0xd0036000 /* end of sram dedicated to u-boot /
sub sp, sp, #12 / set stack */
mov fp, #0
(这里设置栈是因为程序会二次调用函数。LR只有一个,当我们调用函数是会将返回地址存放在LR中,如果二次调用函数会使第一次调用函数的返回地址丢失,所以要将第一次的返回地址放入栈中)
#跳转到lowlevel_init中
bl lowlevel_init