]> rtime.felk.cvut.cz Git - sysless.git/blob - arch/arm/mach-lpc17cmsis/libs/boot/crt0_17xx.c
6b859d0a9e38497ccb487186371010a33f9099e5
[sysless.git] / arch / arm / mach-lpc17cmsis / libs / boot / crt0_17xx.c
1 /**
2  * crt0.c
3  * LPC17xx (ARM Cortex M3) family startup code
4  *
5  * adapted from startup_LPC17xx.c
6  * by Marek Peca <mp@duch.cz> 2010/06
7  * modified by Jiri Kubias <jiri.kubias@addat.cz>
8  *
9  * ( file :    startup_LPC17xx.c                          )
10  * ( brief : CMSIS Cortex-M3 Core Device Startup File     )
11  * ( version : V1.01                                      )
12  * ( date :    4. Feb. 2009                               )
13  * ( Copyright (C) 2009 ARM Limited. All rights reserved. )
14  *
15  * ( ARM Limited (ARM) is supplying this software for use with Cortex-Mx     )
16  * ( processor based microcontrollers.  This file can be freely distributed  )
17  * ( within development tools that are supporting such ARM based processors. )
18  */
19
20 #include <sys/types.h>
21 #include <LPC17xx.h>
22
23 #define WEAK __attribute__((weak))
24
25 /* System exception vector handler */
26 void WEAK               Reset_Handler();             /* Reset Handler */
27 void WEAK               NMI_Handler();               /* NMI Handler */
28 void WEAK               HardFault_Handler();         /* Hard Fault Handler */
29 void WEAK               MemManage_Handler();         /* MPU Fault Handler */
30 void WEAK               BusFault_Handler();          /* Bus Fault Handler */
31 void WEAK               UsageFault_Handler();        /* Usage Fault Handler */
32 void WEAK               SVC_Handler();               /* SVCall Handler */
33 void WEAK               DebugMon_Handler();          /* Debug Monitor Handler */
34 void WEAK               PendSV_Handler();            /* PendSV Handler */
35 void WEAK               SysTick_Handler();           /* SysTick Handler */
36
37 /* External interrupt vector handler */
38 void WEAK  WAKEUP_IRQHandler();
39 void WEAK  I2C_IRQHandler();
40 void WEAK  TIMER16_0_IRQHandler();
41 void WEAK  TIMER16_1_IRQHandler();
42 void WEAK  TIMER32_0_IRQHandler();
43 void WEAK  TIMER32_1_IRQHandler();
44 void WEAK  SSP_IRQHandler();
45 void WEAK  UART_IRQHandler();
46 void WEAK  USB_IRQHandler();
47 void WEAK  USB_FIQHandler();
48 void WEAK  ADC_IRQHandler();
49 void WEAK  WDT_IRQHandler();
50 void WEAK  BOD_IRQHandler();
51 void WEAK  FMC_IRQHandler();
52 void WEAK  PIOINT3_IRQHandler();
53 void WEAK  PIOINT2_IRQHandler();
54 void WEAK  PIOINT1_IRQHandler();
55 void WEAK  PIOINT0_IRQHandler();
56
57 /** memory map pointers (defined in ldscript) **/
58 extern uint32_t _data, _edata, _datainit;
59 extern uint32_t __bss_start, __bss_end__;
60 extern uint32_t _stack;
61
62 /** function prototypes **/
63 extern void WEAK _memory_init();
64 extern void WEAK __libc_init_array();
65 ////void _start() __attribute__((__interrupt__));
66 void _start();
67 extern int main();
68
69 /*
70  * The minimal vector table for a Cortex M3.  Note that the proper constructs
71  * must be placed on this to ensure that it ends up at physical address
72  * 0x00000000.
73  */
74 __attribute__((section(".ivec")))
75      void (* const _vectors[])() =
76 {
77   /* Cortex M3 common */
78   (void (*)())&_stack,   /* The initial stack pointer */
79   _start,                    /* Reset Handler */
80   NMI_Handler,               /* NMI Handler */
81   HardFault_Handler,         /* Hard Fault Handler */
82   MemManage_Handler,         /* MPU Fault Handler */
83   BusFault_Handler,          /* Bus Fault Handler */
84   UsageFault_Handler,        /* Usage Fault Handler */
85   0,                         /* Reserved */
86   0,                         /* Reserved */
87   0,                         /* Reserved */
88   0,                         /* Reserved */
89   SVC_Handler,               /* SVCall Handler */
90   DebugMon_Handler,          /* Debug Monitor Handler */
91   0,                         /* Reserved */
92   PendSV_Handler,            /* PendSV Handler */
93   SysTick_Handler,           /* SysTick Handler */
94
95   /* LPC13xx specific interrupts */
96   WAKEUP_IRQHandler,         /* 16  0 Wake-up on  pin  PIO0_0             */
97   WAKEUP_IRQHandler,         /* 17  1 Wake-up on  pin  PIO0_1             */
98   WAKEUP_IRQHandler,         /* 18  2 Wake-up on  pin  PIO0_2             */
99   WAKEUP_IRQHandler,         /* 19  3 Wake-up on  pin  PIO0_3             */
100   WAKEUP_IRQHandler,         /* 20  4 Wake-up on  pin  PIO0_4             */
101   WAKEUP_IRQHandler,         /* 21  5 Wake-up on  pin  PIO0_5             */
102   WAKEUP_IRQHandler,         /* 22  6 Wake-up on  pin  PIO0_6             */
103   WAKEUP_IRQHandler,         /* 23  7 Wake-up on  pin  PIO0_7             */
104   WAKEUP_IRQHandler,         /* 24  8 Wake-up on  pin  PIO0_8             */
105   WAKEUP_IRQHandler,         /* 25  9 Wake-up on  pin  PIO0_9             */
106   WAKEUP_IRQHandler,         /* 26 10 Wake-up on  pin  PIO0_10            */
107   WAKEUP_IRQHandler,         /* 27 11 Wake-up on  pin  PIO0_11            */
108   WAKEUP_IRQHandler,         /* 28 12 Wake-up on  pin  PIO1_0             */
109   WAKEUP_IRQHandler,         /* 29 13 Wake-up on  pin  PIO1_1             */
110   WAKEUP_IRQHandler,         /* 30 14 Wake-up on  pin  PIO1_2             */
111   WAKEUP_IRQHandler,         /* 31 15 Wake-up on  pin  PIO1_3             */
112   WAKEUP_IRQHandler,         /* 32 16 Wake-up on  pin  PIO1_4             */
113   WAKEUP_IRQHandler,         /* 33 17 Wake-up on  pin  PIO1_5             */
114   WAKEUP_IRQHandler,         /* 34 18 Wake-up on  pin  PIO1_6             */
115   WAKEUP_IRQHandler,         /* 35 19 Wake-up on  pin  PIO1_7             */
116   WAKEUP_IRQHandler,         /* 36 20 Wake-up on  pin  PIO1_8             */
117   WAKEUP_IRQHandler,         /* 37 21 Wake-up on  pin  PIO1_9             */
118   WAKEUP_IRQHandler,         /* 38 22 Wake-up on  pin  PIO1_10            */
119   WAKEUP_IRQHandler,         /* 39 23 Wake-up on  pin  PIO1_11            */
120   WAKEUP_IRQHandler,         /* 40 24 Wake-up on  pin  PIO2_0             */
121   WAKEUP_IRQHandler,         /* 41 25 Wake-up on  pin  PIO2_1             */
122   WAKEUP_IRQHandler,         /* 42 26 Wake-up on  pin  PIO2_2             */
123   WAKEUP_IRQHandler,         /* 43 27 Wake-up on  pin  PIO2_3             */
124   WAKEUP_IRQHandler,         /* 44 28 Wake-up on  pin  PIO2_4             */
125   WAKEUP_IRQHandler,         /* 45 29 Wake-up on  pin  PIO2_5             */
126   WAKEUP_IRQHandler,         /* 46 30 Wake-up on  pin  PIO2_6             */
127   WAKEUP_IRQHandler,         /* 47 31 Wake-up on  pin  PIO2_7             */
128   WAKEUP_IRQHandler,         /* 48 32 Wake-up on  pin  PIO2_8             */
129   WAKEUP_IRQHandler,         /* 49 33 Wake-up on  pin  PIO2_9             */
130   WAKEUP_IRQHandler,         /* 50 34 Wake-up on  pin  PIO2_10            */
131   WAKEUP_IRQHandler,         /* 51 35 Wake-up on  pin  PIO2_11            */
132   WAKEUP_IRQHandler,         /* 52 36 Wake-up on  pin  PIO3_0             */
133   WAKEUP_IRQHandler,         /* 53 37 Wake-up on  pin  PIO3_1             */
134   WAKEUP_IRQHandler,         /* 54 38 Wake-up on  pin  PIO3_2             */
135   WAKEUP_IRQHandler,         /* 55 39 Wake-up on  pin  PIO3_3             */
136   I2C_IRQHandler,            /* 56 40 I2C0 SI (state change)    */
137   TIMER16_0_IRQHandler,      /* 57 41 CT16B0 16 bit timer 0     */
138   TIMER16_1_IRQHandler,      /* 58 42 CT16B1 16 bit timer 1     */
139   TIMER32_0_IRQHandler,      /* 59 43 CT32B0 32 bit timer 0     */
140   TIMER32_1_IRQHandler,      /* 60 44 CT32B1 32 bit timer 1     */
141   SSP_IRQHandler,            /* 61 45 SSP                       */
142   UART_IRQHandler,           /* 62 46 UART                      */
143   USB_IRQHandler,            /* 63 47 USB IRQ low priority      */
144   USB_FIQHandler,            /* 64 48 USB FIQ high priority     */
145   ADC_IRQHandler,            /* 65 49 ADC end of conversion     */
146   WDT_IRQHandler,            /* 66 50 Watchdog interrupt (WDINT)          */
147   BOD_IRQHandler,            /* 67 51 BOD Brown-out detect                */
148   FMC_IRQHandler,            /* 68 52 Reserved also marked as IP2111 Flash Memory */
149   PIOINT3_IRQHandler,        /* 69 53 PIO_3  GPIO interrupt status of port 3 */
150   PIOINT2_IRQHandler,        /* 70 54 PIO_2  GPIO interrupt status of port 2 */
151   PIOINT1_IRQHandler,        /* 71 55 PIO_1  GPIO interrupt status of port 1 */
152   PIOINT0_IRQHandler,        /* 72 56 PIO_0  GPIO interrupt status of port 0 */
153 };
154
155 /*
156  * startup code (Reset Handler)
157  */
158 void _start() {
159   uint32_t *src, *dst;
160
161   /*
162    * External memory initialization (only if _memory_init linked)
163    * (can not be called from init_array, must precede data initialization)
164    */
165   if (_memory_init)
166     _memory_init();
167
168   /* Copy initialized data to its execution address in RAM */
169   if (&_datainit != &_data) {   /* _datainit == _data indicates RAM, ie. no need of copying */
170     for (src = &_datainit, dst = &_data; dst < &_edata; src++, dst++)
171       *dst = *src;
172   }
173   
174   /* clear .bss */
175   for (dst = &__bss_start; dst < &__bss_end__; dst++)
176     *dst = 0;
177
178   /*
179    * remap IRQ vector or not, depending on their RAM/ROM location
180    */
181   /*
182 * set IRQ vectors location
183 */
184 //SYSMEMREMAP = 2; /* do NOT use NXP LPC fashioned vectors remapping.. */
185 SCB->VTOR = (uint32_t)&_vectors; /* ..follow Cortex M3's way instead */
186
187   /* Call init functions in .init_array section (only if __libc_init_array exists) */
188   if (__libc_init_array)
189     __libc_init_array();
190
191   /* set irq table */
192   //SCB->VTOR=0x10000000;
193
194   /* Call the application's entry point. */
195   main();
196
197   /* Requiescat In Pacem */
198   for (;;);
199 }
200
201 /*
202  * This is the code that gets called when the processor receives an unexpected
203  * interrupt.  This simply enters an infinite loop, preserving the system state
204  * for examination by a debugger.
205  */
206 void Default_Handler() {
207   for (;;);
208 }
209
210 /*
211  * Provide weak aliases for each Exception handler to the Default_Handler.
212  * As they are weak aliases, any function with the same name will override
213  * this definition.
214  */
215 #pragma weak MemManage_Handler = Default_Handler          /* MPU Fault Handler */
216 #pragma weak BusFault_Handler = Default_Handler           /* Bus Fault Handler */
217 #pragma weak UsageFault_Handler = Default_Handler         /* Usage Fault Handler */
218 #pragma weak SVC_Handler = Default_Handler                /* SVCall Handler */
219 #pragma weak DebugMon_Handler = Default_Handler           /* Debug Monitor Handler */
220 #pragma weak PendSV_Handler = Default_Handler             /* PendSV Handler */
221 #pragma weak SysTick_Handler = Default_Handler            /* SysTick Handler */
222
223 /* External interrupt vector handler */
224 #pragma weak WAKEUP_IRQHandler = Default_Handler
225 #pragma weak I2C_IRQHandler = Default_Handler
226 #pragma weak TIMER16_0_IRQHandler = Default_Handler
227 #pragma weak TIMER16_1_IRQHandler = Default_Handler
228 #pragma weak TIMER32_0_IRQHandler = Default_Handler
229 #pragma weak TIMER32_1_IRQHandler = Default_Handler
230 #pragma weak SSP_IRQHandler = Default_Handler
231 #pragma weak UART_IRQHandler = Default_Handler
232 #pragma weak USB_IRQHandler = Default_Handler
233 #pragma weak USB_FIQHandler = Default_Handler
234 #pragma weak ADC_IRQHandler = Default_Handler
235 #pragma weak WDT_IRQHandler = Default_Handler
236 #pragma weak BOD_IRQHandler = Default_Handler
237 #pragma weak FMC_IRQHandler = Default_Handler
238 #pragma weak PIOINT3_IRQHandler = Default_Handler
239 #pragma weak PIOINT2_IRQHandler = Default_Handler
240 #pragma weak PIOINT1_IRQHandler = Default_Handler
241 #pragma weak PIOINT0_IRQHandler = Default_Handler