⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.s

📁 ARM920T S3C440B 原碼
💻 S
字号:
; *******************************************************
; * NAME    : Init.S					*
; * Version : 11.Nov.2005				*
; * Description:					*
; *	C start up codes				*
; *	Configure memory, Initialize ISR ,stacks	*
; *	Initialize C-variables				*
; *	Fill zeros into zero-initialized C-variables	*
; *     Author: Victor Fan Created                      *
; *******************************************************
 
;    GET ..\inc\option.s
;    GET ..\inc\memcfg.s

_ISR_STARTADDRESS EQU   0xc7fff00    


;Pre-defined constants
USERMODE    EQU	0x10
FIQMODE	    EQU	0x11
IRQMODE	    EQU	0x12
SVCMODE	    EQU	0x13
ABORTMODE   EQU	0x17
UNDEFMODE   EQU	0x1b
MODEMASK    EQU	0x1f
NOINT	    EQU	0xc0

T_bit       EQU 0x20


    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    ; The main entry of mon program 					
    AREA    Init,CODE,READONLY

    ENTRY 
    b ResetHandler  ;for debug
    b .
    b .
    b .
    b .
    b .		    
    b .
    b .


;Add all interrupt source in there like above

IsrIRQ	

;1. Follow the SoC's interrupt controller and decided the interrupt source
;2. Load the interrrupt service routine 
;3. pc = interrupt service routine

;****************************************************
;*	START					    *
;****************************************************
ResetHandler

;1. Disable all interrupt
;2. Setup PLL
;3. Setup all SoC special register

    ;****************************************************
    ;*	Set memory control registers			* 	
    ;****************************************************
;Set all memory controller parameter
;SDRAM parameter    
    ;****************************************************
    ;*	Initialize stacks				* 
    ;****************************************************
    ldr	    sp, =SVCStack	;Why?
    bl	    InitStacks
    LDR		R2,=0xc000000
    SWP		R0,R1,[R2]
;	LDMFD SP!,{R0,R1,R2}
;	LDMFA SP!,{R0,R1,R2}
;	STMFD SP!,{R0-R3}
;	STMFA SP!,{R0-R3}
;	LDMED SP!,{R0,R1,R2}
;	LDMEA SP!,{R0,R1,R2}
;	STMED SP!,{R0-R3}
;	STMEA SP!,{R0-R3}
;	MOV   R3,#1
;Div1	CMP   R2,#0x80000000
;	CMPCC R2,R1
;	MOVCC R2,R2,LSL#1
;	MOVCC R3,R3,LSL#1
;	BCC   Div1
;	MOV   R4,#0
;Div2    CMP   R1,R2
;	SUBCS R1,R1,R2
;	ADDCS R4,R4,R3
;	MOVS  R3,R3,LSR#1
;	MOVNE R2,R2,LSR#1
;	BNE   Div2		
;	ADD	  R1,R1,R1,LSL#10
;	MOV   R1,R2,LSL#2
;	ADD   R1,R1,R1,LSL#1
;	MOV   R1,R1,LSL#1
	ADD   R1,R1,R1,LSL#2
	ADD   R1,R2,R1,LSL#1
    ;****************************************************
    ;*	Setup IRQ handler				*
    ;****************************************************
    ldr	    r0,=HandleIRQ
    ldr	    r1,=IsrIRQ
    str	    r1,[r0]

    ;********************************************************
    ;*	Copy and paste RW data/zero initialized data	    *
    ;********************************************************
    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	    %F1
0		
    CMP	    r1, r3	    ; Copy init data
    LDRCC   r2, [r0], #4    ;--> LDRCC r2, [r0] + ADD r0, r0, #4		 
    STRCC   r2, [r1], #4    ;--> STRCC r2, [r1] + ADD r1, r1, #4
    BCC	    %B0
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	    %B2
    
;   BL	    Main	    ;Don't use main() because ......
    						

;****************************************************
;*	The function for initializing stack	    *
;****************************************************
InitStacks
	;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

    bic	    r0,r0,#MODEMASK|NOINT
    orr	    r1,r0,#SVCMODE
    msr	    cpsr_cxsf,r1 	    	;SVCMode
    ldr	    sp,=SVCStack

	;USER mode is not initialized.
    mov	    pc,lr ;The LR register may be not valid for the mode changes.
    

	AREA RamData, DATA, READWRITE
	^	(_ISR_STARTADDRESS-10240)
				
UserStack	#	2048	;(c7)ffa00
SVCStack	#	2048	;(c7)ffb00
UndefStack	#	2048	;(c7)ffc00
AbortStack	#	2048	;(c7)ffd00
IRQStack	#	2048	;(c7)ffe00
FIQStack	#	0	;(c7)fff00


		^	_ISR_STARTADDRESS
HandleReset	#	4
HandleUndef	#	4
HandleSWI	#	4
HandlePabort	#	4
HandleDabort	#	4
HandleReserved	#	4
HandleIRQ	#	4
HandleFIQ	#	4

;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
		END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -