]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_A5_SAMA5D4x_EK_IAR/AtmelFiles/libboard_sama5d4x-ek/source/board_cstartup_gnu.S
Core kernel files:
[freertos] / FreeRTOS / Demo / CORTEX_A5_SAMA5D4x_EK_IAR / AtmelFiles / libboard_sama5d4x-ek / source / board_cstartup_gnu.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 //------------------------------------------------------------------------------\r
32 //         Definitions\r
33 //------------------------------------------------------------------------------\r
34 \r
35 \r
36 #define AIC         0xFC06E000\r
37 #define AIC_IVR     0x10\r
38 #define AIC_EOICR   0x38\r
39 #define SAIC        0xFC068400\r
40 #define AIC_FVR     0x14\r
41 \r
42 #define IRQ_STACK_SIZE   8*3*4\r
43 #define FIQ_STACK_SIZE   8*3*4\r
44 \r
45 #define MODE_MSK         0x1F\r
46 #define ARM_MODE_ABT     0x17\r
47 #define ARM_MODE_FIQ     0x11\r
48 #define ARM_MODE_IRQ     0x12\r
49 #define ARM_MODE_SVC     0x13\r
50 #define ARM_MODE_SYS     0x1F\r
51 \r
52 #define I_BIT            0x80\r
53 #define F_BIT            0x40\r
54 \r
55 #define REG_SFR_AICREDIR        0xF8028054\r
56 #define REG_SFR_UID             0xF8028050   \r
57 #define AICREDIR_KEY            0x5F67B102\r
58 \r
59 //------------------------------------------------------------------------------\r
60 //         Startup routine\r
61 //------------------------------------------------------------------------------\r
62 \r
63             .align      4\r
64             .arm\r
65         \r
66 /* Exception vectors\r
67  *******************/\r
68             .section    .vectors, "a", %progbits\r
69 \r
70 resetVector:\r
71         ldr     pc, =resetHandler       /* Reset */\r
72 undefVector:\r
73         b       undefVector             /* Undefined instruction */\r
74 swiVector:\r
75         b       swiVector               /* Software interrupt */\r
76 prefetchAbortVector:\r
77         b       prefetchAbortVector     /* Prefetch abort */\r
78 dataAbortVector:\r
79         b       dataAbortVector         /* Data abort */\r
80 reservedVector:\r
81         b       reservedVector          /* Reserved for future use */\r
82 irqVector:\r
83         b       irqHandler              /* Interrupt */\r
84 fiqVector:\r
85         b       fiqHandler              /* Fast interrupt */\r
86 //------------------------------------------------------------------------------\r
87 /// Handles a fast interrupt request by branching to the address defined in the\r
88 /// AIC.\r
89 //------------------------------------------------------------------------------\r
90 fiqHandler:\r
91         SUB     lr, lr, #4\r
92         STMFD   sp!, {lr}\r
93         /* MRS     lr, SPSR */\r
94         STMFD   sp!, {r0}\r
95 \r
96         /* Write in the IVR to support Protect Mode */\r
97         LDR     lr, =SAIC\r
98         LDR     r0, [r14, #AIC_IVR]\r
99         STR     lr, [r14, #AIC_IVR]\r
100 \r
101         /* Branch to interrupt handler in Supervisor mode */\r
102         MSR     CPSR_c, #ARM_MODE_SVC\r
103         STMFD   sp!, {r1-r3, r4, r12, lr}\r
104 \r
105         MOV     r14, pc\r
106         BX      r0\r
107 \r
108         LDMIA   sp!, {r1-r3, r4, r12, lr}\r
109         MSR     CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT\r
110 \r
111         /* Acknowledge interrupt */\r
112         LDR     lr, =SAIC\r
113         STR     lr, [r14, #AIC_EOICR]\r
114 \r
115         /* Restore interrupt context and branch back to calling code */\r
116         LDMIA   sp!, {r0}\r
117         /* MSR     SPSR_cxsf, lr*/\r
118         LDMIA   sp!, {pc}^\r
119 \r
120 \r
121 //------------------------------------------------------------------------------\r
122 /// Handles incoming interrupt requests by branching to the corresponding\r
123 /// handler, as defined in the AIC. Supports interrupt nesting.\r
124 //------------------------------------------------------------------------------\r
125 irqHandler:\r
126  /* Save interrupt context on the stack to allow nesting */\r
127      /* Save interrupt context on the stack to allow nesting */\r
128         SUB     lr, lr, #4\r
129         STMFD   sp!, {lr}\r
130         MRS     lr, SPSR\r
131         STMFD   sp!, {r0, lr}\r
132 \r
133         /* Write in the IVR to support Protect Mode */\r
134         LDR     lr, =AIC\r
135         LDR     r0, [r14, #AIC_IVR]\r
136         STR     lr, [r14, #AIC_IVR]\r
137 \r
138         /* Branch to interrupt handler in Supervisor mode */\r
139         MSR     CPSR_c, #ARM_MODE_SVC\r
140         STMFD   sp!, {r1-r3, r4, r12, lr}\r
141 \r
142         /* Check for 8-byte alignment and save lr plus a */\r
143         /* word to indicate the stack adjustment used (0 or 4) */\r
144         AND     r1, sp, #4\r
145         SUB     sp, sp, r1\r
146         STMFD   sp!, {r1, lr}\r
147 \r
148         BLX     r0\r
149 \r
150         LDMIA   sp!, {r1, lr}\r
151         ADD     sp, sp, r1\r
152 \r
153         LDMIA   sp!, {r1-r3, r4, r12, lr}\r
154         MSR     CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT\r
155 \r
156         /* Acknowledge interrupt */\r
157         LDR     lr, =AIC\r
158         STR     lr, [r14, #AIC_EOICR]\r
159 \r
160         /* Restore interrupt context and branch back to calling code */\r
161         LDMIA   sp!, {r0, lr}\r
162         MSR     SPSR_cxsf, lr\r
163         LDMIA   sp!, {pc}^\r
164 \r
165 \r
166 //------------------------------------------------------------------------------\r
167 /// Initializes the chip and branches to the main() function.\r
168 //------------------------------------------------------------------------------\r
169             .section    .textEntry\r
170             .global     entry\r
171 \r
172 entry:\r
173 resetHandler:\r
174         \r
175         CPSIE   A \r
176 \r
177 /* Enable VFP */\r
178         /* - Enable access to CP10 and CP11 in CP15.CACR */\r
179         //mrc     p15, 0, r0, c1, c0, 2\r
180         //orr     r0, r0, #0xf00000\r
181         //mcr     p15, 0, r0, c1, c0, 2\r
182 /* - Enable access to CP10 and CP11 in CP15.NSACR */\r
183 /* - Set FPEXC.EN (B30) */\r
184         //fmrx    r0, fpexc\r
185         //orr     r0, r0, #0x40000000\r
186         //fmxr    fpexc, r0\r
187 \r
188 /* Useless instruction for referencing the .vectors section */\r
189         ldr     r0, =resetVector\r
190 \r
191 /* Set pc to actual code location (i.e. not in remap zone) */\r
192         ldr     pc, =1f\r
193 \r
194 /* Initialize the prerelocate segment */\r
195 1:\r
196         ldr     r0, =_efixed\r
197         ldr     r1, =_sprerelocate\r
198         ldr     r2, =_eprerelocate\r
199 1:\r
200         cmp     r1, r2\r
201         ldrcc   r3, [r0], #4\r
202         strcc   r3, [r1], #4\r
203         bcc     1b\r
204 \r
205 /* Perform low-level initialization of the chip using LowLevelInit() */\r
206         ldr     sp, =_cstack\r
207         stmfd   sp!, {r0}\r
208         ldr     r0, =LowLevelInit\r
209         blx     r0\r
210 \r
211 /* Initialize the postrelocate segment */\r
212 \r
213         ldmfd   sp!, {r0}\r
214         ldr     r1, =_spostrelocate\r
215         ldr     r2, =_epostrelocate\r
216 1:\r
217         cmp     r1, r2\r
218         ldrcc   r3, [r0], #4\r
219         strcc   r3, [r1], #4\r
220         bcc     1b\r
221 \r
222 /* Clear the zero segment */\r
223         ldr     r0, =_szero\r
224         ldr     r1, =_ezero\r
225         mov     r2, #0\r
226 1:\r
227         cmp     r0, r1\r
228         strcc   r2, [r0], #4\r
229         bcc     1b\r
230         \r
231         MRS     r0, cpsr                \r
232 /* Set up the fast interrupt stack pointer.*/\r
233         bic     r0, r0, #MODE_MSK       \r
234         orr     r0, r0, #ARM_MODE_FIQ   \r
235         msr     cpsr_c, r0              \r
236         ldr     sp, =_fiqstack     \r
237         bic     sp,sp,#0x7       \r
238 \r
239 /* Set up the normal interrupt stack pointer.*/\r
240 \r
241         bic     r0, r0, #MODE_MSK       \r
242         orr     r0, r0, #ARM_MODE_IRQ  \r
243         msr     cpsr_c, r0             \r
244         ldr     sp, =_irqstack          \r
245         bic     sp,sp,#0x7             \r
246 \r
247 /* Set up the stack pointer.*/\r
248 \r
249         bic     r0 ,r0, #MODE_MSK      \r
250         orr     r0 ,r0, #ARM_MODE_SYS  \r
251         msr     cpsr_c, r0             \r
252         ldr     sp, =_sysstack\r
253         bic     sp,sp,#0x7              \r
254 \r
255         bic     r0 ,r0, #MODE_MSK      \r
256         orr     r0 ,r0, #ARM_MODE_SVC\r
257         msr     cpsr_c, r0             \r
258         ldr     sp, =_cstack\r
259         bic     sp,sp,#0x7    \r
260 \r
261                 // Redirect FIQ to IRQ\r
262         LDR  r0,  =AICREDIR_KEY \r
263         LDR  r1, = REG_SFR_UID\r
264         LDR  r2, = REG_SFR_AICREDIR\r
265         LDR  r3,[r1]\r
266         EORS r0, r0, r3\r
267         ORRS r0, r0, #0x01\r
268         STR  r0, [r2]\r
269 \r
270 /*Initialize the C library  */\r
271        ldr     r3, =__libc_init_array\r
272        mov     lr, pc\r
273        bx      r3\r
274 \r
275 /* Branch to main()\r
276  ******************/\r
277        ldr     r0, =main\r
278        blx     r0\r
279 \r
280 /* Loop indefinitely when program is finished */\r
281 1:\r
282         b       1b\r
283 \r