#/***********************************************************************/ #/* This file is part of the uVision/ARM development tools */ #/* Copyright KEIL ELEKTRONIK GmbH 2002-2004 */ #/***********************************************************************/ #/* */ #/* STARTUP.S: Startup file */ #/* */ #/***********************************************************************/ # *** Startup Code (executed after Reset) *** # Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs .equ Mode_USR, 0x10 .equ Mode_FIQ, 0x11 .equ Mode_IRQ, 0x12 .equ Mode_SVC, 0x13 .equ Mode_ABT, 0x17 .equ Mode_UND, 0x1B .equ Mode_SYS, 0x1F .equ I_Bit, 0x80 /* when I bit is set, IRQ is disabled */ .equ F_Bit, 0x40 /* when F bit is set, FIQ is disabled */ .equ Top_Stack, 0x4000F700 .equ UND_Stack_Size, 0x00000000 .equ SVC_Stack_Size, 0x00000008 .equ ABT_Stack_Size, 0x00000000 .equ FIQ_Stack_Size, 0x00000000 .equ IRQ_Stack_Size, 0x00000080 .equ USR_Stack_Size, 0x00000800 # Starupt Code must be linked first at Address at which it expects to run. .text .arm .global _startup # .global EnableRAMPower .func _startup _startup: # Exception Vectors # Mapped to Address 0. # Absolute addressing mode must be used. # Dummy Handlers are implemented as infinite loops which can be modified. Vectors: LDR PC, Reset_Addr LDR PC, Undef_Addr LDR PC, SWI_Addr LDR PC, PAbt_Addr LDR PC, DAbt_Addr NOP /* Reserved Vector */ # LDR PC, IRQ_Addr LDR PC, [PC, #-0x0FF0] /* Vector from VicVectAddr */ LDR PC, FIQ_Addr Reset_Addr: .word Reset_Handler Undef_Addr: .word Undef_Handler SWI_Addr: .word SWI_Handler PAbt_Addr: .word PAbt_Handler DAbt_Addr: .word DAbt_Handler .word 0 /* Reserved Address */ IRQ_Addr: .word IRQ_Handler FIQ_Addr: .word FIQ_Handler Undef_Handler: B Undef_Handler SWI_Handler: B SWI_Handler PAbt_Handler: B PAbt_Handler DAbt_Handler: B DAbt_Handler IRQ_Handler: B IRQ_Handler FIQ_Handler: B FIQ_Handler #EnableRAMPower: # LDR R1, =0xE01FC0C4 # STR R1, [R2] # ADD R2, R2, #(1<<11) # STR R2, [R1] # Reset Handler Reset_Handler: # Setup Stack for each mode LDR R0, =Top_Stack # Enter Undefined Instruction Mode and set its Stack Pointer MSR CPSR_c, #Mode_UND|I_Bit|F_Bit MOV SP, R0 SUB R0, R0, #UND_Stack_Size # Enter Abort Mode and set its Stack Pointer MSR CPSR_c, #Mode_ABT|I_Bit|F_Bit MOV SP, R0 SUB R0, R0, #ABT_Stack_Size # Enter FIQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_FIQ|I_Bit|F_Bit MOV SP, R0 SUB R0, R0, #FIQ_Stack_Size # Enter IRQ Mode and set its Stack Pointer MSR CPSR_c, #Mode_IRQ|I_Bit|F_Bit MOV SP, R0 SUB R0, R0, #IRQ_Stack_Size # Enter Supervisor Mode and set its Stack Pointer MSR CPSR_c, #Mode_SVC|I_Bit|F_Bit MOV SP, R0 SUB R0, R0, #SVC_Stack_Size # Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR MOV SP, R0 # Setup a default Stack Limit (when compiled with "-mapcs-stack-check") SUB SL, SP, #USR_Stack_Size # Relocate .data section (Copy from ROM to RAM) LDR R1, =_etext LDR R2, =_data LDR R3, =_edata LoopRel: CMP R2, R3 LDRLO R0, [R1], #4 STRLO R0, [R2], #4 BLO LoopRel # Clear .bss section (Zero init) # MOV R0, #0 # LDR R1, =_bss_start # LDR R2, =_bss_end #LoopZI: CMP R1, R2 # STRLO R0, [R1], #4 # BLO LoopZI # Enter the C code B main .size _startup, . - _startup .endfunc .end