]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D4x_EK_IAR/cstartup_with_FreeRTOS_vectors.s
Core kernel files:
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D4x_EK_IAR / cstartup_with_FreeRTOS_vectors.s
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2014, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 /*\r
31      IAR startup file for SAMA5D4X microcontrollers.\r
32  */\r
33 \r
34         MODULE  ?cstartup\r
35 \r
36         ;; Forward declaration of sections.\r
37         SECTION IRQ_STACK:DATA:NOROOT(2)\r
38         SECTION FIQ_STACK:DATA:NOROOT(2)\r
39         SECTION UND_STACK:DATA:NOROOT(2)\r
40         SECTION ABT_STACK:DATA:NOROOT(2)\r
41         SECTION CSTACK:DATA:NOROOT(3)\r
42 \r
43 //------------------------------------------------------------------------------\r
44 //         Headers\r
45 //------------------------------------------------------------------------------\r
46 \r
47 #define __ASSEMBLY__\r
48 \r
49 //------------------------------------------------------------------------------\r
50 //         Definitions\r
51 //------------------------------------------------------------------------------\r
52 \r
53 #define AIC         0xFC06E000\r
54 #define AIC_IVR     0x10\r
55 #define AIC_EOICR   0x38\r
56 #define L2CC_CR     0x00A00100\r
57 \r
58 #define REG_SFR_AICREDIR        0xF8028054\r
59 #define REG_SFR_UID             0xF8028050\r
60 #define AICREDIR_KEY            0x5F67B102\r
61 \r
62 \r
63 MODE_MSK DEFINE 0x1F            ; Bit mask for mode bits in CPSR\r
64 #define ARM_MODE_ABT     0x17\r
65 #define ARM_MODE_FIQ     0x11\r
66 #define ARM_MODE_IRQ     0x12\r
67 #define ARM_MODE_SVC     0x13\r
68 #define ARM_MODE_SYS     0x1F\r
69 #define ARM_MODE_UND     0x1B\r
70 #define I_BIT            0x80\r
71 #define F_BIT            0x40\r
72 \r
73 \r
74 \r
75 //------------------------------------------------------------------------------\r
76 //         Startup routine\r
77 //------------------------------------------------------------------------------\r
78 \r
79 /*\r
80    Exception vectors\r
81  */\r
82         SECTION .vectors:CODE:NOROOT(2)\r
83 \r
84         PUBLIC  resetVector\r
85         PUBLIC  IRQ_Handler\r
86         EXTERN  FreeRTOS_IRQ_Handler\r
87         EXTERN  Undefined_C_Handler\r
88         EXTERN  FreeRTOS_SWI_Handler\r
89         EXTERN  Prefetch_C_Handler\r
90         EXTERN  Abort_C_Handler\r
91         PUBLIC  FIQ_Handler\r
92 \r
93         ARM\r
94 \r
95 __iar_init$$done:               ; The interrupt vector is not needed\r
96                                 ; until after copy initialization is done\r
97 \r
98 resetVector:\r
99         ; All default exception handlers (except reset) are\r
100         ; defined as weak symbol definitions.\r
101         ; If a handler is defined by the application it will take precedence.\r
102         LDR     pc, =resetHandler        ; Reset\r
103         LDR     pc, Undefined_Addr       ; Undefined instructions\r
104         LDR     pc, SWI_Addr             ; Software interrupt (SWI/SYS)\r
105         LDR     pc, Prefetch_Addr        ; Prefetch abort\r
106         LDR     pc, Abort_Addr           ; Data abort\r
107         B       .                        ; RESERVED\r
108         LDR     PC,IRQ_Addr              ; 0x18 IRQ\r
109         LDR     PC,FIQ_Addr              ; 0x1c FIQ\r
110 \r
111 IRQ_Addr:       DCD   FreeRTOS_IRQ_Handler\r
112 Undefined_Addr: DCD   Undefined_C_Handler\r
113 SWI_Addr:       DCD   FreeRTOS_SWI_Handler\r
114 Abort_Addr:     DCD   Abort_C_Handler\r
115 Prefetch_Addr:  DCD   Prefetch_C_Handler\r
116 ;IRQ_Addr:       DCD   IRQ_Handler\r
117 FIQ_Addr:       DCD   FIQ_Handler\r
118 /*\r
119    Handles incoming interrupt requests by branching to the corresponding\r
120    handler, as defined in the AIC. Supports interrupt nesting.\r
121  */\r
122 IRQ_Handler:\r
123         /* Save interrupt context on the stack to allow nesting */\r
124         SUB     lr, lr, #4\r
125         STMFD   sp!, {lr}\r
126         MRS     lr, SPSR\r
127         STMFD   sp!, {r0, lr}\r
128 \r
129         /* Write in the IVR to support Protect Mode */\r
130         LDR     lr, =AIC\r
131         LDR     r0, [r14, #AIC_IVR]\r
132         STR     lr, [r14, #AIC_IVR]\r
133 \r
134         /* Branch to interrupt handler in Supervisor mode */\r
135         MSR     CPSR_c, #ARM_MODE_SVC\r
136         STMFD   sp!, {r1-r3, r4, r12, lr}\r
137 \r
138         /* Check for 8-byte alignment and save lr plus a */\r
139         /* word to indicate the stack adjustment used (0 or 4) */\r
140         AND     r1, sp, #4\r
141         SUB     sp, sp, r1\r
142         STMFD   sp!, {r1, lr}\r
143 \r
144         BLX     r0\r
145 \r
146         LDMIA   sp!, {r1, lr}\r
147         ADD     sp, sp, r1\r
148 \r
149         LDMIA   sp!, {r1-r3, r4, r12, lr}\r
150         MSR     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT\r
151 \r
152         /* Acknowledge interrupt */\r
153         LDR     lr, =AIC\r
154         STR     lr, [r14, #AIC_EOICR]\r
155 \r
156         /* Restore interrupt context and branch back to calling code */\r
157         LDMIA   sp!, {r0, lr}\r
158         MSR     SPSR_cxsf, lr\r
159         LDMIA   sp!, {pc}^\r
160 \r
161 \r
162 /*\r
163    After a reset, execution starts here, the mode is ARM, supervisor\r
164    with interrupts disabled.\r
165    Initializes the chip and branches to the main() function.\r
166  */\r
167         SECTION .cstartup:CODE:NOROOT(2)\r
168 \r
169         PUBLIC  resetHandler\r
170         EXTERN  LowLevelInit\r
171         EXTERN  ?main\r
172         REQUIRE resetVector\r
173         EXTERN  CP15_InvalidateBTB\r
174         EXTERN  CP15_InvalidateTranslationTable\r
175         EXTERN  CP15_InvalidateIcache\r
176         EXTERN  CP15_InvalidateDcacheBySetWay\r
177         ARM\r
178 \r
179 resetHandler:\r
180 \r
181         LDR     r4, =SFE(CSTACK)     ; End of SVC stack\r
182         BIC     r4,r4,#0x7           ; Make sure SP is 8 aligned\r
183         MOV     sp, r4\r
184 \r
185 \r
186         ;; Set up the normal interrupt stack pointer.\r
187 \r
188         MSR     CPSR_c, #(ARM_MODE_IRQ | F_BIT | I_BIT)\r
189         LDR     sp, =SFE(IRQ_STACK)     ; End of IRQ_STACK\r
190         BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned\r
191 \r
192 \r
193         ;; Set up the fast interrupt stack pointer.\r
194 \r
195         MSR     CPSR_c, #(ARM_MODE_FIQ | F_BIT | I_BIT)\r
196         LDR     sp, =SFE(FIQ_STACK)     ; End of FIQ_STACK\r
197         BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned\r
198 \r
199         MSR     CPSR_c, #(ARM_MODE_ABT | F_BIT | I_BIT)\r
200         LDR     sp, =SFE(ABT_STACK)     ; End of ABT_STACK\r
201         BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned\r
202 \r
203         MSR     CPSR_c, #(ARM_MODE_UND | F_BIT | I_BIT)\r
204         LDR     sp, =SFE(UND_STACK)     ; End of UND_STACK\r
205         BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned\r
206 \r
207         MSR     CPSR_c, #(ARM_MODE_SYS | F_BIT | I_BIT)\r
208         LDR     sp, =SFE(CSTACK-0x3000) ; 0x1000 bytes of SYS stack\r
209         BIC     sp,sp,#0x7              ; Make sure SP is 8 aligned\r
210 \r
211 \r
212         MSR     CPSR_c, #(ARM_MODE_SVC | F_BIT | I_BIT)\r
213 \r
214         CPSIE   A\r
215 \r
216         /* Enable VFP */\r
217         /* - Enable access to CP10 and CP11 in CP15.CACR */\r
218         MRC     p15, 0, r0, c1, c0, 2\r
219         ORR     r0, r0, #0xf00000\r
220         MCR     p15, 0, r0, c1, c0, 2\r
221         /* - Enable access to CP10 and CP11 in CP15.NSACR */\r
222         /* - Set FPEXC.EN (B30) */\r
223 #ifdef __ARMVFP__\r
224         MOV     r3, #0x40000000\r
225         VMSR    FPEXC, r3\r
226 #endif\r
227 \r
228          // Redirect FIQ to IRQ\r
229         LDR  r0,  =AICREDIR_KEY\r
230         LDR  r1, = REG_SFR_UID\r
231         LDR  r2, = REG_SFR_AICREDIR\r
232         LDR  r3,[r1]\r
233         EORS r0, r0, r3\r
234         ORRS r0, r0, #0x01\r
235         STR  r0, [r2]\r
236 \r
237          /* Perform low-level initialization of the chip using LowLevelInit() */\r
238         LDR     r0, =LowLevelInit\r
239         BLX     r0\r
240 \r
241 \r
242         MRC     p15, 0, r0, c1, c0, 0       ; Read CP15 Control Regsiter into r0\r
243         TST     r0, #0x1                    ; Is the MMU enabled?\r
244         BICNE   r0, r0, #0x1                ; Clear bit 0\r
245         TST     r0, #0x4                    ; Is the Dcache enabled?\r
246         BICNE   r0, r0, #0x4                ; Clear bit 2\r
247         MCRNE   p15, 0, r0, c1, c0, 0       ; Write value back\r
248 \r
249         // Disbale L2 cache\r
250         LDR r1,=L2CC_CR\r
251         MOV r2,#0\r
252         STR r2, [r1]\r
253 \r
254         DMB\r
255         BL      CP15_InvalidateTranslationTable\r
256         BL      CP15_InvalidateBTB\r
257         BL      CP15_InvalidateIcache\r
258         BL      CP15_InvalidateDcacheBySetWay\r
259         DMB\r
260         ISB\r
261 \r
262 \r
263         /* Branch to main() */\r
264         LDR     r0, =?main\r
265         BLX     r0\r
266 \r
267         /* Loop indefinitely when program is finished */\r
268 loop4:\r
269         B       loop4\r
270 \r
271 \r
272 \r
273 ;------------------------------------------------------------------------------\r
274 ;- Function             : FIQ_Handler\r
275 ;- Treatments           : FIQ Controller Interrupt Handler.\r
276 ;- Called Functions     : AIC_IVR[interrupt]\r
277 ;------------------------------------------------------------------------------\r
278 SAIC   DEFINE   0xFC068400\r
279 AIC_FVR           DEFINE   0x14\r
280 \r
281         SECTION .text:CODE:NOROOT(2)\r
282         ARM\r
283 FIQ_Handler:\r
284   /* Save interrupt context on the stack to allow nesting */\r
285         SUB     lr, lr, #4\r
286         STMFD   sp!, {lr}\r
287         /* MRS     lr, SPSR */\r
288         STMFD   sp!, {r0}\r
289 \r
290         /* Write in the IVR to support Protect Mode */\r
291         LDR     lr, =SAIC\r
292         LDR     r0, [r14, #AIC_IVR]\r
293         STR     lr, [r14, #AIC_IVR]\r
294 \r
295         /* Branch to interrupt handler in Supervisor mode */\r
296         MSR     CPSR_c, #ARM_MODE_SVC\r
297         STMFD   sp!, {r1-r3, r4, r12, lr}\r
298 \r
299         MOV     r14, pc\r
300         BX      r0\r
301 \r
302         LDMIA   sp!, {r1-r3, r4, r12, lr}\r
303         MSR     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT\r
304 \r
305         /* Acknowledge interrupt */\r
306         LDR     lr, =SAIC\r
307         STR     lr, [r14, #AIC_EOICR]\r
308 \r
309         /* Restore interrupt context and branch back to calling code */\r
310         LDMIA   sp!, {r0}\r
311         /* MSR     SPSR_cxsf, lr */\r
312         LDMIA   sp!, {pc}^\r
313 \r
314 \r
315  END\r