remove VIM swap file, and add it to .gitignore
[rapper.git] / new_cmsis / usb / startup.c
1 //*****************************************************************************\r
2 //\r
3 // startup_gcc.c - Startup code for use with GNU tools.\r
4 //\r
5 // Copyright (c) 2009 Luminary Micro, Inc.  All rights reserved.\r
6 // Software License Agreement\r
7 // \r
8 // Luminary Micro, Inc. (LMI) is supplying this software for use solely and\r
9 // exclusively on LMI's microcontroller products.\r
10 // \r
11 // The software is owned by LMI and/or its suppliers, and is protected under\r
12 // applicable copyright laws.  All rights are reserved.  You may not combine\r
13 // this software with "viral" open-source software in order to form a larger\r
14 // program.  Any use in violation of the foregoing restrictions may subject\r
15 // the user to criminal sanctions under applicable laws, as well as to civil\r
16 // liability for the breach of the terms and conditions of this license.\r
17 // \r
18 // THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED\r
19 // OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF\r
20 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.\r
21 // LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR\r
22 // CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.\r
23 // \r
24 // This is part of revision 32 of the Stellaris CMSIS Package.\r
25 //\r
26 //*****************************************************************************\r
27 \r
28 #define WEAK __attribute__ ((weak))\r
29 \r
30 //*****************************************************************************\r
31 //\r
32 // Forward declaration of the default fault handlers.\r
33 //\r
34 //*****************************************************************************\r
35 void WEAK Reset_Handler(void);\r
36 static void Default_Handler(void);\r
37 void WEAK NMI_Handler(void);\r
38 void WEAK HardFault_Handler(void);\r
39 void WEAK MemManage_Handler(void);\r
40 void WEAK BusFault_Handler(void);\r
41 void WEAK UsageFault_Handler(void);\r
42 void WEAK MemManage_Handler(void);\r
43 void WEAK SVC_Handler(void);\r
44 void WEAK DebugMon_Handler(void);\r
45 void WEAK PendSV_Handler(void);\r
46 void WEAK SysTick_Handler(void);\r
47 void WEAK GPIOPortA_IRQHandler(void);\r
48 void WEAK GPIOPortB_IRQHandler(void);\r
49 void WEAK GPIOPortC_IRQHandler(void);\r
50 void WEAK GPIOPortD_IRQHandler(void);\r
51 void WEAK GPIOPortE_IRQHandler(void);\r
52 void WEAK UART0_IRQHandler(void);\r
53 void WEAK UART1_IRQHandler(void);\r
54 void WEAK SSI0_IRQHandler(void);\r
55 void WEAK I2C0_IRQHandler(void);\r
56 void WEAK PWMFault_IRQHandler(void);\r
57 void WEAK PWMGen0_IRQHandler(void);\r
58 void WEAK PWMGen1_IRQHandler(void);\r
59 void WEAK PWMGen2_IRQHandler(void);\r
60 void WEAK QEI0_IRQHandler(void);\r
61 void WEAK ADCSeq0_IRQHandler(void);\r
62 void WEAK ADCSeq1_IRQHandler(void);\r
63 void WEAK ADCSeq2_IRQHandler(void);\r
64 void WEAK ADCSeq3_IRQHandler(void);\r
65 void WEAK Watchdog_IRQHandler(void);\r
66 void WEAK Timer0A_IRQHandler(void);\r
67 void WEAK Timer0B_IRQHandler(void);\r
68 void WEAK Timer1A_IRQHandler(void);\r
69 void WEAK Timer1B_IRQHandler(void);\r
70 void WEAK Timer2A_IRQHandler(void);\r
71 void WEAK Timer2B_IRQHandler(void);\r
72 void WEAK Comp0_IRQHandler(void);\r
73 void WEAK Comp1_IRQHandler(void);\r
74 void WEAK Comp2_IRQHandler(void);\r
75 void WEAK SysCtrl_IRQHandler(void);\r
76 void WEAK FlashCtrl_IRQHandler(void);\r
77 void WEAK GPIOPortF_IRQHandler(void);\r
78 void WEAK GPIOPortG_IRQHandler(void);\r
79 void WEAK GPIOPortH_IRQHandler(void);\r
80 void WEAK UART2_IRQHandler(void);\r
81 void WEAK SSI1_IRQHandler(void);\r
82 void WEAK Timer3A_IRQHandler(void);\r
83 void WEAK Timer3B_IRQHandler(void);\r
84 void WEAK I2C1_IRQHandler(void);\r
85 void WEAK QEI1_IRQHandler(void);\r
86 void WEAK CAN0_IRQHandler(void);\r
87 void WEAK CAN1_IRQHandler(void);\r
88 void WEAK CAN2_IRQHandler(void);\r
89 void WEAK Ethernet_IRQHandler(void);\r
90 void WEAK Hibernate_IRQHandler(void);\r
91 \r
92 //*****************************************************************************\r
93 //\r
94 // The entry point for the application.\r
95 //\r
96 //*****************************************************************************\r
97 extern int main(void);\r
98 \r
99 //*****************************************************************************\r
100 //\r
101 // Reserve space for the system stack.\r
102 //\r
103 //*****************************************************************************\r
104 static unsigned long pulStack[64];\r
105 \r
106 //*****************************************************************************\r
107 //\r
108 // The vector table.  Note that the proper constructs must be placed on this to\r
109 // ensure that it ends up at physical address 0x0000.0000.\r
110 //\r
111 //*****************************************************************************\r
112 __attribute__ ((section(".isr_vector")))\r
113 void (* const g_pfnVectors[])(void) =\r
114 {\r
115     (void (*)(void))((unsigned long)pulStack + sizeof(pulStack)),\r
116                                             // The initial stack pointer\r
117     Reset_Handler,                          // The reset handler\r
118     NMI_Handler,                            // The NMI handler\r
119     HardFault_Handler,                      // The hard fault handler\r
120     MemManage_Handler,                      // The MPU fault handler\r
121     BusFault_Handler,                       // The bus fault handler\r
122     UsageFault_Handler,                     // The usage fault handler\r
123     0xefff9d6e,                             // Reserved\r
124     0,                                      // Reserved\r
125     0,                                      // Reserved\r
126     0,                                      // Reserved\r
127     SVC_Handler,                            // SVCall handler\r
128     DebugMon_Handler,                       // Debug monitor handler\r
129     0,                                      // Reserved\r
130     PendSV_Handler,                         // The PendSV handler\r
131     SysTick_Handler,                        // The SysTick handler\r
132 \r
133     //\r
134     // External Interrupts\r
135     //\r
136     GPIOPortA_IRQHandler,                   // GPIO Port A\r
137     GPIOPortB_IRQHandler,                   // GPIO Port B\r
138     GPIOPortC_IRQHandler,                   // GPIO Port C\r
139     GPIOPortD_IRQHandler,                   // GPIO Port D\r
140     GPIOPortE_IRQHandler,                   // GPIO Port E\r
141     UART0_IRQHandler,                       // UART0 Rx and Tx\r
142     UART1_IRQHandler,                       // UART1 Rx and Tx\r
143     SSI0_IRQHandler,                        // SSI0 Rx and Tx\r
144     I2C0_IRQHandler,                        // I2C0 Master and Slave\r
145     PWMFault_IRQHandler,                    // PWM Fault\r
146     PWMGen0_IRQHandler,                     // PWM Generator 0\r
147     PWMGen1_IRQHandler,                     // PWM Generator 1\r
148     PWMGen2_IRQHandler,                     // PWM Generator 2\r
149     QEI0_IRQHandler,                        // Quadrature Encoder 0\r
150     ADCSeq0_IRQHandler,                     // ADC Sequence 0\r
151     ADCSeq1_IRQHandler,                     // ADC Sequence 1\r
152     ADCSeq2_IRQHandler,                     // ADC Sequence 2\r
153     ADCSeq3_IRQHandler,                     // ADC Sequence 3\r
154     Watchdog_IRQHandler,                    // Watchdog timer\r
155     Timer0A_IRQHandler,                     // Timer 0 subtimer A\r
156     Timer0B_IRQHandler,                     // Timer 0 subtimer B\r
157     Timer1A_IRQHandler,                     // Timer 1 subtimer A\r
158     Timer1B_IRQHandler,                     // Timer 1 subtimer B\r
159     Timer2A_IRQHandler,                     // Timer 2 subtimer A\r
160     Timer2B_IRQHandler,                     // Timer 2 subtimer B\r
161     Comp0_IRQHandler,                       // Analog Comparator 0\r
162     Comp1_IRQHandler,                       // Analog Comparator 1\r
163     Comp2_IRQHandler,                       // Analog Comparator 2\r
164     SysCtrl_IRQHandler,                     // System Control (PLL, OSC, BO)\r
165     FlashCtrl_IRQHandler,                   // FLASH Control\r
166     GPIOPortF_IRQHandler,                   // GPIO Port F\r
167     GPIOPortG_IRQHandler,                   // GPIO Port G\r
168     GPIOPortH_IRQHandler,                   // GPIO Port H\r
169     UART2_IRQHandler,                       // UART2 Rx and Tx\r
170     SSI1_IRQHandler,                        // SSI1 Rx and Tx\r
171     Timer3A_IRQHandler,                     // Timer 3 subtimer A\r
172     Timer3B_IRQHandler,                     // Timer 3 subtimer B\r
173     I2C1_IRQHandler,                        // I2C1 Master and Slave\r
174     QEI1_IRQHandler,                        // Quadrature Encoder 1\r
175     CAN0_IRQHandler,                        // CAN0\r
176     CAN1_IRQHandler,                        // CAN1\r
177     CAN2_IRQHandler,                        // CAN2\r
178     Ethernet_IRQHandler,                    // Ethernet\r
179     Hibernate_IRQHandler                    // Hibernate\r
180 };\r
181 \r
182 //*****************************************************************************\r
183 //\r
184 // The following are constructs created by the linker, indicating where the\r
185 // the "data" and "bss" segments reside in memory.  The initializers for the\r
186 // for the "data" segment resides immediately following the "text" segment.\r
187 //\r
188 //*****************************************************************************\r
189 extern unsigned long _etext;\r
190 extern unsigned long _sdata;\r
191 extern unsigned long _edata;\r
192 extern unsigned long _sbss;\r
193 extern unsigned long _ebss;\r
194 \r
195 //*****************************************************************************\r
196 //\r
197 // This is the code that gets called when the processor first starts execution\r
198 // following a reset event.  Only the absolutely necessary set is performed,\r
199 // after which the application supplied entry() routine is called.  Any fancy\r
200 // actions (such as making decisions based on the reset cause register, and\r
201 // resetting the bits in that register) are left solely in the hands of the\r
202 // application.\r
203 //\r
204 //*****************************************************************************\r
205 void\r
206 Reset_Handler(void)\r
207 {\r
208     unsigned long *pulSrc, *pulDest;\r
209 \r
210     //\r
211     // Copy the data segment initializers from flash to SRAM.\r
212     //\r
213     pulSrc = &_etext;\r
214     for(pulDest = &_sdata; pulDest < &_edata; )\r
215     {\r
216         *pulDest++ = *pulSrc++;\r
217     }\r
218 \r
219     //\r
220     // Zero fill the bss segment.  This is done with inline assembly since this\r
221     // will clear the value of pulDest if it is not kept in a register.\r
222     //\r
223     __asm("    ldr     r0, =_sbss\n"\r
224           "    ldr     r1, =_ebss\n"\r
225           "    mov     r2, #0\n"\r
226           "    .thumb_func\n"\r
227           "zero_loop:\n"\r
228           "        cmp     r0, r1\n"\r
229           "        it      lt\n"\r
230           "        strlt   r2, [r0], #4\n"\r
231           "        blt     zero_loop");\r
232 \r
233     //\r
234     // Call the application's entry point.\r
235     //\r
236     main();\r
237 }\r
238 \r
239 //*****************************************************************************\r
240 //\r
241 // Provide weak aliases for each Exception handler to the Default_Handler.\r
242 // As they are weak aliases, any function with the same name will override\r
243 // this definition.\r
244 //\r
245 //*****************************************************************************\r
246 #pragma weak NMI_Handler = Default_Handler\r
247 #pragma weak HardFault_Handler = Default_Handler\r
248 #pragma weak MemManage_Handler = Default_Handler\r
249 #pragma weak BusFault_Handler = Default_Handler\r
250 #pragma weak UsageFault_Handler = Default_Handler\r
251 #pragma weak SVC_Handler = Default_Handler\r
252 #pragma weak DebugMon_Handler = Default_Handler\r
253 #pragma weak PendSV_Handler = Default_Handler\r
254 #pragma weak SysTick_Handler = Default_Handler\r
255 #pragma weak GPIOPortA_IRQHandler = Default_Handler\r
256 #pragma weak GPIOPortB_IRQHandler = Default_Handler\r
257 #pragma weak GPIOPortC_IRQHandler = Default_Handler\r
258 #pragma weak GPIOPortD_IRQHandler = Default_Handler\r
259 #pragma weak GPIOPortE_IRQHandler = Default_Handler\r
260 #pragma weak UART0_IRQHandler = Default_Handler\r
261 #pragma weak UART1_IRQHandler = Default_Handler\r
262 #pragma weak SSI0_IRQHandler = Default_Handler\r
263 #pragma weak I2C0_IRQHandler = Default_Handler\r
264 #pragma weak PWMFault_IRQHandler = Default_Handler\r
265 #pragma weak PWMGen0_IRQHandler = Default_Handler\r
266 #pragma weak PWMGen1_IRQHandler = Default_Handler\r
267 #pragma weak PWMGen2_IRQHandler = Default_Handler\r
268 #pragma weak QEI0_IRQHandler = Default_Handler\r
269 #pragma weak ADCSeq0_IRQHandler = Default_Handler\r
270 #pragma weak ADCSeq1_IRQHandler = Default_Handler\r
271 #pragma weak ADCSeq2_IRQHandler = Default_Handler\r
272 #pragma weak ADCSeq3_IRQHandler = Default_Handler\r
273 #pragma weak Watchdog_IRQHandler = Default_Handler\r
274 #pragma weak Timer0A_IRQHandler = Default_Handler\r
275 #pragma weak Timer0B_IRQHandler = Default_Handler\r
276 #pragma weak Timer1A_IRQHandler = Default_Handler\r
277 #pragma weak Timer1B_IRQHandler = Default_Handler\r
278 #pragma weak Timer2A_IRQHandler = Default_Handler\r
279 #pragma weak Timer2B_IRQHandler = Default_Handler\r
280 #pragma weak Comp0_IRQHandler = Default_Handler\r
281 #pragma weak Comp1_IRQHandler = Default_Handler\r
282 #pragma weak Comp2_IRQHandler = Default_Handler\r
283 #pragma weak SysCtrl_IRQHandler = Default_Handler\r
284 #pragma weak FlashCtrl_IRQHandler = Default_Handler\r
285 #pragma weak GPIOPortF_IRQHandler = Default_Handler\r
286 #pragma weak GPIOPortG_IRQHandler = Default_Handler\r
287 #pragma weak GPIOPortH_IRQHandler = Default_Handler\r
288 #pragma weak UART2_IRQHandler = Default_Handler\r
289 #pragma weak SSI1_IRQHandler = Default_Handler\r
290 #pragma weak Timer3A_IRQHandler = Default_Handler\r
291 #pragma weak Timer3B_IRQHandler = Default_Handler\r
292 #pragma weak I2C1_IRQHandler = Default_Handler\r
293 #pragma weak QEI1_IRQHandler = Default_Handler\r
294 #pragma weak CAN0_IRQHandler = Default_Handler\r
295 #pragma weak CAN1_IRQHandler = Default_Handler\r
296 #pragma weak CAN2_IRQHandler = Default_Handler\r
297 #pragma weak Ethernet_IRQHandler = Default_Handler\r
298 #pragma weak Hibernate_IRQHandler = Default_Handler\r
299 \r
300 //*****************************************************************************\r
301 //\r
302 // This is the code that gets called when the processor receives an unexpected\r
303 // interrupt.  This simply enters an infinite loop, preserving the system state\r
304 // for examination by a debugger.\r
305 //\r
306 //*****************************************************************************\r
307 static void\r
308 Default_Handler(void)\r
309 {\r
310     //\r
311     // Go into an infinite loop.\r
312     //\r
313     while(1)\r
314     {\r
315     }\r
316 }\r