天天看点

uboot start.S文件分析

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