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

📄 boot.s

📁 基于ARM核的HMS7202
💻 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

@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;; SDRAM Mode Register
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ 22  20  21  19  18  17  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_NAP,	 0x00a2000c

.equ   SDRAM_CASL,  SDRAM_MODE_CAS2
.equ   SDRAM_CTRL,  SDRAM_CTRL_CAS2_NAP

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

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

@;;;        GBLA    counter
@;;;counter SETA    0
@;;;        WHILE   counter<64     ; Entries for 0-63M
@;;;        DCD     &0
@;;;counter SETA    counter+1
@;;;        WEND
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;; Abort Handlers
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

		.extern  abort

		.ALIGN
UndefinedInstruction:
			mov	r0, #0
			sub r1, lr, #4
			bl  abort
			B	terminate
			
		.ALIGN
syscall_handler:
			mov	r0, #0
			sub r1, lr, #4
			B  syscall_handler
			
		.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
IRQHandler:




		.align
FIQHandler:




/***************************************
;; power up enter here
***************************************/
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, #0x1	@16 bits for access
			orr	r1,	r1, #0x40	@for non_burst RD_WT=15 Acce_WT = 8
			str	r1, [r0]
@;;delay			
			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, #0x66   @ 70.04 Mhz
			str	r1, [r0, #0x28]
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; init_sdram
@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

			ldr	r2, =SDRAM_CTRL
			mov	r1, #0x80000000
			ldr	r3, [r1, #0]
			bic r3,r3,#0xff000000
			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]	 @  sdram_ctl init_val

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

			orr r1,r1,#0xc
			mov r2,#0x80000000
			str r1,[r2,#0]		@enable precharge

			mov r1,#0x10
refloop:
			bl	delay10us
			sub	r1, r1, #1
			cmp	r1, #0
			bne refloop

			mov	r2, #0x118
			mov	r1, #0x80000000
			str	r2, [r1, #4]	 @set the refresh rate

			@enable refresh
			mov r2, #0xa20000
			str r2, [r1]		 @enable refresh
			
@delay for refresh
			mov r1,#0x10			
refloop0:
			bl	delay10us
			sub	r1, r1, #1
			cmp	r1, #0
			bne refloop0


			@ 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, r0
/*			@ 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]

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@;;;; Now Switch to RUN Mode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
L5:			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
			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 + -