]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/arm/mach-lpc13xx/libs/hal/startup.c
Added arch for lpc13xx
[sysless.git] / arch / arm / mach-lpc13xx / libs / hal / startup.c
1 /****************************************************************************//**
2  * @file :    startup_LPC17xx.c
3  * @brief : CMSIS Cortex-M3 Core Device Startup File
4  * @version : V1.01
5  * @date :    4. Feb. 2009
6  *
7  *----------------------------------------------------------------------------
8  *
9  * Copyright (C) 2009 ARM Limited. All rights reserved.
10  *
11  * ARM Limited (ARM) is supplying this software for use with Cortex-Mx
12  * processor based microcontrollers.  This file can be freely distributed
13  * within development tools that are supporting such ARM based processors.
14  *
15  * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
16  * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
17  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
18  * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
19  * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
20  *
21  ******************************************************************************/
22
23 // Mod by nio for the .fastcode part
24
25 #include "LPC13xx.h"
26
27 #define WEAK __attribute__ ((weak))
28 //*****************************************************************************
29 //
30 // Forward declaration of the default fault handlers.
31 //
32 //*****************************************************************************
33 /* System exception vector handler */
34 void WEAK               Reset_Handler(void);             /* Reset Handler */
35 void WEAK               NMI_Handler(void);               /* NMI Handler */
36 void WEAK               HardFault_Handler(void);         /* Hard Fault Handler */
37 void WEAK               MemManage_Handler(void);         /* MPU Fault Handler */
38 void WEAK               BusFault_Handler(void);          /* Bus Fault Handler */
39 void WEAK               UsageFault_Handler(void);        /* Usage Fault Handler */
40 void WEAK               SVC_Handler(void);               /* SVCall Handler */
41 void WEAK               DebugMon_Handler(void);          /* Debug Monitor Handler */
42 void WEAK               PendSV_Handler(void);            /* PendSV Handler */
43 void WEAK               SysTick_Handler(void);           /* SysTick Handler */
44
45
46 void WEAK       WAKEUP0_IRQHandler(void);
47 void WEAK       WAKEUP1_IRQHandler(void);
48 void WEAK       WAKEUP2_IRQHandler(void);
49 void WEAK       WAKEUP3_IRQHandler(void);
50 void WEAK       WAKEUP4_IRQHandler(void);
51 void WEAK       WAKEUP5_IRQHandler(void);
52 void WEAK       WAKEUP6_IRQHandler(void);
53 void WEAK       WAKEUP7_IRQHandler(void);
54 void WEAK       WAKEUP8_IRQHandler(void);
55 void WEAK       WAKEUP9_IRQHandler(void);
56 void WEAK       WAKEUP10_IRQHandler(void);
57 void WEAK       WAKEUP11_IRQHandler(void);
58 void WEAK       WAKEUP12_IRQHandler(void);
59 void WEAK       WAKEUP13_IRQHandler(void);
60 void WEAK       WAKEUP14_IRQHandler(void);
61 void WEAK       WAKEUP15_IRQHandler(void);
62 void WEAK       WAKEUP16_IRQHandler(void);
63 void WEAK       WAKEUP17_IRQHandler(void);
64 void WEAK       WAKEUP18_IRQHandler(void);
65 void WEAK       WAKEUP19_IRQHandler(void);
66 void WEAK       WAKEUP20_IRQHandler(void);
67 void WEAK       WAKEUP21_IRQHandler(void);
68 void WEAK       WAKEUP22_IRQHandler(void);
69 void WEAK       WAKEUP23_IRQHandler(void);
70 void WEAK       WAKEUP24_IRQHandler(void);
71 void WEAK       WAKEUP25_IRQHandler(void);
72 void WEAK       WAKEUP26_IRQHandler(void);
73 void WEAK       WAKEUP27_IRQHandler(void);
74 void WEAK       WAKEUP28_IRQHandler(void);
75 void WEAK       WAKEUP29_IRQHandler(void);
76 void WEAK       WAKEUP30_IRQHandler(void);
77 void WEAK       WAKEUP31_IRQHandler(void);
78 void WEAK       WAKEUP32_IRQHandler(void);
79 void WEAK       WAKEUP33_IRQHandler(void);
80 void WEAK       WAKEUP34_IRQHandler(void);
81 void WEAK       WAKEUP35_IRQHandler(void);
82 void WEAK       WAKEUP36_IRQHandler(void);
83 void WEAK       WAKEUP37_IRQHandler(void);
84 void WEAK       WAKEUP38_IRQHandler(void);
85 void WEAK       WAKEUP39_IRQHandler(void);
86 void WEAK       I2C_IRQHandler(void);
87 void WEAK       TIMER_16_0_IRQHandler(void);
88 void WEAK       TIMER_16_1_IRQHandler(void);
89 void WEAK       TIMER_32_0_IRQHandler(void);
90 void WEAK       TIMER_32_1_IRQHandler(void);
91 void WEAK       SSP_IRQHandler(void);
92 void WEAK       UART_IRQHandler(void);
93 void WEAK       USB_IRQHandler(void);
94 void WEAK       USB_FIQHandler(void);
95 void WEAK       ADC_IRQHandler(void);
96 void WEAK       WDT_IRQHandler(void);
97 void WEAK       BOD_IRQHandler(void);
98 void WEAK       EINT3_IRQHandler(void);
99 void WEAK       EINT2_IRQHandler(void);
100 void WEAK       EINT1_IRQHandler(void);
101 void WEAK       EINT0_IRQHandler(void);
102
103
104 /* Exported types --------------------------------------------------------------*/
105 /* Exported constants --------------------------------------------------------*/
106 extern unsigned long _etext;
107 extern unsigned long _sidata;           /* start address for the initialization values of the .data section. defined in linker script */
108 extern unsigned long _sdata;            /* start address for the .data section. defined in linker script */
109 extern unsigned long _edata;            /* end address for the .data section. defined in linker script */
110
111 extern unsigned long _sifastcode;               /* start address for the initialization values of the .fastcode section. defined in linker script */
112 extern unsigned long _sfastcode;                /* start address for the .fastcode section. defined in linker script */
113 extern unsigned long _efastcode;                /* end address for the .fastcode section. defined in linker script */
114
115 extern unsigned long _sbss;                     /* start address for the .bss section. defined in linker script */
116 extern unsigned long _ebss;                     /* end address for the .bss section. defined in linker script */
117
118 extern void _estack;            /* init value for the stack pointer. defined in linker script */
119
120 extern void (_setup_board)(void);               /* setup_board adress function */
121 extern unsigned long _mem_app_start;
122
123
124 /* Private typedef -----------------------------------------------------------*/
125 /* function prototypes ------------------------------------------------------*/
126 void Reset_Handler(void) __attribute__((__interrupt__));
127 //void Reset_Handler(void);
128 extern int main(void);
129
130 typedef void (*FNC)(void);
131 FNC fnc_entry;
132
133 /******************************************************************************
134 *
135 * The minimal vector table for a Cortex M3.  Note that the proper constructs
136 * must be placed on this to ensure that it ends up at physical address
137 * 0x0000.0000.
138 *
139 ******************************************************************************/
140
141 extern unsigned long _stack;
142
143 __attribute__ ((section(".isr_vector")))
144 void (* const g_pfnVectors[])(void) =
145 {
146         (void (*)(void))&_stack,   /* The initial stack pointer */
147         Reset_Handler,             /* Reset Handler */
148         NMI_Handler,               /* NMI Handler */
149         HardFault_Handler,         /* Hard Fault Handler */
150         MemManage_Handler,         /* MPU Fault Handler */
151         BusFault_Handler,          /* Bus Fault Handler */
152         UsageFault_Handler,        /* Usage Fault Handler */
153         0,                         /* Reserved */
154         0,                         /* Reserved */
155         0,                         /* Reserved */
156         0,                         /* Reserved */
157         SVC_Handler,               /* SVCall Handler */
158         DebugMon_Handler,          /* Debug Monitor Handler */
159         0,                         /* Reserved */
160         PendSV_Handler,            /* PendSV Handler */
161         SysTick_Handler,           /* SysTick Handler */
162
163         // External Interrupts
164         WAKEUP0_IRQHandler,
165         WAKEUP1_IRQHandler,
166         WAKEUP2_IRQHandler,
167         WAKEUP3_IRQHandler,
168         WAKEUP4_IRQHandler,
169         WAKEUP5_IRQHandler,
170         WAKEUP6_IRQHandler,
171         WAKEUP7_IRQHandler,
172         WAKEUP8_IRQHandler,
173         WAKEUP9_IRQHandler,
174         WAKEUP10_IRQHandler,
175         WAKEUP11_IRQHandler,
176         WAKEUP12_IRQHandler,
177         WAKEUP13_IRQHandler,
178         WAKEUP14_IRQHandler,
179         WAKEUP15_IRQHandler,
180         WAKEUP16_IRQHandler,
181         WAKEUP17_IRQHandler,
182         WAKEUP18_IRQHandler,
183         WAKEUP19_IRQHandler,
184         WAKEUP20_IRQHandler,
185         WAKEUP21_IRQHandler,
186         WAKEUP22_IRQHandler,
187         WAKEUP23_IRQHandler,
188         WAKEUP24_IRQHandler,
189         WAKEUP25_IRQHandler,
190         WAKEUP26_IRQHandler,
191         WAKEUP27_IRQHandler,
192         WAKEUP28_IRQHandler,
193         WAKEUP29_IRQHandler,
194         WAKEUP30_IRQHandler,
195         WAKEUP31_IRQHandler,
196         WAKEUP32_IRQHandler,
197         WAKEUP33_IRQHandler,
198         WAKEUP34_IRQHandler,
199         WAKEUP35_IRQHandler,
200         WAKEUP36_IRQHandler,
201         WAKEUP37_IRQHandler,
202         WAKEUP38_IRQHandler,
203         WAKEUP39_IRQHandler,
204         I2C_IRQHandler,
205         TIMER_16_0_IRQHandler,
206         TIMER_16_1_IRQHandler,
207         TIMER_32_0_IRQHandler,
208         TIMER_32_1_IRQHandler,
209         SSP_IRQHandler,
210         UART_IRQHandler,
211         USB_IRQHandler,
212         USB_FIQHandler,
213         ADC_IRQHandler,
214         WDT_IRQHandler,
215         BOD_IRQHandler,
216         EINT3_IRQHandler,
217         EINT2_IRQHandler,
218         EINT1_IRQHandler,
219         EINT0_IRQHandler
220 };
221
222 /*******************************************************************************
223 * Function Name  : Reset_Handler
224 * Description    : This is the code that gets called when the processor first starts execution
225 *                      following a reset event.  Only the absolutely necessary set is performed,
226 *                      after which the application supplied main() routine is called.
227 * Input          :
228 * Output         :
229 * Return         :
230 *******************************************************************************/
231
232 void Reset_Handler(void)
233 {
234     unsigned long *pulDest;
235     unsigned long *pulSrc;
236
237     //
238     // Copy the data segment initializers from flash to SRAM in ROM mode
239     //
240
241     if (&_sidata != &_sdata) {  // only if needed
242                 pulSrc = &_sidata;
243                 for(pulDest = &_sdata; pulDest < &_edata; ) {
244                         *(pulDest++) = *(pulSrc++);
245                 }
246     }
247
248     // Copy the .fastcode code from ROM to SRAM
249
250     if (&_sifastcode != &_sfastcode) {  // only if needed
251         pulSrc = &_sifastcode;
252                 for(pulDest = &_sfastcode; pulDest < &_efastcode; ) {
253                         *(pulDest++) = *(pulSrc++);
254                 }
255     }
256
257     //
258     // Zero fill the bss segment.
259     //
260     for(pulDest = &_sbss; pulDest < &_ebss; )
261     {
262         *(pulDest++) = 0;
263     }
264
265     // set irq table
266     SCB->VTOR=0x10000000;
267     //
268     // remap IRQ vector or not, depending on their RAM/ROM location
269     //
270     LPC_SYSCON->SYSMEMREMAP = 1 + ((&g_pfnVectors == (void*)0x0)?0:1);
271
272
273     _setup_board();
274     
275
276
277     //
278     // Call the application's entry point.
279     //
280     main();
281
282     /* disable interrupts */
283     NVIC->ICER[0] = 0xffffffff;
284     NVIC->ICER[1] = 0x00000007;
285     __set_MSP(*(unsigned long *)(&_mem_app_start));         /* Stack pointer */
286     fnc_entry = (FNC)*(unsigned long *)(&_mem_app_start+1); /* Reset handler */
287     fnc_entry();
288 }
289
290 //*****************************************************************************
291 //
292 // Provide weak aliases for each Exception handler to the Default_Handler.
293 // As they are weak aliases, any function with the same name will override
294 // this definition.
295 //
296 //*****************************************************************************
297 #pragma weak MemManage_Handler = Default_Handler          /* MPU Fault Handler */
298 #pragma weak BusFault_Handler = Default_Handler           /* Bus Fault Handler */
299 #pragma weak UsageFault_Handler = Default_Handler         /* Usage Fault Handler */
300 #pragma weak SVC_Handler = Default_Handler                /* SVCall Handler */
301 #pragma weak DebugMon_Handler = Default_Handler           /* Debug Monitor Handler */
302 #pragma weak PendSV_Handler = Default_Handler             /* PendSV Handler */
303 #pragma weak SysTick_Handler = Default_Handler            /* SysTick Handler */
304
305
306 /* External interrupt vector handler */
307 #pragma weak WAKEUP0_IRQHandler = Default_Handler
308 #pragma weak WAKEUP1_IRQHandler = Default_Handler
309 #pragma weak WAKEUP2_IRQHandler = Default_Handler
310 #pragma weak WAKEUP3_IRQHandler = Default_Handler
311 #pragma weak WAKEUP4_IRQHandler = Default_Handler
312 #pragma weak WAKEUP5_IRQHandler = Default_Handler
313 #pragma weak WAKEUP6_IRQHandler = Default_Handler
314 #pragma weak WAKEUP7_IRQHandler = Default_Handler
315 #pragma weak WAKEUP8_IRQHandler = Default_Handler
316 #pragma weak WAKEUP9_IRQHandler = Default_Handler
317 #pragma weak WAKEUP10_IRQHandler = Default_Handler
318 #pragma weak WAKEUP11_IRQHandler = Default_Handler
319 #pragma weak WAKEUP12_IRQHandler = Default_Handler
320 #pragma weak WAKEUP13_IRQHandler = Default_Handler
321 #pragma weak WAKEUP14_IRQHandler = Default_Handler
322 #pragma weak WAKEUP15_IRQHandler = Default_Handler
323 #pragma weak WAKEUP16_IRQHandler = Default_Handler
324 #pragma weak WAKEUP17_IRQHandler = Default_Handler
325 #pragma weak WAKEUP18_IRQHandler = Default_Handler
326 #pragma weak WAKEUP19_IRQHandler = Default_Handler
327 #pragma weak WAKEUP20_IRQHandler = Default_Handler
328 #pragma weak WAKEUP21_IRQHandler = Default_Handler
329 #pragma weak WAKEUP22_IRQHandler = Default_Handler
330 #pragma weak WAKEUP23_IRQHandler = Default_Handler
331 #pragma weak WAKEUP24_IRQHandler = Default_Handler
332 #pragma weak WAKEUP25_IRQHandler = Default_Handler
333 #pragma weak WAKEUP26_IRQHandler = Default_Handler
334 #pragma weak WAKEUP27_IRQHandler = Default_Handler
335 #pragma weak WAKEUP28_IRQHandler = Default_Handler
336 #pragma weak WAKEUP29_IRQHandler = Default_Handler
337 #pragma weak WAKEUP30_IRQHandler = Default_Handler
338 #pragma weak WAKEUP31_IRQHandler = Default_Handler
339 #pragma weak WAKEUP32_IRQHandler = Default_Handler
340 #pragma weak WAKEUP33_IRQHandler = Default_Handler
341 #pragma weak WAKEUP34_IRQHandler = Default_Handler
342 #pragma weak WAKEUP35_IRQHandler = Default_Handler
343 #pragma weak WAKEUP36_IRQHandler = Default_Handler
344 #pragma weak WAKEUP37_IRQHandler = Default_Handler
345 #pragma weak WAKEUP38_IRQHandler = Default_Handler
346 #pragma weak WAKEUP39_IRQHandler = Default_Handler
347 #pragma weak I2C_IRQHandler = Default_Handler
348 #pragma weak TIMER16_0_IRQHandler = Default_Handler
349 #pragma weak TIMER16_1_IRQHandler = Default_Handler
350 #pragma weak TIMER32_0_IRQHandler = Default_Handler
351 #pragma weak TIMER32_1_IRQHandler = Default_Handler
352 #pragma weak SSP_IRQHandler = Default_Handler
353 #pragma weak UART_IRQHandler = Default_Handler
354 #pragma weak USB_IRQHandler = Default_Handler
355 #pragma weak USB_FIQHandler = Default_Handler
356 #pragma weak ADC_IRQHandler = Default_Handler
357 #pragma weak WDT_IRQHandler = Default_Handler
358 #pragma weak BOD_IRQHandler = Default_Handler
359 #pragma weak FMC_IRQHandler = Default_Handler
360 #pragma weak PIOINT3_IRQHandler = Default_Handler
361 #pragma weak PIOINT2_IRQHandler = Default_Handler
362 #pragma weak PIOINT1_IRQHandler = Default_Handler
363 #pragma weak PIOINT0_IRQHandler = Default_Handler
364
365
366 //*****************************************************************************
367 //
368 // This is the code that gets called when the processor receives an unexpected
369 // interrupt.  This simply enters an infinite loop, preserving the system state
370 // for examination by a debugger.
371 //
372 //*****************************************************************************
373 void Default_Handler(void) {
374         // Go into an infinite loop.
375         //
376         while (1) {
377         }
378 }