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

📄 start.s

📁 某个ARM9板子的实际bootloader 对裁剪
💻 S
字号:
;/****************************************************************************; * Copyright  Storlink Corp 2005.  All rights reserved.                ; *--------------------------------------------------------------------------; * Name		: sys_start.S; * Description	: ; *		Start-up entry for BOOT-2 (stage 2 of the boot loader); *; * History; *; *	Date		Writer		Description; *	-----------	-----------	-------------------------------------------------; *	04/18/2005	Gary Chen	Create; *; ****************************************************************************/#include <board_config.h>#include <sl2312.h>#include <hal_setup_sl2312.h>        .file   "sys_start.S"// #========================================================================// #	Macro definition// #========================================================================#ifdef __thumb__// Switch to thumb mode#define THUMB_MODE(_r_, _l_)                     \        ldr     _r_,=_l_ ## f+1                 ;\        bx      _r_                             ;\        .pool                                   ;\        .code   16                              ;\        .thumb_func                             ;\ _l_:// Call thumb function from ARM mode, return to ARM// mode afterwards#define THUMB_CALL(_r_, _l_, _f_)                \        ldr     _r_,=_f_+1                      ;\        mov     lr,pc                           ;\        bx      _r_                             ;\        .pool                                   ;\        .code   16                              ;\        .thumb_func                             ;\        ldr     _r_,=_l_  ## f                  ;\        bx      _r_                             ;\        .pool                                   ;\        .code   32                              ;\ _l_:// Switch to ARM mode#define ARM_MODE(_r_, _l_)                       \        ldr     _r_,=_l_ ## f                   ;\        bx      _r_                             ;\        .pool                                   ;\        .code   32                              ;\ _l_:// Function definition, start executing body in ARM mode#define FUNC_START_ARM(_name_, _r_)              \        .code   16                              ;\        .thumb_func                             ;\        .globl _name_                           ;\_name_:                                         ;\        ldr     _r_,=_name_ ## _ARM             ;\        bx      _r_                             ;\        .code   32                              ;\_name_ ## _ARM:#else// Switch to thumb mode#define THUMB_MODE(_r_, _l_)// Call ARM function#define THUMB_CALL(_r_, _l_, _f_) \        bl      _f_// Switch to ARM mode#define ARM_MODE(_r_, _l_)// Function definition, start executing body in ARM mode#define FUNC_START_ARM(_name_, _r_) \        .globl _name_; \_name_: #endif#define DEFINE_PTR(name)			\.##name: .word  name#define WRITE_REG32(reg, value)		\		ldr	    r0,=reg;			\		ldr		r1,=value;			\		str		r1,[r0]// #========================================================================// #	Vectors// #========================================================================        .code   32        .section ".init","ax"        .global __exception_handlers__exception_handlers:        b       reset_vector					// 0x00 		ldr     pc,.undefined_instruction       // 0x04		ldr     pc,.software_interrupt          // 0x08 start && software int		ldr     pc,.abort_prefetch              // 0x0C        ldr     pc,.abort_data                  // 0x10		b       reset_vector                    // unused		ldr     pc,.IRQ                         // 0x18        ldr     pc,.FIQ                         // 0x1C                .global vectorsvectors:DEFINE_PTR(reset_vector);					/* 0x20 */DEFINE_PTR(undefined_instruction);			/* 0x24 */DEFINE_PTR(software_interrupt);				/* 0x28 */DEFINE_PTR(abort_prefetch);					/* 0x2C */DEFINE_PTR(abort_data);						/* 0x30 */        .word   0							/* 0x34 */DEFINE_PTR(IRQ);							/* 0x38 */DEFINE_PTR(FIQ);							/* 0x3c */ /* Offset 0x40, the starting location of User's RAM Area */                       // #========================================================================// #	Start-up Program// #	reset_vector// #========================================================================        .text           .global reset_vector        .type   reset_vector,function reset_vector:// #========================================================================// #	Set to supervisor mode and disable interrupts// #    initialize CPSR (machine state register)// #========================================================================        mov     r0,#(ARM_CPSR_IRQ_DISABLE|ARM_CPSR_FIQ_DISABLE|ARM_CPSR_SUPERVISOR_MODE)        msr     cpsr,r0		/* Disable all interrupts in the interrupt controller */		WRITE_REG32 (SL2312_INTERRUPT_BASE + SL2312_IRQ_MASK, 0);		// setup SL2312 platform		HAL_SETUP_SL2312		// #========================================================================// #	warm_reset// #========================================================================		//  set interrupt vectors  warm_reset:        mov     r0,#0        ldr     r1,=__exception_handlers        // Wait with this if stubs are included (see further down).        ldr     r2,[r1,#0x04]   // undefined instruction        str     r2,[r0,#0x04]        ldr     r2,[r1,#0x24]           str     r2,[r0,#0x24]        ldr     r2,[r1,#0x08]   // software interrupt        str     r2,[r0,#0x08]        ldr     r2,[r1,#0x18]   //  IRQ        str     r2,[r0,#0x18]        ldr     r2,[r1,#0x38]        str     r2,[r0,#0x38]        ldr     r2,[r1,#0x1C]   /* FIQ */        str     r2,[r0,#0x1C]        ldr     r2,[r1,#0x3C]        str     r2,[r0,#0x3C]        ldr     r2,[r1,#0x0C]   /* abort (prefetch) */        str     r2,[r0,#0x0C]        ldr     r2,[r1,#0x2C]           str     r2,[r0,#0x2C]        ldr     r2,[r1,#0x10]   /* abort (data) */        str     r2,[r0,#0x10]        ldr     r2,[r1,#0x30]        str     r2,[r0,#0x30]// #========================================================================// #	Set up reset vector// #========================================================================        mov     r0,#0        ldr     r1,=__exception_handlers        ldr     r2,[r1,#0x00]    /*  reset vector intstruction */        str     r2,[r0,#0x00]        ldr     r2,=warm_reset        str     r2,[r0,#0x20]       // #========================================================================// #	 Copy from ROM Data to RAM area// #========================================================================// t1:		b		t1        ldr     r3,.__rom_data_start        ldr     r4,.__ram_data_start        ldr     r5,.__ram_data_end        cmp     r4,r5           /*  jump if no data to move */        beq     2f        sub     r3,r3,#4        /*  loop adjustments */        sub     r4,r4,#41:      ldr     r0,[r3,#4]!     /*  copy info */        str     r0,[r4,#4]!        cmp     r4,r5        bne     1b2:// #========================================================================// #	 initialize interrupt/exception environments// #========================================================================        ldr     sp,.__startup_stack        mov     r0,#(ARM_CPSR_IRQ_DISABLE|ARM_CPSR_FIQ_DISABLE|ARM_CPSR_IRQ_MODE)        msr     cpsr,r0        ldr     sp,.__exception_stack        mov     r0,#(ARM_CPSR_IRQ_DISABLE|ARM_CPSR_FIQ_DISABLE|ARM_CPSR_UNDEF_MODE)        msr     cpsr,r0        ldr     sp,.__exception_stack        /*  initialize CPSR (machine state register) */        mov     r0,#(ARM_CPSR_IRQ_DISABLE|ARM_CPSR_FIQ_DISABLE|ARM_CPSR_SUPERVISOR_MODE)        msr     cpsr,r0        /*  Note: some functions in LIBGCC1 will cause a "restore from SPSR"!! */        msr     spsr,r0// #========================================================================// #	 initialize stack// #========================================================================        ldr     sp,.__startup_stack// #========================================================================// #	 clear BSS// #========================================================================        ldr     r1,.__bss_start        ldr     r2,.__bss_end        mov     r0,#0        cmp     r1,r2        beq     2f1:      str     r0,[r1],#4        cmp     r1,r2        bne     1b2:// #========================================================================// #	Call main entry of C program// #========================================================================        bl      sl_main_here:        b       _here// #========================================================================// #	Function: // #========================================================================        .global reset_platform        .type   reset_platform,functionreset_platform:        mov     r0,#0        mov     pc,r0           /* Jump to reset vector  */      // #========================================================================// #	entry of exception// #========================================================================        .code   32        .global undefined_instruction        .global software_interrupt, abort_prefetch        .global abort_data, FIQundefined_instruction:software_interrupt:abort_prefetch:abort_data:FIQ:		b		hal_reset		b		reset_vector/* ************************************************************************* * * Interrupt handling * ************************************************************************* */@@ IRQ stack frame.@#define S_FRAME_SIZE	72#define S_OLD_R0	68#define S_PSR		64#define S_PC		60#define S_LR		56#define S_SP		52#define S_IP		48#define S_FP		44#define S_R10		40#define S_R9		36#define S_R8		32#define S_R7		28#define S_R6		24#define S_R5		20#define S_R4		16#define S_R3		12#define S_R2		8#define S_R1		4#define S_R0		0		.macro	irq_save_user_regs		sub		sp, sp, #S_FRAME_SIZE		stmia	sp, {r0 - r12}			// Calling r0-r12		nop		add		r8, sp, #S_PC		stmdb	r8, {sp, lr}^			// Calling SP, LR		nop		str		lr, [r8, #0]			// Save calling PC		mrs		r6, spsr		str		r6, [r8, #4]			// Save CPSR		str		r0, [r8, #8]			// Save OLD_R0		mov		r0, sp		.endm		.macro	irq_restore_user_regs		ldmia	sp, {r0 - lr}^			// Calling r0 - lr		nop		nop		mov		r0, r0		ldr		lr, [sp, #S_PC]			// Get PC		add		sp, sp, #S_FRAME_SIZE		subs	pc, lr, #4				// return & move spsr_svc into cpsr		.endm		.macro get_irq_stack			// setup IRQ stack		ldr     sp,.__exception_stack		.endm        .code   32		.global	IRQ		.align	5IRQ:		get_irq_stack		irq_save_user_regs		bl 	hal_irq_handler		irq_restore_user_regs	// #========================================================================// #	Pointers to various objects.// #========================================================================DEFINE_PTR(__startup_stack)DEFINE_PTR(__exception_stack)DEFINE_PTR(__bss_start)DEFINE_PTR(__bss_end)DEFINE_PTR(_end)DEFINE_PTR(__rom_data_start)DEFINE_PTR(__ram_data_start)DEFINE_PTR(__ram_data_end)DEFINE_PTR(__exception_handlers)        .data// #========================================================================// #	Data area// #========================================================================        .databoot_active:        .balign 4        .byte	'P'        .byte	'O'        .byte	'S'        .byte	'T'// #========================================================================// #	BSS area// # 		- Temporary interrupt stack// #========================================================================        .section ".bss"        .balign 4        .byte	'.'        .byte	'B'        .byte	'S'        .byte	'S'		.align 14		.global ttb_basettb_base:        .rept   (0x4000)        .long   0        .endr                .balign 16__exception_stack_base:         .rept   256        .long   0        .endr__exception_stack:        .balign 16__startup_stack_base:        .rept 4096        .byte 0        .endr        .balign 16__startup_stack:// #========================================================================// #	end// #========================================================================

⌨️ 快捷键说明

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