]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D2x_Xplained_IAR/AtmelFiles/target/sama5d2/toolchain/iar/cstartup.s
Add SAMA5D2 Xplained IAR demo.
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D2x_Xplained_IAR / AtmelFiles / target / sama5d2 / toolchain / iar / cstartup.s
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2015, 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         MODULE  ?cstartup\r
31 \r
32         ;; Forward declaration of sections.\r
33         SECTION IRQ_STACK:DATA:NOROOT(2)\r
34         SECTION FIQ_STACK:DATA:NOROOT(2)\r
35         SECTION ABT_STACK:DATA:NOROOT(2)\r
36         SECTION UND_STACK:DATA:NOROOT(2)\r
37         SECTION SYS_STACK:DATA:NOROOT(2)\r
38         SECTION CSTACK:DATA:NOROOT(3)\r
39 \r
40 //------------------------------------------------------------------------------\r
41 //         Headers\r
42 //------------------------------------------------------------------------------\r
43 \r
44 #define __ASSEMBLY__\r
45 \r
46 //------------------------------------------------------------------------------\r
47 //         Definitions\r
48 //------------------------------------------------------------------------------\r
49 \r
50 AT91C_BASE_AIC  DEFINE 0xFC020000\r
51 AT91C_BASE_SAIC DEFINE 0xF803C000\r
52 AIC_IVR         DEFINE 0x10\r
53 AIC_EOICR       DEFINE 0x38\r
54 \r
55 MODE_MSK        DEFINE 0x1F  ; Bit mask for mode bits in CPSR\r
56 \r
57 ARM_MODE_ABT    DEFINE 0x17\r
58 ARM_MODE_FIQ    DEFINE 0x11\r
59 ARM_MODE_IRQ    DEFINE 0x12\r
60 ARM_MODE_SVC    DEFINE 0x13\r
61 ARM_MODE_SYS    DEFINE 0x1F\r
62 ARM_MODE_UND    DEFINE 0x1B\r
63 \r
64 I_BIT           DEFINE 0x80\r
65 F_BIT           DEFINE 0x40\r
66 \r
67 //------------------------------------------------------------------------------\r
68 //         Startup routine\r
69 //------------------------------------------------------------------------------\r
70 \r
71         SECTION .vectors:CODE:NOROOT(2)\r
72 \r
73         PUBLIC  _reset_vector\r
74         PUBLIC  __iar_program_start\r
75         PUBLIC  irqHandler\r
76         PUBLIC  fiqHandler\r
77 \r
78         EXTERN  undefined_instruction_irq_handler\r
79         EXTERN  prefetch_abort_irq_handler\r
80         EXTERN  data_abort_irq_handler\r
81         EXTERN  software_interrupt_irq_handler\r
82 \r
83         DATA\r
84 \r
85 __iar_init$$done:               ; The vector table is not needed\r
86                                 ; until after copy initialization is done\r
87 \r
88 _reset_vector:                  ; Make this a DATA label, so that stack usage\r
89                                 ; analysis doesn't consider it an uncalled fun\r
90 \r
91         ARM\r
92 \r
93         ldr     pc, reset_addr          ; 0x0 Reset\r
94         ldr     pc, undefined_addr      ; 0x4 Undefined instructions\r
95         ldr     pc, soft_int_addr       ; 0x8 Software interrupt (SWI/SVC)\r
96         ldr     pc, prefetch_abt_addr   ; 0xc Prefetch abort\r
97         ldr     pc, data_abt_addr       ; 0x10 Data abort\r
98         DCD     0                       ; 0x14 RESERVED\r
99         ldr     pc, irq_addr            ; 0x18 IRQ\r
100         ldr     pc, fiq_addr            ; 0x1c FIQ\r
101 \r
102         DATA\r
103 \r
104 ; All default handlers (except reset, irq and fiq) are\r
105 ; defined as weak symbol definitions.\r
106 ; If a handler is defined by the application it will take precedence.\r
107 reset_addr:        DCD   __iar_program_start\r
108 undefined_addr:    DCD   undefined_instruction_irq_handler\r
109 soft_int_addr:     DCD   software_interrupt_irq_handler\r
110 prefetch_abt_addr: DCD   prefetch_abort_irq_handler\r
111 data_abt_addr:     DCD   data_abort_irq_handler\r
112 irq_addr:          DCD   irqHandler\r
113 fiq_addr:          DCD   fiqHandler\r
114 \r
115 ;------------------------------------------------------------------------------\r
116 ; Handles a fast interrupt request by branching to the address defined in the\r
117 ; AIC.\r
118 ;------------------------------------------------------------------------------\r
119         SECTION .text:CODE:NOROOT(2)\r
120         ARM\r
121 fiqHandler:\r
122         sub         lr, lr, #4\r
123         stmfd       sp!, {lr}\r
124         stmfd       sp!, {r0}\r
125 \r
126         ; Write in the IVR to support Protect Mode\r
127 \r
128         ldr         lr, =AT91C_BASE_SAIC\r
129         ldr         r0, [r14, #AIC_IVR]\r
130         str         lr, [r14, #AIC_IVR]\r
131 \r
132         ; Branch to interrupt handler in Supervisor mode\r
133 \r
134         msr         CPSR_c, #ARM_MODE_SVC\r
135         stmfd       sp!, { r1-r3, r4, r12, lr}\r
136 \r
137         blx          r0\r
138 \r
139         ldmia       sp!, { r1-r3, r4, r12, lr}\r
140         msr         CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT\r
141 \r
142         ; Acknowledge interrupt\r
143 \r
144         ldr         lr, =AT91C_BASE_SAIC\r
145         str         lr, [r14, #AIC_EOICR]\r
146 \r
147         ; Restore interrupt context and branch back to calling code\r
148         ldmia       sp!, {r0}\r
149         ldmia       sp!, {pc}^\r
150 \r
151 ;------------------------------------------------------------------------------\r
152 ; Handles incoming interrupt requests by branching to the corresponding\r
153 ; handler, as defined in the AIC. Supports interrupt nesting.\r
154 ;------------------------------------------------------------------------------\r
155         SECTION .text:CODE:NOROOT(2)\r
156         ARM\r
157 irqHandler:\r
158         ; Save interrupt context on the stack to allow nesting\r
159 \r
160         sub         lr, lr, #4\r
161         stmfd       sp!, {lr}\r
162         mrs            lr, SPSR\r
163         stmfd       sp!, {r0, lr}\r
164 \r
165         ; Write in the IVR to support Protect Mode\r
166 \r
167         ldr         lr, =AT91C_BASE_AIC\r
168         ldr         r0, [r14, #AIC_IVR]\r
169            str         lr, [r14, #AIC_IVR]\r
170 \r
171         ; Branch to interrupt handler in Supervisor mode\r
172 \r
173         msr         CPSR_c, #ARM_MODE_SVC\r
174         stmfd       sp!, { r1-r3, r4, r12, lr}\r
175 \r
176         ; Check for 8-byte alignment and save lr plus a\r
177         ; word to indicate the stack adjustment used (0 or 4)\r
178 \r
179         and         r1, sp, #4\r
180         sub         sp, sp, r1\r
181         stmfd       sp!, {r1, lr}\r
182 \r
183         blx         r0\r
184 \r
185         ldmia       sp!, {r1, lr}\r
186         add            sp, sp, r1\r
187 \r
188         ldmia       sp!, { r1-r3, r4, r12, lr}\r
189         msr         CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT\r
190 \r
191         ; Acknowledge interrupt\r
192 \r
193         ldr         lr, =AT91C_BASE_AIC\r
194         str         lr, [r14, #AIC_EOICR]\r
195 \r
196         ; Restore interrupt context and branch back to calling code\r
197 \r
198         ldmia       sp!, {r0, lr}\r
199         msr         SPSR_cxsf, lr\r
200         ldmia       sp!, {pc}^\r
201 \r
202 //------------------------------------------------------------------------------\r
203 /// Initializes the chip and branches to the main() function.\r
204 //------------------------------------------------------------------------------\r
205 \r
206         SECTION .text:CODE:NOROOT(2)\r
207         PUBLIC    __iar_program_start\r
208         EXTERN  __cmain\r
209         EXTERN     low_level_init\r
210         REQUIRE _reset_vector\r
211 \r
212         EXTWEAK __iar_init_core\r
213         EXTWEAK __iar_init_vfp\r
214 \r
215         ARM\r
216 \r
217 __iar_program_start:\r
218 ?cstartup:\r
219 \r
220         cpsie   a\r
221 \r
222         ; Set up the fast interrupt stack pointer\r
223 \r
224         mrs     r0, CPSR\r
225         bic     r0, r0, #MODE_MSK\r
226         orr     r0, r0, #ARM_MODE_FIQ\r
227         msr     cpsr_c, r0\r
228         ldr     sp, =SFE(FIQ_STACK)\r
229         bic     sp, sp, #0x7\r
230 \r
231         ; Set up the normal interrupt stack pointer\r
232 \r
233         bic     r0, r0, #MODE_MSK\r
234         orr     r0, r0, #ARM_MODE_IRQ\r
235         msr     CPSR_c, r0\r
236         ldr     sp, =SFE(IRQ_STACK)\r
237         bic     sp, sp, #0x7\r
238 \r
239         ; Set up the abort mode stack pointer\r
240 \r
241         bic     r0, r0, #MODE_MSK\r
242         orr     r0, r0, #ARM_MODE_ABT\r
243         msr     CPSR_c, r0\r
244         ldr     sp, =SFE(ABT_STACK)\r
245         bic     sp, sp, #0x7\r
246 \r
247         ; Set up the undefined mode stack pointer\r
248 \r
249         bic     r0, r0, #MODE_MSK\r
250         orr     r0, r0, #ARM_MODE_UND\r
251         msr     CPSR_c, r0\r
252         ldr     sp, =SFE(UND_STACK)\r
253         bic     sp, sp, #0x7\r
254 \r
255         ; Set up the system mode stack pointer\r
256 \r
257         bic     r0, r0, #MODE_MSK\r
258         orr     r0, r0, #ARM_MODE_SYS\r
259         msr     CPSR_c, r0\r
260         ldr     sp, =SFE(SYS_STACK)\r
261         bic     sp, sp, #0x7\r
262 \r
263         ; Set up the supervisor mode stack pointer\r
264 \r
265         bic     r0 ,r0, #MODE_MSK\r
266         orr     r0 ,r0, #ARM_MODE_SVC\r
267         msr     cpsr_c, r0\r
268         ldr     sp, =SFE(CSTACK)\r
269         bic     sp, sp, #0x7\r
270 \r
271         ; Perform low-level initialization of the chip using low_level_init()\r
272 \r
273         ldr     r0, =low_level_init\r
274         blx     r0\r
275 \r
276         ; Turn on core features assumed to be enabled\r
277         FUNCALL __iar_program_start, __iar_init_core\r
278         bl      __iar_init_core\r
279 \r
280         ;; Initialize VFP (if needed)\r
281         FUNCALL __iar_program_start, __iar_init_vfp\r
282         bl      __iar_init_vfp\r
283 \r
284         FUNCALL __iar_program_start, __cmain\r
285         bl      __cmain\r
286 \r
287        ;; Loop indefinitely when program is finished\r
288 loop4:  b       loop4\r
289 \r
290         END\r