1 ;------------------------------------------------------------------------------
\r
2 ;- ATMEL Microcontroller Software Support - ROUSSET -
\r
3 ;------------------------------------------------------------------------------
\r
4 ; The software is delivered "AS IS" without warranty or condition of any
\r
5 ; kind, either express, implied or statutory. This includes without
\r
6 ; limitation any warranty or condition with respect to merchantability or
\r
7 ; fitness for any particular purpose, or against the infringements of
\r
8 ; intellectual property rights of others.
\r
9 ;-----------------------------------------------------------------------------
\r
10 ;- File source : Cstartup.s79
\r
11 ;- Object : Generic CStartup for IAR No Use REMAP
\r
12 ;- Compilation flag : None
\r
14 ;- 1.0 15/Jun/04 JPP : Creation
\r
15 ;------------------------------------------------------------------------------
\r
17 #include "AT91SAM7X256_inc.h"
\r
19 ;------------------------------------------------------------------------------
\r
21 ;------------------------------------------------------------------------------
\r
23 ;---------------------------------------------------------------
\r
26 ; Normally, segment INTVEC is linked at address 0.
\r
27 ; For debugging purposes, INTVEC may be placed at other
\r
29 ; A debugger that honors the entry point will start the
\r
30 ; program in a normal way even if INTVEC is not at address 0.
\r
31 ;-------------------------------------------------------------
\r
34 RSEG INTRAMSTART_REMAP
\r
35 RSEG INTRAMEND_REMAP
\r
37 EXTERN vPortYieldProcessor
\r
39 RSEG ICODE:CODE:ROOT(2)
\r
40 CODE32 ; Always ARM mode after reset
\r
43 ;------------------------------------------------------------------------------
\r
44 ;- Exception vectors
\r
45 ;--------------------
\r
46 ;- These vectors can be read at address 0 or at RAM address
\r
47 ;- They ABSOLUTELY requires to be in relative addresssing mode in order to
\r
48 ;- guarantee a valid jump. For the moment, all are just looping.
\r
49 ;- If an exception occurs before remap, this would result in an infinite loop.
\r
50 ;- To ensure if a exeption occurs before start application to infinite loop.
\r
51 ;------------------------------------------------------------------------------
\r
53 B InitReset ; 0x00 Reset handler
\r
55 B undefvec ; 0x04 Undefined Instruction
\r
57 B vPortYieldProcessor ; 0x08 Software Interrupt
\r
59 B pabtvec ; 0x0C Prefetch Abort
\r
61 B dabtvec ; 0x10 Data Abort
\r
63 B rsvdvec ; 0x14 reserved
\r
65 LDR PC, [PC, #-0xF20] ; Jump directly to the address given by the AIC
\r
69 ;------------------------------------------------------------------------------
\r
70 ;- Function : FIQ_Handler_Entry
\r
71 ;- Treatments : FIQ Controller Interrupt Handler.
\r
72 ;- Called Functions : AIC_FVR[interrupt]
\r
73 ;------------------------------------------------------------------------------
\r
77 ;- Switch in SVC/User Mode to allow User Stack access for C code
\r
78 ; because the FIQ is not yet acknowledged
\r
80 ;- Save and r0 in FIQ_Register
\r
82 ldr r0 , [r8, #AIC_FVR]
\r
83 msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC
\r
85 ;- Save scratch/used registers and LR in User Stack
\r
86 stmfd sp!, { r1-r3, r12, lr}
\r
88 ;- Branch to the routine pointed by the AIC_FVR
\r
92 ;- Restore scratch/used registers and LR from User Stack
\r
93 ldmia sp!, { r1-r3, r12, lr}
\r
95 ;- Leave Interrupts disabled
\ 4and switch back in FIQ mode
\r
96 msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ
\r
98 ;- Restore the R0 ARM_MODE_SVC register
\r
101 ;- Restore the Program Counter using the LR_fiq directly in the PC
\r
105 ;------------------------------------------------------------------------------
\r
106 ;- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit
\r
107 ;------------------------------------------------------------------------------
\r
108 EXTERN AT91F_LowLevelInit
\r
110 #define __iramend SFB(INTRAMEND_REMAP)
\r
112 ;- minumum C initialization
\r
113 ;- call AT91F_LowLevelInit( void)
\r
115 ldr r13,=__iramend ; temporary stack in internal RAM
\r
116 ;--Call Low level init function in ABSOLUTE through the Interworking
\r
117 ldr r0,=AT91F_LowLevelInit
\r
120 ;------------------------------------------------------------------------------
\r
121 ;- Stack Sizes Definition
\r
122 ;------------------------
\r
123 ;- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using
\r
124 ;- the vectoring. This assume that the IRQ management.
\r
125 ;- The Interrupt Stack must be adjusted depending on the interrupt handlers.
\r
126 ;- Fast Interrupt not requires stack If in your application it required you must
\r
128 ;- The System stack size is not defined and is limited by the free internal
\r
130 ;------------------------------------------------------------------------------
\r
132 ;------------------------------------------------------------------------------
\r
133 ;- Top of Stack Definition
\r
134 ;-------------------------
\r
135 ;- Interrupt and Supervisor Stack are located at the top of internal memory in
\r
136 ;- order to speed the exception handling context saving and restoring.
\r
137 ;- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory.
\r
138 ;------------------------------------------------------------------------------
\r
140 IRQ_STACK_SIZE EQU 300
\r
142 ARM_MODE_FIQ EQU 0x11
\r
143 ARM_MODE_IRQ EQU 0x12
\r
144 ARM_MODE_SVC EQU 0x13
\r
149 ;------------------------------------------------------------------------------
\r
150 ;- Setup the stack for each mode
\r
151 ;-------------------------------
\r
154 ;- Set up Fast Interrupt Mode and set FIQ Mode Stack
\r
155 msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
\r
156 ;- Init the FIQ register
\r
157 ldr r8, =AT91C_BASE_AIC
\r
159 ;- Set up Interrupt Mode and set IRQ Mode Stack
\r
160 msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
\r
161 mov r13, r0 ; Init stack IRQ
\r
162 sub r0, r0, #IRQ_STACK_SIZE
\r
164 ;- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack
\r
165 msr CPSR_c, #ARM_MODE_SVC
\r
169 ;---------------------------------------------------------------
\r
171 ;---------------------------------------------------------------
\r
172 EXTERN __segment_init
\r
174 ; Initialize segments.
\r
175 ; __segment_init is assumed to use
\r
176 ; instruction set and to be reachable by BL from the ICODE segment
\r
177 ; (it is safest to link them in segment ICODE).
\r
178 ldr r0,=__segment_init
\r
189 ;------------------------------------------------------------------------------
\r
192 ;- End of application. Normally, never occur.
\r
193 ;- Could jump on Software Reset ( B 0x0 ).
\r
194 ;------------------------------------------------------------------------------
\r
201 ;---------------------------------------------------------------
\r
203 ; This module is only linked if needed for closing files.
\r
204 ;---------------------------------------------------------------
\r
205 PUBLIC AT91F_Default_FIQ_handler
\r
206 PUBLIC AT91F_Default_IRQ_handler
\r
207 PUBLIC AT91F_Spurious_handler
\r
209 CODE32 ; Always ARM mode after exeption
\r
211 AT91F_Default_FIQ_handler
\r
212 b AT91F_Default_FIQ_handler
\r
214 AT91F_Default_IRQ_handler
\r
215 b AT91F_Default_IRQ_handler
\r
217 AT91F_Spurious_handler
\r
218 b AT91F_Spurious_handler
\r