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