📄 init.s
字号:
;/**********************************************************************/
;/* */
;/* MODULE: UADSLMCU/KS8947/init.s */
;/* PURPOSE: Hardware Initialiation code */
;/* Description: S5N8947 BSP ver.1.0. */
;/* */
;/*--------------------------------------------------------------------*/
;/* COPYRIGHT 2001 SAMSUNG ELECTRONICS. */
;/*--------------------------------------------------------------------*/
;/* */
;/* */
;/**********************************************************************/
;/**********************************************************************/
;/* */
;/* Copyright (c) 2003 上海量子光电公司 */
;/* */
;/* */
;/**********************************************************************/
GET board.inc
IMPORT InstallVector
IMPORT SysInitVars
AREA INIT, CODE, READONLY
;************************************************************************
;* HdwInit: Do startup initialization that can't be done in C. *
;* *
;* SYNTAX: void HdwInit(void); *
;* NOTE: Called from "begin.s", not C code. Doesn't return. *
;* *
;************************************************************************
EXPORT HdwInit
EXPORT RomHdwInit
RomHdwInit
HdwInit
;/------------------------------------------------------------------/
;/ Some hardware requires a rom/ram remap to get RAM at low /
;/ address and ROM up higher. This is a good place to do this /
;/------------------------------------------------------------------/
;/------------------------------------------------------------------/
;/ Configure System Memroy /
;/ /
;/ To initialize the memory system, which includes: /
;/ - Set up base pointer for special-register file. /
;/ - Specify the access timing control parameters for various /
;/ external memories. /
;/ - Configure the external memory allocation. /
;/------------------------------------------------------------------/
;/------------------------------------------------------------------/
;/ Setup Register SYSCFG /
;/ - Special Register Base Addr : 0x3ff0000 /
;/ - Cache and Write Buffer Enable according to the environments /
;/------------------------------------------------------------------/
; The default value of ROM_IMAGE is TRUE
[ ROM_IMAGE
SetSysCfg
;/----------------------------------------------------------------------/
;/ SDRAM setting : /
;/----------------------------------------------------------------------/
SYNC_DRAM_CONFIGURATION
LDR r0, =0x3FF0000
LDR r1, =0x83FF0000 ; Start_addr = 0x3FF0000, WE=0
STR r1, [r0] ; Cache OFF
;/------------------------------------------------------------------/
;/ Initialize Memory Configuration. /
;/ This operation must be done at a time. /
;/------------------------------------------------------------------/
ADD r0, pc, #(SystemInitData_SDRAM-.-8)
LDMIA r0, {r1-r10}
LDR r0, =0x3FF0000 + 0x3010 ; ROMCON Offset : 0x3010
STMIA r0, {r1-r10}
;/------------------------------------------------------------------/
;/ Test whether SDRAM can be used or not. /
;/------------------------------------------------------------------/
;LDR r1, =EXTHND_BASE
;STR r1,[r1] ; write to SDRAM base
;LDR r2,[r1] ; read from SDRAM base
;CMP r2,r1 ; compare above two data
; SetSVC is not necessary
;BEQ SetSVC ; if equal, branch to SetSVC
; else, set SDRAM environment
;B .
]
[ REMAP
;/------------------------------------------------------------------/
;/ Copy ROM image to EDO DRAM, Change ROM and DRAM Base pointer /
;/------------------------------------------------------------------/
IMPORT |Image$$RO$$Base|
IMPORT |Image$$RW$$Limit|
DRAM_BASE EQU 0x1700000
ROM2DRAM_COPY_START
1 LDR r0, =|Image$$RO$$Base| ; Get pointer to ROM data
LDR r1, =|Image$$RW$$Limit| ; and RAM copy
LDR r2, =DRAM_BASE ; Copy DRAM area base
SUB r1, r1, r0 ; [r1] is loop count
ADD r1, r1, #4; [r1] is loop count
MOV r0, #0
ROM2DRAM_COPY_LOOP
LDR r3, [r0], #4
STR r3, [r2], #4
SUBS r1, r1, #4; Down Count
BNE ROM2DRAM_COPY_LOOP
;/------------------------------------------------------------------/
;/ Change Base address of ROM and DRAM /
;/------------------------------------------------------------------/
;LDR r13, =SetSVC
LDR r13, PtInitRemap
ADD r0, pc, #-(8+.-SystemInitDataSDRAM_S)
LDMIA r0, {r1-r10}
LDR r0, =0x3FF0000 + 0x3010 ; ROMCntr Offset : 0x3010
STMIA r0, {r1-r10}
MOV pc, r13
NOP
NOP
NOP
PtInitRemap
DCD SetSVC
]
;/------------------------------------------------------------------/
;/ If we are in User mode, get into SVC mode by SWI call. /
;/------------------------------------------------------------------/
SetSVC
MRS r0, cpsr
AND r1, r0, #PSR_Mode_Mask
TEQ r1, #PSR_SVC_Mode ; Test if in SVC mode
BEQ InitINT ; if not, skip.
;/------------------------------------------------------------------/
;/ Setup temporary SWI vector to enter SVC mode. /
;/ ; Later this vector is to be changed. /
;/------------------------------------------------------------------/
;IMPORT SWIWrapper
;LDR r0, =HandleSwi ; SWI exception handler address
;LDR r1, =SWIWrapper ; ( = 0x1000008)
;STR r1, [r0]
;SWI 0xff ; Set SVC mode.
InitINT
;/------------------------------------------------------------------/
;/ Enable the FIQ if requested /
;/------------------------------------------------------------------/
[ :DEF: ENABLE_FIQ_FOREVER
MRS r0, cpsr
BIC r0, r0, #PSR_F_Bit
MSR cpsr_cxsf, r0
]
;/------------------------------------------------------------------/
;/ Initialize Interrupt Contollers(20 Interrupts) /
;/------------------------------------------------------------------/
LDR r0, =INTMODE ; Init Interupt Mode Register
LDR r1, =0x0 ; -> All IRQ mode
STR r1, [r0]
LDR r0, =INTPEND ; Init Interupt Pending Register
LDR r1, =0x7fffff ; -> Clear all pending bits
STR r1, [r0]
LDR r0, =INTMASK ; Init Interrupt Mask Register
LDR r1, =0xffffff ; -> Diasable all interrupts
STR r1, [r0]
;/------------------------------------------------------------------/
;/ Initialize the C run time environment /
;/------------------------------------------------------------------/
BL SysInitVars ; begin.s / rombegin.s
;/----------------------------------------------------------------------/
;/ Go into each mode in turn and set up the stack pointer for that mode./
;/ The stacks are defined in the BSS segment at the end of this file. /
;/ If you wish to change the sizes of the stacks they should be /
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -