📄 nbc_init.s
字号:
;; ******************************************************
;; * NAME : SOURCE\NBC_INIT.S ver1.0 *
;; * Author : Nicolas Park *
;; * E-mail : openice@aijisystem.com *
;; * Description: *
;; * C start up codes for NBC board S3C4510B0 *
;; * Configure memory, Initialize ISR ,stacks *
;; * Initialize C-variables *
;; * Fill zeros into zero-initialized C-variables *
;; * The last Modification date: 18-April-2002 *
;; * REMARKS: Created initial version 1.0 *
;; * Copyrigth (C) 2002 AIJISYSTEM CO.,LTD *
;; ******************************************************
GET ..\include\memory.a
GET ..\include\nbc.a
IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit| ; to zero initialise
IMPORT Main
AREA Init, CODE, READONLY
ENTRY
;; --------------------------------------------------------------------------------------------------
;; Booting from address 0
;; Setup Exception Vectors
;; --------------------------------------------------------------------------------------------------
B Reset_Handler
B Undefined_Handler
B SWI_Handler
B Prefetch_Handler
B Abort_Handler
NOP ; Reserved vector
B IRQ_Handler
B FIQ_Handler
;==========================================================
; The Default Exception Handler Vector Entry Pointer Setup
;==========================================================
FIQ_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleFiq
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
IRQ_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleIrq
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
Prefetch_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandlePrefetch
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
Abort_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleAbort
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
Undefined_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleUndef
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
SWI_Handler
SUB sp, sp, #4
STMFD sp!, {r0}
LDR r0, =HandleSwi
LDR r0, [r0]
STR r0, [sp, #4]
LDMFD sp!, {r0, pc}
;; --------------------------------------------------------------------------------------------------
;; The Reset Entry Point
;; --------------------------------------------------------------------------------------------------
Reset_Handler ;/* Reset Entry Point */
;=====================================
; Setup Special Register
;=====================================
LDR r0, =0x3FF0000
LDR r1, =0x87FFFF90 ; SetValue = 0x83FFFF91
STR r1, [r0] ; Cache,WB disable
; Start_addr = 0x3FF00000
ldr r0, =SYS_SET
ldmia r0, {r1-r5}
ldr r0, =0x3ff3000
stmia r0, {r1-r5}
ldr r0, =SMRDATA
ldmia r0, {r1-r11}
ldr r0, =0x3ff3014
stmia r0, {r1-r11}
;=====================================
; Initialise STACK
;=====================================
INITIALIZE_STACK
MRS r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK
ORR r2, r0, #USR_MODE
ORR r1, r0, #LOCKOUT | FIQ_MODE
msr cpsr_cxsf, r1
LDR sp, =FIQ_STACK
ORR r1, r0, #LOCKOUT | IRQ_MODE
msr cpsr_cxsf, r1
LDR sp, =IRQ_STACK
ORR r1, r0, #LOCKOUT | ABT_MODE
msr cpsr_cxsf, r1
LDR sp, =ABT_STACK
ORR r1, r0, #LOCKOUT | UDF_MODE
msr cpsr_cxsf, r1
LDR sp, =UDF_STACK
ORR r1, r0, #LOCKOUT | SUP_MODE
msr cpsr_cxsf, r1
LDR sp, =SUP_STACK ; Change CPSR to SVC mode
;=====================================
; LED Display
;=====================================
LDR r1, =IOPMOD
LDR r0, =0xFF
STR r0, [r1]
LDR r1, =IOPDATA
LDR r0, =0x55
STR r0, [r1]
;=============================
; Exception Vector Table Setup
;=============================
EXCEPTION_VECTOR_TABLE_SETUP
LDR r0, =HandleReset ; Exception Vector Table Memory Loc.
LDR r1, =ExceptionHandlerTable ; Exception Handler Assign
MOV r2, #8 ; Number of Exception is 8
ExceptLoop
LDR r3, [r1], #4
STR r3, [r0], #4
SUBS r2, r2, #1 ; Down Count
BNE ExceptLoop
;; --------------------------------------------------------------------------------------------------
;; Initialization for C source program
;; --------------------------------------------------------------------------------------------------
;; Initialize memory required for C code
;; - RAM initialization
;; - Copy all read/write data from Assembler & C code to the read/write area
;; - Copy Zero initialized data from C code to the read/write area(for example, global variable)
;; --------------------------------------------------------------------------------------------------
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 initialised data
CMP r0, r1 ; Check that they are different
BEQ %1
0 CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4
STRCC r2, [r1], #4
BCC %0
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 %2
;====================================================
; Now change to user mode and set up user mode stack.
;====================================================
MRS r0, cpsr
BIC r0, r0, #LOCKOUT | MODE_MASK
ORR r1, r0, #USR_MODE
MSR cpsr_cxsf, r0
LDR sp, =USR_STACK
;===========================
; Now we enter the C Program
;===========================
BL Main
;===========================================
; Exception Vector Function Definition
; Consist of function Call from C-Program.
;===========================================
SystemUndefinedHandler
IMPORT ISR_UndefHandler
STMFD sp!, {r0-r12}
B ISR_UndefHandler
LDMFD sp!, {r0-r12, pc}^
SystemSwiHandler
STMFD sp!, {r0-r12,lr}
LDR r0, [lr, #-4]
BIC r0, r0, #0xff000000
CMP r0, #0xff
BEQ MakeSVC
LDMFD sp!, {r0-r12, pc}^
MakeSVC
MRS r1, spsr
BIC r1, r1, #MODE_MASK
ORR r2, r1, #SUP_MODE
MSR spsr_cxsf, r2
LDMFD sp!, {r0-r12, pc}^
SystemPrefetchHandler
IMPORT ISR_PrefetchHandler
STMFD sp!, {r0-r12, lr}
B ISR_PrefetchHandler
LDMFD sp!, {r0-r12, lr}
;ADD sp, sp, #4
SUBS pc, lr, #4
SystemAbortHandler
IMPORT ISR_AbortHandler
STMFD sp!, {r0-r12, lr}
B ISR_AbortHandler
LDMFD sp!, {r0-r12, lr}
;ADD sp, sp, #4
SUBS pc, lr, #8
SystemReserv
SUBS pc, lr, #4
SystemIrqHandler
IMPORT ISR_IrqHandler
STMFD sp!, {r0-r12, lr}
BL ISR_IrqHandler
LDMFD sp!, {r0-r12, lr}
SUBS pc, lr, #4
SystemFiqHandler
IMPORT ISR_FiqHandler
STMFD sp!, {r0-r7, lr}
BL ISR_FiqHandler
LDMFD sp!, {r0-r7, lr}
SUBS pc, lr, #4
AREA ROMDATA, DATA, READONLY
;; MEMMORY CONFIG
SYS_SET
DCD 0x0
DCD 0x0
DCD 0x0eb70eb7
DCD 0xeb70eb7
DCD 0x55fff59
ALIGN
SMRDATA
DCD 0x4000060
DCD 0x8010040
DCD 0x9020040
DCD 0xa021020
DCD 0xb028040
DCD 0xc02c040
DCD 0x20040380
DCD 0x21084180
DCD 0x22088180
DCD 0x2308c180
DCD 0xce278360
ALIGN
;===========================================
; Exception Handler Vector Table Entry Point
;===========================================
ExceptionHandlerTable
DCD UserCodeArea
DCD SystemUndefinedHandler
DCD SystemSwiHandler
DCD SystemPrefetchHandler
DCD SystemAbortHandler
DCD SystemReserv
DCD SystemIrqHandler
DCD SystemFiqHandler
ALIGN
;/***************************************************/
AREA SYS_STACK, NOINIT
;/***************************************************/
% USR_STACK_SIZE
USR_STACK
% UDF_STACK_SIZE
UDF_STACK
% ABT_STACK_SIZE
ABT_STACK
% IRQ_STACK_SIZE
IRQ_STACK
% FIQ_STACK_SIZE
FIQ_STACK
% SUP_STACK_SIZE
SUP_STACK
;/***************************************************/
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -