.section start
.text
#include "include/part.h"
/*----------------------------------------------------------------------------
Area Definition
----------------
Must be defined as function to put first in the code as it must be mapped
at offset 0 of the flash EBI_CSR0, ie. at address 0 before remap.
_---------------------------------------------------------------------------*/
/* Application startup entry point */
.globl reset
.align 4
reset:
/* Exception vectors (should be a branch to be detected as a valid code by the rom */
_exception_vectors:
b reset_vector /* reset */
b undef_vector /* Undefined Instruction */
b swi_vector /* Software Interrupt */
b pabt_vector /* Prefetch Abort */
b dabt_vector /* Data Abort */
b rsvd_vector /* reserved */
b irq_vector /* IRQ : read the AIC */
b fiq_vector /* FIQ */
undef_vector:
b undef_vector
swi_vector:
b swi_vector
pabt_vector:
b pabt_vector
dabt_vector:
b dabt_vector
rsvd_vector:
b rsvd_vector
irq_vector:
b irq_vector
fiq_vector:
b fiq_vector
reset_vector:
/* Init the stack */
_init_stack:
ldr sp,=TOP_OF_MEM
/* Test if main oscillator is enabled */
ldr r0,=AT91C_PMC_SR
ldr r1, [r0]
ldr r2,=AT91C_PMC_MOSCS
ands r1, r1, r2
bne _switch_to_mosc
/* Enable the main oscillator */
_enable_mosc:
ldr r0,=AT91C_PMC_MOR
mov r1, #(0x40 << 8)
ldr r2,=AT91C_CKGR_MOSCEN
orr r1, r1, r2
str r1, [r0]
ldr r0,=AT91C_PMC_SR
1:
ldr r1, [r0]
ldr r2,=AT91C_PMC_MOSCS
ands r1, r1, r2
beq 1b
/* Test if MCK == SLOW CLOCK */
_switch_to_mosc:
ldr r0,=AT91C_PMC_MCKR
ldr r1,=AT91C_PMC_CSS
ldr r2, [r0]
and r2, r2, r1
mov r1, #0
cmp r1, r2
/* No => Do nothing */
bne _init_bss
/* Yes => Switch to the main oscillator */
ldr r1,=AT91C_PMC_CSS_MAIN_CLK
ldr r2,=AT91C_PMC_PRES_CLK
orr r1, r1, r2
str r1, [r0]
ldr r0,=AT91C_PMC_SR
1:
ldr r1, [r0]
ldr r2,=AT91C_PMC_MCKRDY
ands r1, r1, r2
beq 1b
/* Initialize the bss segment */
_init_bss:
adr r2, _lp_bss
ldmia r2, {r3, r4}
mov r2, #0
1:
cmp r3, r4
strcc r2, [r3], #4
bcc 1b
#ifdef CFG_NORFLASH
//如果是从NorFlash启动,那么拷贝NorFlash中的4K代码到内部的sram0中
/*if boot from nor flash then relocate to RAM */
relocate:
ldr r1, _loop_start
ldr r2, _loop_end
ldr r3, _loop_target
copy_loop:
ldr r4,[r1],#4
str r4,[r3],#4
cmp r3,r2
ble copy_loop
#endif
/* Branch on C code Main function (with interworking) */
_branch_main:
ldr r4, = main
mov lr, pc
bx r4
/* Branch to the application at the end of the bootstrap init */
_go:
ldr r1, =MACH_TYPE
mov lr, pc
bx r0
.align
_lp_bss:
.word __bss_start__
.word __bss_end__
_loop_start:
.word 0x10000000 //NorFlash的起始地址
_loop_end:
.word 0x201000 //内部sram0的结束地址
_loop_target:
.word 0x200000 //内部sram0的起始地址
|