📄 startup.s
字号:
@@ *****************************************************
@@ * NAME : Startup.s ver 1.0 *
@@ * Date : 2004/02/02 *
@@ * Author : dae hong, Kim *
@@ * E-mail : redizi@armkorea.com *
@@ * Description: *
@@ * S3C2410X ARM920T LN2410SBC Rev 1.0 *
@@ * XTAL= 12MHz *
@@ * MCLK= 266MHz *
@@ * ROM = K9F5608U0M (32MB, 8bit, NAND) *
@@ * RAM = K4S561632D (64MB, 32bit, SDRAM) *
@@ *****************************************************
@****************** Register ********************
@=================
@ Memory control
@=================
BWSCON = 0x48000000 @Bus width & wait status
BANKCON0 = 0x48000004 @Boot ROM control
BANKCON1 = 0x48000008 @BANK1 control
BANKCON2 = 0x4800000c @BANK2 cControl
BANKCON3 = 0x48000010 @BANK3 control
BANKCON4 = 0x48000014 @BANK4 control
BANKCON5 = 0x48000018 @BANK5 control
BANKCON6 = 0x4800001c @BANK6 control
BANKCON7 = 0x48000020 @BANK7 control
REFRESH = 0x48000024 @DRAM/SDRAM refresh
BANKSIZE = 0x48000028 @Flexible Bank Size
MRSRB6 = 0x4800002c @Mode register set for SDRAM
MRSRB7 = 0x48000030 @Mode register set for SDRAM
@=================
@ INTERRUPT
@=================
SRCPND = 0x4a000000 @Interrupt r=est status
INTMOD = 0x4a000004 @Interrupt mode control
INTMSK = 0x4a000008 @Interrupt mask control
PRIORITY = 0x4a00000c @IRQ priority control <-- May 06, 2002 SOP
INTPND = 0x4a000010 @Interrupt r=est status
INTOFFSET = 0x4a000014 @Interruot r=est source offset
SUSSRCPND = 0x4a000018 @Sub source pending
INTSUBMSK = 0x4a00001c @Interrupt sub mask
@==========================
@ CLOCK & POWER MANAGEMENT
@==========================
LOCKTIME = 0x4c000000 @PLL lock time counter
MPLLCON = 0x4c000004 @MPLL Control
UPLLCON = 0x4c000008 @UPLL Control
CLKCON = 0x4c00000c @Clock generator control
CLKSLOW = 0x4c000010 @Slow clock control
CLKDIVN = 0x4c000014 @Clock divider control
@=================
@ I/O PORT
@=================
GPACON = 0x56000000 @Port A control
GPADAT = 0x56000004 @Port A data
GPBCON = 0x56000010 @Port B control
GPBDAT = 0x56000014 @Port B data
GPBUP = 0x56000018 @Pull-up control B
GPCCON = 0x56000020 @Port C control
GPCDAT = 0x56000024 @Port C data
GPCUP = 0x56000028 @Pull-up control C
GPDCON = 0x56000030 @Port D control
GPDDAT = 0x56000034 @Port D data
GPDUP = 0x56000038 @Pull-up control D
GPECON = 0x56000040 @Port E control
GPEDAT = 0x56000044 @Port E data
GPEUP = 0x56000048 @Pull-up control E
GPFCON = 0x56000050 @Port F control
GPFDAT = 0x56000054 @Port F data
GPFUP = 0x56000058 @Pull-up control F
GPGCON = 0x56000060 @Port G control
GPGDAT = 0x56000064 @Port G data
GPGUP = 0x56000068 @Pull-up control G
GPHCON = 0x56000070 @Port H control
GPHDAT = 0x56000074 @Port H data
GPHUP = 0x56000078 @Pull-up control H
@=================
@ WATCH DOG TIMER
@=================
WTCON = 0x53000000 @Watch-dog timer mode
WTDAT = 0x53000004 @Watch-dog timer data
WTCNT = 0x53000008 @Eatch-dog timer count
@*************************************************
@ Pre-defined constants
USERMODE = 0x10
FIQMODE = 0x11
IRQMODE = 0x12
SVCMODE = 0x13
ABORTMODE = 0x17
UNDEFMODE = 0x1b
SYSMODE = 0x1f
MODEMASK = 0x1f
INTMASK = 0xc0
.macro WR8 addr, data
ldr r0, =\addr
ldr r1, =\data
strb r1, [r0]
.endm
.macro WR16 addr, data
ldr r0, =\addr
ldr r1, =\data
strh r1, [r0]
.endm
.macro WR32 addr, data
ldr r0, =\addr
ldr r1, =\data
str r1, [r0]
.endm
.macro ExceptionHandler addr
stmfd sp!, {r0-r3, lr}
ldr r0, =\addr
ldr r0, [r0]
add lr, pc, #0
mov pc, r0
ldmfd sp!, {r0-r3, lr}
subs pc, lr, #4
.endm
.global Main
.global ResetHandler
.text @ AREA ???, CODE, READONLY
.code 32 @ CODE32
@---------------------------------------------------------------------
@ Main Routine
@---------------------------------------------------------------------
ResetHandler:
WR32 WTCON, (47<<8)+(0<<5)+(0<<0) @ Disable Watch-Dog Timer (66KHz=15us)
WR32 INTMSK, 0xFFFFFFFF @ All Interrupt Disable
WR32 INTSUBMSK, 0x7FF @ All sub-interrupt disable
WR32 CLKDIVN, (0<<2)+(1<<1)+(1<<0) @ 1:2:4
WR32 LOCKTIME, 0xFFFFFF
@ WR32 MPLLCON, (0xA1<<12)+(3<<4)+(1) @ Fin=12MHz, Fout=202.8MHz
WR32 MPLLCON, (0x7D<<12)+(4<<4)+(0) @ Fin=12MHz, Fout=266MHz
@ WR32 UPLLCON, (0x28<<12)+(1<<4)+(2) @ Fin=12MHz, Fout=48MHz
WR32 HandleIRQ, IsrIRQ @ Set IRQ Handler
BL InitPort
;BL InitMemoryController
BL InitStacks @ Initialize Stack
BL InitVariables @ Initialize Global Variables
LDR pc, =Main
B .
@---------------------------------------------------------------------
@ ISR(Interrupt Service Routine) IRQ = Non Vector
@---------------------------------------------------------------------
IsrIRQ:
STMFD sp!,{r0-r3, lr}
LDR r1,=INTOFFSET
LDR r1,[r1]
LDR r2,=HandleEINT0
ADD r3,r2,r1,lsl #2
MOV lr, pc
LDR pc,[r3]
LDMFD sp!,{r0-r3, lr}
SUBS pc, lr, #4
.LTORG
@---------------------------------------------------------------------
@ Initialize Port
@---------------------------------------------------------------------
InitPort:
LDR r0, =GPHCON @ Set TxD0/RxD0
LDR r1, [r0]
BIC r1, r1, #0xF0
ORR r1, r1, #0xA0
STR r1, [r0]
LDR r0, =GPBCON @ Set GPB5/6
LDR r1, [r0]
BIC r1, r1, #(0xF<<10)
ORR r1, r1, #(0x5<<10)
STR r1, [r0]
LDR r0, =GPBDAT @ Initial Value
LDR r1, [r0]
ORR r1, r1, #(3<<5);
STR r1, [r0]
MOV pc, lr
.LTORG
@---------------------------------------------------------------------
@ Initialize Stack
@---------------------------------------------------------------------
InitStacks:
mrs r0, cpsr
bic r0, r0, #MODEMASK
orr r1, r0, #SYSMODE
msr cpsr_cxsf, r1 @ System Mode
ldr sp, =__STACK_USER_END__
orr r1, r0, #IRQMODE
msr cpsr_cxsf, r1 @ IRQ Mode
ldr sp, =__STACK_IRQ_END__
orr r1, r0, #FIQMODE
msr cpsr_cxsf, r1 @ FIQ Mode
ldr sp, =__STACK_FIQ_END__
orr r1, r0, #UNDEFMODE
msr cpsr_cxsf, r1 @ UND Mode
ldr sp, =__STACK_UNDEF_END__
orr r1, r0, #SVCMODE
bic r1, r1, #INTMASK @ IRQ,FIQ enable
msr cpsr_cxsf, r1 @ Supervisor Mode
ldr sp, =__STACK_SVC_END__
mov pc, lr
.LTORG
@---------------------------------------------------------------------
@ Initialize Data Regien
@---------------------------------------------------------------------
InitVariables:
@ zero bss
_Lzero_bss:
ldr r0, =__bss_start__
ldr r1, =__bss_end__
mov r2, #0
_Lzero_words:
cmp r0, r1
strne r2, [r0], #0x4
bne _Lzero_words
mov pc, lr
.LTORG
@---------------------------------------------------------------------
@ Initialize Memory Controller
@---------------------------------------------------------------------
InitMemoryController:
LDR r0,=SMRDATA
LDR r1,=BWSCON @BWSCON Address
ADD r2, r0, #52 @End address of SMRDATA
_L1:
LDR r3, [r0], #4
STR r3, [r1], #4
CMP r2, r0
BNE _L1
MOV pc, lr
.LTORG
@------------------------------------------------------------------------------
@ Memory Controller
@------------------------------------------------------------------------------
SMRDATA:
.word (0+(5<<4)+(5<<8)+(0<<12)+(0<<16)+(0<<20)+(2<<24)+(0<<28))
.word ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+(0)) @GCS0
.word ((3<<13)+(3<<11)+(7<<8)+(3<<6)+(3<<4)+(0<<2)+(0)) @GCS1
.word ((0<<13)+(1<<11)+(2<<8)+(1<<6)+(0<<4)+(0<<2)+(0)) @GCS2
.word ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+(0)) @GCS3
.word ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+(0)) @GCS4
.word ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+(0)) @GCS5
.word ((3<<15)+(1<<2)+(1)) @GCS6
.word ((0<<13)+(0<<11)+(7<<8)+(0<<6)+(0<<4)+(0<<2)+(0)) @GCS7
.word ((1<<23)+(0<<22)+(0<<20)+(3<<18)+(2<<16)+1113)
.word 0x32 @BANKSIZE 128M/128M
.word 0x30 @MRSR6 CL=3clk
.word 0x30 @MRSR7
@------------------------------------------------------------------------------
@ Data Region
@------------------------------------------------------------------------------
.section .vector
HandleReset: .space 4 @ 0x00 Reset Exception
HandleUndef: .space 4 @ 0x04 Undefine Instruction Exception
HandleSWI: .space 4 @ 0x08 Software Interrupt Exception
HandlePabort: .space 4 @ 0x0C Prefetch Abort Exception
HandleDabort: .space 4 @ 0x10 Data Abort Exception
HandleReserved: .space 4 @ 0x14
HandleIRQ: .space 4 @ 0x18 IRQ Exception
HandleFIQ: .space 4 @ 0x1C FIQ Exception
HandleEINT0: .space 4 @Interrupt Resouces
HandleEINT1: .space 4
HandleEINT2: .space 4
HandleEINT3: .space 4
HandleEINT4_7: .space 4
HandleEINT8_23: .space 4
HandleRSV6: .space 4
HandleBATFLT: .space 4
HandleTICK: .space 4
HandleWDT: .space 4
HandleTIMER0: .space 4
HandleTIMER1: .space 4
HandleTIMER2: .space 4
HandleTIMER3: .space 4
HandleTIMER4: .space 4
HandleUART2: .space 4
HandleLCD: .space 4
HandleDMA0: .space 4
HandleDMA1: .space 4
HandleDMA2: .space 4
HandleDMA3: .space 4
HandleMMC: .space 4
HandleSPI0: .space 4
HandleUART1: .space 4
HandleRSV24: .space 4
HandleUSBD: .space 4
HandleUSBH: .space 4
HandleIIC: .space 4
HandleUART0: .space 4
HandleSPI1: .space 4
HandleRTC: .space 4
HandleADC: .space 4
.END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -