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

📄 hmsinit.s

📁 基于ARM核的HMS7202
💻 S
字号:
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;
@;; Copyright (c) 2000-2001 Hyundai Electronics, Ltd. All rights reserved.
@;; 
@;; ArMon Startup Code for
@;;        HMS7201/7202 : CStartup.s
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Some ARM720 CPSR bit discriptions
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.equ   Mode_USR32,	0x10
.equ   Mode_FIQ32,	0x11
.equ   Mode_IRQ32,	0x12
.equ   Mode_ABT32,	0x17
.equ   Mode_UND32,	0x1b
.equ   Mode_SVC32,	0x13

.equ   I_Bit,	0x80
.equ   F_Bit,	0x40

@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; MMU Register discription
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@p15	CP	15
@c0	CN	0
@c1	CN	1
@c2	CN	2
@c3	CN	3

.equ   CtrlMMU,			1
.equ   CtrlAlign,		2
.equ   CtrlCache,		4
.equ   CtrlWBuff,		8
.equ   CtrlBigEnd,		128
.equ   CtrlSystem,		256
.equ   CtrlROM,			512
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ 22  20  21  19  18  18  16  15  14  13  12  11   _AMBA address pin
@ A11 A10 A09 A08 A07 A06 A05 A04 A03 A02 A01 A00  _SDRAM address pin
@     OPCODE     | 0 |   LMODE   |BT |   BL
@ OPCODE
@    'b0000 : Burst Read/Write
@    'bxx01 : Reserved
@    'bxx10 : Burst read and Single write
@    'bxx11 : Reserved
@ LMODE ( CE Latency )
@    'b000  : Reserved
@    'b001  : -
@    'b010  : CAS2
@    'b011  : CAS3
@    'b1xx  : Reserved
@ BT : Burst Type
@    'b0 : Sequential
@    'b1 : Interleave
@ BL : Burst Length
@             BT=0  BT=1
@    'b000  :  1     1
@    'b001  :  2     2
@    'b010  :  4     4
@    'b011  :  8     8
@    'b100  :  R     R
@    'b101  :  R     R
@    'b110  :  R     R
@    'b111  :  F.P.  R
@;
.equ   SDRAM_MODE_CAS2,	 (0x20<<11) @0x10000
.equ   SDRAM_MODE_CAS3,	 (0x30<<11) @0x18000
.equ   SDRAM_MODE_BL1,	 (0x00<<11) @0x0
.equ   SDRAM_MODE_BL2,	 (0x01<<11) @0x800
.equ   SDRAM_MODE_BL4,	 (0x02<<11) @0x1000
.equ   SDRAM_MODE_BL8,	 (0x03<<11) @0x1800

@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Init Register Value
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.equ   SDRAM_CTRL_RFE,		0x00800000	@; Refresh Enable
.equ   SDRAM_CTRL_APE,		0x00400000	@; AutoPrecharge Enable
.equ   SDRAM_CTRL_CAS2,		0x00200000	@; CAS2
.equ   SDRAM_CTRL_CAS3,		0x00300000	@; CAS3
.equ   SDRAM_CTRL_BTE,		0x00080000	@; Data Bus Tristate Enable
.equ   SDRAM_CTRL_CCL,		0x00040000	@; Clock Control Enable
.equ   SDRAM_CTRL_WBE,		0x00020000	@; Write Buffer Enable
.equ   SDRAM_CTRL_B1E,		0x000000c0	@; BANK1 Enable
.equ   SDRAM_CTRL_B0E,		0x0000000c	@; BANK0 Enable


.equ   SDRAM_CTRL_CAS2_AP,	 0x00e200cc @ Disable DataBusTri
@.equ   SDRAM_CTRL_CAS2_AP,	 0x00ea00cc @ Data Bus trista 
.equ   SDRAM_CTRL_CAS2_NAP,	 0x00a200cc
.equ   SDRAM_CTRL_CAS3_AP,	 0x00fa00cc
.equ   SDRAM_CTRL_CAS3_NAP,	 0x00ba00cc

.equ   SDRAM_CTRL_CAS2_TEST,	 0x00a400cc

.equ   SDRAM_CASL,  SDRAM_MODE_CAS2
.equ   SDRAM_CTRL,  SDRAM_CTRL_CAS2_NAP  @iikoy
@.equ   SDRAM_CTRL,  SDRAM_CTRL_CAS2_TEST

@.equ   SDRAM_CASL,  SDRAM_MODE_CAS3
@.equ   SDRAM_CTRL,  SDRAM_CTRL_CAS3_AP
@.equ   SDRAM_CTRL,  SDRAM_CTRL_CAS3_NAP



@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Start here
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			.text
			
			@.extern syscall_handler
			@.extern IRQHandler
			@.extern FIQHandler

			
ENTRY:
			B	ColdReset
			B	UndefHandler
			B	syscall_handler
			B	PrefetchAbort
			B	DataAbort
			B	ReservedHandler
			B	IRQHandler
			B	FIQHandler

           .align
IRQHandler:    
   @将要使用的寄存器压栈r0,r1
   stmdb	sp!, {r0-r11, ip, lr}
   ldr      r0 ,=0x80024090  @中断ID寄存器
   ldr      r0 ,[r0]
   and      r0 ,r0,#0x1f  @取出iqr ID
   ldr      r1 ,=0x80024010  @SVR0
   add      r1 ,r1,r0, asl #2
   ldr      pc ,[r1]
   ldmia	sp!, {r0-r11, ip, lr}/* pop r0-r11, ip, lr */
   subs	     pc, r14, #4
   
    


@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@	.if 1-STANDALONE  @IF STANDALONE = 0
@; #define TF_ARMON_MAGIC 0x41524d4f // ARMO
@		.extern partition_table
@		.long	0x41524d4f   @cmpmi     	r2, pc, asr #26
@		.long partition_table
@	.endif
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Leave as nops
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;        GBLA    counter
@;;counter SETA    0
@;;        WHILE   counter<64     ; Entries for 0-63M
@;;        DCD     &0
@;;counter SETA    counter+1
@;;        WEND
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; Abort Handlers
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			.extern  abort

			.align
UndefHandler:	
			mov	r0, #0
			sub r1, lr, #4
			bl  abort
			B	terminate

			.align
PrefetchAbort:		
			mov	r0, #1
			sub r1, lr, #4
			bl  abort
			B	terminate

			.align
DataAbort:		
			mov	r0, #2
			sub r1, lr, #4
			bl  abort
			B	terminate

			.align
ReservedHandler:		
			mov	r0, #3
			sub r1, lr, #4
			bl  abort
			B	terminate
			
			.align
syscall_handler:
            b syscall_handler
            			
			.align
FIQHandler:
			b FIQHandler
			
            





ColdReset:

            ldr r0,=0x8002b000
            mov r1,#0x0
            str r1,[r0]  @disable watchdog
            
            ldr r0,=0x80024000
            str r1,[r0]  @disable all interrupt
            ldr r0,=0x80024004
            str r1,[r0]  @clear all interrupt pending bits

			ldr	r0,=0x80003000
			ldr	r1, [r0]
			and	r1,	r1, #0x3
			orr	r1,	r1, #0x40
			str	r1, [r0] @设置MEMCFG0寄存器ROM chip0,禁止突发模式,正常访问等待状态数为8


			mov	r1, #0x1000
resetLoop:
			bl	delay10us
			sub	r1, r1, #1
			cmp	r1, #0
			bne resetLoop
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; set system clock to 70 MHz
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			ldr	r0,=0x80001000
			ldr r1, [r0, #0x28]
			bic	r1, r1, #0xff
@;;;;;;;			orr	r1, r1, #0x76   ; 100 Mhz
			orr	r1, r1, #0x66   @ 70.04 Mhz
@;;;;;;;			orr	r1, r1, #0x6e   ; 84.7 Mhz
			str	r1, [r0, #0x28]
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Initialize SDRAM Controller and Seting Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; 7202 support 2 banks, so initialize both of them
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;			ldr	r2, =0x00a200cc

@.equ SDRAM_ini_val,   0x003e0000

/*  SDRAM_IDLE  0x0032,0000  //( 

!(0x1<<23 | 0x3<<2 | 0x3<<6) ) */

@.equ SDRAM_PRECHARGE_CHIP0,  0x007e000c	

/* ( 0x1<<22 | 0x3<<2 ) */
@.equ SDRAM_PRECHARGE_CHIP1,  0x007e00c0	

/* ( 0x1<<22 | 0x3<<6 ) */
@.equ SDRAM_REFRESH,  0xfe000000		

/* ( 0x1<<23 & !(0x3<<6 | 0x3<<2) ) */
/* 	wait for 8us X 2	*/


@.equ SDRAM_complete,  0xfe00cc		

/* (0x1<<23 | 0x3<<6 | 0x3<<2) */

.equ SDRAM_Expect,	0xa2000c

@.equ  SDRAM_mode,	0x32


	ldr r0, =SDRAM_Expect
	mov r1, #0x80000000
	ldr r3, [r1]
	cmp r3,r0
	beq 50	/* need set? */


@	ldr r0, =SDRAM_ini_val		/* init set */
/*	str r0, [r1]

	mov r3,#0x100
 l10:	
	bl	delay10us
	sub r3,r3,#1
	cmp r3,#0
	bne l10


	ldr r2, =SDRAM_PRECHARGE_CHIP0		/* precharge */
/*	ldr r4, =SDRAM_PRECHARGE_CHIP1
	orr r2,r2,r4
	orr r2,r2,r0
	mov r1, #0x80000000
	str r2,[r1]

	mov r3,#0x1000
 l20:	 
	bl	delay10us
	sub r3,r3,#1
	cmp r3,#0
	bne l20
	
	mov r0,#0x80000004		/* set the rest regs */
/*	mov r1,#0x118
	str r1,[r0]

	ldr r4,=SDRAM_REFRESH		/* refresh */
/*	orr r2,r2,r4
	str r2,[r1]

	mov r3,#0x1000
 l30:	
	bl	delay10us
	sub r3,r3,#1
	cmp r3,#0
	bne l30

	mov r1, #0x80000000		/* complete */
/*	ldr r3, =SDRAM_Expect
	str r3,[r1]

	mov r3,#0x1000
 l40:	
	bl	delay10us
	sub r3,r3,#1
	cmp r3,#0
	bne l40


	mov r0,#0x44000000		/* set the mode register */
/*	mov r2,#0x32
	add r0,r0,r2,LSL#11
	ldr r0,[r0]

	bl	delay10us

	mov r0,#0x46000000
	mov r2,#0x32
	add r0,r0,r2,LSL#11
	ldr r0,[r0]




	mov r0,#0x80000008
	mov r1,#0x3
	str r1,[r0]



/*
			ldr	r2, =SDRAM_CTRL
			mov	r1, #0x80000000
			ldr	r3, [r1, #0]
			cmp	r3, r2
			beq	L5
			
			
			@ IO_SdramControl = CAS2|SDRAM_WB;
			mov	r1, #0x220000    @  CAS2
@			mov	r1, #0x320000    @  CAS3
			mov	r2, #0x80000000
			str	r1, [r2, #0]
						
@;			Refresh Value = 0x230 for 16MB(128Mbit)x2
@;			Refresh Value = 0x230/2 for 32MB(256Mbit)x2
@;			For simplicity, Refresh value for 32MBx2 is used, and it would
@;			be no problem for 16MBx2
@;			0x230 >> 1 = 0x118
@
			mov	r2, #0x118
			mov	r1, #0x80000000
			str	r2, [r1, #4]
			
			@enable refresh
			mov r2, #0xa20000
			str r2, [r1]
			
@delay for refresh
			mov r1,#0x10
			
refloop:
			bl	delay10us
			sub	r1, r1, #1
			cmp	r1, #0
			bne refloop
			
@set slots			
			mov r1,#0x80000000
			ldr r2,[r1]
			orr r2,r2,#0xcc
			str r2,[r1]
			


			@ SDRAM Mode Register Setting
			@ Tmp = IO(SdramModeReg | SdramModeBurstLength8 | SdramModeCAS2 |Device0);
			mov	r1, #SDRAM_CASL
			add	r1, r1,  #SDRAM_MODE_BL8
			add	r1, r1, #0x44000000
			ldr	r1, [r1, #0]
			mov	r0, r1
			@ Tmp = IO(SdramModeReg | SdramModeBurstLength8 | SdramModeCAS2 |Device1);
			mov	r1, #SDRAM_CASL
			add	r1, r1,  #SDRAM_MODE_BL8
			add	r1, r1, #0x46000000
			ldr	r1, [r1, #0]
			mov	r0, r1


			ldr	r2, =SDRAM_CTRL
			mov	r1, #0x80000000
			str	r2, [r1, #0]

			mov	r2, #0
			mov	r1, #0x80000000
			str	r2, [r1, #8]
*/
	


@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; End of Initialization
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; MMU Initialization ( Pagetable, and etc )
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
50:
/*			.extern 	L0PageTable
@ Save r0 to #2 reg of coprocessor #15
@ This register value means the pagetable base address
			ldr	r0, =L0PageTable
	@.ifdef ONSDRAM
	@.if ONSDRAM  @IF :DEF: ONSDRAM :LAND: ONSDRAM > 0
			@orr	r0, r0, #0x40000000
	@.endif
	@.endif
			mcr	p15, 0, r0, c2, c0, 0
			nop
			nop
			nop
			nop
			nop
			nop
			mvn	r0, #0
@ Save r0 to #3 reg of coprocessor #15
@ With #3 reg, domain access control can be utilized
			mcr	p15, 0, r0, c3, c0, 0
@ Save r0 to #0 reg of coprocessor #15
@ This enables MMU, Cache and WriteBuffer
			mov	r0, #CtrlMMU+CtrlCache+CtrlWBuff
			mcr	p15, 0, r0, c1, c0, 0
			nop
			nop
			mov	r0, #CtrlMMU+CtrlCache+CtrlWBuff
			mcr	p15, 0, r0, c1, c0, 0
			nop
			nop*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Now Switch to RUN Mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			ldr	r0, =0x80001000
			mov	r1, #1
			str	r1, [r0]
			nop
			nop
			nop
			nop
			nop
# ********************************************************
# *	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
F0:
    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	    F0
F1:
    ldr	    r1, =Image_ZI_Limit					/* Top of zero init segment */
    mov	    r2, #0
F2:
    cmp	    r3, r1	    						/* Zero init */
    strcc   r2, [r3], #4
    bcc	    F2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Setup for each MODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			@; Set up SVC stack to be 4K on top of zero-init data
			LDR	r1, =installStack
			ADD	sp, r1, #4096
			@; Set up IRQ and FIQ stacks
			MOV	r0, #(Mode_IRQ32 | I_Bit)
			MSR	cpsr_csxf, r0
			MOV	r0, r0
			ADD	sp, r1, #4096*2
			MOV	r0, #(Mode_FIQ32 | I_Bit | F_Bit)
			MSR	cpsr_csxf, r0
			MOV	r0, r0
			ADD	sp, r1, #4096*3
			@; Set up undefine stacks
			MOV	r0, #(Mode_UND32 | I_Bit | F_Bit)
			MSR	cpsr_csxf, r0
			MOV	r0, r0
			ADD	sp, r1, #(4096*3+512)
			@; Set up abort stacks
			MOV	r0, #(Mode_ABT32 | I_Bit | F_Bit)
			MSR	cpsr_csxf, r0
			MOV	r0, r0
			ADD	sp, r1, #(4096*3+1024)
			@; Enter SVC mode
			MOV r0,#Mode_SVC32
			MSR cpsr_csxf, r0

			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Setup for each MODE end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;    
    
    
    

	MRS		r0, CPSR
	bic		r0, r0, #(I_Bit | F_Bit)				/* enable interrupt */
	msr		CPSR_cxsf, r0

	# jump to Main()
				.extern Main
	.if STANDALONE  @IF STANDALONE = 1
			MOV	r0, #1 
	.endif
			BL	Main 

			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Abnormal Termination
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

terminate:
			B	terminate

delay10us:
			mov	r0, #10
_delay1us:
			sub	r0, r0, #1
			cmp	r0, #0
			bne	_delay1us
			mov	pc, lr



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Stack Memory Allocation
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			.data 
			@AREA	Stack, ALIGN=10,	DATA, NOINIT
installStack:
			.zero	4096*5
TOPinstallStack:

			.end			
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;; End of CStartup.s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

⌨️ 快捷键说明

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