www.pudn.com > ucosins3c2410.zip > init.s
;**************************************************************************
; *
; PROJECT : ARM port for UCOS-II *
; *
; MODULE : INIT.s *
; *
; AUTHOR : Michael Anburaj *
; URL : http://geocities.com/michaelanburaj/ *
; EMAIL: michaelanburaj@hotmail.com *
; *
; PROCESSOR : S3c2410x (32 bit ARM920T RISC core from Samsung) *
; *
; IDE : SDT 2.51 & ADS 1.2 *
; *
; DESCRIPTION : *
; S3c2410x processor Start up assembly code file. *
; *
;*************************************************************************/
GBLL PLL_ON_START
PLL_ON_START SETL {TRUE}
; GBLL ENDIAN_CHANGE
;ENDIAN_CHANGE SETL {FALSE}
GBLA ENTRY_BUS_WIDTH
ENTRY_BUS_WIDTH SETA 16
;BUSWIDTH = 16,32
GBLA BUSWIDTH ; max. bus width for the GPIO configuration
BUSWIDTH SETA 32
GBLA FCLK
FCLK SETA 184000000
[ FCLK = 176000000
M_MDIV EQU 80 ; Fin=12.0MHz Fout=176.0MHz
M_PDIV EQU 1
M_SDIV EQU 1
]
[ FCLK = 180000000
M_MDIV EQU 82 ; Fin=12.0MHz Fout=180.0MHz
M_PDIV EQU 1
M_SDIV EQU 1
]
[ FCLK = 184000000
M_MDIV EQU 84 ; Fin=12.0MHz Fout=184.0MHz
M_PDIV EQU 1
M_SDIV EQU 1
]
[ FCLK = 192000000
M_MDIV EQU 88 ; Fin=12.0MHz Fout=192.0MHz
M_PDIV EQU 1
M_SDIV EQU 1
]
[ FCLK = 200000000
M_MDIV EQU 92 ; Fin=12.0MHz Fout=200.0MHz
M_PDIV EQU 1
M_SDIV EQU 1
]
SRAM_SADDR EQU 0x40000000 ; SRAM starting address
SRAM_SIZE EQU 4*1024 ; 4K internal SRAM
SDRAM_SADDR EQU 0x30000000 ; SDRAM starting address
SDRAM_SIZE EQU 64*1024*1024 ; 64M SDRAM
ISR_BADDR EQU 0x33ffff00 ; plus 0x20 is the RW base address -linker setting
SRAM_EADDR EQU SRAM_SADDR+SRAM_SIZE-1 ; SRAM end address
SDRAM_EADDR EQU SDRAM_SADDR+SDRAM_SIZE-1 ; SDRAM end address
MMUTT_SIZE EQU 16*1024 ; It has to be in multiples of 16K
MMUTT_SADDR EQU SDRAM_SADDR
MMUTT_EADDR EQU MMUTT_SADDR+MMUTT_SIZE
_SVC_STKSIZE EQU 1024*20
_UND_STKSIZE EQU 256
_ABT_STKSIZE EQU 256
_IRQ_STKSIZE EQU 1024*1
_FIQ_STKSIZE EQU 256
STK_SIZE EQU _SVC_STKSIZE+_UND_STKSIZE+_ABT_STKSIZE+_IRQ_STKSIZE+_FIQ_STKSIZE
STK_SADDR EQU ISR_BADDR-STK_SIZE
; Register definition
GET S3c2410x.a
GET memcfg.a
BIT_SELFREFRESH EQU (1<<22)
; Pre-defined constants
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4
stmfd sp!,{r0}
ldr r0,=$HandleLabel
ldr r0,[r0]
str r0,[sp,#4]
ldmfd sp!,{r0,pc}
MEND
; Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
GBLL THUMBCODE
[ {CONFIG} = 16
THUMBCODE SETL {TRUE}
CODE32
|
THUMBCODE SETL {FALSE}
]
MACRO
MOV_PC_LR
[ THUMBCODE
bx lr
|
mov pc,lr
]
MEND
MACRO
MOVEQ_PC_LR
[ THUMBCODE
bxeq lr
|
moveq pc,lr
]
MEND
AREA |Init|, CODE, READONLY
ENTRY
ASSERT :DEF:ENDIAN_CHANGE
[ ENDIAN_CHANGE
ASSERT :DEF:ENTRY_BUS_WIDTH
[ ENTRY_BUS_WIDTH=32
b ChangeBigEndian ; DCD 0xea000007
]
[ ENTRY_BUS_WIDTH=16
andeq r14,r7,r0,lsl #20 ; DCD 0x0007ea00
]
[ ENTRY_BUS_WIDTH=8
streq r0,[r0,-r10,ror #1] ; DCD 0x070000ea
]
|
b ResetHandler
]
b HandlerUndef ; handlerUndef
b HandlerSWI ; SWI interrupt handler
b HandlerPabort ; handlerPAbort
b HandlerDabort ; handlerDAbort
b . ; handlerReserved
b HandlerIRQ ; handlerIRQ
b HandlerFIQ ; handlerFIQ
; @0x20
b EnterPWDN
; @0x24
ChangeBigEndian
[ ENTRY_BUS_WIDTH=32
DCD 0xee110f10 ; 0xee110f10 => mrc p15,0,r0,c1,c0,0
DCD 0xe3800080 ; 0xe3800080 => orr r0,r0,#0x80; //Big-endian
DCD 0xee010f10 ; 0xee010f10 => mcr p15,0,r0,c1,c0,0
]
[ ENTRY_BUS_WIDTH=16
DCD 0x0f10ee11
DCD 0x0080e380
DCD 0x0f10ee01
]
[ ENTRY_BUS_WIDTH=8
DCD 0x100f11ee
DCD 0x800080e3
DCD 0x100f01ee
]
DCD 0xffffffff ; swinv 0xffffff is similar with NOP and run well in both endian mode.
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
DCD 0xffffffff
b ResetHandler
; 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.
; void EnterPWDN(int CLKCON);
EnterPWDN
mov r2,r0 ; r2=rCLKCON
tst r0,#0x8 ; POWER_OFF mode?
bne ENTER_POWER_OFF
ENTER_STOP
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.
0 subs r1,r1,#1
bne %B0
ldr r0,=CLKCON ; enter STOP mode.
str r2,[r0]
mov r1,#32
0 subs 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 POWER_OFF mode, only the reset by wake-up is available.
ldr r0,=REFRESH ; exit from SDRAM self refresh mode.
str r3,[r0]
MOV_PC_LR
ENTER_POWER_OFF
; NOTE.
; 1) rGSTATUS3 should have the return address after wake-up from POWER_OFF mode.
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.
0 subs r1,r1,#1
bne %B0
ldr r1,=MISCCR
ldr r0,[r1]
orr r0,r0,#(7<<17) ; Make sure that SCLK0:SCLK->0, SCLK1:SCLK->0, SCKE=L during boot-up
str r0,[r1]
ldr r0,=CLKCON
str r2,[r0]
b . ; CPU will die here.
WAKEUP_POWER_OFF
; Release SCLKn after wake-up from the POWER_OFF mode.
ldr r1,=MISCCR
ldr r0,[r1]
bic r0,r0,#(7<<17) ; SCLK0:0->SCLK, SCLK1:0->SCLK, SCKE:L->H
str r0,[r1]
; Set memory control registers
ldr r0,=SMRDATA
ldr r1,=BWSCON ; BWSCON Address
add r2, r0, #52 ; End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
mov r1,#256
0 subs r1,r1,#1 ; 1) wait until the SelfRefresh is released.
bne %B0
ldr r1,=GSTATUS3 ; GSTATUS3 has the start address just after POWER_OFF wake-up
ldr r0,[r1]
mov pc,r0
LTORG
HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort
;*****************************************************************************
;
; ResetHandler is the startup code to be used
;
;*****************************************************************************
ResetHandler
ldr r0,=WTCON ; watch dog disable
ldr r1,=0x0
str r1,[r0]
ldr r0,=INTMSK
ldr r1,=0xffffffff ; all interrupt disable
str r1,[r0]
ldr r0,=INTSUBMSK
ldr r1,=0x7ff ; all sub interrupt disable
str r1,[r0]
; To reduce PLL lock time, adjust the LOCKTIME register.
ldr r0,=LOCKTIME
ldr r1,=0xffffff
str r1,[r0]
[ PLL_ON_START
; Configure MPLL
ldr r0,=MPLLCON
ldr r1,=((M_MDIV<<12)+(M_PDIV<<4)+M_SDIV) ; Fin=12MHz,Fout=50MHz
str r1,[r0]
]
; Check if the boot is caused by the wake-up from POWER_OFF mode.
ldr r1,=GSTATUS2
ldr r0,[r1]
tst r0,#0x2
; In case of the wake-up from POWER_OFF mode, go to POWER_OFF_WAKEUP handler.
bne WAKEUP_POWER_OFF
EXPORT StartPointAfterPowerOffWakeUp
StartPointAfterPowerOffWakeUp
; Set memory control registers
ldr r0,=SMRDATA
ldr r1,=BWSCON ; BWSCON Address
add r2, r0, #52 ; End address of SMRDATA
0
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne %B0
; Initialize stacks
bl InitStacks
;********************************************************************
; End of Stack Setup
;********************************************************************
;
; Copy the read-write data block from ROM to RAM.
;
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialize
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialize
ldr r0,=|Image$$RO$$Limit| ; Get pointer to ROM data
ldr r1,=|Image$$RW$$Base| ; and RAM copy
ldr r3,=|Image$$ZI$$Base|
; Zero init base => top of initialized data
cmp r0,r1 ; Check that they are different
beq %F1
0
cmp r1,r3 ; Copy init data
ldrcc r2,[r0],#4
strcc r2,[r1],#4
bcc %B0
1
ldr r1,=|Image$$ZI$$Limit| ; Top of zero init segment
mov r2,#0
2
cmp r3,r1 ; Zero init
strcc r2,[r3],#4
bcc %B2
program
;
; Call the actual C program.
; Should never return.
;
IMPORT C_vMain
b C_vMain ; C Entry
InitStacks
; Don't use DRAM,such as stmfd,ldmfd......
; SVCstack is initialized before
; Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ; UndefMode
ldr sp,=UndefStack
orr r1,r0,#ABORTMODE|NOINT
msr cpsr_cxsf,r1 ; AbortMode
ldr sp,=AbortStack
orr r1,r0,#IRQMODE|NOINT
msr cpsr_cxsf,r1 ; IRQMode
ldr sp,=IRQStack
orr r1,r0,#FIQMODE|NOINT
msr cpsr_cxsf,r1 ; FIQMode
ldr sp,=FIQStack
bic r0,r0,#MODEMASK|NOINT
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ; SVCMode
ldr sp,=SVCStack
; USER mode is not initialized.
mov pc,lr ; The LR register may be not valid for the mode changes.
LTORG
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 is safe 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)+(Trc<<18)+(Tchr<<16)+REFCNT)
DCD 0x32 ; SCLK power saving mode, BANKSIZE 128M/128M
DCD 0x30 ; MRSR6 CL=3clk
DCD 0x30 ; MRSR7
; DCD 0x20 ; MRSR6 CL=2clk
; DCD 0x20 ; MRSR7
;
;*****************************************************************************
;
; Zero-initialized read/write data area for stacks.
; This area is determined by the RW value in the Linker under "entry and base".
;*****************************************************************************
AREA SYS_STK, DATA, READWRITE, NOINIT
;*****************************************************************************
;
; Memory buffers to contain the stacks for the various processor modes which
; we will be using.
;
;*****************************************************************************
^ STK_SADDR
UserStack # _SVC_STKSIZE
SVCStack # _UND_STKSIZE
UndefStack # _ABT_STKSIZE
AbortStack # _IRQ_STKSIZE
IRQStack # _FIQ_STKSIZE
FIQStack # 0
AREA ISR_HOOK, DATA, READWRITE, NOINIT
^ ISR_BADDR
HandleReset # 4
HandleUndef # 4
HandleSWI # 4
HandlePabort # 4
HandleDabort # 4
HandleReserved # 4
HandleIRQ # 4
HandleFIQ # 4
;
;*****************************************************************************
;
END