S3C2410启动代码详解(3)
;======================================================================================
;Copy and paste RW da
//以下程序段将加载哉中的数据段RW拷贝到运行域的ram中 将ZI段中的零初始化数据段清零
//跳入C语言的main函数执行到这步结束bootloader初步引导结束
程序先把 ROM 里|Image$$RO$$Limt|开始的 RW 初始数据拷贝到 RAM 里面|Image$$RW$$Base|开始的地址,当RAM这边的目标地址到达|Image$$ZI$$Base|后就表示RW区的结束和ZI区的开始,接下去就对这片ZI区进行清零操作,直到遇到结束地址|Image$$ZI$$Limit|。
;====================================================================================== [ :LNOT:THUMBCODE [ THUMBCODE ;for start-up co ;function initializing stacks orrr1,r0,#IRQMODE|NOINT bicr0,r0,#MODEMASK|NOINT //不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响 ;以下是上面提到的对存储寄存器初始化的数据map,共13个DCD LTORG SMRDATA DA DCD (0+(B1_BWSCON<4)+(B2_BWSCON<8)+(B3_BWSCON<12)+(B4_BWSCON<16)+(B5_BWSCON<20)+(B6_BWSCON<24)+(B7_BWSCON<28))//BAN1,6,7为32位数据完,其他除0外为16 DCD 0x32 ; ;SCLK power saving mode, ARM core burst disable, BANKSIZE 128M/128M DCD 0x30 ;MRSR6 CL=3clk CL:CAS latency //下面是对ram区域map的定义;这里定义了处理器工作于各模式的堆栈区在ram中map. ALIGN//字对齐 ^ _ISR_STARTADDRESS //^=map
ldrr0, =|Image$$RO$$Limit| //Get pointer to ROM da
ldrr1, =|Image$$RW$$Base| //and RAM copyRW区在RAM里的执行区起始地址
ldrr3, =|Image$$ZI$$Base|//ZI区在RAM里面的起始地址
;Zero init base => top of initialised da
cmpr0, r1 ; Check that they are different
beq%F2 ;//若相等则跳转到2,相同,则不拷贝该区间,初始化零数据区
1
cmpr1, r3 ; Copy init da
ldrccr2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4当无符号数r1
bcc%B1 ;//若相等则跳转到1,相同,则不拷贝该区间,初始化零数据区
2
ldrr1, =|Image$$ZI$$Limit| ; Top of zero init segment,ZI区在RAM里面的结束地址后面的一个地址
movr2, #0
3
cmpr3, r1 ; Zero init
strccr2, [r3], #4 //当ZI区的起始地址未达等于结束地址时,继续清0
bcc%B3 ;//当无符号数r3
blMain ;Dont usemain()because......跳到Main()主函数,注意大小写
b.
]
orrlr,pc,#1
bxlr
CO
blMain ;Dont use main() because ......
b.
CO
]
InitStacks
;Dont use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1
mrsr0,cpsr;//读取CPSR的值,R0=CPSR,CPSR为当前程序状态寄存器
bicr0,r0,#MODEMASK;//R0=R0&(~MODEMASK),MODEMASK=0X1F,也就是低五位清0
orrr1,r0,#UNDEFMODE|NOINT;//R1=R0|(MODEMASK|NONINT),R1为未定义模式,也就是低八位为11X11011
msrcpsr_cxsf,r1;UndefMode;//写把R1的值写到状态寄存器cpsr_cxsf(也就是CPSR),UndefMode
ldrsp,=UndefStack;//设置未定义模式下的堆栈指针
orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack
orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack
//USER mode has not be initialized.注意:不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就
movpc,lr //堆栈初始化完成返回
;The LR register wont be valid if the current mode is not SVC mode.
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings is safe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK=75Mhz.
DCD ((B0_Tacs<13)+(B0_Tcos<11)+(B0_Tacc<8)+(B0_Tcoh<6)+(B0_Tah<4)+(B0_Tacp<2)+(B0_PMC));GCS0;BANK0的相关访问模式及各访问周期设置, 各位定义可参考memcfg.inc文件
DCD ((B1_Tacs<13)+(B1_Tcos<11)+(B1_Tacc<8)+(B1_Tcoh<6)+(B1_Tah<4)+(B1_Tacp<2)+(B1_PMC)) ;GCS1
DCD ((B2_Tacs<13)+(B2_Tcos<11)+(B2_Tacc<8)+(B2_Tcoh<6)+(B2_Tah<4)+(B2_Tacp<2)+(B2_PMC)) ;GCS2
DCD ((B3_Tacs<13)+(B3_Tcos<11)+(B3_Tacc<8)+(B3_Tcoh<6)+(B3_Tah<4)+(B3_Tacp<2)+(B3_PMC)) ;GCS3
DCD ((B4_Tacs<13)+(B4_Tcos<11)+(B4_Tacc<8)+(B4_Tcoh<6)+(B4_Tah<4)+(B4_Tacp<2)+(B4_PMC)) ;GCS4
DCD ((B5_Tacs<13)+(B5_Tcos<11)+(B5_Tacc<8)+(B5_Tcoh<6)+(B5_Tah<4)+(B5_Tacp<2)+(B5_PMC)) ;GCS5
DCD ((B6_MT<15)+(B6_Trcd<2)+(B6_SCAN)) ;GCS6
DCD ((B7_MT<15)+(B7_Trcd<2)+(B7_SCAN)) ;GCS7
DCD ((REFEN<23)+(TREFMD<22)+(Trp<20)+(Trc<18)+(Tchr<16)+REFCNT)//;设置刷新周期
DCD 0x30 ;MRSR7
; DCD 0x20 ;MRSR6 CL=2clk
; DCD 0x20 ;MRSR7
AREA RamData, DA
HandleReset # 4 //#=field
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
S3C2410启动代 相关文章:
- S3C2410启动代码详解(2)(11-11)
- S3C2410启动代码详解(1)(11-11)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)