]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/arm/mach-lpc17xx/libs/hal/startup.c
ab9d1fc97b569d8004360e674024c9bc2365f5d2
[sysless.git] / arch / arm / mach-lpc17xx / 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 "LPC17xx.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 /* External interrupt vector handler */
46 void WEAK       WDT_IRQHandler(void);            /* Watchdog Timer */
47 void WEAK       TIMER0_IRQHandler(void);         /* Timer0 */
48 void WEAK       TIMER1_IRQHandler(void);         /* Timer1 */
49 void WEAK       TIMER2_IRQHandler(void);         /* Timer2 */
50 void WEAK       TIMER3_IRQHandler(void);         /* Timer3 */
51 void WEAK       UART0_IRQHandler(void);          /* UART0 */
52 void WEAK       UART1_IRQHandler(void);          /* UART1 */
53 void WEAK       UART2_IRQHandler(void);          /* UART2 */
54 void WEAK       UART3_IRQHandler(void);          /* UART3 */
55 void WEAK       PWM1_IRQHandler(void);           /* PWM1 */
56 void WEAK       I2C0_IRQHandler(void);           /* I2C0 */
57 void WEAK       I2C1_IRQHandler(void);           /* I2C1 */
58 void WEAK       I2C2_IRQHandler(void);           /* I2C2 */
59 void WEAK       SPI_IRQHandler(void);            /* SPI */
60 void WEAK       SSP0_IRQHandler(void);           /* SSP0 */
61 void WEAK       SSP1_IRQHandler(void);           /* SSP1 */
62 void WEAK       PLL0_IRQHandler(void);           /* PLL0 (Main PLL) */
63 void WEAK       RTC_IRQHandler(void);            /* Real Time Clock */
64 void WEAK       EINT0_IRQHandler(void);          /* External Interrupt 0 */
65 void WEAK       EINT1_IRQHandler(void);          /* External Interrupt 1 */
66 void WEAK       EINT2_IRQHandler(void);          /* External Interrupt 2 */
67 void WEAK       EINT3_IRQHandler(void);          /* External Interrupt 3 */
68 void WEAK       ADC_IRQHandler(void);            /* A/D Converter */
69 void WEAK       BOD_IRQHandler(void);            /* Brown Out Detect */
70 void WEAK       USB_IRQHandler(void);            /* USB */
71 void WEAK       CAN_IRQHandler(void);            /* CAN */
72 void WEAK       DMA_IRQHandler(void);            /* GP DMA */
73 void WEAK       I2S_IRQHandler(void);            /* I2S */
74 void WEAK       ENET_IRQHandler(void);           /* Ethernet */
75 void WEAK       RIT_IRQHandler(void);            /* Repetitive Interrupt Timer */
76 void WEAK       MCPWM_IRQHandler(void);          /* Motor Control PWM */
77 void WEAK       QEI_IRQHandler(void);            /* Quadrature Encoder Interface */
78 void WEAK       PLL1_IRQHandler(void);           /* PLL1 (USB PLL) */
79
80
81
82 /* Exported types --------------------------------------------------------------*/
83 /* Exported constants --------------------------------------------------------*/
84 extern unsigned long _etext;
85 extern unsigned long _sidata;           /* start address for the initialization values of the .data section. defined in linker script */
86 extern unsigned long _sdata;            /* start address for the .data section. defined in linker script */
87 extern unsigned long _edata;            /* end address for the .data section. defined in linker script */
88
89 extern unsigned long _sifastcode;               /* start address for the initialization values of the .fastcode section. defined in linker script */
90 extern unsigned long _sfastcode;                /* start address for the .fastcode section. defined in linker script */
91 extern unsigned long _efastcode;                /* end address for the .fastcode section. defined in linker script */
92
93 extern unsigned long _sbss;                     /* start address for the .bss section. defined in linker script */
94 extern unsigned long _ebss;                     /* end address for the .bss section. defined in linker script */
95
96 extern void _estack;            /* init value for the stack pointer. defined in linker script */
97
98 extern void (_setup_board)(void);               /* setup_board adress function */
99 extern unsigned long _mem_app_start;
100
101
102
103 /* Private typedef -----------------------------------------------------------*/
104 /* function prototypes ------------------------------------------------------*/
105 void Reset_Handler(void) __attribute__((__interrupt__));
106 extern int main(void);
107
108 typedef void (*FNC)(void);
109 FNC fnc_entry;
110
111 /******************************************************************************
112 *
113 * The minimal vector table for a Cortex M3.  Note that the proper constructs
114 * must be placed on this to ensure that it ends up at physical address
115 * 0x0000.0000.
116 *
117 ******************************************************************************/
118
119 extern unsigned long _stack;
120
121 __attribute__ ((section(".isr_vector")))
122 void (* const g_pfnVectors[])(void) =
123 {
124         (void (*)(void))&_stack,   /* The initial stack pointer */
125         Reset_Handler,             /* Reset Handler */
126         NMI_Handler,               /* NMI Handler */
127         HardFault_Handler,         /* Hard Fault Handler */
128         MemManage_Handler,         /* MPU Fault Handler */
129         BusFault_Handler,          /* Bus Fault Handler */
130         UsageFault_Handler,        /* Usage Fault Handler */
131         0,                         /* Reserved */
132         0,                         /* Reserved */
133         0,                         /* Reserved */
134         0,                         /* Reserved */
135         SVC_Handler,               /* SVCall Handler */
136         DebugMon_Handler,          /* Debug Monitor Handler */
137         0,                         /* Reserved */
138         PendSV_Handler,            /* PendSV Handler */
139         SysTick_Handler,           /* SysTick Handler */
140
141                 // External Interrupts
142         WDT_IRQHandler,            /* Watchdog Timer */
143         TIMER0_IRQHandler,         /* Timer0 */
144         TIMER1_IRQHandler,         /* Timer1 */
145         TIMER2_IRQHandler,         /* Timer2 */
146         TIMER3_IRQHandler,         /* Timer3 */
147         UART0_IRQHandler,          /* UART0 */
148         UART1_IRQHandler,          /* UART1 */
149         UART2_IRQHandler,          /* UART2 */
150         UART3_IRQHandler,          /* UART3 */
151         PWM1_IRQHandler,           /* PWM1 */
152         I2C0_IRQHandler,           /* I2C0 */
153         I2C1_IRQHandler,           /* I2C1 */
154         I2C2_IRQHandler,           /* I2C2 */
155         SPI_IRQHandler,            /* SPI */
156         SSP0_IRQHandler,           /* SSP0 */
157         SSP1_IRQHandler,           /* SSP1 */
158         PLL0_IRQHandler,           /* PLL0 (Main PLL) */
159         RTC_IRQHandler,            /* Real Time Clock */
160         EINT0_IRQHandler,          /* External Interrupt 0 */
161         EINT1_IRQHandler,          /* External Interrupt 1 */
162         EINT2_IRQHandler,          /* External Interrupt 2 */
163         EINT3_IRQHandler,          /* External Interrupt 3 */
164         ADC_IRQHandler,            /* A/D Converter */
165         BOD_IRQHandler,            /* Brown Out Detect */
166         USB_IRQHandler,            /* USB */
167         CAN_IRQHandler,            /* CAN */
168         DMA_IRQHandler,            /* GP DMA */
169         I2S_IRQHandler,            /* I2S */
170         ENET_IRQHandler,           /* Ethernet */
171         RIT_IRQHandler,            /* Repetitive Interrupt Timer */
172         MCPWM_IRQHandler,          /* Motor Control PWM */
173         QEI_IRQHandler,            /* Quadrature Encoder Interface */
174         PLL1_IRQHandler,           /* PLL1 (USB PLL) */
175 };
176
177 /*******************************************************************************
178 * Function Name  : Reset_Handler
179 * Description    : This is the code that gets called when the processor first starts execution
180 *                      following a reset event.  Only the absolutely necessary set is performed,
181 *                      after which the application supplied main() routine is called.
182 * Input          :
183 * Output         :
184 * Return         :
185 *******************************************************************************/
186
187 void Reset_Handler(void)
188 {
189     unsigned long *pulDest;
190     unsigned long *pulSrc;
191
192     //
193     // Copy the data segment initializers from flash to SRAM in ROM mode
194     //
195
196     if (&_sidata != &_sdata) {  // only if needed
197                 pulSrc = &_sidata;
198                 for(pulDest = &_sdata; pulDest < &_edata; ) {
199                         *(pulDest++) = *(pulSrc++);
200                 }
201     }
202
203     // Copy the .fastcode code from ROM to SRAM
204
205     if (&_sifastcode != &_sfastcode) {  // only if needed
206         pulSrc = &_sifastcode;
207                 for(pulDest = &_sfastcode; pulDest < &_efastcode; ) {
208                         *(pulDest++) = *(pulSrc++);
209                 }
210     }
211
212     //
213     // Zero fill the bss segment.
214     //
215     for(pulDest = &_sbss; pulDest < &_ebss; )
216     {
217         *(pulDest++) = 0;
218     }
219
220
221     // set irq table
222     SCB->VTOR=0x10000000;
223
224     //if (_setup_board!=0)
225       _setup_board();
226
227     //
228     // Call the application's entry point.
229     //
230     main();
231
232     /* disable interrupts */
233     NVIC->ICER[0] = 0xffffffff;
234     NVIC->ICER[1] = 0x00000007;
235     __set_MSP(*(unsigned long *)(&_mem_app_start));         /* Stack pointer */
236     fnc_entry = (FNC)*(unsigned long *)(&_mem_app_start+1); /* Reset handler */
237     fnc_entry();
238 }
239
240 //*****************************************************************************
241 //
242 // Provide weak aliases for each Exception handler to the Default_Handler.
243 // As they are weak aliases, any function with the same name will override
244 // this definition.
245 //
246 //*****************************************************************************
247 #pragma weak MemManage_Handler = Default_Handler          /* MPU Fault Handler */
248 #pragma weak BusFault_Handler = Default_Handler           /* Bus Fault Handler */
249 #pragma weak UsageFault_Handler = Default_Handler         /* Usage Fault Handler */
250 #pragma weak SVC_Handler = Default_Handler                /* SVCall Handler */
251 #pragma weak DebugMon_Handler = Default_Handler           /* Debug Monitor Handler */
252 #pragma weak PendSV_Handler = Default_Handler             /* PendSV Handler */
253 #pragma weak SysTick_Handler = Default_Handler            /* SysTick Handler */
254
255 /* External interrupt vector handler */
256 #pragma weak WDT_IRQHandler = Default_Handler            /* Watchdog Timer */
257 #pragma weak TIMER0_IRQHandler = Default_Handler         /* Timer0 */
258 #pragma weak TIMER1_IRQHandler = Default_Handler         /* Timer1 */
259 #pragma weak TIMER2_IRQHandler = Default_Handler         /* Timer2 */
260 #pragma weak TIMER3_IRQHandler = Default_Handler         /* Timer3 */
261 #pragma weak UART0_IRQHandler = Default_Handler          /* UART0 */
262 #pragma weak UART1_IRQHandler = Default_Handler          /* UART1 */
263 #pragma weak UART2_IRQHandler = Default_Handler          /* UART2 */
264 #pragma weak UART3_IRQHandler = Default_Handler          /* UART3 */
265 #pragma weak PWM1_IRQHandler = Default_Handler           /* PWM1 */
266 #pragma weak I2C0_IRQHandler = Default_Handler           /* I2C0 */
267 #pragma weak I2C1_IRQHandler = Default_Handler           /* I2C1 */
268 #pragma weak I2C2_IRQHandler = Default_Handler           /* I2C2 */
269 #pragma weak SPI_IRQHandler = Default_Handler            /* SPI */
270 #pragma weak SSP0_IRQHandler = Default_Handler           /* SSP0 */
271 #pragma weak SSP1_IRQHandler = Default_Handler           /* SSP1 */
272 #pragma weak PLL0_IRQHandler = Default_Handler           /* PLL0 (Main PLL) */
273 #pragma weak RTC_IRQHandler = Default_Handler            /* Real Time Clock */
274 #pragma weak EINT0_IRQHandler = Default_Handler          /* External Interrupt 0 */
275 #pragma weak EINT1_IRQHandler = Default_Handler          /* External Interrupt 1 */
276 #pragma weak EINT2_IRQHandler = Default_Handler          /* External Interrupt 2 */
277 #pragma weak EINT3_IRQHandler = Default_Handler          /* External Interrupt 3 */
278 #pragma weak ADC_IRQHandler = Default_Handler            /* A/D Converter */
279 #pragma weak BOD_IRQHandler = Default_Handler            /* Brown Out Detect */
280 #pragma weak USB_IRQHandler = Default_Handler            /* USB */
281 #pragma weak CAN_IRQHandler = Default_Handler            /* CAN */
282 #pragma weak DMA_IRQHandler = Default_Handler            /* GP DMA */
283 #pragma weak I2S_IRQHandler = Default_Handler            /* I2S */
284 #pragma weak ENET_IRQHandler = Default_Handler           /* Ethernet */
285 #pragma weak RIT_IRQHandler = Default_Handler            /* Repetitive Interrupt Timer */
286 #pragma weak MCPWM_IRQHandler = Default_Handler          /* Motor Control PWM */
287 #pragma weak QEI_IRQHandler = Default_Handler            /* Quadrature Encoder Interface */
288 #pragma weak PLL1_IRQHandler = Default_Handler           /* PLL1 (USB PLL) */
289
290 //*****************************************************************************
291 //
292 // This is the code that gets called when the processor receives an unexpected
293 // interrupt.  This simply enters an infinite loop, preserving the system state
294 // for examination by a debugger.
295 //
296 //*****************************************************************************
297 void Default_Handler(void) {
298         // Go into an infinite loop.
299         //
300         while (1) {
301         }
302 }