📄 sysinit.s
字号:
INCLUDE inc\option.s
INCLUDE inc\memcfg.s
;****************************************************************************
;存储器空间
;GCS6 16bit(32MB) DRAM/SDRAM(0x30000000-0x32000000)
;APP RAM=0xc000000~0xc7effff
;44BMON RAM=0xc7f0000-0xc7fffff
;STACK =0xc7ffa00
;****************************************************************************
;预定义常数(常量)
USERMODE EQU 0x10
FIQMODE EQU 0x11
IRQMODE EQU 0x12
SVCMODE EQU 0x13
ABORTMODE EQU 0x17
UNDEFMODE EQU 0x1b
MODEMASK EQU 0x1f
NOINT EQU 0xc0
S3C2410X_WTCON EQU 0x53000000
S3C2410X_INTMASK EQU 0x4a000008
S3C2410X_INTSUBMSK EQU 0x4a00001c
S3C2410X_LOCKTIME EQU 0x4c000000
rLOCKTIME EQU 0xffffff
S3C2410X_MPLLCON EQU 0x4c000004
;rMPLLCON EQU ((88<<12)+(1<<4)+1)
rMPLLCON EQU ((72<<12)+(6<<4)+1)
S3C2410X_UPLLCON EQU 0x4c000008
rUPLLCON EQU ((0x78<<12)+(2<<4)+3)
S3C2410X_CLKCON EQU 0x4c00000c
rCLKCON EQU 0x7ff00
S3C2410X_CLKSLOW EQU 0x4c000010
rCLKSLOW EQU 0x00000084
S3C2410X_CLKDIVN EQU 0x4c000014
;rCLKDIVN EQU 0x00000003
rCLKDIVN EQU 0x00000000
rEXTDBWTH EQU 0x11110110
rROMCON0 EQU (7<<8)
rROMCON1 EQU (7<<8)
rROMCON2 EQU (7<<8)
rROMCON3 EQU (7<<8)
rROMCON4 EQU (7<<8)
rROMCON5 EQU (7<<8)
rSDRAMCON0 EQU ((3<<15)+(2<<2)+(1))
rSDRAMCON1 EQU ((3<<15)+(2<<2)+(1))
rSREFEXTCON EQU ((0x1<<23)+(0<<22)+(0<<20)+(3<<18)+(0<<16)+1113)
rBANKSIZE EQU ((0<<7)+(1<<5)+(1<<4)+(2))
rMRSRB6 EQU 0x30
rMRSRB7 EQU 0x30
S3C2410X_MRSRB7 EQU 0x48000030
S3C2410X_BWSCON EQU 0x48000000
;*****************************************************************
AREA InitSystemBlk, CODE, READONLY
;*****************************************************************
;初始化程序开始
EXPORT InitSystem
InitSystem
;禁止看门狗
ldr r0, =S3C2410X_WTCON
ldr r1, =0
str r1,[r0]
;禁止所有中断
ldr r0,=S3C2410X_INTMASK
ldr r1,=0xffffffff
str r1,[r0]
ldr r0,=S3C2410X_INTSUBMSK
ldr r1,=0xffffff
str r1,[r0]
;设定时钟控制寄存器
ldr r0, =S3C2410X_LOCKTIME
ldr r1, =rLOCKTIME
str r1, [r0]
ldr r0, =S3C2410X_MPLLCON
ldr r1, = rMPLLCON
str r1, [r0]
ldr r0, =S3C2410X_UPLLCON
ldr r1, =rUPLLCON
str r1, [r0]
ldr r0, =S3C2410X_CLKCON
ldr r1, =rCLKCON
str r1, [r0]
ldr r0, =S3C2410X_CLKSLOW
ldr r1, =rCLKSLOW
str r1, [r0]
ldr r0, =S3C2410X_CLKDIVN
ldr r1, =rCLKDIVN
str r1, [r0]
LDR r1, SystemInitDataSDRAM
LDR r2, SystemInitDataSDRAM + 0x04
LDR r3, SystemInitDataSDRAM + 0x08
LDR r4, SystemInitDataSDRAM + 0x0c
LDR r5, SystemInitDataSDRAM + 0x10
LDR r6, SystemInitDataSDRAM + 0x14
LDR r7, SystemInitDataSDRAM + 0x18
LDR r8, SystemInitDataSDRAM + 0x1c
LDR r9, SystemInitDataSDRAM + 0x20
LDR r10,SystemInitDataSDRAM + 0x24
LDR r11,SystemInitDataSDRAM + 0x28
LDR r12,SystemInitDataSDRAM + 0x2c
LDR r0,=rEXTDBWTH
STMIA r0, {r1-r12}
;****************************************************
;初始化堆栈
;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
orr r1, r0, #SVCMODE|NOINT
msr cpsr_cxsf, r1 ;SVCMode
ldr sp, =SVCStack
;USER mode is not initialized.
;***********************************************
;设置IQR处理程序入口, 在配置好RAM后设置
ldr r0, =IRQ_SVC_VECTOR
ldr r1, =IRQ_SERVICE
str r1, [r0]
;***********************************************
mov pc, lr ;返回
;*******************************************************
IRQ_SERVICE ;using I_ISPR register.
IMPORT pIrqStart
IMPORT pIrqFinish
IMPORT pIrqHandler
;IMPORTANT CAUTION!!!
;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
; ldr r4, =I_ISPR
; ldr r4, [r4]
; cmp r4, #0x0 ;If the IDLE mode work-around is used, r0 may be 0 sometimes.
; beq %F3
; ldr r5, =I_ISPC
; str r4, [r5] ;clear interrupt pending bit
; ldr r5, =pIrqStart
; ldr r5, [r5]
; cmp r5, #0
; movne lr, pc ; .+8
; movne pc, r5
; mov r0, #0x0
;0
; movs r4, r4, lsr #1
; bcs %F1
; add r0, r0, #1
; b %B0
;1
; ldr r1, =pIrqHandler
; ldr r1, [r1]
; cmp r1, #0
; movne lr, pc
; movne pc, r1
;2
; ldr r0, =pIrqFinish
; ldr r0, [r0]
; cmp r0, #0
; movne lr, pc ; .+8
; movne pc, r0
; cmp r0, #0
; movne lr, pc
; movne pc, r0
;3
; */
ldmfd sp!, {r0} ;从IRQ返回
msr spsr_cxsf, r0
ldmfd sp!, {r0-r12, pc}^
SystemInitDataSDRAM
DCD rEXTDBWTH
DCD rROMCON0
DCD rROMCON1
DCD rROMCON2
DCD rROMCON3
DCD rROMCON4
DCD rROMCON5
DCD rSDRAMCON0
DCD rSDRAMCON1
DCD rSREFEXTCON
DCD rBANKSIZE
DCD rMRSRB6
DCD rMRSRB7
;***********************************************
; EXPORT IrqHandlerTab
;IrqHandlerTab DCD HandleADC
;***********************************************
AREA RamData, DATA, READWRITE
^ (_ISR_STARTADDRESS-0x500)
UserStack # 256 ;c1(c7)ffa00
SVCStack # 256 ;c1(c7)ffb00
UndefStack # 256 ;c1(c7)ffc00
AbortStack # 256 ;c1(c7)ffd00
IRQStack # 256 ;c1(c7)ffe00
FIQStack # 0 ;c1(c7)fff00
MAP _ISR_STARTADDRESS
SYS_RST_VECTOR # 4
UDF_INS_VECTOR # 4
SWI_SVC_VECTOR # 4
INS_ABT_VECTOR # 4
DAT_ABT_VECTOR # 4
RESERVED_VECTOR # 4
IRQ_SVC_VECTOR # 4
FIQ_SVC_VECTOR # 4
EXPORT SYS_RST_VECTOR
EXPORT UDF_INS_VECTOR
EXPORT SWI_SVC_VECTOR
EXPORT INS_ABT_VECTOR
EXPORT DAT_ABT_VECTOR
EXPORT RESERVED_VECTOR
EXPORT IRQ_SVC_VECTOR
EXPORT FIQ_SVC_VECTOR
;Don't use the label 'IntVectorTable',
;because armasm.exe cann't recognize this label correctly.
;the value is different with an address you think it may be.
;IntVectorTable
HandleADC # 4
HandleRTC # 4
HandleSPI1 # 4
HandleUTXD0 # 4
HandleSIO # 4
HandleIIC # 4
HandleURXD1 # 4
HandleURXD0 # 4
HandleTIMER5 # 4
HandleTIMER4 # 4
HandleTIMER3 # 4
HandleTIMER2 # 4
HandleTIMER1 # 4
HandleTIMER0 # 4
HandleUERR01 # 4
HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
HandleEINT2 # 4
HandleEINT1 # 4
HandleEINT0 # 4 ;0xc1(c7)fff84
;****************************************************************************
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -