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

📄 init4510.s

📁 自己编写的bootloader for S3c4510. 1、支持串口下载
💻 S
字号:
;/*************************************************************************/
;/*      init.s                              XZH001 Board version 1.0    */
;/*      This file contains the target processor dependent initialization */
;/*      routines (boot code) and data.                                   */
;/*      This file modified by Hury                                       */
;/*      hefei university of technology 06-15-2006                        */
;/*************************************************************************/
	GET memory.S
	GET 4510b.s
DownloadFLASH   EQU      0		
STACK_BASE  	EQU   0xFFDF00	      ;//16M-256Byte-8KByte,SDRAM区调试
;//STACK_BASE  	EQU   0x11FDF00	      ;//18M-256Byte-8KByte,下载到FLASH时用

		
		AREA    Init, CODE, READONLY
        ENTRY
        B       Reset_Handler
        B       Undefined_Handler
        B       SWI_Handler
        B       Prefetch_Handler
        B       Abort_Handler
        NOP     		; Reserved vector
        B       IRQ_Handler
        B       FIQ_Handler
;==========================================================
; The Default Exception Handler Vector Entry Pointer Setup
;==========================================================
Reset_Handler                           ;/* Reset Entry Point */
	
	LDR R0,=0x3FF0000
	LDR R1,=0xE7FFFF80					;//对应的内部静态4K的SRAM的起始地址0x3FE0000
	STR R1,[R0]
	IF DownloadFLASH = 1
		;//map:  FLASH 0-2M    SDRAM  2-18M
		;//
		LDR	r1, =rEXTDBWTH_F 				;//EXTDBWTH          		
		LDR	r2, =rROMCON0_F  				;//ROMCON0	@ 0M ~ 2M	
		LDR	r3, =rROMCON1_F					;//ROMCON1	@ DISABLED
		LDR	r4, =rROMCON2_F					;//ROMCON1	@ DISABLED
		LDR	r5, =rROMCON3_F					;//ROMCON1	@ DISABLED
		LDR	r6, =rROMCON4_F					;//ROMCON1	@ DISABLED
		LDR	r7, =rROMCON5_F					;//ROMCON1	@ DISABLED
		LDR	r8, =rSDRAMCON0_F				;//SDRAMCON0 	@ 2M ~ 18M
		LDR	r9, =rSDRAMCON1_F				;//SDRAMCON1 	@ DISABLED
		LDR	r10,=rSDRAMCON2_F				;//SDRAMCON2 	@ DISABLED
		LDR	r11,=rSDRAMCON3_F				;//SDRAMCON3 	@ DISABLED
		LDR	r12,=rSREFEXTCON_F			
		
		LDR	r0, =ARM7_EXTDBWTH 			
		STMIA	r0, {r1-r12}			;//从R0指示的地址,依次把R1-R12存入...
	    
	    
	    ;//导入一些链接器预定义的关键变量
	    IMPORT |Image$$RO$$Base|    
		IMPORT |Image$$RO$$Limit|   
		IMPORT |Image$$RW$$Base|   
		IMPORT |Image$$RW$$Limit| 	
		IMPORT |Image$$ZI$$Base| 	
		IMPORT |Image$$ZI$$Limit|
		
		
		;//把代码自己全部拷贝到SDRAM里面去。
		LDR		r0, =|Image$$RO$$Base|      
		LDR		r1, =|Image$$RO$$Limit|      
		LDR		r2, =|Image$$RW$$Base|      
		LDR		r3, =|Image$$RW$$Limit|     

		SUB 	r1, r1, r0				;//r1=r1-r0
		SUB		r3, r3, r2				;//r3=r3-r2
		ADD		r1, r1, r3				;//r1=r1+r3
	
		LDR		r2, =0x200000   ;@2M

	
COPY
		LDR		r3, [r0], #4			;//r3<-[r0]、r0=r0+4
		STR		r3, [r2], #4			;//r3->[r2]、r2=r2+4
		SUBS	r1, r1,   #4			;//r1=r1-4
		BNE		COPY
 		
 		;//rmap:    SDRAM  0-16M  FLASH 16-18M
		;//			
		LDR	r1, =rEXTDBWTH_R 				;//EXTDBWTH          		
		LDR	r2, =rROMCON0_R  				;//ROMCON0	@ 16M ~ 18M	
		LDR	r3, =rROMCON1_R					;//ROMCON1	@ DISABLED
		LDR	r4, =rROMCON2_R					;//ROMCON1	@ DISABLED
		LDR	r5, =rROMCON3_R					;//ROMCON1	@ DISABLED
		LDR	r6, =rROMCON4_R					;//ROMCON1	@ DISABLED
		LDR	r7, =rROMCON5_R					;//ROMCON1	@ DISABLED
		LDR	r8, =rSDRAMCON0_R				;//SDRAMCON0 	@ 0M ~ 16M
		LDR	r9, =rSDRAMCON1_R				;//SDRAMCON1 	@ DISABLED
		LDR	r10,=rSDRAMCON2_R				;//SDRAMCON2 	@ DISABLED
		LDR	r11,=rSDRAMCON3_R				;//SDRAMCON3 	@ DISABLED
		LDR	r12,=rSREFEXTCON_R			
		
		LDR	r0, =ARM7_EXTDBWTH 			
		STMIA	r0, {r1-r12}			;//从R0指示的地址,依次把R1-R12存入...
 		
 		
 		;//把RW段拷贝到RW BASE指定的位置上去,
		;//并且把RW段里的ZI段初始化为零。
		LDR r0, =|Image$$RO$$Limit| 	;//ro的最高地址
		LDR r1, =|Image$$RW$$Base| 		;//rw的base
		LDR r3, =|Image$$ZI$$Base| 		;//zi的base

		CMP r0, r1 
		BEQ %1

0 	    CMP r1, r3 						;// Copy init data
		LDRCC r2, [r0], #4				;//在ARM里,LDRCC是一条条件执行指令。当前面的运算没有设C标志的时候,执行LDR。否则LDRCC就等效于NOP
		STRCC r2, [r1], #4
		BCC %0

1 		LDR r1, =|Image$$ZI$$Limit| 	; Top of zero init segment
		MOV r2, #0

2 		CMP r3, r1 						; Zero init
		STRCC r2, [r3], #4
		BCC %2
 
 	ENDIF
	;====================================================
	; Now change to user mode and set up user mode stack.
	;====================================================
    MRS     r0, cpsr
	BIC	r0, r0, #LOCKOUT | MODE_MASK
				;//清除I(7)、F(6)和低5位模式位,只保留了State bit
	ORR r1, r0, #UDF_MODE	;//未定义模式
	MSR	cpsr_cf, r1
	LDR	sp, =UDF_STACK+0x200		
	
	ORR r1, r0, #ABT_MODE	;//中止模式
	MSR	cpsr_cf, r1
	LDR	sp, =ABT_STACK+0x200		
	
	ORR r1, r0, #SUP_MODE	;//管理模式
	MSR	cpsr_cf, r1
	LDR	sp, =SUP_STACK+0x800	
	
	ORR r1, r0, #IRQ_MODE	;//IRQ 模式
	MSR	cpsr_cf, r1
	LDR	sp, =IRQ_STACK+0x800	
	
	ORR r1, r0, #FIQ_MODE	;//FIQ 模式
	MSR	cpsr_cf, r1
	LDR	sp, =FIQ_STACK+0x800	
	
	ORR	r1, r0, #USR_MODE	;//用户模式
	MSR	cpsr_cf, r1
	LDR	sp, =USR_STACK+0x400

;       /* Call C_Entry application routine with a pointer to the first */
;       /* available memory address after ther compiler's global data   */
;       /* This memory may be used by the application.                  */
	;===========================
	; Now we enter the C Program
	;===========================
    IMPORT  Main 
    BL      Main
    B .
;//-*******************************************************************-//
;//           异常入口
;//-*******************************************************************-//    
    IMPORT	ISR_FiqHandler
FIQ_Handler
	STMFD	sp!, {r0-r7, lr}	;//中断栈保存 
	BL		ISR_FiqHandler		;//中断C处理函数
	LDMFD	sp!, {r0-r7, lr}	;//恢复中断栈
	SUBS	pc, lr, #4			;//返回中断前的程序指针



    IMPORT	ISR_IrqHandler
IRQ_Handler
	STMFD	sp!, {r0-r12, lr}	;//中断栈保存 
	BL		ISR_IrqHandler		;//中断C处理函数
	LDMFD	sp!, {r0-r12, lr}	;//恢复中断栈
	SUBS	pc, lr, #4			;//返回中断前的程序指针


    IMPORT ISR_PreHandler 			;//预取错误中断处理函数
Prefetch_Handler  B  ISR_PreHandler

    IMPORT ISR_AbtHandler			;//中止模式中断处理函数
Abort_Handler     B  ISR_AbtHandler

    IMPORT ISR_UdefHandler			;//未定义指令中断处理函数
Undefined_Handler B  ISR_UdefHandler

    IMPORT ISR_SwiHandler			;//用户软中断处理函数
SWI_Handler       B  ISR_SwiHandler


;//***************************************************/				____________________0x1200000-1
	AREA SYS_STACK, NOINIT,READWRITE				;//			   |  256字节中断向量表 |
;//**************************************************/             |__________________|_0x11FFF00
;                    %       USR_STACK_SIZE		;//1024			   |    SUP stack 2K    |
;USR_STACK										;//				   |____________________|_0x11FF700
;                    %       UDF_STACK_SIZE		;//512			   |    FIQ stack 2K    |
;UDF_STACK										;//				   |____________________|_0x11FEF00	
;                    %       ABT_STACK_SIZE		;//512			   |    IRQ stack 2K    |
;ABT_STACK										;//				   |____________________|_0x11FE700	
;                    %       IRQ_STACK_SIZE		;//2048			   |    ABT stack 0.5K  |
;IRQ_STACK										;//				   |____________________|_0x11FE500	
;                    %       FIQ_STACK_SIZE		;//2048			   |    UDF stack 0.5K  |
;FIQ_STACK										;//				   |____________________|_0x11FE300	
;                    %       SUP_STACK_SIZE      ;//2048			   |    USR stack 1K    |       
;SUP_STACK										;//				   |____________________|_0x11FDF00	
					^    STACK_BASE
USR_STACK			#	USR_STACK_SIZE
UDF_STACK			#	UDF_STACK_SIZE
ABT_STACK			#	ABT_STACK_SIZE
IRQ_STACK			#	IRQ_STACK_SIZE
FIQ_STACK			#	FIQ_STACK_SIZE	
SUP_STACK			#	SUP_STACK_SIZE					
;/***************************************************/
	END

⌨️ 快捷键说明

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