`

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 详解

    有关 uboot的start.S文件的详解

    uboot,start.S汇编文件分析

    uboot中start.S文件分析

    uboot的start.s文件解释

    这是一个介绍uboot的start.s函数的文档,写的相当详细,如果你正在从事相关的工作或者相应的学习,你可以参考参考,希望对你有所帮助!

    start.s的代码的详细分析

    对uboot中的start.s代码分析的比较详细,看一遍基本能明白star.s 完成什么工作了

    以创龙Omapl138所使用的uboot2014.04.01为例分析uboot执行流程

    针对创龙omap138所使用的uboot版本号为:2012.04.01的U_BOOT,从start.s文件开始,跳转到C语言函数board_init_f,再跳转到汇编语言进行重定位,最后回到C语言函数board_inir_r完成初始化的全过程。

    uboot代码详细分析.pdf

    u-boot-1.1.6 之 cpu/arm920t/start.s分析 ........................................................................................... 2 u-boot 中.lds连接脚本文件的分析 .....................................

    uboot源码 start.S文件详解

    花了一个下午的时间一行一行看完的,结合了和下面这个人的blog的内容.虽然啃的吃力,不过受益菲浅.

    riscv_uboot程序运行架构分析

    U_BOOT代码运行框架 Uboot的start文件注释 如何调试运行在qemu上的riscv版uboot

    uboot代码详细分析(88页)

    linux启动代码详细解释u-boot-1.1.6 之cpu/arm920t/start.s 分析 ........................................................................................... 2 u-boot 中.lds 连接脚本文件的分析 ..............

    uboot移植(非常经典)

    start.s board.c 等文件分析

    Sifive 结构cpu的U-BOOT整个系统运行流程分析

    Sifive 结构cpu的U-BOOT整个系统运行流程分析: 包含源代码start.s和程序分析文档

    u-boot移植实验

    1 阶段1,汇编代码,对于s3c2410是cpu/arm920t/start.s文件。 主要流程如下: 设置CPU的模式为SVC模式 关闭看门狗 禁掉所有中断 设置以CPU的频率 把自己拷贝到RAM 配置内存区控制寄存器 配置的栈空间 进入C代码部分 ...

    u-boot开源代码

    start.S是U-BOOT启动时执行的第一个文件,它主要是设置系统堆栈和工作方式,为进入C程序奠定基础。 ◆ disk:disk驱动的分区处理代码。 ◆ doc:文档。 ◆ drivers:通用设备驱动程序,比如各种网卡、支持CFI的...

    u-boot-2009.08

    u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成; u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。

    uboott移植实验手册及技术文档

    二、修改 cpu/arm920t/start.S文件,完成 U-Boot的重定向 (1)修改中断禁止部分 # if defined(CONFIG_S3C2410) ldr r1, =0x7ff /*根据 2410 芯片手册,INTSUBMSK 有 11位可用 */ ldr r0, =INTSUBMSK Create ...

    IMX6ULL裸机第一次汇编点亮LED

    博客介绍 硬件:正点原子linux开发板IM6...leds.s文件 /* 文件功能:使用汇编点灯 使用引脚:GPIO1_IO03 */ .global _start @全局标号 _start: @1.使能所有外设时钟 @使能CCGR1所有时钟 ldr r0, =0x020c4068 @CCM_

    linux全志R16的linux系统编译的资料_20170502_1655.7z

    下载 3,425 kB,耗时 2秒 (1,303 kB/s) Selecting previously unselected package libencode-locale-perl. (正在读取数据库 ... 系统当前共安装有 213805 个文件和目录。) Preparing to unpack .../libencode-locale...

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z

    r40_tinav2.1_最终验证通过_使用CB-S来验证OV5640有横条纹fpscamera+SPI2.0成功_20171114_1443没有外层目录.7z 开发板:CB-S 1、(可选修改/调试技巧:) 除了ov5640.c之外,其它的驱动都不编译,节省编译时间!...

    ELDK使用与开发手册

    kermit在执行其它命令之前,会执行你的用户目录下的初始文件.kermrc,所以可以非常简单的通过初始化命令来定制kermit。下面是使用U-Boot和Linux时推荐配置: ~/.kermrc: set line /dev/ttyS0 set speed 115200 set ...

Global site tag (gtag.js) - Google Analytics