|
Here is the startup file for bootloader and the application. It is same for both. Is it ok to have identical startup files for both bootloader and applicatiion. ??
MODULE ?cstartup SECTION IRQ_STACK:DATA:NOROOT(3) SECTION FIQ_STACK:DATA:NOROOT(3) SECTION UND_STACK:DATA:NOROOT(3) SECTION ABT_STACK:DATA:NOROOT(3) SECTION SVC_STACK:DATA:NOROOT(3) SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN Undef_Wrapper EXTERN SWI_Wrapper EXTERN Prefetch_Wrapper EXTERN Abort_Wrapper EXTERN IRQ_Wrapper EXTERN FIQ_Wrapper ARM ;;============================================================================== ;; EXECPTION HANDLERS ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. ;;============================================================================== __vector:
LDR PC,Reset_Addr ; Reset LDR PC,Undefined_Addr ; Undefined instructions LDR PC,SWI_Addr ; Software interrupt (SWI/SVC) LDR PC,Prefetch_Addr ; Prefetch abort LDR PC,Abort_Addr ; Data abort __vector_0x14: DCD 0 ; RESERVED LDR PC,IRQ_Addr ; IRQ LDR PC,FIQ_Addr ; FIQ
Reset_Addr: DCD __iar_program_start Undefined_Addr: DCD Undef_Wrapper SWI_Addr: DCD SWI_Wrapper Prefetch_Addr: DCD Prefetch_Wrapper Abort_Addr: DCD Abort_Wrapper IRQ_Addr: DCD IRQ_Wrapper FIQ_Addr: DCD FIQ_Wrapper
;;============================================================================== ;; LOW LEVEL SYSTEM INITIALIZATION ; After a reset execution starts here, the mode is ARM, supervisor ; with interrupts disabled. ;;==============================================================================
SECTION .text:CODE:NOROOT(2) EXTERN ?main REQUIRE __vector EXTERN AT91LowLevelInit EXTERN at91_spurious_handler
ARM __iar_program_start: ?cstartup:
; Minumum C initialization
ldr r13,=SFE(SVC_STACK) ; Call Low level init function ldr r0,=AT91LowLevelInit mov lr, pc bx r0
; ; Add initialization needed before setup of stackpointers here. ;
; ; Initialize the stack pointers. ; The pattern below can be used for any of the exception stacks: ; FIQ, IRQ, SVC, ABT, UND, SYS. ; The USR mode uses the same stack as SYS. ; The stack segments must be defined in the linker command file, ; and be declared above. ;
; -------------------- ; Mode, corresponds to bits 0-5 in CPSR
MODE_MSK DEFINE 0x1F ; Bit mask for mode bits in CPSR
USR_MODE DEFINE 0x10 ; User mode FIQ_MODE DEFINE 0x11 ; Fast Interrupt Request mode IRQ_MODE DEFINE 0x12 ; Interrupt Request mode SVC_MODE DEFINE 0x13 ; Supervisor mode ABT_MODE DEFINE 0x17 ; Abort mode UND_MODE DEFINE 0x1B ; Undefined Instruction mode SYS_MODE DEFINE 0x1F ; System mode
MRS r0, cpsr ; Original PSR value ;;============================================================================== ;; STACK POINTERS SETUP ;;==============================================================================
;; Setup the interrupt stack pointer.
BIC r0, r0, #MODE_MSK ; Clear the mode bits ORR r0, r0, #IRQ_MODE ; Set IRQ mode bits MSR cpsr_c, r0 ; Change the mode LDR sp, =SFE(IRQ_STACK) ; End of IRQ_STACK
;; Set up the fast interrupt stack pointer.
BIC r0, r0, #MODE_MSK ; Clear the mode bits ORR r0, r0, #FIQ_MODE ; Set FIR mode bits MSR cpsr_c, r0 ; Change the mode LDR sp, =SFE(FIQ_STACK) ; End of FIQ_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#UND_MODE ; Set UND mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(UND_STACK) ; End of UND_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#ABT_MODE ; Set ABT mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(ABT_STACK) ; End of ABT_STACK bic r0,r0,#MODE_MSK ; Clear the mode bits orr r0,r0,#SYS_MODE ; Set SYS mode bits msr cpsr_c,r0 ; Change the mode ldr sp,=SFE(CSTACK) ; End of CSTACK
;; Set up the normal stack pointer.
BIC r0 ,r0, #MODE_MSK ; Clear the mode bits ORR r0 ,r0, #SVC_MODE ; Set SVC mode bits MSR cpsr_c, r0 ; Change the mode LDR sp, =SFE(SVC_STACK) ; End of SVC_STACK ; setup spurious interrupt handler ldr r0,=at91_spurious_handler ldr r1,=AT91C_BASE_AIC str r0,[r1, #AIC_SPU]
#ifdef __ARMVFP__ ;; Enable the VFP coprocessor.
MOV r0, #0x40000000 ; Set EN bit in VFP FMXR fpexc, r0 ; FPEXC, clear others.
; ; Disable underflow exceptions by setting flush to zero mode. ; For full IEEE 754 underflow compliance this code should be removed ; and the appropriate exception handler installed. ;
MOV r0, #0x01000000 ; Set FZ bit in VFP FMXR fpscr, r0 ; FPSCR, clear others. #endif
; ; Add more initialization here ;
; Continue to ?main for C-level initialization.
B ?main
END
|