原文转:http://blog.csdn.net/shiyi_2012/article/category/1107472
#include
#include
.globl
_start: b
//中断时候使用,产生中断时,跳到指定位置
ldr pc,
ldr pc,
ldr pc,
ldr pc,
ldr pc,
ldr pc,
ldr pc,
_undefined_instruction: .word
_software_interrupt: .word
_prefetch_abort: .word
_data_abort: .word
_not_used: .word
_irq: .word
_fiq: .word
.balignl
_TEXT_BASE:
.word TEXT_BASE
.globl
_armboot_start:
.word
.globl
_bss_start:
.word
.globl
_bss_end:
.word
#ifdef
.globl
IRQ_STACK_START:
.word 0x0badc0de
.globl
FIQ_STACK_START:
.word
#endif
reset:
mrs r0,cpsr
bic r0,r0,#0x1f
orr r0,r0,#0xd3
msr cpsr,r0
//没用到的信息,跳过,是针对S3C2400
#if
#
#
#
#elif
#
#
#
#
#endif
//关闭看门狗,等同于C语言的pWTCON =0x0
#if
ldr
str
//屏蔽所有中断,包括主中断屏蔽寄存器INTMSK,副中断屏蔽寄存器INTSUBMSK
mov r1,
ldr r0,
str r1,
#
ldr r1,
ldr r0,
str r1,
#
//设置CPU与总线时钟的速度,一共有三个时钟源:FCLK,HCLK,PCLK,三者关系有CLKDIVN[1-0]位决定
ldr r0,
mov r1,
str r1,
#endif
//主要对临界关键寄存器初始化,在重启时候才用到,如果从RAM中启动 则不执行
#ifndef
bl cpu_init_crit
#endif
//重定向代码,实现的功能就是吧uboot代码搬到地址为
//也就是复制Uboot的整个代码都复制到SDRAM
#ifndef
relocate:
adr r0,
ldr r1,
cmp
beq
ldr r2,
ldr r3,
sub r2,
add r2,
//把0x0(r0)的代码全部复制到0x33f80000(r2)
copy_loop:
ldmia r0!,
stmia r1!,
cmp r0,
ble copy_loop
#endif
add r0,
cmp r0,
ble clbss_l
#if
//if0----endif为注销操作,可跳过
if 0
ldr
mov
str
mov r1,
ldr r0,
str r1,
ldr r0,
mov r1,
str r1,
#endif
//设置好堆栈,可以跳到Uboot启动第二阶段,即C语言那边去啦。
ldr pc,
_start_armboot: .word
#ifndef
cpu_init_crit:
mov r0,
mcr p15,
mcr p15,
mrc p15,
bic r0,
bic r0,
orr r0,
orr r0,
mcr p15,
mov ip,
bl lowlevel_init
mov lr,
mov pc,
#endif
uboot的作用:
1.设置CPU的工作模式为管理模式
2.关闭看门狗
3.屏蔽中断
4.设置CPU和总线的时钟FCLK相对于ARN929T而言,HCLK相对于AHB总线(ARM920T,内存控制器,中断控制器,LCD控制器,DMA和USB主模块使用),而PCLK相对于APB总线(外设:IIC\RTC\SPI\UART\GPIO)。
5.为加载uboot第二阶段准备ram空间
6.赋值uboot所有代码到RAM中