?? start.s
字號:
;
; file:
; start.S
; description:
; s3c2410 startup code.
;
; MEMORY AREA
_RAM_STARTADDRESS EQU 0x30000000
_RAM_ENDADDRESS EQU 0x34000000
_ROM_STARTADDRESS EQU 0x00000000
_ROM_ENDADDRESS EQU 0x00200000
; STACK DEFINITIONS
_FIQ_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x08000) ; 14K
_IRQ_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x0b800) ; 14K
_ABT_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x0f000) ; 1K
_SVC_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x0f400) ; 2K
_UND_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x0fc00) ; 1k
_USR_STACK_ADDRESS EQU (_RAM_ENDADDRESS-0x10000) ; 0k
; PROCESSOR MODE
FIQ_MODE EQU 0x11 ; Fast Interrupt Mode (FIQ)
IRQ_MODE EQU 0x12 ; Interrupt Mode (IRQ)
ABT_MODE EQU 0x17 ; Abort Mode(ABT)
SVC_MODE EQU 0x13 ; Supervisor Mode (SVC)
UND_MODE EQU 0x1b ; Undefine Mode(UDF)
USR_MODE EQU 0x10 ; User Mode(USR)
SYS_MODE EQU 0x1f ; System Mode(SYS)
MODE_MSK EQU 0x1f ; Processor Mode Mask
; IRQ BITS
F_BIT EQU 0x40 ; FIQ Disable
I_BIT EQU 0x80 ; IRQ Disable
LOCKOUT EQU 0xc0 ; Interrupt lockout mask value
; watchdog controller
WTCON EQU 0x53000000
WTDAT EQU 0x53000004
WTCNT EQU 0x53000008
; interrupt controller
SRCPND EQU 0x4a000000
INTMOD EQU 0x4a000004
INTMSK EQU 0x4a000008
PRIORITY EQU 0x4a00000c
INTPND EQU 0x4a000010
INTOFFSET EQU 0x4a000014
SUBSRCPND EQU 0x4a000018
INTSUBMSK EQU 0x4a00001c
; clock controller
LOCKTIME EQU 0x4c000000
MPLLCON EQU 0x4c000004
UPLLCON EQU 0x4c000008
CLKCON EQU 0x4c00000c
CLKSLOW EQU 0x4c000010
CLKDIVN EQU 0x4c000014
MM_DIV EQU 0xa1 ; Fin=12MHz Fout=202.8MHz
MP_DIV EQU 0x03
MS_DIV EQU 0x01
UM_DIV EQU 0x78
UP_DIV EQU 0x02
US_DIV EQU 0x03
; memory controller
BWSCON EQU 0x48000000
BANKCON0 EQU 0x48000004
BANKCON1 EQU 0x48000008
BANKCON2 EQU 0x4800000c
BANKCON3 EQU 0x48000010
BANKCON4 EQU 0x48000014
BANKCON5 EQU 0x48000018
BANKCON6 EQU 0x4800001c
BANKCON7 EQU 0x48000020
REFRESH EQU 0x48000024
BANKSIZE EQU 0x48000028
MRSRB6 EQU 0x4800002c
MRSRB7 EQU 0x48000030
; STARTUP CODE
AREA start, CODE, READONLY, ALIGN=4
CODE32
ENTRY
b SystemResetHandler
ldr pc, =_RAM_STARTADDRESS+4 ; b SystemUndefinedHandler
ldr pc, =_RAM_STARTADDRESS+8 ; b SystemSwiHandler
ldr pc, =_RAM_STARTADDRESS+12 ; b SystemPrefetchHandler
ldr pc, =_RAM_STARTADDRESS+16 ; b SystemAbortHandler
ldr pc, =_RAM_STARTADDRESS+20 ; b SystemReservedHandler
ldr pc, =_RAM_STARTADDRESS+24 ; b SystemIrqHandler
ldr pc, =_RAM_STARTADDRESS+28 ; b SystemFiqHandler
LTORG
ConfigMemoryData
DCD 0x22111112 ; BWSCON
DCD 0x00000600 ; BANKCON0
DCD 0x00000700 ; BANKCON1
DCD 0x00000700 ; BANKCON2
DCD 0x00000700 ; BANKCON3
DCD 0x00000700 ; BANKCON4
DCD 0x00000700 ; BANKCON5
DCD 0x00018001 ; BANKCON6
DCD 0x00018001 ; BANKCON7
DCD 0x008001e9 ; REFRESH
DCD 0x00000032 ; BANKSIZE
DCD 0x00000030 ; MRSRB6
DCD 0x00000030 ; MRSRB7
SystemReservedHandler
b SystemReservedHandler
SystemResetHandler
ldr r0, =WTCON ; Disable WatchDog
ldr r1, =0x8000
str r1, [r0]
ldr r0, =INTMSK ; Disable interrupt
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =INTSUBMSK ; Disable sub interrupt
ldr r1, =0x07ff
str r1, [r0]
ldr r0, =INTMOD ; IRQ mode
ldr r1, =0x00
str r1, [r0]
ldr r0, =SUBSRCPND ; Clear sub interrupt pending
ldr r1, =0x07ff
str r1, [r0]
ldr r0, =SRCPND ; Clear interrupt source
ldr r1, =0xffffffff
str r1, [r0]
ldr r0, =INTPND ; Clear interrupt pending
ldr r1, =0xffffffff
str r1, [r0]
b Initialize_Memory
LTORG
Initialize_Memory
mov r0, pc
ldr r1, =_RAM_STARTADDRESS
cmp r0, r1
ldr r0, =ConfigMemoryData
sublt r0, r0, r1
ldmia r0, {r1-r13}
ldr r0, =BWSCON
stmia r0, {r1-r13}
b Initialize_Code
LTORG
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
Initialize_Code
mov r0, pc
ldr r1, =_RAM_STARTADDRESS
cmp r0, r1
bge Initialize_Clock
ldr r0, =_ROM_STARTADDRESS
ldr r1, =|Image$$RO$$Base|
ldr r2, =|Image$$ZI$$Base|
0
cmp r1, r2
bge %F1
ldmia r0!, {r3-r10}
stmia r1!, {r3-r10}
b %B0
1
ldr pc, =_RAM_STARTADDRESS
LTORG
Initialize_Clock
ldr r0, =CLKDIVN
ldr r1, =0x03
str r1, [r0]
ldr r0, =LOCKTIME
ldr r1, =0x00ffffff
str r1, [r0]
ldr r0, =MPLLCON
ldr r1, =((MM_DIV<<12)+(MP_DIV<<4)+MS_DIV)
str r1, [r0]
ldr r0, =UPLLCON
ldr r1, =((UM_DIV<<12)+(UP_DIV<<4)+US_DIV)
str r1, [r0]
ldr r0, =CLKCON
ldr r1, =0x0007fff0
str r1, [r0]
ldr r0, =CLKSLOW
ldr r1, =0x04
str r1, [r0]
b Initialize_Vector
LTORG
Initialize_Vector
ldr r0, =_RAM_STARTADDRESS;
add r0, r0, #4
ldr r1, =SystemUndefinedHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemSwiHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemPrefetchHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemAbortHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemReservedHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemIrqHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
add r0, r0, #4
ldr r1, =SystemFiqHandler
sub r1, r1, #8
sub r1, r1, r0
mov r1, r1, lsr#2
orr r1, r1, #0xea000000
str r1, [r0]
b Initialize_Stack
LTORG
Initialize_Stack
mov r0, #0x00
orr r1, r0, #LOCKOUT|FIQ_MODE
msr cpsr_cxsf, r1
ldr sp, =_FIQ_STACK_ADDRESS
orr r1, r0, #I_BIT|IRQ_MODE
msr cpsr_cxsf, r1
ldr sp, =_IRQ_STACK_ADDRESS
orr r1, r0, #LOCKOUT|ABT_MODE
msr cpsr_cxsf, r1
ldr sp, =_ABT_STACK_ADDRESS
orr r1, r0, #LOCKOUT|UND_MODE
msr cpsr_cxsf, r1
ldr sp, =_UND_STACK_ADDRESS
orr r1, r0, #LOCKOUT|SVC_MODE
msr cpsr_cxsf, r1
ldr sp, =_SVC_STACK_ADDRESS
b Initialize_Data
LTORG
Initialize_Data
ldr r0, =|Image$$RO$$Limit|
ldr r1, =|Image$$RW$$Base|
ldr r2, =|Image$$ZI$$Base|
ldr r3, =|Image$$ZI$$Limit|
mov r4, #0
cmp r0, r1
beq %F1
0
cmp r1, r2
ldrcc r5, [r0], #4
strcc r5, [r1], #4
bcc %B0
1
cmp r2, r3
strcc r4, [r2], #4
bcc %B1
b Initialize_Entry
LTORG
IMPORT _os_entry
Initialize_Entry
mov r0, #SYS_MODE
msr cpsr_cxsf, r0
ldr sp, =_USR_STACK_ADDRESS
bl _os_entry
b .
LTORG
IMPORT Isr_UndefineHandler
SystemUndefinedHandler
stmfd sp!, {r0-r3, ip, lr}
sub r0, lr, #4
bl Isr_UndefineHandler
ldmfd sp!, {r0-r3, ip, pc}^
IMPORT Isr_SwiHandler
SystemSwiHandler
stmfd sp!, {r0-r3, ip, lr}
sub r0, lr, #4
ldr r1, [r0]
bic r1, r1, #0xff000000
bl Isr_SwiHandler
ldmfd sp!, {r0-r3, ip, pc}^
IMPORT Isr_PrefetchAbortHandler
SystemPrefetchHandler
stmfd sp!, {r0-r3, ip, lr}
sub r0, lr, #4
bl Isr_PrefetchAbortHandler
ldmfd sp!, {r0-r3, ip, lr}
subs pc, lr, #4
IMPORT Isr_DataAbortHandler
SystemAbortHandler
stmfd sp!, {r0-r3, ip, lr}
sub r0, lr, #8
bl Isr_DataAbortHandler
ldmfd sp!, {r0-r3, ip, lr}
subs pc, lr, #8
IMPORT _irq_entry
SystemIrqHandler
stmfd sp!, {r0-r3, ip, lr}
ldr r0, =INTOFFSET
ldr r0, [r0]
mov r2, #1
mov r2, r2, lsl r0
ldr r1, =SRCPND ; Clear SRCPND
str r2, [r1]
ldr r1, =INTPND ; Clear INTPND
str r2, [r1]
b _irq_entry
LTORG
IMPORT _irq_entry
SystemFiqHandler
stmfd sp!, {r0-r3, ip, lr}
ldr r1, =INTPND
ldr r1, [r1]
cmp r1, #0x00
beq %F2
mov r0, #0x0
0
movs r1, r1, lsr #1
bcs %F1
add r0, r0, #1
b %B0
1
mov r2, #1
mov r2, r2, lsl r0
ldr r1, =SRCPND ; Clear SRCPND
str r2, [r1]
ldr r1, =INTPND ; Clear INTPND
str r2, [r1]
b _irq_entry
2
ldmfd sp!, {r0-r3, ip, lr}
subs pc, lr, #4
LTORG
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -