U-boot第一个开始文件arch\arm\cpu\arm1176\start.S
start.S文件分析:
#include<config.h>
#include<version.h>
#ifdefCONFIG_ENABLE_MMU
#include<asm/proc/domain.h>
#endif
#if!defined(CONFIG_ENABLE_MMU)&&!defined(CONFIG_SYS_PHY_UBOOT_BASE)
#defineCONFIG_SYS_PHY_UBOOT_BASE CONFIG_SYS_UBOOT_BASE
#endif
.globl_start
_start:b reset
#ifndefCONFIG_NAND_SPL
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
_undefined_instruction:
.wordundefined_instruction
_software_interrupt:
.wordsoftware_interrupt
_prefetch_abort:
.wordprefetch_abort
_data_abort:
.worddata_abort
_not_used:
.wordnot_used
_irq:
.wordirq
_fiq:
.wordfiq
_pad:
.word0x12345678
#else
.=_start+64
#endif
.global_end_vect
_end_vect:
.balignl16,0xdeadbeef
_TEXT_BASE:
.word TEXT_BASE
.globl_armboot_start
_armboot_start:
.word_start
.globl_bss_start
_bss_start:
.word__bss_start
.globl_bss_end
_bss_end:
.word_end
reset:
mrs r0,cpsr
bic r0,r0,#0x3f
orr r0,r0,#0xd3
msr cpsr,r0
cpu_init_crit:
#ifndefCONFIG_NAND_SPL
mov r0,#0
mcr p15,0,r0,c7,c7,0
mcr p15,0,r0,c8,c7,0
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00002300 @clearbits13,9:8(--V---RS)
bic r0,r0,#0x00000087 @clearbits7,2:0(B----CAM)
orr r0,r0,#0x00000002 @setbit2(A)Align
orr r0,r0,#0x00001000 @setbit12(I)I-Cache
adr r2,mmu_disable_phys
sub r2,r2,#(CONFIG_SYS_PHY_UBOOT_BASE-TEXT_BASE)
b mmu_disable
.align5
mmu_disable:
mcr p15,0,r0,c1,c0,0
nop
nop
mov pc,r2
mmu_disable_phys:
#ifdefCONFIG_DISABLE_TCM
mrc p15,0,r0,c0,c0,2
cmp r0,#0
beq skip_tcmdisable
mov r1,#0
mov r2,#1
tst r0,r2
mcrne p15,0,r1,c9,c1,1
tst r0,r2,LSL#16
mcrne p15,0,r1,c9,c1,0
skip_tcmdisable:
#endif
#endif
#ifdefCONFIG_PERIPORT_REMAP
ldr r0,=CONFIG_PERIPORT_BASE
orr r0,r0,#CONFIG_PERIPORT_SIZE
mcr p15,0,r0,c15,c2,4
#endif
bl lowlevel_init
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
adr r0,_start
ldr r1,_TEXT_BASE
cmpr0,r1
beqstack_setup
ldr r2,_armboot_start
ldr r3,_bss_start
sub r2,r3,r2
add r2,r0,r2
copy_loop:
ldmia r0!,{r3-r10}
stmia r1!,{r3-r10}
cmp r0,r2
ble copy_loop
#endif
#ifdefCONFIG_ENABLE_MMU
enable_mmu:
ldr r5,=0x0000ffff
mcr p15,0,r5,c3,c0,0
ldr r0,_mmu_table_base
ldr r1,=CONFIG_SYS_PHY_UBOOT_BASE
ldr r2,=0xfff00000
bic r0,r0,r2
orr r1,r0,r1
mcr p15,0,r1,c2,c0,0
mrc p15,0,r0,c1,c0,0
orr r0,r0,#1
adr r1,skip_hw_init
and r1,r1,#0x3fc
ldr r2,_TEXT_BASE
ldr r3,=0xfff00000
and r2,r2,r3
orr r2,r2,r1
b mmu_enable
.align5
mmu_enable:
mcr p15,0,r0,c1,c0,0
nop
nop
mov pc,r2
skip_hw_init:
#endif
stack_setup:
ldr r0,=CONFIG_SYS_UBOOT_BASE
sub r0,r0,#CONFIG_SYS_MALLOC_LEN
sub r0,r0,#CONFIG_SYS_GBL_DATA_SIZE
sub sp,r0,#12
bic sp,sp,#7
clear_bss:
ldr r0,_bss_start
ldr r1,_bss_end
mov r2,#0
clbss_l:
str r2,[r0]
add r0,r0,#4
cmp r0,r1
ble clbss_l
#ifndefCONFIG_NAND_SPL
ldr pc,_start_armboot
_start_armboot:
.wordstart_armboot
#else
#defineMEM_CFG_STAT0x7E00F12C
ldr r1,=MEM_CFG_STAT
ldr r0,[r1]
mov r1,#0x60
and r1,r0,r1
cmp r1,#0x60
beq boot_from_irom
cmp r1,#0x00
beq nand_boot
b reset
boot_from_irom:
b mmc_boot_copy
#endif
#ifdefCONFIG_ENABLE_MMU
_mmu_table_base:
.wordmmu_table
#endif
#ifndefCONFIG_NAND_SPL
#ifdefCONFIG_ENABLE_MMU
.globltheLastJump
theLastJump:
mov r9,r0
ldr r3,=0xfff00000
ldr r4,_TEXT_PHY_BASE
adr r5,phy_last_jump
bic r5,r5,r3
orr r5,r5,r4
mov pc,r5
phy_last_jump:
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00002300
bic r0,r0,#0x00000087
orr r0,r0,#0x00000002
orr r0,r0,#0x00001000
mcr p15,0,r0,c1,c0,0
mcr p15,0,r0,c8,c7,0
mov r0,#0
mov pc,r9
#endif
@
@IRQstackframe.
@
#defineS_FRAME_SIZE 72
#defineS_OLD_R0 68
#defineS_PSR 64
#defineS_PC 60
#defineS_LR 56
#defineS_SP 52
#defineS_IP 48
#defineS_FP 44
#defineS_R10 40
#defineS_R9 36
#defineS_R8 32
#defineS_R7 28
#defineS_R6 24
#defineS_R5 20
#defineS_R4 16
#defineS_R3 12
#defineS_R2 8
#defineS_R1 4
#defineS_R0 0
#defineMODE_SVC0x13
#defineI_BIT 0x80
.macro bad_save_user_regs
sub sp,sp,#S_FRAME_SIZE
stmia sp,{r0-r12}
ldr r2,_armboot_start
sub r2,r2,#(CONFIG_SYS_MALLOC_LEN)
sub r2,r2,#(CONFIG_SYS_GBL_DATA_SIZE+8)
ldmia r2,{r2-r3}
add r0,sp,#S_FRAME_SIZE
add r5,sp,#S_SP
mov r1,lr
stmia r5,{r0-r3}
mov r0,sp
.endm
.macroget_bad_stack
ldr r13,_armboot_start
sub r13,r13,#(CONFIG_SYS_MALLOC_LEN)
sub r13,r13,#(CONFIG_SYS_GBL_DATA_SIZE+8)
str lr,[r13]
mrs lr,spsr
str lr,[r13,#4]
mov r13,#MODE_SVC
@msr spsr_c,r13
msr spsr,r13
mov lr,pc
movs pc,lr
.endm
.macroget_bad_stack_swi
sub r13,r13,#4
str r0,[r13]
ldr r0,_armboot_start
sub r0,r0,#(CONFIG_SYS_MALLOC_LEN)
sub r0,r0,#(CONFIG_SYS_GBL_DATA_SIZE+8)
str lr,[r0]
mrs r0,spsr
str lr,[r0,#4]
ldr r0,[r13]
add r13,r13,#4
.endm
.align 5
undefined_instruction:
get_bad_stack
bad_save_user_regs
bl do_undefined_instruction
.align 5
software_interrupt:
get_bad_stack_swi
bad_save_user_regs
bl do_software_interrupt
.align 5
prefetch_abort:
get_bad_stack
bad_save_user_regs
bl do_prefetch_abort
.align 5
data_abort:
get_bad_stack
bad_save_user_regs
bl do_data_abort
.align 5
not_used:
get_bad_stack
bad_save_user_regs
bl do_not_used
.align 5
irq:
get_bad_stack
bad_save_user_regs
bl do_irq
.align 5
fiq:
get_bad_stack
bad_save_user_regs
bl do_fiq
#endif
链接地址:\board\samsung\mini6410\u-boot-nand.lds
程序的一般步骤:
1初始化:关看门狗
初始化时钟
初始化sdram
2把程序从nandflash拷贝到sdram
3设置sp