微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > s3c2440启动文件详细分析

s3c2440启动文件详细分析

时间:11-19 来源:互联网 点击:
rccr1, [r0], #4
strccr1, [r2], #4
bcc%B0

;下面循环体是为未初始化的全局变量赋值为0
movr0,#0
ldrr3,EndOfBSS
1
cmpr2,r3
strccr0, [r2], #4
bcc%B1

ldrpc, =%F2;goto compiler address
2

;[ CLKdiv_VAL>1;if FCLK:HCLK≠1:1
;blMMU_SetAsyncBusMode;设置时钟模式为异步模式
;|
;bl MMU_SetFastBusMode;设置时钟模式为快速总线模式
;]

;===========================================================
;普通中断处理
;当普通中断发生时,执行的是IsrIRQ
; Setup IRQ handler
ldrr0,=HandleIRQ;This routine is needed
ldrr1,=IsrIRQ;if there is not subs pc,lr,#4 at 0x18, 0x1c
strr1,[r0]

;完成最基本的初始化任务,跳转到由C语言撰写的Main()函数内继续执行其他程序
;这里不能写main,因为写了main,系统会自动为我们完成一些初始化工作,而这些工作在这段程序中是由我们显式地人为完成的。
[ :LNOT:THUMBCODE
blMain;Do not use main() because ......
b.
]

[ THUMBCODE;for start-up code for Thumb mode
orrlr,pc,#1
bxlr
CODE16
blMain;Do not use main() because ......
b.
CODE32
]

;初始化堆栈函数
;function initializing stacks
InitStacks
;Do not use DRAM,such as stmfd,ldmfd......
;Under toolkit ver 2.5, msr cpsr,r1 can be used instead of msr cpsr_cxsf,r1
;改变CPSR中M控制位,切换到相应的处理器模式下
;为各自模式下的SP赋值
mrsr0,cpsr
bicr0,r0,#MODEMASK
orrr1,r0,#UNDEFMODE|NOINT
msrcpsr_cxsf,r1;UndefMode
ldrsp,=UndefStack; UndefStack=0x33FF_5C00

orrr1,r0,#ABORTMODE|NOINT
msrcpsr_cxsf,r1;AbortMode
ldrsp,=AbortStack; AbortStack=0x33FF_6000

orrr1,r0,#IRQMODE|NOINT
msrcpsr_cxsf,r1;IRQMode
ldrsp,=IRQStack; IRQStack=0x33FF_7000

orrr1,r0,#FIQMODE|NOINT
msrcpsr_cxsf,r1;FIQMode
ldrsp,=FIQStack; FIQStack=0x33FF_8000

bicr0,r0,#MODEMASK|NOINT
orrr1,r0,#SVCMODE
msrcpsr_cxsf,r1;SVCMode
ldrsp,=SVCStack; SVCStack=0x33FF_5800

;系统模式和用户模式共用一个栈空间,因此不用再重复设置用户模式堆栈
;系统复位后进入的是SVC模式,而且各种模式下的lr不同,因此要想从该函数内返回,要首先切换到SVC模式,再使用lr,这样可以正确返回了
movpc,lr
;The LR register will not be valid if the current mode is not SVC mode.

;定义一个数据缓冲池
LTORG

;连续13个内存控制寄存器的定义空间
SMRDATA DATA
; Memory configuration should be optimized for best performance
; The following parameter is not optimized.
; Memory access cycle parameter strategy
; 1) The memory settings issafe parameters even at HCLK=75Mhz.
; 2) SDRAM refresh period is for HCLK<=75Mhz.

DCD (0+(B1_BWSCON<4)+(B2_BWSCON<8)+(B3_BWSCON<12)+(B4_BWSCON<16)+(B5_BWSCON<20)+(B6_BWSCON<24)+(B7_BWSCON<28))
DCD ((B0_Tacs<13)+(B0_Tcos<11)+(B0_Tacc<8)+(B0_Tcoh<6)+(B0_Tah<4)+(B0_Tacp<2)+(B0_PMC));GCS0
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)+(Tsrc<18)+(Tchr<16)+REFCNT)

DCD 0x32;SCLK power saving mode, BANKSIZE 128M/128M

DCD 0x30;MRSR6 CL=3clk
DCD 0x30;MRSR7 CL=3clk

;运行域定义
BaseOfROMDCD|Image

RO

Base|
TopOfROMDCD|Image

RO

Limit|
BaseOfBSSDCD|Image

RW

Base|
BaseOfZeroDCD|Image

ZI

Base|
EndOfBSSDCD|Image

ZI

Limit|

;重新使数据字对齐
ALIGN

;Function for entering power down mode
; 1. SDRAM should be in self-refresh mode.
; 2. All interrupt should be maksked for SDRAM/DRAM self-refresh.
; 3. LCD controller should be disabled for SDRAM/DRAM self-refresh.
; 4. The I-cache may have to be turned on.
; 5. The location of the following code may have not to be changed.

;掉电模式函数
;在C语言中定义为:#define EnterPWDN(clkcon) ((void (*)(int))0x20)(clkcon)
;void EnterPWDN(int clkcon);
EnterPWDN
mov r2,r0;r0为该函数输入参数clkcon
tst r0,#0x8;判断clkcon中的第3位,是否要切换到SLEEP模式
bne ENTER_SLEEP;切换到SLEEP模式

ENTER_STOP;IDLE模式
;设置SDRAM为自刷新方式
ldr r0,=REFRESH
ldr r3,[r0];r3=rREFRESH
mov r1, r3
orr r1, r1, #BIT_SELFREFRESH
str r1, [r0];Enable SDRAM self-refresh

;等待一段时间
mov r1,#16;wait until self-refresh is issued. may not be needed.
0subs r1,r1,#1
bne %B0

ldr r0,=CLKCON
str r2,[r0];置第2位,进入IDLE模式

;等待一段时间
mov r1,#32
0subs r1,r1,#1;1) wait until the STOP mode is in effect.
bne %B0;2) Or wait here until the CPU&Peripherals will be turned-off
;Entering SLEEP mode, only the reset by wake-up is available.

;从IDLE模式下被唤醒,系统从该处继续执行

;取消SDRAM自刷新方式
ldr r0,=REFRESH ;exit from SDRAM self refresh mode.
str r3,[r0]

MOV_PC_LR;返回,该语句为一个宏定义

ENTER_SLEEP;SLEEP模式
;NOTE.
;1) rGSTATUS3 should have the return address after wake-up from SLEEP mode.

;设置SDRAM为自刷新方式
ldr r0,=REFRESH
ldr r1,[r0];r1=rREFRESH
orr r1, r1, #BIT_SELFREFRESH
str r1, [r0];Enable SDRAM self-refresh

;等待一段时间
mov r1,#16;Wait until self-refresh is issued,which may not be needed.
0subs r1,r1,#1
bne %B0

;在进入SLEEP模式之前,配置必要的时钟和OFFREFRESH
ldrr1,=MISCCR
ldrr0,[r1]
orrr0,r0,#(7<17);Set SCLK0=0, SCLK1=0, SCKE=0.
strr0,[r1]

ldr r0,=CLKCON
str r2,[r0];置第3位,进入SLEEP模式

b .;CPU will die here.

;从SLEEP模式下被唤醒函数
WAKEUP_SLEEP
;Release SCLKn after wake-up from the SLEEP mode.
;设置时钟和OFFREFRESH
ldrr1,=MISCCR
ldrr0,[r1]
bicr0,r0,#(7<17);SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:0->=SCKE.
strr0,[r1]

;Set memory control registers
;配置内存控制寄存器
ldrr0,=SMRDATA;be careful!
ldrr1,=BWSCON;BWSCON Address
addr2, r0, #52;End address of SMRDATA
0
ldrr3, [r0], #4
strr3, [r1], #4
cmpr2, r0
bne%B0

;等待一段时间
mov r1,#256
0subs r1,r1,#1;1) wait until the SelfRefresh is released.
bne %B0

;GSTATUS3存放着想要从SLEEP模式唤醒后的执行地址
ldr r1,=GSTATUS3 ;GSTATUS3 has the start address just after SLEEP wake-up
ldr r0,[r1]

mov pc,r0;跳转到GSTATUS3存放的地址处

;=====================================================================
; Clock division test
; Assemble code, because VSYNC time is very short
;=====================================================================
EXPORT CLKdiv124
EXPORT CLKdiv144

CLKdiv124

ldrr0, = CLKdivN
ldrr1, = 0x3; 0x3 = 1:2:4
strr1, [r0]
;wait until clock is stable
nop
nop
nop
nop
nop

ldrr0, = REFRESH
ldrr1, [r0]
bicr1, r1, #0xff
bicr1, r1, #(0x7<8)
orrr1, r1, #0x470; REFCNT135
strr1, [r0]
nop
nop
nop
nop
nop
movpc, lr

CLKdiv144
ldrr0, = CLKdivN
ldrr1, = 0x4; 0x4 = 1:4:4
strr1, [r0]
;wait until clock is stable
nop
nop
nop
nop
nop

ldrr0, = REFRESH
ldrr1, [r0]
bicr1, r1, #0xff
bicr1, r1, #(0x7<8)
orrr1, r1, #0x630; REFCNT675 - 1520
strr1, [r0]
nop
nop
nop
nop
nop
movpc, lr

ALIGN

AREA RamData, DATA, READWRITE

;在0x33FF_FF00处定义中断向量表
;^是MAP的同义词,#是FIELD的同义词
^_ISR_STARTADDRESS; _ISR_STARTADDRESS=0x33FF_FF00
HandleReset#4
HandleUndef #4
HandleSWI#4
HandlePabort#4
HandleDabort#4
HandleReserved#4
HandleIRQ#4
HandleFIQ#4

;Do not use the label IntVectorTable,
;The value of IntVectorTable is different with the address you think it may be.
;IntVectorTable
;@0x33FF_FF20
HandleEINT0#4
HandleEINT1#4
HandleEINT2#4
HandleEINT3#4
HandleEINT4_7#4
HandleEINT8_23#4
HandleCAM#4; Added for 2440.
HandleBATFLT#4
HandleTICK#4
HandleWDT#4
HandleTIMER0#4
HandleTIMER1#4
HandleTIMER2#4
HandleTIMER3#4
HandleTIMER4#4
HandleUART2#4
;@0x33FF_FF60
HandleLCD#4
HandleDMA0#4
HandleDMA1#4
HandleDMA2#4
HandleDMA3#4
HandleMMC#4
HandleSPI0#4
HandleUART1#4
HandleNFCON#4; Added for 2440.
HandleUSBD#4
HandleUSBH#4
HandleIIC#4
HandleUART0 #4
HandleSPI1#4
HandleRTC#4
HandleADC#4
;@0x33FF_FFA0
END;程序结尾

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top