]> git.sur5r.net Git - freertos/blob
7e3a2ced55d7181637f13e6b5cb847316716a252
[freertos] /
1 /* ----------------------------------------------------------------------------\r
2  *         SAM Software Package License\r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2011, 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 AT91SAMA5D3X 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 CSTACK:DATA:NOROOT(3)\r
39 \r
40 //------------------------------------------------------------------------------\r
41 //         Headers\r
42 //------------------------------------------------------------------------------\r
43 \r
44 //#define __ASSEMBLY__\r
45 //#include "board.h"\r
46 \r
47 //------------------------------------------------------------------------------\r
48 //         Definitions\r
49 //------------------------------------------------------------------------------\r
50 \r
51 #define AIC         0xFFFFF000\r
52 #define AIC_IVR     0x10\r
53 #define AIC_EOICR   0x38\r
54 \r
55 #define ARM_MODE_ABT     0x17\r
56 #define ARM_MODE_FIQ     0x11\r
57 #define ARM_MODE_IRQ     0x12\r
58 #define ARM_MODE_SVC     0x13\r
59 #define ARM_MODE_SYS     0x1F\r
60 \r
61 #define I_BIT            0x80\r
62 #define F_BIT            0x40\r
63 \r
64 //------------------------------------------------------------------------------\r
65 //         Startup routine\r
66 //------------------------------------------------------------------------------\r
67 \r
68 /*\r
69    Exception vectors\r
70  */\r
71         SECTION .vectors:CODE:NOROOT(2)\r
72 \r
73         PUBLIC  resetVector\r
74         PUBLIC  irqHandler\r
75 \r
76         EXTERN  Undefined_Handler\r
77         EXTERN  SWI_Handler\r
78         EXTERN  Prefetch_Handler\r
79         EXTERN  Abort_Handler\r
80         EXTERN  FIQ_Handler\r
81 \r
82         ARM\r
83 \r
84 __iar_init$$done:               ; The interrupt vector is not needed\r
85                                 ; until after copy initialization is done\r
86 \r
87 resetVector:\r
88         ; All default exception handlers (except reset) are\r
89         ; defined as weak symbol definitions.\r
90         ; If a handler is defined by the application it will take precedence.\r
91         LDR     pc, =resetHandler        ; Reset\r
92         LDR     pc, Undefined_Addr       ; Undefined instructions\r
93         LDR     pc, SWI_Addr             ; Software interrupt (SWI/SYS)\r
94         LDR     pc, Prefetch_Addr        ; Prefetch abort\r
95         LDR     pc, Abort_Addr           ; Data abort\r
96         B       .                        ; RESERVED\r
97         LDR     pc, =irqHandler          ; IRQ\r
98         LDR     pc, FIQ_Addr             ; FIQ\r
99 \r
100 Undefined_Addr: DCD   Undefined_Handler\r
101 SWI_Addr:       DCD   SWI_Handler\r
102 Prefetch_Addr:  DCD   Prefetch_Handler\r
103 Abort_Addr:     DCD   Abort_Handler\r
104 FIQ_Addr:       DCD   FIQ_Handler\r
105 \r
106 /*\r
107    Handles incoming interrupt requests by branching to the corresponding\r
108    handler, as defined in the AIC. Supports interrupt nesting.\r
109  */\r
110 irqHandler:\r
111         /* Save interrupt context on the stack to allow nesting */\r
112         SUB     lr, lr, #4\r
113         STMFD   sp!, {lr}\r
114         MRS     lr, SPSR\r
115         STMFD   sp!, {r0, lr}\r
116 \r
117         /* Write in the IVR to support Protect Mode */\r
118         LDR     lr, =AIC\r
119         LDR     r0, [r14, #AIC_IVR]\r
120         STR     lr, [r14, #AIC_IVR]\r
121 \r
122         /* Branch to interrupt handler in Supervisor mode */\r
123         MSR     CPSR_c, #ARM_MODE_SYS\r
124         STMFD   sp!, {r1-r3, r4, r12, lr}\r
125 \r
126         /* Check for 8-byte alignment and save lr plus a */\r
127         /* word to indicate the stack adjustment used (0 or 4) */\r
128         AND     r1, sp, #4\r
129         SUB     sp, sp, r1\r
130         STMFD   sp!, {r1, lr}\r
131 \r
132         BLX     r0\r
133 \r
134         LDMIA   sp!, {r1, lr}\r
135         ADD     sp, sp, r1\r
136 \r
137         LDMIA   sp!, {r1-r3, r4, r12, lr}\r
138         MSR     CPSR_c, #ARM_MODE_IRQ | I_BIT\r
139 \r
140         /* Acknowledge interrupt */\r
141         LDR     lr, =AIC\r
142         STR     lr, [r14, #AIC_EOICR]\r
143 \r
144         /* Restore interrupt context and branch back to calling code */\r
145         LDMIA   sp!, {r0, lr}\r
146         MSR     SPSR_cxsf, lr\r
147         LDMIA   sp!, {pc}^\r
148 \r
149 \r
150 /*\r
151    After a reset, execution starts here, the mode is ARM, supervisor\r
152    with interrupts disabled.\r
153    Initializes the chip and branches to the main() function.\r
154  */\r
155         SECTION .cstartup:CODE:NOROOT(2)\r
156 \r
157         PUBLIC  resetHandler\r
158         EXTERN  LowLevelInit\r
159         EXTERN  ?main\r
160         REQUIRE resetVector\r
161         ARM\r
162 \r
163 resetHandler:\r
164        CPSIE   A\r
165         /* Enable VFP */\r
166         /* - Enable access to CP10 and CP11 in CP15.CACR */\r
167         mrc     p15, 0, r0, c1, c0, 2\r
168         orr     r0, r0, #0xf00000\r
169         mcr     p15, 0, r0, c1, c0, 2\r
170         /* - Enable access to CP10 and CP11 in CP15.NSACR */\r
171         /* - Set FPEXC.EN (B30) */\r
172         fmrx    r0, fpexc\r
173         orr     r0, r0, #0x40000000\r
174         fmxr    fpexc, r0\r
175         /* Set pc to actual code location (i.e. not in remap zone) */\r
176         LDR     pc, =label\r
177 \r
178         /* Perform low-level initialization of the chip using LowLevelInit() */\r
179 label:\r
180         LDR     r0, =LowLevelInit\r
181         LDR     r4, =SFE(CSTACK)\r
182         MOV     sp, r4\r
183         BLX     r0\r
184 \r
185         /* Set up the interrupt stack pointer. */\r
186         MSR     cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT      ; Change the mode\r
187         LDR     sp, =SFE(IRQ_STACK)\r
188 \r
189         /* Set up the SYS stack pointer. */\r
190         MSR     cpsr_c, #ARM_MODE_SYS | F_BIT              ; Change the mode\r
191         LDR     sp, =SFE(CSTACK)\r
192 \r
193         /* Branch to main() */\r
194         LDR     r0, =?main\r
195         BLX     r0\r
196 \r
197         /* Loop indefinitely when program is finished */\r
198 loop4:\r
199         B       loop4\r
200         END\r