`

uboot start.S文件分析

 
阅读更多

U-boot第一个开始文件arch\arm\cpu\arm1176\start.S

start.S文件分析:

/*

*armboot-StartupCodeforARM1176CPU-core

*

*Copyright(c)2007 SamsungElectronics

*

*Copyright(C)2008

*GuennadiLiakhovetki,DENXSoftwareEngineering,<lg@denx.de>

*

*SeefileCREDITSforlistofpeoplewhocontributedtothis

*project.

*

*Thisprogramisfreesoftware;youcanredistributeitand/or

*modifyitunderthetermsoftheGNUGeneralPublicLicenseas

*publishedbytheFreeSoftwareFoundation;eitherversion2of

*theLicense,or(atyouroption)anylaterversion.

*

*Thisprogramisdistributedinthehopethatitwillbeuseful,

*butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof

*MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE. Seethe

*GNUGeneralPublicLicenseformoredetails.

*

*YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense

*alongwiththisprogram;ifnot,writetotheFreeSoftware

*Foundation,Inc.,59TemplePlace,Suite330,Boston,

*MA02111-1307USA

*

*2007-09-21-Restructuredcodesbyjsgood(jsgood.yang@samsung.com)

*2007-09-21-AddedMoviNANDandOneNANDbootcodesby

*jsgood(jsgood.yang@samsung.com)

*Basecodesbyscsuh(sc.suh)

*/

 

#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

 

/*

*************************************************************************

*

*Jumpvectortableasintable3.1in[1]

*

*************************************************************************

*/

 

.globl_start

_start:b reset

/*异常向量表,为中断异常作准备*/

/*当异常发生pc会跳到.wrod后面的地址处处理异常*/

#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

/*未定义指令异常,程序从地址0x4处开始执行*/

_undefined_instruction:

.wordundefined_instruction

/*软件中断处理指令,,0x8处开始执行*/

_software_interrupt:

.wordsoftware_interrupt

/*指令预取中止*/

_prefetch_abort:

.wordprefetch_abort

/*数据访问中止*/

_data_abort:

.worddata_abort

/**/

_not_used:

.wordnot_used

/*外部中断请求*/

_irq:

.wordirq

/*快速中断请求*/

_fiq:

.wordfiq

_pad:

.word0x12345678/*now16*4=64*/

#else

.=_start+64

#endif

 

.global_end_vect

_end_vect:

.balignl16,0xdeadbeef

/*

*************************************************************************

*

*StartupCode(resetvector)

*

*doimportantinitonlyifwedon'tstartfrommemory!

*setupMemoryandboardspecificbitspriortorelocation.

*relocatearmboottoram

*setupstack

*

*************************************************************************

*/

/*uboot代码的运行地址*/

_TEXT_BASE:

/*uboot程序的运行地址为0xc7e00000

即代码放到我们的sdram*/

.word TEXT_BASE

 

/*

*BelowvariableisveryimportantbecauseweuseMMUinU-Boot.

*Withoutit,wecannotruncodecorrectlybeforeMMUisON.

*byscsuh.

*/

/*uboot会开启mmu,以下是开启mmuuboot存放的真实物理地址

_TEXT_PHY_BASE:

.word CONFIG_SYS_PHY_UBOOT_BASE

 

/*_start标号和编译时运行的地址有关系,

text_base参数通知编译器程序运行在0xc7e00000

那么标号也是此值

*/

.globl_armboot_start

_armboot_start:

.word_start

 

/*

*Thesearedefinedintheboard-specificlinkerscript.

*/

/*u-boot.lds中指定*/

.globl_bss_start

_bss_start:

.word__bss_start

 

.globl_bss_end

_bss_end:

.word_end

 

/*

*theactualresetcode

*/

reset:

/*

*setthecputoSVC32mode

*/

/*使cpu的模式为管理模式.即保证cpsr低五位的值为10011*/

mrs r0,cpsr/*r0=cpsr*/

bic r0,r0,#0x3f/*后后6位清零*/

orr r0,r0,#0xd3/*11010011*/

msr cpsr,r0

 

/*

*************************************************************************

*

*CPU_init_criticalregisters

*

*setupimportantregisters

*setupmemorytiming

*

*************************************************************************

*/

/*

*wedosys-criticalinitsonlyatreboot,

*notwhenbootingfromram!

*/

cpu_init_crit:

/*

*WhenbootingfromNAND-ithasdefinitelybeenareset,so,noneed

*toflushcachesanddisabletheMMU

*/

#ifndefCONFIG_NAND_SPL

/*

*flushv4I/Dcaches

*/

mov r0,#0

mcr p15,0,r0,c7,c7,0 /*flushv3/v4cache*/

mcr p15,0,r0,c8,c7,0 /*flushv4TLB*/

 

/*

*disableMMUstuffandcaches

*/

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)/*0为小端,1为大端*/

orr r0,r0,#0x00000002 @setbit2(A)Align/*打开地址对齐检察*/

orr r0,r0,#0x00001000 @setbit12(I)I-Cache/*打开指令缓存*/

 

/*PreparetodisabletheMMU*/

adr r2,mmu_disable_phys

sub r2,r2,#(CONFIG_SYS_PHY_UBOOT_BASE-TEXT_BASE)

b mmu_disable

 

.align5

/*Runinasinglecache-line*/

mmu_disable:

mcr p15,0,r0,c1,c0,0

nop

nop

mov pc,r2

mmu_disable_phys:

 

#ifdefCONFIG_DISABLE_TCM

/*

*DisabletheTCMs

*/

mrc p15,0,r0,c0,c0,2 /*ReturnTCMdetails*/

cmp r0,#0

beq skip_tcmdisable

mov r1,#0

mov r2,#1

tst r0,r2

mcrne p15,0,r1,c9,c1,1 /*DisableInstructionTCMifpresent*/

tst r0,r2,LSL#16

mcrne p15,0,r1,c9,c1,0 /*DisableDataTCMifpresent*/

skip_tcmdisable:

#endif

#endif

 

#ifdefCONFIG_PERIPORT_REMAP

/*Periportsetup*/

ldr r0,=CONFIG_PERIPORT_BASE

orr r0,r0,#CONFIG_PERIPORT_SIZE

mcr p15,0,r0,c15,c2,4

#endif

 

/*

*GosetupMemoryandboardspecificbitspriortorelocation.

*/

/*初始化工作:关看门狗、关闭中断、初始化时钟、

nandflash初始化、内存控制器初始化、

*/

bl lowlevel_init /*gosetuppll,mux,memory*/

 

#ifndefCONFIG_SKIP_RELOCATE_UBOOT

relocate: /*relocateU-BoottoRAM */

adr r0,_start /*r0<-currentpositionofcode*/

ldr r1,_TEXT_BASE /*testifwerunfromflashorRAM*/

cmpr0,r1/*don'trelocduringdebug*/

beqstack_setup

 

ldr r2,_armboot_start

ldr r3,_bss_start

sub r2,r3,r2 /*r2<-sizeofarmboot*/

add r2,r0,r2 /*r2<-sourceendaddress*/

 

copy_loop:

ldmia r0!,{r3-r10} /*copyfromsourceaddress[r0]*/

stmia r1!,{r3-r10} /*copytotargetaddress[r1]*/

cmp r0,r2 /*untilsourceendaddreee[r2]*/

ble copy_loop

#endif /*CONFIG_SKIP_RELOCATE_UBOOT*/

 

#ifdefCONFIG_ENABLE_MMU

enable_mmu:

/*enabledomainaccess*/

ldr r5,=0x0000ffff

mcr p15,0,r5,c3,c0,0 /*loaddomainaccessregister*/

 

/*SettheTTBregister*/

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

 

/*EnabletheMMU*/

mrc p15,0,r0,c1,c0,0

orr r0,r0,#1 /*SetCR_MtoenableMMU*/

 

/*PreparetoenabletheMMU*/

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

/*Runinasinglecache-line*/

mmu_enable:

 

mcr p15,0,r0,c1,c0,0

nop

nop

mov pc,r2

skip_hw_init:

#endif

 

/*Setupthestack */

stack_setup:

ldr r0,=CONFIG_SYS_UBOOT_BASE /*baseofcopyinDRAM */

sub r0,r0,#CONFIG_SYS_MALLOC_LEN /*mallocarea*/

sub r0,r0,#CONFIG_SYS_GBL_DATA_SIZE/*bdinfo*/

sub sp,r0,#12 /*leave3wordsforabort-stack*/

bic sp,sp,#7 /*8-bytealignmentforABIcompliance*/

 

/*bss段内容*/

clear_bss:

ldr r0,_bss_start /*findstartofbsssegment*/

ldr r1,_bss_end /*stophere*/

mov r2,#0 /*clear*/

 

clbss_l:

str r2,[r0] /*clearloop...*/

add r0,r0,#4

cmp r0,r1

ble clbss_l

 

#ifndefCONFIG_NAND_SPL

ldr pc,_start_armboot

 

_start_armboot:

.wordstart_armboot

#else

 

/*checkbootstatus*/

#defineMEM_CFG_STAT0x7E00F12C

 

ldr r1,=MEM_CFG_STAT /*addressofregMEM_CFG_STAT*/

ldr r0,[r1]

mov r1,#0x60

and r1,r0,r1 /*r1=MEM_CFG_STAT&CFG_BOOT_LOC*/

 

cmp r1,#0x60 /*InternalROM*/

beq boot_from_irom

cmp r1,#0x00 /*SteppingStoneareainNFCON*/

beq nand_boot

b reset

/* .wordnand_boot*/

boot_from_irom:

b mmc_boot_copy /*MINI6410bootfromInternalROM-->MMCboot*/

#endif

 

#ifdefCONFIG_ENABLE_MMU

_mmu_table_base:

.wordmmu_table

#endif

 

#ifndefCONFIG_NAND_SPL

/*

*weassumethatcacheoperationisdonebefore.(eg.cleanup_before_linux())

*actually,wedon'tneedtodoanythingaboutcacheifnotused-cachein

*U-Boot.So,inthisfunctionwecleanonlyMMU.byscsuh

*

*void theLastJump(void*kernel,intarch_num,uintboot_params);

*/

#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:

/*

*disableMMUstuff

*/

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*/

mcr p15,0,r0,c1,c0,0

 

mcr p15,0,r0,c8,c7,0 /*flushv4TLB*/

 

mov r0,#0

mov pc,r9

#endif

 

 

/*

*************************************************************************

*

*Interrupthandling

*

*************************************************************************

*/

@

@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

 

/*

*usebad_save_user_regsforabort/prefetch/undef/swi...

*/

 

.macro bad_save_user_regs

/*carveoutaframeoncurrentuserstack*/

sub sp,sp,#S_FRAME_SIZE

/*Saveuserregisters(nowinsvcmode)r0-r12*/

stmia sp,{r0-r12}

 

ldr r2,_armboot_start

sub r2,r2,#(CONFIG_SYS_MALLOC_LEN)

/*setbase2wordsintoabortstack*/

sub r2,r2,#(CONFIG_SYS_GBL_DATA_SIZE+8)

/*getvaluesfor"aborted"pcandcpsr(intoparmregs)*/

ldmia r2,{r2-r3}

/*grabpointertooldstack*/

add r0,sp,#S_FRAME_SIZE

 

add r5,sp,#S_SP

mov r1,lr

/*savesp_SVC,lr_SVC,pc,cpsr*/

stmia r5,{r0-r3}

/*savecurrentstackintor0(paramregister)*/

mov r0,sp

.endm

 

.macroget_bad_stack

/*setupourmodestack(enterinbankedmode)*/

ldr r13,_armboot_start

/*movepastmallocpool*/

sub r13,r13,#(CONFIG_SYS_MALLOC_LEN)

/*movetoreservedacouplespotsforabortstack*/

sub r13,r13,#(CONFIG_SYS_GBL_DATA_SIZE+8)

 

/*savecallerlrinposition0ofsavedstack*/

str lr,[r13]

/*getthespsr*/

mrs lr,spsr

/*savespsrinposition1ofsavedstack*/

str lr,[r13,#4]

 

/*prepareSVC-Mode*/

mov r13,#MODE_SVC

@msr spsr_c,r13

/*switchmodes,makesuremoveswillexecute*/

msr spsr,r13

/*capturereturnpc*/

mov lr,pc

/*jumptonextinstruction&switchmodes.*/

movs pc,lr

.endm

 

.macroget_bad_stack_swi

/*spaceoncurrentstackforscratchreg.*/

sub r13,r13,#4

/*saveR0'svalue.*/

str r0,[r13]

/*getdataregionsstart*/

ldr r0,_armboot_start

/*movepastmallocpool*/

sub r0,r0,#(CONFIG_SYS_MALLOC_LEN)

/*movepastgblandacouplespotsforabortstack*/

sub r0,r0,#(CONFIG_SYS_GBL_DATA_SIZE+8)

/*savecallerlrinposition0ofsavedstack*/

str lr,[r0]

/*getthespsr*/

mrs r0,spsr

/*savespsrinposition1ofsavedstack*/

str lr,[r0,#4]

/*restorer0*/

ldr r0,[r13]

/*popstackentry*/

add r13,r13,#4

.endm

 

/*

*exceptionhandlers

*/

.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/*CONFIG_NAND_SPL*/

 

链接地址:\board\samsung\mini6410\u-boot-nand.lds

 

程序的一般步骤:

1初始化:关看门狗

初始化时钟

初始化sdram

2把程序从nandflash拷贝到sdram

3设置sp

分享到:
评论

相关推荐

    uboot start.s 详细分析

    从提供的文件内容中可知,有一个名为CrifanLi的大神对U-Boot的Start.S文件进行了深入的分析,并将这个分析结果发布在了网上。该分析提供多种格式的文件供读者下载阅读,包括HTML、PDF、CHM、TXT、RTF以及WEB HELP等...

    UBOOT的start.S 详解

    `Uboot中start.S源码的指令级的详尽解析.pdf`文档可能包含了对start.S文件中每一条汇编指令的详细分析,这包括指令的作用、执行流程和对硬件的影响。深入理解这些指令,可以帮助开发者更好地理解和调试U-Boot的启动...

    uboot的start.s文件解释

    根据提供的文件信息,本文将对Uboot中start.s文件进行详细的解释。Uboot(Universal Boot Loader)是一个广泛使用的引导加载程序,通常用于嵌入式系统的初始化,它负责初始化硬件设备、建立内存空间映射,并最终加载...

    Uboot中start.S源码的指令级的详尽解析

    ### Uboot中start.S源码的指令级详尽解析 #### 正文之前 ...通过上述分析,我们可以清晰地了解到`start.S`文件中每个步骤的重要性及其背后的技术原理,这对于理解和掌握Uboot的启动过程至关重要。

    Uboot中start.S源码的指令级的详尽解析+v1.6

    start.S是Uboot的第一个执行文件,它是用汇编语言编写的,因为早期的系统初始化阶段需要对硬件进行低级别控制,而汇编语言能够提供这样的精确度。在这个阶段,C语言等高级语言尚未加载,因此汇编是首选。 start.S的...

    uboot中start.S详解.doc

    通过分析 start.S 代码,我们可以看到 ARM 处理器的异常处理机制是如何工作的,以及 U-Boot 中如何使用 start.S 来初始化硬件设备和建立内存空间的映射图,以便为最终调用操作系统内核准备好正确的环境。 知识点: ...

    uboot,start.S汇编文件分析

    《U-Boot中Start.S文件深度解析》 U-Boot,作为开源的嵌入式设备启动加载程序,其内部机制复杂且精妙,对于初学者而言,深入理解其工作原理并非易事。其中,`start.S`文件尤其关键,它是U-Boot启动过程的第一步,...

    uboot1.1.16源代码分析包括ld, makefile start.S部分

    U-Boot 1.1.16 源代码分析,包括 ld, Makefile, start.S 部分 U-Boot 是一个开源的引导加载程序,广泛应用于嵌入式系统中。下面是对 U-Boot 1.1.16 源代码的分析,包括 ld, Makefile, start.S 部分。 Makefile ...

    Uboot中start.S源码的指令级的详尽解析 v1.6

    ### Uboot中start.S源码的指令级详尽解析 v1.6 #### 4.1 如何查看C或汇编的源代码所对应的真正的汇编代码 在开发过程中,有时候我们需要了解C语言或者汇编语言编译后的真实汇编代码,这对于理解程序的行为、优化...

    Uboot中start.S源码的指令级的详尽解析_v1.6.pdf

    本文档针对Uboot启动过程中的关键组件——`start.S`文件进行了深入的解析,旨在帮助读者理解Uboot启动过程中的底层细节,特别是与处理器相关的初始配置。 #### 1.1 本文内容 本文主要围绕Uboot中`start.S`文件进行...

    start.s详解

    `u-boot启动代码start.S详解.pdf`是关于U-Boot启动过程的深入分析,U-Boot是一个广泛使用的开放源码引导加载程序,它的`start.S` 文件对于理解系统启动流程极具价值。 在开发过程中,`GNU+ARM汇编.doc`和`GNU_ARM...

    uboot源码 start.S文件详解

    在学习start.S文件时,我们可以通过分析代码来了解U-boot_bootloader的工作原理和ARM处理器的汇编语言指令。同时,我们也可以通过查看U-boot_bootloader的文档和相关资源来更好地了解start.S文件的工作原理和实现...

    uboot2012.04.01编译过程分析

    `Start.S`和`cpu_init.c`等源文件则包含启动和CPU初始化相关的代码。 总结,U-Boot 2012.04.01的编译过程涉及了多个步骤,包括源码编译、链接、格式转换以及特定平台的适配。理解这一过程对于调试、定制和优化U-...

    Uboot启动之start.doc

    《UBoot启动过程详解:深入剖析start.s》 在嵌入式系统的世界里,UBoot作为引导加载器,是系统启动过程中的...通过分析`start.s`,我们可以了解到嵌入式系统启动的底层机制,这对于系统开发和故障排查具有极大的价值。

Global site tag (gtag.js) - Google Analytics