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

📄 startup.s

📁 基于S3C2410和SM501的彩屏控制器程序
💻 S
字号:
; 2003.09.23 KT2000N

; *******************************************************
; * NAME    : STARTUP.S				                    *
; * Version : 25.11.2002   ver 1.0 (8MBYTE)           *
; * Project name: MBA-2410(S3C2410)                    *
; * Description:					                    *
; *	C start up codes				                    *
; *	Configure Memory, Initialize Ports, ISR, Stacks     *
; *	Initialize C-variables				                *
; *	Fill zeros into zero-initialized C-variables	    *
; *                                                     *
; *                                 CONSINE,CO LTD. *
; *******************************************************
;;------------------------------------
;; | 	      RESERVED		    |
;; |----------------------------|0x48000000
;; | 	      (NAND FLASH)	    |
;; |----------------------------|0x40000000 
;; |	      RESERVED			|
;; |----------------------------|0x38000000
;; |	 Interrupt Handler	    |
;; |----------------------------|0x37FFFF00
;; |	    STACK AREA		    |
;; |----------------------------|0x37000000
;; |     HEAP AREA(R/W base)    |
;; |----------------------------|0x31000000 DATA AREA(R/W AND ZI)
;; |   APPLICATION AREA(SDRAM)	|
;; |----------------------------|0x30000000
;; |          RESERVED          |
;; |----------------------------|0x28000000
;; |	      SM501  		    |
;; |----------------------------|0x20000000 (128KBYTE)
;; |          RESERVED          |
;; |----------------------------|0x08000000
;; |         (NORFLASH)	        |
;;  ---------------------------- 0x00000000 BOOT RO BASE 0x00

_ISR_STARTADDRESS   	EQU   0x37FFFF00 
;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

R1_I					EQU		(1<<12)


				    	AREA    Init,CODE,READONLY
		    			GET		2410.s

						IMPORT	|Image$$BOOTROM$$Limit|
						IMPORT  |Image$$SDRAM$$Base|
						IMPORT  |Image$$SDRAM$$Limit|
						IMPORT	|Image$$SDRAM$$Length|
						IMPORT	|Image$$SDRAM1$$ZI$$Base|
						IMPORT	|Image$$SDRAM1$$ZI$$Limit|
						IMPORT	|Image$$SDRAM1$$Base|
						IMPORT	|Image$$SDRAM1$$Limit|
						IMPORT	|Image$$SDRAM1$$Length|		
						IMPORT	main_boot
						EXPORT __user_initial_stackheap


    ENTRY
    	b ResetHandler  ;for debug  0x00
    	b HandlerUndef  ;handlerUndef	0x04
    	b HandlerSWI    ;SWI interrupt handler	0x08
    	b HandlerPabort ;handlerPAbort	0x0c
    	b HandlerDabort ;handlerDAbort	0x10
    	b .		        ;handlerReserved	0x14
    	b HandlerIRQ	;0x18
    	b HandlerFIQ	;0x1c

     ;***************
     ;*	 START      *
     ;***************		

ResetHandler  
		ldr    r0,=|Image$$BOOTROM$$Limit|
		ldr    r0,=|Image$$SDRAM$$Length|
		ldr    r0,=|Image$$SDRAM$$Base|
		ldr    r0,=|Image$$SDRAM1$$Base|
		ldr    r0,=|Image$$SDRAM1$$Length|
		ldr    r0,=|Image$$SDRAM1$$ZI$$Base|
		ldr    r0,=|Image$$SDRAM1$$ZI$$Limit|		      
		ldr    r0,=|Image$$SDRAM$$Limit|
		ldr    r0,=|Image$$SDRAM1$$Limit|
		

    	mrs    r0,cpsr
		bic	   r0,r0,#0x1f
		orr	   r0,r0,#0xd3
		msr	   cpsr_cxsf,r0	

    	ldr    r0,=WTCON	    ;watch dog disable
    	ldr    r1,=0x0
    	str    r1,[r0]

		ldr		r0,=1000
delay1
		sub		r0,r0,#1  ;r0-1->r0
    	cmp		r0,#0x1
    	bne		delay1  ;!= 
    	
		
		mov	r1, #0xffffffff
		ldr	r0, =INTMSK
		str	r1, [r0]

		ldr	r1, =0x7ff
		ldr	r0, =INTSUBMSK
		str	r1, [r0] 
;****************************************************
;*	Configuration Port control registers		    *
;****************************************************

; Clock configration
		ldr 	r0,=LOCKTIME	;PLL lock counter value;
		ldr		r1,=0xFFFFFF
		str		r1,[r0]

		ldr		r0,=MPLLCON		;Fout=(MDIV+8)*Fin/((PDIV+2)*2^SDIV)
								;Fout*2^SDIV<170 and 1<Fin/(PDIV+2)<2
								;MDIV=bit 19-12,PDIV=bit 9-4 SDIV=bit 1-0	
		ldr		r1,=0x44011		;152M					
		str		r1,[r0]			

		ldr		r0,=4000        ;
delay2
		sub		r0,r0,#1  ;r0-1->r0
    	cmp		r0,#0x1
    	bne		delay2  ;!= 
		
			

    					
		ldr		r0,=UPLLCON		;USB时钟
		ldr		r1,=0x48032		;					
		str		r1,[r0]			

		ldr		r0,=CLKCON		;enable peripherals clock
		ldr		r1,=0x7fff0		;使能外部时钟
		str		r1,[r0]
		
		ldr		r0,=4000        ;
delay3
		sub		r0,r0,#1  ;r0-1->r0
    	cmp		r0,#0x1
    	bne		delay3  ;!=
    			
		ldr	r0, =CLKDIVN        ;分频比
	    mov	r1, #3
	    str	r1, [r0]
	    

;;;Nandinit
	mov	r1, #0x4E000000
	ldr	r2, =0xf830		; initial value
	str	r2, [r1, #0x00]
	ldr	r2, [r1, #0x00]
	bic	r2, r2, #0x800		; enable chip
	str	r2, [r1, #0x00]
	mov	r2, #0xff		; RESET command
	strb	r2, [r1, #0x04]
	mov	r3, #0			; wait 
one	add	r3, r3, #0x1
	cmp	r3, #0xa
	blt	one
two	ldr	r2, [r1, #0x10]	; wait ready
	tst	r2, #0x1
	beq	two
	ldr	r2, [r1, #0x00]
	orr	r2, r2, #0x800		; disable chip
	str	r2, [r1, #0x00]
	
;;;Nandinit
		mov	r0, #0
		mcr	p15, 0, r0, c7, c7, 0	
		mcr	p15, 0, r0, c8, c7, 0	

		mrc	p15, 0, r0, c1, c0, 0
		bic	r0, r0, #0x00002300	
		bic	r0, r0, #0x00000087	
		orr	r0, r0, #0x00000002	
		orr	r0, r0, #0x00001000	
		mcr	p15, 0, r0, c1, c0, 0


 	    
	
;Memory configration
		ldr		r0,=SMRDATA		;
		ldmia 	r0,{r1-r13}     ;将r0中的数据读到r1--r13中,r0自动加1
		ldr		r0,=BWSCON
		stmia	r0,{r1-r13}

;****************************************************
;*	Initialize stacks				                *
;****************************************************
    	ldr		sp, =SVCStack
    	bl		InitStacks	

;init interrupt controller
    	ldr		r0,=INTMOD			;all interrupt is IRQ interrupt
    	ldr		r1,=0x0
    	str		r1,[r0]
    	    	    	
    	ldr    	r3, =0x30000000		
    	ldr    	r1, =0x30140000 
    	mov    	r2, #0    	
3
    	cmp    	r3, r1	    		;把0x30100000--0x30140000清0
    	strcc  	r2, [r3],#4
    	bcc    	%b3

		ldr    	r3, =0x37000000
    	ldr    	r1, =0x37020000 
    	mov    	r2, #0    	
4
    	cmp    	r3, r1	    		;把0x37000000--0x037020000清0
    	strcc  	r2, [r3],#4			
    	bcc    	%b4 
    	

   						
;****************************************************搬系统程序到运行区域

    	ldr		r0,=|Image$$BOOTROM$$Limit|;****ROM代码区结束地址(=ROM数据的起始地址)
		ldr		r1,=|Image$$SDRAM$$Limit|;****
		ldr		r3,=|Image$$SDRAM$$Length|;****
		ldr		r4,=|Image$$SDRAM$$Base|;****
		ldr		r5,=0
0
   		cmp   	r5, r3	    	; Copy prog to SDRAM
    	ldrcc  	r2, [r0],#4    	;--> LDRCC r2, [r0] + ADD r0, r0, #4//r0
    	strcc  	r2, [r4],#4    	;--> STRCC r2, [r1] + ADD r1, r1, #4
    	add	   	r5,r5,#4
    	bcc    	%b0

    	ldr     	r3,=|Image$$SDRAM1$$Base|
    	ldr		r1,=|Image$$SDRAM1$$Length|
		ldr		r5,=0
1
    	cmp    	r5, r1	    	; Copy init data
    	ldrcc  	r2, [r0],#4    	;--> LDRCC r2, [r0] + ADD r0, r0, #4
    	strcc  	r2, [r3],#4    	;--> STRCC r2, [r1] + ADD r1, r1, #4
    	add	   	r5,r5,#4
    	bcc   	%b1
				
						;Zero init base => top of initialised data
    	ldr    	r3, =|Image$$SDRAM1$$ZI$$Base|						
						; Top of zero init segment
    	ldr    	r1, =|Image$$SDRAM1$$ZI$$Limit| 
    	mov    	r2, #0
2
    	cmp    	r3, r1	    	; Zero init
    	strcc  	r2, [r3],#4
    	bcc    	%b2
    	
  		mrc	p15, 0, r1, c1, c0, 0		
		orr	r1, r1, #0xc0000000		
		mcr	p15, 0, r1, c1, c0, 0		
    		    	
loop 					;主循环部分	
   ;	 LDR     r0,=PDATG
	;    LDR     r1,[r0]
	 ;   EOR     r1,r1,#4
	 ;   STR     r1,[r0]		;喂狗部分
	 
		bl		main_boot
		b		loop

		B		.
    	
    	DCB		"####广州市科赛恩电气技术有限公司###"
    	DCB		"www.cosine-ee.com"

HandlerFIQ
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandleFIQ
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}
    	

HandlerUndef
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandleUndef
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}


HandlerSWI
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandleSWI
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}

HandlerDabort
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandleDabort
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}

HandlerPabort
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandlePabort
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}


HandlerIRQ	
        sub     sp,sp,#4
        stmfd   sp!,{r0}
        ldr     r0,=HandleIRQ
        ldr     r0,[r0]
        str     r0,[sp,#4]
        ldmfd   sp!,{r0,pc}

__user_initial_stackheap
	LDR r0, =|Image$$SDRAM1$$ZI$$Limit| ;Heap B
	LDR r1, =|Image$$SDRAM1$$ZI$$Limit| ;Stack B
	add r1,r1,#0x8000
	; r2 not used (HL)
	; r3 not used (SL)
	MOV pc, lr

;****************************************************
;*	The function for initializing stack	            *
;****************************************************
InitStacks
    	mrs    r0,cpsr
    	bic    r0,r0,#MODEMASK        ;MODEMASK=0x1f
    	orr    r1,r0,#UNDEFMODE|NOINT ;UNDEFMODE=0x1b ;NOINT=0xc0
    	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

    	mov    pc,lr ;The LR register may be not valid for the mode changes.子程序返回 


SMRDATA
		DCD		0x221ed110  	;2410;分配一段内存单元
		DCD		0x7ffc			;GCS0:BOOT ROM;;
		DCD		0x7ffc			;GCS1 no use;;;
		DCD		0x700			;GCS2 Nor FLASH;;
		DCD		0x1f4c			;GCS4 no use;;;
		DCD		0x54a8			;GCS5 no use;;
		DCD		0x700			;GCS3 no use;;
		DCD		0x18009			;GCS6;; 
		DCD		0x18009			;GCS7 no use;;
		DCD		0x8e0459		;REFRESH
		DCD		0x32			;SCLK BANKSIZE=8M
		DCD		0x30			;MRSR6 CL=2clk
		DCD		0x30			;MRSR7
	 		

	ALIGN


	AREA RamData, DATA, READWRITE

	^	(_ISR_STARTADDRESS-0x20000)

UserStack	#	256
SVCStack	#	65536
UndefStack	#	256
AbortStack	#	256
IRQStack	#	4096
FIQStack	#	256


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

		END
		

	

⌨️ 快捷键说明

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