📄 cstartup.arm
字号:
;------------------------------------------------------------------------------
;- ATMEL Microcontroller Software Support - ROUSSET -
;------------------------------------------------------------------------------
; The software is delivered "AS IS" without warranty or condition of any
; kind, either express, implied or statutory. This includes without
; limitation any warranty or condition with respect to merchantability or
; fitness for any particular purpose, or against the infringements of
; intellectual property rights of others.
;-----------------------------------------------------------------------------
;- File source : Cstartup.arm
;- Object : Generic CStartup for GHS
;- Compilation flag : None
;-
;- 1.0 22/Nov/02 JPP : Creation
;------------------------------------------------------------------------------
.file "Cstartup.arm"
.nothumb
#include "include/AT91M42800A_inc.h"
;--------------------------------
;- ARM Core Mode and Status Bits
;--------------------------------
ARM_MODE_USER EQU 0x10
ARM_MODE_FIQ EQU 0x11
ARM_MODE_IRQ EQU 0x12
ARM_MODE_SVC EQU 0x13
ARM_MODE_ABORT EQU 0x17
ARM_MODE_UNDEF EQU 0x1B
ARM_MODE_SYS EQU 0x1F
I_BIT EQU 0x80
F_BIT EQU 0x40
T_BIT EQU 0x20
;------------------------------------------------------------------------------
;- Area Definition
;------------------------------------------------------------------------------
.section ".reset", .text
.align 4
;------------------------------------------------------------------------------
;- Exception vectors ( before Remap )
;------------------------------------
;- These vectors can be read at address 0 or at RAM address
;- They ABSOLUTELY requires to be in relative addressing mode in order to
;- guarantee a valid jump. For the moment, all are just looping.
;- If an exception occurs before remap, this would result in an infinite loop.
;- To ensure if a exception occurs before start application to infinite loop.
;------------------------------------------------------------------------------
.globl __reset
__reset:
B InitReset ; Reset handler
undefvec:
B undefvec ; Undefined Instruction
swivec:
B swivec ; Software Interrupt
pabtvec:
B pabtvec ; Prefetch Abort
dabtvec:
B dabtvec ; Data Abort
rsvdvec:
B rsvdvec ; reserved
irqvec:
B irqvec ; IRQ
fiqvec:
B fiqvec ; FIQ
.type __reset,$function
.size __reset,.-__reset
;--------------------
;- The reset handler
;--------------------
InitReset:
;------------------------------------------------------------------------------
;- Low level Init (APMC, AIC, EBI, ....) by C function AT91F_LowLevelInit
;------------------------------------------------------------------------------
.import AT91F_LowLevelInit
.import __iramend
.import __iramstart
.import __ghsbegin_picbase
;- minimum C initialization
;- call AT91_REG * AT91F_LowLevelInit( unsigned int * Vector, unsigned int * InternalRam)
; r0 = AT91F_LowLevelInit(&VectorTable,&InternalRAM)
ldr r9,= __ghsbegin_picbase
ldr r13,=__iramend ; temporary stack in iram
add r0, pc,VectorTable-8-. ; @ where to read values (relative)
ldr r1,=__iramstart
bl AT91F_LowLevelInit
;--------------------------------------------
;- Remap Command and jump on ABSOLUTE address
;--------------------------------------------
ldr r12, PtInitRemap ; Get the real jump address ( after remap )
mov r1,#AT91C_EBI_RCB ; Get the REMAP value
str r1, [r0] ; Store the complete image with the remap command
;- Jump to LINK address at its absolute address
mov pc, r12 ; Jump and break the pipeline
PtInitRemap:
DCD InitRemap ; Address where to jump after REMAP
;------------------------------------------------------------------------------
;- The Reset Handler after Remap
;-------------------------------
;- From here, the code is executed from its link address, ie. 0x100 0000.
;------------------------------------------------------------------------------
InitRemap:
;------------------------------------------------------------------------------
;- Stack Sizes Definition
;------------------------
;- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using
;- the vectoring. This assume that the IRQ_ENTRY/IRQ_EXIT macro are used.
;- The Interrupt Stack must be adjusted depending on the interrupt handlers.
;- Fast Interrupt not requires stack If in your application it required you must
;- be define here.
;- Other stacks are defined by default to save one word each.
;- The System stack size is not defined and is limited by the free internal
;- SRAM.
;- User stack size is not defined and is limited by the free external SRAM.
;------------------------------------------------------------------------------
IRQ_STACK_SIZE EQU (2*8*4) ; 2 words per interrupt priority level
FIQ_STACK_SIZE EQU (0*4) ; 0 words
ABT_STACK_SIZE EQU (1*4) ; 1 word
UND_STACK_SIZE EQU (1*4) ; 1 word
;------------------------------------------------------------------------------
;- Top of Stack Definition
;-------------------------
;- Fast Interrupt, Interrupt, Abort, Undefined and Supervisor Stack are located
;- at the top of internal memory in order to speed the exception handling
;- context saving and restoring.
;- User (Application, C) Stack is located at the top of the external memory.
;------------------------------------------------------------------------------
#define TOP_EXCEPTION_STACK (AT91C_SRAM_AFTER_REMAP+AT91C_SRAM_AFTER_REMAP_SIZE)
;------------------------------------------------------------------------------
;- Setup the stack for each mode
;-------------------------------
ldr r0, =TOP_EXCEPTION_STACK
;- Set up Fast Interrupt Mode and set FIQ Mode Stack
msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
mov r13, r0 ; Init stack FIQ
sub r0, r0, #FIQ_STACK_SIZE
;- Set up Interrupt Mode and set IRQ Mode Stack
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
mov r13, r0 ; Init stack IRQ
sub r0, r0, #IRQ_STACK_SIZE
;- Set up Abort Mode and set Abort Mode Stack
msr CPSR_c, #ARM_MODE_ABORT | I_BIT | F_BIT
mov r13, r0 ; Init stack Abort
sub r0, r0, #ABT_STACK_SIZE
;- Set up Undefined Instruction Mode and set Undef Mode Stack
msr CPSR_c, #ARM_MODE_UNDEF | I_BIT | F_BIT
mov r13, r0 ; Init stack Undef
sub r0, r0, #UND_STACK_SIZE
;- Set up Supervisor Mode and set Supervisor Mode Stack
msr CPSR_c, #ARM_MODE_SVC | I_BIT
mov r13, r0 ; Init stack Undef
;------------------------------------------------------------------------------
;- Before Init C Initialize C variables you can copy the from FLASH to RAM
;------------------------------------------------------------------------------
;- Enable interrupt
msr CPSR_c, #ARM_MODE_SVC | F_BIT
;------------------------------------------------------------------------------
;- Branch on C code Main function (with interworking)
;----------------------------------------------------
;- Branch must be performed by an interworking call as either an ARM or Thumb
;- _start function must be supported. This makes the code not position-
;- independent. A Branch with link would generate errors
;------------------------------------------------------------------------------
;- Get Green Hills Linker Values
.import _start
.import __ghsend_stack
.import __ghsbegin_picbase
;- Get Value for Rom/Copy
.weak __ghs_rambootcodestart ; 0 for RAM and Rom/run
.weak __ghs_rombootcodestart ; 0 for RAM and Rom/run
.weak __ghs_rombootcodeend ; 0 for RAM and Rom/run
;- minimum C initialization
;- Calculate the _start address for different mode RAM or Rom/run or Rom copy
ldr r1,= __ghs_rombootcodestart
ldr r4,= _start
cmp r1, r4 ; rombootcodestart < _start ?
bcs fix
ldr r0,= __ghs_rombootcodeend
cmp r0, r4 ; rombootcodeend < _start ?
bcs done
fix:
ldr r0,= __ghs_rambootcodestart
sub r4, r4, r0
add r4, r4, r1
done:
;-
mov r0,0
mov r1,r0
mov r2,r0
;- Load The Green Hills register
ldr r9,= __ghsbegin_picbase
ldr r13,= __ghsend_stack
;- Branch to _start by interworking
mov lr, pc
bx r4
;------------------------------------------------------------------------------
;- Loop for ever
;---------------
;- End of application. Normally, never occur.
;- Could jump on Software Reset ( B 0x0 ).
;------------------------------------------------------------------------------
End
b End
.type InitReset,$function
.size InitReset,.-InitReset
;------------------------------------------------------------------------------
;- Exception vectors ( after cstartup execution )
;------------------------------------
;- These vectors are read at RAM address after the remap command is performed in
;- the EBI. As they will be relocated at address 0x0 to be effective, a
;- RELATIVE addressing is FORBIDDEN. The only possibility to get an absolute
;- addressing for an ARM vector is to read a PC relative value at a defined
;- offset. It is easy to reserve the locations 0x20 to 0x3C (the 8 next
;- vectors) for storing the absolute exception handler address.
;- The AIC vectoring access vectors are saved in the interrupt and fast
;- interrupt ARM vectors. So, only 5 offsets are required (reserved vector
;- offset is never used).
;- The provisory handler addresses are defined on infinite loop and can be
;- modified at any time.
;- Note also that the reset is only accessible by a jump from the application
;- to 0. It is an actual software reset.
;- As the 13 (8+5) first location are used by the vectors, the read/write link
;- address must be defined from 0x34 if internal data mapping is required.
;- (use for that the option -rw- base=0x34
;------------------------------------------------------------------------------
.globl VectorTable
VectorTable:
ldr pc, [pc, #&18] ; SoftReset
ldr pc, [pc, #&18] ; UndefHandler
ldr pc, [pc, #&18] ; SWIHandler
ldr pc, [pc, #&18] ; PrefetchAbortHandler
ldr pc, [pc, #&18] ; DataAbortHandler
nop ; Reserved
ldr pc, [pc,#-0xF20] ; IRQ : read the AIC
ldr pc, [pc,#-0xF20] ; FIQ : read the AIC
;- There are only 5 offsets as the vectoring is used.
DCD SoftReset
DCD UndefHandler
DCD SWIHandler
DCD PrefetchAbortHandler
DCD DataAbortHandler
;- Vectoring Execution function run at absolute address
SoftReset
b SoftReset
UndefHandler
b UndefHandler
SWIHandler
b SWIHandler
PrefetchAbortHandler
b PrefetchAbortHandler
DataAbortHandler
b DataAbortHandler
.type VectorTable,$function
.size VectorTable,.-VectorTable
;------------------------------------------------------------------------------
;- Manage exception
;---------------
;- The exception must be ensure in ARM mode
;------------------------------------------------------------------------------
.align 4
.global AT91F_Default_FIQ_handler
AT91F_Default_FIQ_handler
b AT91F_Default_FIQ_handler
.type AT91F_Default_FIQ_handler,$function
.size AT91F_Default_FIQ_handler,.-AT91F_Default_FIQ_handler
.global AT91F_Default_IRQ_handler
AT91F_Default_IRQ_handler
b AT91F_Default_IRQ_handler
.type AT91F_Default_IRQ_handler,$function
.size AT91F_Default_IRQ_handler,.-AT91F_Default_IRQ_handler
.global AT91F_Spurious_handler
AT91F_Spurious_handler
b AT91F_Spurious_handler
.type AT91F_Spurious_handler,$function
.size AT91F_Spurious_handler,.-AT91F_Spurious_handler
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -