Bootloader/u-boot的启动模式
u-boot的启动一般流程:
第一阶段:依赖cpu初始化外围硬件代码,通常用汇编代码实现
1、设置cpu的工作模式;
2、关中断,以防止意外发生;
mrs
r0,cpsr//读取cpsr中的数据到r0中
bic r0,r0,#0x 1f//将寄存器r0的值和0x1f的反码安位与之后将结果存储在r0中相当于清零
orr r0,r0,#0xd3//将寄存器r0的值和0xd3 安位或之后将结果保存在r0寄存器之中,关闭中断
msr
cpsr,r0//将cpsr中的数值写到r0寄存器中
3、关闭看门狗,避免系统重启;
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
# if defined(CONFIG_S3C2400)
#define pWTCON
0x15300000
#define INTMSK
0x14400008
#define CLKDIVN
0x14800014
#else
#define pWTCON
0x53000000
#define INTMSK
0x4A000008
#define INTSUBMSK 0x4A00001C
#define CLKDIVN
0x4C000014
# endif
4、设置back初始化,设置cpu的工作频率;
#if defined(CONFIG_S3C2440)
ldr
r0, =CLKDIVN
mov
r1,#5
str
r1,[r0]
mrc p15,0,r1,c1,c0,0
orr r1, r1,#0xc0000000
mcr p15,0,r1,c1,c0,0
mov r1,#CLK_CTL_BASE
mov r2,#MDIV_405
add r2,r2,#PSDIV_405
str r2,[r1,#0x4]
#else
ldr
r0, =CLKDIVN
mov
r1, #3
str
r1, [r0]
#endif
adr r0, _start
//adr是读取地址的伪指令,表示将_start标示的运行地址给r0
ldr
r1, _TEXT_BASE
// 表示将_TEXT_BASE 指向的地址中的数据拷贝到r1中
cmp
r0, r1
//比较是否相同
beq
stack_setup
//相同跳转出去
ldr
r2, _
armboot_start
//start起始地址,包含RO代码段+RW
数据段+ZI
全局变量
ldr
r3, _bss_start
//全局变量的地址
sub
r2, r3, r2
//相减之后得到的是代码段+数据段的总大小
add
第一阶段:依赖cpu初始化外围硬件代码,通常用汇编代码实现
1、设置cpu的工作模式;
2、关中断,以防止意外发生;
mrs
3、关闭看门狗,避免系统重启;
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
# if defined(CONFIG_S3C2400)
#
#
#
#else
#
#
#
#
# endif
4、设置back初始化,设置cpu的工作频率;
#if defined(CONFIG_S3C2440)
#else
#endif