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

📄 44binit.s

📁 初学者的第一个成功之作,希望大家共同学习共同进步.其中的S3C44B0X启动代码经过我认真修改过了,很适合初学者使用.
💻 S
字号:
    INCLUDE  option.inc
    INCLUDE  memcfg.inc
    
	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|	
    IMPORT	|Image$$ZI$$Limit|	
	   
;Pre-defined constants
MODE_USR    EQU	 0x10
MODE_FIQ    EQU	 0x11
MODE_IRQ    EQU	 0x12
MODE_SVC    EQU	 0x13
MODE_ABT    EQU	 0x17
MODE_UND    EQU	 0x1B
MODE_SYS    EQU	 0x1F
MODEMASK	EQU  0x1F

I_Bit      EQU  0x80            ; when I bit is set, IRQ is disabled
F_Bit      EQU  0x40            ; when F bit is set, FIQ is disabled
NOINT      EQU  I_Bit|F_Bit

;Interrupt Control
INTPND	    EQU	0x01e00004
INTMOD	    EQU	0x01e00008
INTMSK	    EQU	0x01e0000c
I_ISPR	    EQU	0x01e00020
I_CMST	    EQU	0x01e0001c

;Watchdog timer
WTCON	    EQU	0x01d30000

;Clock Controller
PLLCON	    EQU	0x01d80000
CLKCON	    EQU	0x01d80004
LOCKTIME    EQU	0x01d8000c



;Memory Controller
REFRESH	    EQU 0x01c80024

	
;BDMA destination register
BDIDES0		EQU 0x1f80008
BDIDES1		EQU 0x1f80028


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Code Begin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    AREA    Init,CODE,READONLY

    ENTRY 
    b ResetHandler				
    b HandlerUND				;handlerUndef
    b HandlerSWI				;SWI interrupt handler
    b HandlerPABT				;handlerPAbort
    b HandlerDABT				;handlerDAbort
    b .							;handlerReserved
    ;b HandlerIRQ
    ;b HandlerFIQ
    subs pc,lr,#4
    subs pc,lr,#4
	

;中断向量表
VECTOR_BRANCH
    ldr pc,=HandlerEINT0	;mGA	0x20 
    ldr pc,=HandlerEINT1	;	
    ldr pc,=HandlerEINT2	;
    ldr pc,=HandlerEINT3	;
    ldr pc,=HandlerEINT4567	;
    ldr pc,=HandlerTICK		;mGA	0x34
	b .
	b .
    ldr pc,=HandlerZDMA0	;mGB	0x40
    ldr pc,=HandlerZDMA1	;
    ldr pc,=HandlerBDMA0	;
    ldr pc,=HandlerBDMA1	;
    ldr pc,=HandlerWDT		;
    ldr pc,=HandlerUERR01	;mGB	0x54
    b .
    b .
    ldr pc,=HandlerTIMER0	;mGC	0x60
    ldr pc,=HandlerTIMER1	;
    ldr pc,=HandlerTIMER2	;
    ldr pc,=HandlerTIMER3	;
    ldr pc,=HandlerTIMER4	;
    ldr pc,=HandlerTIMER5	;mGC	0x74
    b .
    b .
    ldr pc,=HandlerURXD0	;mGD	0x80
    ldr pc,=HandlerURXD1	;
    ldr pc,=HandlerIIC		;
    ldr pc,=HandlerSIO		;
    ldr pc,=HandlerUTXD0	;
    ldr pc,=HandlerUTXD1	;mGD	0x94
    b .
    b .
    ldr pc,=HandlerRTC		;mGKA	0xa0
    b .
    b .
    b .
    b .
    b .						;mGKA
    b .
    b .
    ldr pc,=HandlerADC	    ;mGKB	0xc0
    b .						;
    b .						;
    b .						;
    b .						;
    b .						;mGKB
    b .
    b .
    ldr pc,=EnterPWDN		;		0xe0
    b .						
    b .						
    b .						
    b .						
    b .						
    b .
    b .

   


ResetHandler
	ldr	    r0,=INTMSK
    ldr	    r1,=0x07ffffff  	;禁止所有中断
    str	    r1,[r0]

    ldr	    r0,=WTCON	    	;禁止看门狗
    ldr	    r1,=0x0		
    str	    r1,[r0]

   
    ;以下三段设置时钟控制寄存器
    ldr	r0,=LOCKTIME
    ldr	r1,=0xfff			
    str	r1,[r0]

    IF PLLONSTART
		ldr	r0,=PLLCON			;temporary setting of PLL
		ldr	r1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV)
		str	r1,[r0]
    ENDIF

    ldr	    r0,=CLKCON		 
    ldr	    r1,=0x7ff8	    	;All unit block CLK enable	
    str	    r1,[r0]
	
	;****************************************************
	;change BDMACON reset value for BDMA                *
	;****************************************************

    ldr     r0,=BDIDES0       
    ldr     r1,=0x40000000		;BDIDESn reset value should be 0x40000000	 
    str     r1,[r0]

    ldr     r0,=BDIDES1      
    ldr     r1,=0x40000000		;BDIDESn reset value should be 0x40000000	 
    str     r1,[r0]

    ;****************************************************
    ;设定存储器控制寄存器            					* 	
    ;****************************************************
    ldr	    r0,=SMRDATA
    ldmia   r0,{r1-r13}
    ldr	    r0,=0x01c80000		;BWSCON Address
    stmia   r0,{r1-r13}

    ;****************************************************
    ;初始化堆栈              							* 
    ;****************************************************
    ldr	    sp, =StackSVC
    		
    mrs	    r0,cpsr
    bic	    r0,r0,#MODEMASK
    
    orr	    r1,r0,#MODE_UND|NOINT
    msr	    cpsr_cxsf,r1			
    ldr	    sp,=StackUND
	
    orr	    r1,r0,#MODE_ABT|NOINT
    msr	    cpsr_cxsf,r1 	    	
    ldr	    sp,=StackABT

    orr	    r1,r0,#MODE_IRQ|NOINT
    msr	    cpsr_cxsf,r1 	    	
    ldr	    sp,=StackIRQ
	
    orr	    r1,r0,#MODE_FIQ|NOINT
    msr	    cpsr_cxsf,r1 	    	
    ldr	    sp,=StackFIQ

    orr		r1,r0,#MODE_USR|NOINT
    msr		cpsr_cxsf,r1
    ldr		sp,=StackUSR


    ;****************************************************
    ;Copy and paste RW data/zero initialized data    	*
    ;****************************************************
    ldr r0,=|Image$$RO$$Limit|
    ldr r1,=|Image$$RW$$Base|
    ldr r3,=|Image$$ZI$$Base|
    cmp		r0,r1
    beq 	ZI
DICopy
	cmp 	r1,r3
	ldrcc   r2,[r0],#4
	strcc   r2,[r1],#4
ZI
	ldr		r1,=|Image$$ZI$$Limit|
	mov 	r2,#0x0
ZICopy
	cmp 	r3,r1
	strcc   r2,[r3],#4
	bcc 	ZICopy
	
	IMPORT  SYSInit			;The main entry of mon program 
	bl	SYSInit	    		;Don't use main() because ......
	b	.						
  


 
  
;****************************************************
;*	The function for entering power down mode		*
;****************************************************
;void EnterPWDN(int CLKCON);
EnterPWDN
    mov	    r2,r0               ;r0=CLKCON
    ldr	    r0,=REFRESH		
    ldr	    r3,[r0]
    mov	    r1, r3
    orr	    r1, r1, #0x400000   ;self-refresh enable
    str	    r1, [r0]

    nop     ;Wait until self-refresh is issued. May not be needed.
    nop     ;If the other bus master holds the bus, ...
    nop	    ; mov r0, r0
    nop
    nop
    nop
    nop

;enter POWERDN mode
    ldr	    r0,=CLKCON
    str	    r2,[r0]

;wait until enter SL_IDLE,STOP mode and until wake-up
    mov	    r0,#0xff
0   subs    r0,r0,#1
    bne	    %B0

;exit from DRAM/SDRAM self refresh mode.
    ldr	    r0,=REFRESH
    str	    r3,[r0]
    mov	    pc,lr
    
  
  
   
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;Vector Macro;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
    sub	    sp,sp,#4			;decrement sp(to store jump address)
    stmfd   sp!,{r0}			;PUSH the work register to stack(lr does't push because it return to original address)
    ldr	    r0,=$HandleLabel	;load the address of HandleXXX to r0
    ldr	    r0,[r0]				;load the contents(service routine start address) of HandleXXX
    str	    r0,[sp,#4]			;store the contents(ISR) of HandleXXX to stack
    ldmfd   sp!,{r0,pc}			;POP the work register and pc(jump to ISR)
    MEND
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

   
 LTORG	

HandlerFIQ	  HANDLER HandleFIQ
HandlerIRQ	  HANDLER HandleIRQ
HandlerUND	  HANDLER HandleUND
HandlerSWI	  HANDLER HandleSWI
HandlerDABT	  HANDLER HandleDABT
HandlerPABT	  HANDLER HandlePABT

HandlerADC		HANDLER HandleADC
HandlerRTC		HANDLER HandleRTC
HandlerUTXD1	HANDLER HandleUTXD1
HandlerUTXD0	HANDLER HandleUTXD0
HandlerSIO		HANDLER HandleSIO
HandlerIIC		HANDLER HandleIIC
HandlerURXD1	HANDLER HandleURXD1
HandlerURXD0	HANDLER HandleURXD0
HandlerTIMER5	HANDLER HandleTIMER5
HandlerTIMER4	HANDLER HandleTIMER4
HandlerTIMER3	HANDLER HandleTIMER3
HandlerTIMER2	HANDLER HandleTIMER2
HandlerTIMER1	HANDLER HandleTIMER1
HandlerTIMER0	HANDLER HandleTIMER0
HandlerUERR01	HANDLER HandleUERR01
HandlerWDT		HANDLER HandleWDT
HandlerBDMA1	HANDLER HandleBDMA1
HandlerBDMA0	HANDLER HandleBDMA0
HandlerZDMA1	HANDLER HandleZDMA1
HandlerZDMA0	HANDLER HandleZDMA0
HandlerTICK		HANDLER HandleTICK
HandlerEINT4567	HANDLER HandleEINT4567
HandlerEINT3	HANDLER HandleEINT3
HandlerEINT2	HANDLER HandleEINT2
HandlerEINT1	HANDLER HandleEINT1
HandlerEINT0	HANDLER HandleEINT0



SMRDATA   DATA
;*** memory access cycle parameter strategy ***
; 1) Even FP-DRAM, EDO setting has more late fetch point by half-clock
; 2) The memory settings,here, are made the safe parameters even at 66Mhz.
; 3) FP-DRAM Parameters:tRCD=3 for tRAC, tcas=2 for pad delay, tcp=2 for bus load.
; 4) DRAM refresh rate is for 40Mhz. 

    IF BUSWIDTH=16
		DCD 0x11111001	;Bank0=OM[1:0], Bank1~Bank7=16bit
    ELSE 														;BUSWIDTH=32
		DCD 0x22222220	;Bank0=OM[1:0], Bank1~Bank7=32bit
    ENDIF
	DCD ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))	;GCS0
	DCD ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))	;GCS1 
	DCD ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))	;GCS2
	DCD ((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))	;GCS3
	DCD ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))	;GCS4
	DCD ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))	;GCS5
	IF BDRAMTYPE="DRAM" 
	    DCD ((B6_MT<<15)+(B6_Trcd<<4)+(B6_Tcas<<3)+(B6_Tcp<<2)+(B6_CAN))	;GCS6 check the MT value in parameter.a
	    DCD ((B7_MT<<15)+(B7_Trcd<<4)+(B7_Tcas<<3)+(B7_Tcp<<2)+(B7_CAN))	;GCS7
	ELSE 														;"SDRAM"
		DCD ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))	;GCS6
		DCD ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))	;GCS7
	ENDIF
	DCD ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)	;REFRESH RFEN=1, TREFMD=0, trp=3clk, trc=5clk, tchr=3clk,count=1019
	DCD 0x10			;SCLK power down mode, BANKSIZE 32M/32M
	DCD 0x20			;MRSR6 CL=2clk
	DCD 0x20			;MRSR7

	ALIGN
	
	

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;RW BEGIN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	AREA RamData, DATA, READWRITE

	MAP	(_ISR_STARTADDRESS-0x500)
				
StackUSR		#	256	;c1(c7)ffa00
StackSVC		#	256	;c1(c7)ffb00
StackUND		#	256	;c1(c7)ffc00
StackABT		#	256	;c1(c7)ffd00
StackIRQ		#	256	;c1(c7)ffe00
StackFIQ		#	0	;c1(c7)fff00


	MAP	_ISR_STARTADDRESS
HandleReset		#	4
HandleUND		#	4
HandleSWI		#	4
HandlePABT	#	4
HandleDABT	#	4
Reserved	#	4
HandleIRQ		#	4
HandleFIQ		#	4


HandleADC		#	4
HandleRTC		#	4
HandleUTXD1		#	4
HandleUTXD0		#	4
HandleSIO		#	4
HandleIIC		#	4
HandleURXD1		#	4
HandleURXD0		#	4
HandleTIMER5	#	4
HandleTIMER4	#	4
HandleTIMER3	#	4
HandleTIMER2	#	4
HandleTIMER1	#	4
HandleTIMER0	#	4
HandleUERR01	#	4
HandleWDT		#	4
HandleBDMA1		#	4
HandleBDMA0		#	4
HandleZDMA1		#	4
HandleZDMA0		#	4
HandleTICK		#	4
HandleEINT4567	#	4
HandleEINT3		#	4
HandleEINT2		#	4
HandleEINT1		#	4
HandleEINT0		#	4   


		END

⌨️ 快捷键说明

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