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

📄 startup.s

📁 支持三星原产的S3C2413开发板
💻 S
字号:
   
	OPT 2

	INCLUDE kxarm.h
	INCLUDE option.inc
	INCLUDE s2413ADDR.inc
	INCLUDE memcfg.inc

	OPT 1
	OPT 128
	
; 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

; Stack locations.
;
SVCStack	EQU	(_STACK_BASEADDRESS-0x2800) 	; 0x33ff5800 ~
UserStack	EQU	(_STACK_BASEADDRESS-0x3800)	  	; 0x33ff4800 ~ 
UndefStack	EQU	(_STACK_BASEADDRESS-0x2400) 	; 0x33ff5c00 ~
AbortStack	EQU	(_STACK_BASEADDRESS-0x2000) 	; 0x33ff6000 ~
IRQStack	EQU	(_STACK_BASEADDRESS-0x1000)	  	; 0x33ff7000 ~
FIQStack	EQU	(_STACK_BASEADDRESS-0x0)		; 0x33ff8000 ~ 

;------------------------------------------------------------------------------
; Sleep state constants 
; 
; Location of sleep data 

; BUGBUG - this needs to be declared as a local var.

SLEEPDATA_BASE_PHYSICAL		 EQU	 0x30028000
WORD_SIZE						EQU		0x4
; Sleep State memory locations

SleepState_Data_Start		   EQU	 (0)
SleepState_WakeAddr			 EQU	 (SleepState_Data_Start  + 0)
SleepState_MMUCTL			   EQU	 (SleepState_WakeAddr	+ WORD_SIZE)
SleepState_MMUTTB			   EQU	 (SleepState_MMUCTL	  + WORD_SIZE)
SleepState_MMUDOMAIN			EQU	 (SleepState_MMUTTB	  + WORD_SIZE)
SleepState_SVC_SP			   EQU	 (SleepState_MMUDOMAIN   + WORD_SIZE)
SleepState_SVC_SPSR			 EQU	 (SleepState_SVC_SP	  + WORD_SIZE)
SleepState_FIQ_SPSR			 EQU	 (SleepState_SVC_SPSR	+ WORD_SIZE)
SleepState_FIQ_R8			   EQU	 (SleepState_FIQ_SPSR	+ WORD_SIZE)
SleepState_FIQ_R9			   EQU	 (SleepState_FIQ_R8	  + WORD_SIZE)
SleepState_FIQ_R10			  EQU	 (SleepState_FIQ_R9	  + WORD_SIZE)
SleepState_FIQ_R11			  EQU	 (SleepState_FIQ_R10	 + WORD_SIZE)
SleepState_FIQ_R12			  EQU	 (SleepState_FIQ_R11	 + WORD_SIZE)
SleepState_FIQ_SP			   EQU	 (SleepState_FIQ_R12	 + WORD_SIZE)
SleepState_FIQ_LR			   EQU	 (SleepState_FIQ_SP	  + WORD_SIZE)
SleepState_ABT_SPSR			 EQU	 (SleepState_FIQ_LR	  + WORD_SIZE)
SleepState_ABT_SP			   EQU	 (SleepState_ABT_SPSR	+ WORD_SIZE)
SleepState_ABT_LR			   EQU	 (SleepState_ABT_SP	  + WORD_SIZE)
SleepState_IRQ_SPSR			 EQU	 (SleepState_ABT_LR	  + WORD_SIZE)
SleepState_IRQ_SP			   EQU	 (SleepState_IRQ_SPSR	+ WORD_SIZE)
SleepState_IRQ_LR			   EQU	 (SleepState_IRQ_SP	  + WORD_SIZE)
SleepState_UND_SPSR			 EQU	 (SleepState_IRQ_LR	  + WORD_SIZE)
SleepState_UND_SP			   EQU	 (SleepState_UND_SPSR	+ WORD_SIZE)
SleepState_UND_LR			   EQU	 (SleepState_UND_SP	  + WORD_SIZE)
SleepState_SYS_SP			   EQU	 (SleepState_UND_LR	  + WORD_SIZE)
SleepState_SYS_LR			   EQU	 (SleepState_SYS_SP	  + WORD_SIZE)
SleepState_Data_End			 EQU	 (SleepState_SYS_LR	  + WORD_SIZE)

SLEEPDATA_SIZE				  EQU	 (SleepState_Data_End - SleepState_Data_Start) / 4


	MACRO
	LED_ON	$data

	LDR	r10, = GPFDN
	LDR	r11, = 0x00ff	;Pull-Down Disable
	STR	r11, [r10]
	
	LDR	r10, = GPFCON
	LDR	r11, = (0x5500)	; GPF[7:4] Output .
	STR	r11, [r10]
	LDR	r10, =GPFDAT
	LDR	r11, =$data
	MOV	 r11, r11, lsl #4	; [7:4]
  	STR	r11, [r10]
  	MEND
  	
  	

	IMPORT main	; C entrypoint for Steppingstone loader.

	EXPORT MMU_EnableICache
 	EXPORT MMU_SetAsyncBusMode
  
	STARTUPTEXT
	LEAF_ENTRY StartUp
	
	b	ResetHandler  
	b	.
	b	.
	b	.		
	b	.		
	b	.		
	b	.			
	b	.
			

;-----------------------------------
; Steppingstone loader entry point.
;-----------------------------------
ResetHandler
	ldr		r0,=WTCON			;	Disable WatchDog.
	mov		r1,#0
	str		r1,[r0]

	ldr	r0, =BANK_CFG			;	ebi
	ldr	r1, =BANK_CFG_VAL			; Refer option.inc
	str	r1,[r0]			

	ldr	 r0, = GPFCON
	ldr	 r1, = 0x5500	  
	str	 r1, [r0]

	ldr	 r0, = INTMSK
	ldr	 r1, = 0xffffffff		; disable all interrupts
	str	 r1, [r0]

	ldr	 r0, = INTSUBMSK
	ldr	 r1, = 0x7fff			 ; disable all sub interrupt
	str	 r1, [r0]

	ldr	 r0, = INTMOD
	mov	 r1, #0x0			; set all interrupt as IRQ
	str	 r1, [r0]


 LED_ON	~0x2


 LED_ON	~0x3

	ldr		r0,=CLKDIVN			;	Set Clock Divider
	ldr		r1,[r0]
	bic		r1,r1,#0xf
	ldr		r2,=((Startup_USB48div<<6)+(Startup_ARMCLKdiv<<3)+(Startup_PCLKdiv<<2)+(Startup_HCLKdiv)) 
	orr		r1,r1,r2
	str		r1,[r0]			
 
 LED_ON	~0x4
 	ldr		r0,=UPLLCON			;	Set UPLL
	ldr		r1,=((0<<20)+(Startup_UMdiv<<12)+(Startup_UPdiv<<4)+(Startup_USdiv))
	str		r1,[r0]			
	
	ldr		r0,=MPLLCON			;	Set MPLL
	ldr		r1,=((0<<20)+(Startup_Mdiv<<12)+(Startup_Pdiv<<4)+(Startup_Sdiv))
	str		r1,[r0]			

 LED_ON	~0x5
	ldr		r0,=CLKSRC			;	Select MPLL clock out for SYSCLK
	ldr		r1,[r0]
	orr		r1,r1,#0x30			; Set MPLL=FCOUTmpll, UPLL=FOUTupll
	str		r1,[r0]			



	; Set up the memory control registers.
	;
 LED_ON	~0x6
	bl		InitMEM


 LED_ON	~0x7

	bl		InitSSMC				
		
  
	; If this is a cold boot or a warm reset, clear RAM because the RAM filesystem may be
	; bad.  If this is a software reboot (triggered by the watchdog timer), don't clear RAM.
	;
		[ {FALSE}
	ldr		r1, =GSTATUS2   ; Determine why we're in the startup code.
	ldr		r10, [r1]	   ; 
	str  	r10, [r1]	   ; Clear GPSTATUS2.
	tst		r10, #0x4	   ; Watchdog (software) reboot?  Skip code that clears RAM.
	bne		%F30
	;;
	;;; TBD
	;;
	
	 	]

	 	[ {FALSE}	; DonGo
	; Clear RAM.
	;
	mov 	r1,#0
	mov 	r2,#0
	mov 	r3,#0
	mov 	r4,#0
	mov 	r5,#0
	mov 	r6,#0
	mov 	r7,#0
	mov 	r8,#0
	
	ldr		r0,=0x30000000   ; Start address (physical 0x3000.0000).
	ldr		r9,=0x04000000   ; 64MB of RAM.
20	
	stmia	r0!, {r1-r8}
	subs	r9, r9, #32 
	bne		%B20
	]

	
	; Initialize stacks.
	;
30
	mrs	r0,cpsr
	bic	r0,r0,#MODEMASK
;	orr	r1,r0,#UNDEFMODE|NOINT
;	msr	cpsr_cxsf,r1		;UndefMode
;	ldr	sp,=UndefStack		; UndefStack=0x33FF_5C00

;	orr	r1,r0,#ABORTMODE|NOINT
;	msr	cpsr_cxsf,r1		;AbortMode
;	ldr	sp,=AbortStack		; AbortStack=0x33FF_6000

	orr	r1,r0,#IRQMODE|NOINT
	msr	cpsr_cxsf,r1		;IRQMode
	ldr	sp,=IRQStack		; IRQStack=0x33FF_7000

;	orr	r1,r0,#FIQMODE|NOINT
;	msr	cpsr_cxsf,r1		;FIQMode
;	ldr	sp,=FIQStack		; FIQStack=0x33FF_8000

	bic	r0,r0,#MODEMASK|NOINT
	orr	r1,r0,#SVCMODE
	msr	cpsr_cxsf,r1		;SVCMode
	ldr	sp,=SVCStack		; SVCStack=0x33FF_5800
	
	; Jump to main C routine.
	;
	 LED_ON	~0x8

	bl		main

	b 		.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	LTORG
	
InitMEM		

	;Set SDR Memory parameter control registers
	;adr		r0, =MEMDATA
	add	 r0, pc, #MEMDATA - (. + 8)

	ldr		r1,=BANKCFG	;
	add		r2, r0, #16	;End address of MEMDATA
110
	ldr		r3, [r0], #4
	str		r3, [r1], #4
	cmp		r2, r0
	bne		%B110


	ldr		r2,=BANKCON1
	ldr		r1,[r2]
	bic		r1,r1,#(0x3<<0)
	orr		r1,r1,#(0x1<<0)			;	4nd	:	Issue a PALL command
	str		r1,[r2]			

	ldr		r4,=REFRESH			;	5fh : refresh cycle every 255-clock cycles
	ldr		r0,=0xff
	str		r0,[r4]					

	IF :DEF: mMDR
	ldr		r4,=DSC1			;   for MDRAM hsjang 0605017
	ldr		r1,[r4]
	ldr		r0,=0x30000
	orr		r1,r1,r0
	str		r1,[r4]
	ENDIF	
	
	mov	r0, #0x100					;	6th : wait 2 auto - clk
120				subs	r0, r0,#1;
	bne	%B120	

	bic		r1,r1,#(0x3<<0)			;	7th	:	Issue a MRS command
	orr		r1,r1,#(0x2<<0)
	str		r1,[r2]			

	ldr		r4,=REFRESH			;	8fh : refresh  normal
	ldr		r0,=REFCYC
	str		r0,[r4]					

	orr		r1,r1,#(0x3<<0)			;	9th	:	Issue a EMRS command
	str		r1,[r2]			

	bic		r1,r1,#(0x3<<0)			;	10th	:	Issue a Normal mode
	str		r1,[r2]			

	mov	pc, lr
	
;-----------------------------------------------------
InitSSMC

	;Set SSMC Memory parameter control registers : AMD Flash
	ldr		r0,=SMBIDCYR0
	ldr		r1,=IDCY0
	str		r1,[r0]
	
	ldr		r0,=SMBWSTRDR0
	ldr		r1,=WSTRD0
	str		r1,[r0]
	
	ldr		r0,=SMBWSTWRR0
	ldr		r1,=WSTWR0
	str		r1,[r0]
	
	ldr		r0,=SMBWSTOENR0
	ldr		r1,=WSTOEN0
	str		r1,[r0]
	
	ldr		r0,=SMBWSTWENR0
	ldr		r1,=WSTWEN0
	str		r1,[r0]
	
	ldr		r0,=SMBCR0
	ldr		r1,=(SMBCR0_2+SMBCR0_1+SMBCR0_0)
	str		r1,[r0]
	
	ldr		r0,=SMBWSTBRDR0
	ldr		r1,=WSTBRD0
	str		r1,[r0]

	
	ldr		r0,=SMBWSTBRDR0
	ldr		r1,=WSTBRD0
	str		r1,[r0]

	ldr		r0,=SSMCCR
	ldr		r1,=((MemClkRatio<<1)+(SMClockEn<<0))
	str		r1,[r0]
	
	mov pc, lr

	LTORG

MEMDATA			DATA
				DCD		((RASBW0<<17)+(RASBW1<<14)+(CASBW0<<11)+(CASBW1<<8)+(ADDRCFG0<<6)+(ADDRCFG1<<4)+(MEMCFG<<2)+(BW<<0))
				DCD		((BStop<<7)+(WBUF<<6)+(AP<<5)+(PWRDN<<4) + (1<<28) + (1<<26))
				DCD		((tRAS<<20)+(tRC<<16)+(CL<<4)+(tRCD<<2)+(tRP<<0))
				DCD		((BA_EMRS<<30)+(DS<<21)+(PASR<<16)+(BA_MRS<<14)+(TM<<7)+(CL_MRS<<4))

				
;-------------------------------------------------------------------------------------------------

;------------------------------------
; MMU Cache/TLB/etc on/off functions
;------------------------------------
R1_I	EQU	(1<<12)
R1_C	EQU	(1<<2)
R1_A	EQU	(1<<1)
R1_M  	EQU	(1)
R1_iA	EQU	(1<<31)
R1_nF 	EQU	(1<<30)

; void MMU_EnableICache(void);
;
	LEAF_ENTRY MMU_EnableICache	
	
	mrc 	p15, 0, r0, c1, c0, 0
	orr 	r0, r0, #R1_I
	mcr 	p15, 0, r0, c1, c0, 0
	mov 	pc, lr

; void MMU_SetAsyncBusMode(void);
; FCLK:HCLK= 1:2
;
	LEAF_ENTRY MMU_SetAsyncBusMode
	mrc 	p15, 0, r0, c1, c0, 0
	orr 	r0, r0, #R1_nF:OR:R1_iA
	mcr 	p15, 0, r0, c1, c0, 0
	mov 	pc, lr


; NAND code...
;
A410_BASE_ADDR	EQU	0x2000000

;;;	MACRO
;;;	LDR4STR1 $src,$tmp1,$tmp2	
;;;	ldrb	$tmp1,[$src]
;;;	ldrb	$tmp2,[$src]
;;;	orr		$tmp1,$tmp1,$tmp2,LSL #8
;;;	ldrb	$tmp2,[$src]
;;;	orr		$tmp1,$tmp1,$tmp2,LSL #16
;;;	ldrb	$tmp2,[$src]
;;;	orr		$tmp1,$tmp1,$tmp2,LSL #24
;;;	MEND

	EXPORT	__RdPage512
__RdPage512
	;input:a1(r0)=pPage
	stmfd	sp!,{r1-r11}

	ldr		r1,=0x4e000010  ;NFDATA
	mov		r2,#0x200
10	
	ldr 		r4,[r1]
	ldr 		r5,[r1]
	ldr 		r6,[r1]
	ldr 		r7,[r1]
	ldr 		r8,[r1]
	ldr 		r9,[r1]
	ldr 		r10,[r1]
	ldr 		r11,[r1]
	stmia	r0!,{r4-r11}
	subs		r2,r2,#32
	bne		%B10

	ldmfd	sp!,{r1-r11}
	mov		pc,lr


	END

⌨️ 快捷键说明

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