]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/Projects/MCUXpresso/Startup/startup_lpc54018.c
Add MPU demo project for LPC54018 board.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_LPC54018_MCUXpresso / Projects / MCUXpresso / Startup / startup_lpc54018.c
1 //*****************************************************************************\r
2 // LPC54018 startup code for use with MCUXpresso IDE\r
3 //\r
4 // Version : 101019\r
5 //*****************************************************************************\r
6 //\r
7 // Copyright 2016-2019 NXP\r
8 // All rights reserved.\r
9 //\r
10 // SPDX-License-Identifier: BSD-3-Clause\r
11 //*****************************************************************************\r
12 \r
13 #if defined (DEBUG)\r
14 #pragma GCC push_options\r
15 #pragma GCC optimize ("Og")\r
16 #endif // (DEBUG)\r
17 \r
18 #if defined (__cplusplus)\r
19 #ifdef __REDLIB__\r
20 #error Redlib does not support C++\r
21 #else\r
22 //*****************************************************************************\r
23 //\r
24 // The entry point for the C++ library startup\r
25 //\r
26 //*****************************************************************************\r
27 extern "C" {\r
28     extern void __libc_init_array(void);\r
29 }\r
30 #endif\r
31 #endif\r
32 \r
33 #define WEAK __attribute__ ((weak))\r
34 #define WEAK_AV __attribute__ ((weak, section(".after_vectors")))\r
35 #define ALIAS(f) __attribute__ ((weak, alias (#f)))\r
36 \r
37 //*****************************************************************************\r
38 #if defined (__cplusplus)\r
39 extern "C" {\r
40 #endif\r
41 \r
42 //*****************************************************************************\r
43 // Variable to store CRP value in. Will be placed automatically\r
44 // by the linker when "Enable Code Read Protect" selected.\r
45 // See crp.h header for more information\r
46 //*****************************************************************************\r
47 #include <NXP/crp.h>\r
48 __CRP const unsigned int CRP_WORD = CRP_NO_CRP ;\r
49 \r
50 //*****************************************************************************\r
51 // Declaration of external SystemInit function\r
52 //*****************************************************************************\r
53 #if defined (__USE_CMSIS)\r
54 extern void SystemInit(void);\r
55 #endif // (__USE_CMSIS)\r
56 \r
57 //*****************************************************************************\r
58 // Forward declaration of the core exception handlers.\r
59 // When the application defines a handler (with the same name), this will\r
60 // automatically take precedence over these weak definitions.\r
61 // If your application is a C++ one, then any interrupt handlers defined\r
62 // in C++ files within in your main application will need to have C linkage\r
63 // rather than C++ linkage. To do this, make sure that you are using extern "C"\r
64 // { .... } around the interrupt handler within your main application code.\r
65 //*****************************************************************************\r
66      void ResetISR(void);\r
67 WEAK void NMI_Handler(void);\r
68 WEAK void HardFault_Handler(void);\r
69 WEAK void MemManage_Handler(void);\r
70 WEAK void BusFault_Handler(void);\r
71 WEAK void UsageFault_Handler(void);\r
72 WEAK void SVC_Handler(void);\r
73 WEAK void DebugMon_Handler(void);\r
74 WEAK void PendSV_Handler(void);\r
75 WEAK void SysTick_Handler(void);\r
76 WEAK void IntDefaultHandler(void);\r
77 \r
78 //*****************************************************************************\r
79 // Forward declaration of the application IRQ handlers. When the application\r
80 // defines a handler (with the same name), this will automatically take\r
81 // precedence over weak definitions below\r
82 //*****************************************************************************\r
83 WEAK void WDT_BOD_IRQHandler(void);\r
84 WEAK void DMA0_IRQHandler(void);\r
85 WEAK void GINT0_IRQHandler(void);\r
86 WEAK void GINT1_IRQHandler(void);\r
87 WEAK void PIN_INT0_IRQHandler(void);\r
88 WEAK void PIN_INT1_IRQHandler(void);\r
89 WEAK void PIN_INT2_IRQHandler(void);\r
90 WEAK void PIN_INT3_IRQHandler(void);\r
91 WEAK void UTICK0_IRQHandler(void);\r
92 WEAK void MRT0_IRQHandler(void);\r
93 WEAK void CTIMER0_IRQHandler(void);\r
94 WEAK void CTIMER1_IRQHandler(void);\r
95 WEAK void SCT0_IRQHandler(void);\r
96 WEAK void CTIMER3_IRQHandler(void);\r
97 WEAK void FLEXCOMM0_IRQHandler(void);\r
98 WEAK void FLEXCOMM1_IRQHandler(void);\r
99 WEAK void FLEXCOMM2_IRQHandler(void);\r
100 WEAK void FLEXCOMM3_IRQHandler(void);\r
101 WEAK void FLEXCOMM4_IRQHandler(void);\r
102 WEAK void FLEXCOMM5_IRQHandler(void);\r
103 WEAK void FLEXCOMM6_IRQHandler(void);\r
104 WEAK void FLEXCOMM7_IRQHandler(void);\r
105 WEAK void ADC0_SEQA_IRQHandler(void);\r
106 WEAK void ADC0_SEQB_IRQHandler(void);\r
107 WEAK void ADC0_THCMP_IRQHandler(void);\r
108 WEAK void DMIC0_IRQHandler(void);\r
109 WEAK void HWVAD0_IRQHandler(void);\r
110 WEAK void USB0_NEEDCLK_IRQHandler(void);\r
111 WEAK void USB0_IRQHandler(void);\r
112 WEAK void RTC_IRQHandler(void);\r
113 WEAK void FLEXCOMM10_IRQHandler(void);\r
114 WEAK void Reserved47_IRQHandler(void);\r
115 WEAK void PIN_INT4_IRQHandler(void);\r
116 WEAK void PIN_INT5_IRQHandler(void);\r
117 WEAK void PIN_INT6_IRQHandler(void);\r
118 WEAK void PIN_INT7_IRQHandler(void);\r
119 WEAK void CTIMER2_IRQHandler(void);\r
120 WEAK void CTIMER4_IRQHandler(void);\r
121 WEAK void RIT_IRQHandler(void);\r
122 WEAK void SPIFI0_IRQHandler(void);\r
123 WEAK void FLEXCOMM8_IRQHandler(void);\r
124 WEAK void FLEXCOMM9_IRQHandler(void);\r
125 WEAK void SDIO_IRQHandler(void);\r
126 WEAK void CAN0_IRQ0_IRQHandler(void);\r
127 WEAK void CAN0_IRQ1_IRQHandler(void);\r
128 WEAK void CAN1_IRQ0_IRQHandler(void);\r
129 WEAK void CAN1_IRQ1_IRQHandler(void);\r
130 WEAK void USB1_IRQHandler(void);\r
131 WEAK void USB1_NEEDCLK_IRQHandler(void);\r
132 WEAK void ETHERNET_IRQHandler(void);\r
133 WEAK void ETHERNET_PMT_IRQHandler(void);\r
134 WEAK void ETHERNET_MACLP_IRQHandler(void);\r
135 WEAK void Reserved68_IRQHandler(void);\r
136 WEAK void LCD_IRQHandler(void);\r
137 WEAK void SHA_IRQHandler(void);\r
138 WEAK void SMARTCARD0_IRQHandler(void);\r
139 WEAK void SMARTCARD1_IRQHandler(void);\r
140 \r
141 //*****************************************************************************\r
142 // Forward declaration of the driver IRQ handlers. These are aliased\r
143 // to the IntDefaultHandler, which is a 'forever' loop. When the driver\r
144 // defines a handler (with the same name), this will automatically take\r
145 // precedence over these weak definitions\r
146 //*****************************************************************************\r
147 void WDT_BOD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
148 void DMA0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
149 void GINT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
150 void GINT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
151 void PIN_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
152 void PIN_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
153 void PIN_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
154 void PIN_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
155 void UTICK0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
156 void MRT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
157 void CTIMER0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
158 void CTIMER1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
159 void SCT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
160 void CTIMER3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
161 void FLEXCOMM0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
162 void FLEXCOMM1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
163 void FLEXCOMM2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
164 void FLEXCOMM3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
165 void FLEXCOMM4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
166 void FLEXCOMM5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
167 void FLEXCOMM6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
168 void FLEXCOMM7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
169 void ADC0_SEQA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
170 void ADC0_SEQB_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
171 void ADC0_THCMP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
172 void DMIC0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
173 void HWVAD0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
174 void USB0_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
175 void USB0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
176 void RTC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
177 void FLEXCOMM10_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
178 void Reserved47_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
179 void PIN_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
180 void PIN_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
181 void PIN_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
182 void PIN_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
183 void CTIMER2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
184 void CTIMER4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
185 void RIT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
186 void SPIFI0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
187 void FLEXCOMM8_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
188 void FLEXCOMM9_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
189 void SDIO_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
190 void CAN0_IRQ0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
191 void CAN0_IRQ1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
192 void CAN1_IRQ0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
193 void CAN1_IRQ1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
194 void USB1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
195 void USB1_NEEDCLK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
196 void ETHERNET_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
197 void ETHERNET_PMT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
198 void ETHERNET_MACLP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
199 void Reserved68_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
200 void LCD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
201 void SHA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
202 void SMARTCARD0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
203 void SMARTCARD1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r
204 \r
205 //*****************************************************************************\r
206 // The entry point for the application.\r
207 // __main() is the entry point for Redlib based applications\r
208 // main() is the entry point for Newlib based applications\r
209 //*****************************************************************************\r
210 #if defined (__REDLIB__)\r
211 extern void __main(void);\r
212 #endif\r
213 extern int main(void);\r
214 \r
215 //*****************************************************************************\r
216 // External declaration for the pointer to the stack top from the Linker Script\r
217 //*****************************************************************************\r
218 extern void _vStackTop(void);\r
219 extern void _image_size(void);\r
220 //*****************************************************************************\r
221 // External declaration for LPC MCU vector table checksum from  Linker Script\r
222 //*****************************************************************************\r
223 WEAK extern void __valid_user_code_checksum();\r
224 \r
225 //*****************************************************************************\r
226 // External declaration for image type and load address from  Linker Script\r
227 //*****************************************************************************\r
228 WEAK extern void __imghdr_loadaddress();\r
229 WEAK extern void __imghdr_imagetype();\r
230 \r
231 //*****************************************************************************\r
232 #if defined (__cplusplus)\r
233 } // extern "C"\r
234 #endif\r
235 #ifndef IMG_BAUDRATE\r
236 #define IMG_BAUDRATE 0\r
237 #endif\r
238 //*****************************************************************************\r
239 // The vector table.\r
240 // This relies on the linker script to place at correct location in memory.\r
241 //*****************************************************************************\r
242 extern void (* const g_pfnVectors[])(void);\r
243 extern void * __Vectors __attribute__ ((alias ("g_pfnVectors")));\r
244 \r
245 __attribute__ ((used, section(".isr_vector")))\r
246 void (* const g_pfnVectors[])(void) = {\r
247     // Core Level - CM4\r
248     &_vStackTop,                       // The initial stack pointer\r
249     ResetISR,                          // The reset handler\r
250     NMI_Handler,                       // The NMI handler\r
251     HardFault_Handler,                 // The hard fault handler\r
252     MemManage_Handler,                 // The MPU fault handler\r
253     BusFault_Handler,                  // The bus fault handler\r
254     UsageFault_Handler,                // The usage fault handler\r
255     __valid_user_code_checksum,        // LPC MCU checksum\r
256     0,                                 // ECRP\r
257     (void (*)(void))0xEDDC94BD,        // Reserved\r
258     (void (*)(void))0x160,             // Reserved\r
259     SVC_Handler,                       // SVCall handler\r
260     DebugMon_Handler,                  // Debug monitor handler\r
261     0,                                 // Reserved\r
262     PendSV_Handler,                    // The PendSV handler\r
263     SysTick_Handler,                   // The SysTick handler\r
264 \r
265     // Chip Level - LPC54018\r
266     WDT_BOD_IRQHandler,         // 16: Windowed watchdog timer, Brownout detect\r
267     DMA0_IRQHandler,            // 17: DMA controller\r
268     GINT0_IRQHandler,           // 18: GPIO group 0\r
269     GINT1_IRQHandler,           // 19: GPIO group 1\r
270     PIN_INT0_IRQHandler,        // 20: Pin interrupt 0 or pattern match engine slice 0\r
271     PIN_INT1_IRQHandler,        // 21: Pin interrupt 1or pattern match engine slice 1\r
272     PIN_INT2_IRQHandler,        // 22: Pin interrupt 2 or pattern match engine slice 2\r
273     PIN_INT3_IRQHandler,        // 23: Pin interrupt 3 or pattern match engine slice 3\r
274     UTICK0_IRQHandler,          // 24: Micro-tick Timer\r
275     MRT0_IRQHandler,            // 25: Multi-rate timer\r
276     CTIMER0_IRQHandler,         // 26: Standard counter/timer CTIMER0\r
277     CTIMER1_IRQHandler,         // 27: Standard counter/timer CTIMER1\r
278     SCT0_IRQHandler,            // 28: SCTimer/PWM\r
279     CTIMER3_IRQHandler,         // 29: Standard counter/timer CTIMER3\r
280     FLEXCOMM0_IRQHandler,       // 30: Flexcomm Interface 0 (USART, SPI, I2C, FLEXCOMM)\r
281     FLEXCOMM1_IRQHandler,       // 31: Flexcomm Interface 1 (USART, SPI, I2C, FLEXCOMM)\r
282     FLEXCOMM2_IRQHandler,       // 32: Flexcomm Interface 2 (USART, SPI, I2C, FLEXCOMM)\r
283     FLEXCOMM3_IRQHandler,       // 33: Flexcomm Interface 3 (USART, SPI, I2C, FLEXCOMM)\r
284     FLEXCOMM4_IRQHandler,       // 34: Flexcomm Interface 4 (USART, SPI, I2C, FLEXCOMM)\r
285     FLEXCOMM5_IRQHandler,       // 35: Flexcomm Interface 5 (USART, SPI, I2C,, FLEXCOMM)\r
286     FLEXCOMM6_IRQHandler,       // 36: Flexcomm Interface 6 (USART, SPI, I2C, I2S,, FLEXCOMM)\r
287     FLEXCOMM7_IRQHandler,       // 37: Flexcomm Interface 7 (USART, SPI, I2C, I2S,, FLEXCOMM)\r
288     ADC0_SEQA_IRQHandler,       // 38: ADC0 sequence A completion.\r
289     ADC0_SEQB_IRQHandler,       // 39: ADC0 sequence B completion.\r
290     ADC0_THCMP_IRQHandler,      // 40: ADC0 threshold compare and error.\r
291     DMIC0_IRQHandler,           // 41: Digital microphone and DMIC subsystem\r
292     HWVAD0_IRQHandler,          // 42: Hardware Voice Activity Detector\r
293     USB0_NEEDCLK_IRQHandler,    // 43: USB Activity Wake-up Interrupt\r
294     USB0_IRQHandler,            // 44: USB device\r
295     RTC_IRQHandler,             // 45: RTC alarm and wake-up interrupts\r
296     FLEXCOMM10_IRQHandler,      // 46: Flexcomm Interface 10 (SPI, FLEXCOMM)\r
297     Reserved47_IRQHandler,      // 47: Reserved interrupt\r
298     PIN_INT4_IRQHandler,        // 48: Pin interrupt 4 or pattern match engine slice 4 int\r
299     PIN_INT5_IRQHandler,        // 49: Pin interrupt 5 or pattern match engine slice 5 int\r
300     PIN_INT6_IRQHandler,        // 50: Pin interrupt 6 or pattern match engine slice 6 int\r
301     PIN_INT7_IRQHandler,        // 51: Pin interrupt 7 or pattern match engine slice 7 int\r
302     CTIMER2_IRQHandler,         // 52: Standard counter/timer CTIMER2\r
303     CTIMER4_IRQHandler,         // 53: Standard counter/timer CTIMER4\r
304     RIT_IRQHandler,             // 54: Repetitive Interrupt Timer\r
305     SPIFI0_IRQHandler,          // 55: SPI flash interface\r
306     FLEXCOMM8_IRQHandler,       // 56: Flexcomm Interface 8 (USART, SPI, I2C, FLEXCOMM)\r
307     FLEXCOMM9_IRQHandler,       // 57: Flexcomm Interface 9 (USART, SPI, I2C, FLEXCOMM)\r
308     SDIO_IRQHandler,            // 58: SD/MMC\r
309     CAN0_IRQ0_IRQHandler,       // 59: CAN0 interrupt0\r
310     CAN0_IRQ1_IRQHandler,       // 60: CAN0 interrupt1\r
311     CAN1_IRQ0_IRQHandler,       // 61: CAN1 interrupt0\r
312     CAN1_IRQ1_IRQHandler,       // 62: CAN1 interrupt1\r
313     USB1_IRQHandler,            // 63: USB1 interrupt\r
314     USB1_NEEDCLK_IRQHandler,    // 64: USB1 activity\r
315     ETHERNET_IRQHandler,        // 65: Ethernet\r
316     ETHERNET_PMT_IRQHandler,    // 66: Ethernet power management interrupt\r
317     ETHERNET_MACLP_IRQHandler,  // 67: Ethernet MAC interrupt\r
318     Reserved68_IRQHandler,      // 68: Reserved interrupt\r
319     LCD_IRQHandler,             // 69: LCD interrupt\r
320     SHA_IRQHandler,             // 70: SHA interrupt\r
321     SMARTCARD0_IRQHandler,      // 71: Smart card 0 interrupt\r
322     SMARTCARD1_IRQHandler,      // 72: Smart card 1 interrupt\r
323 \r
324     0,                          // Reserved\r
325     0,                          // Reserved\r
326     0,                          // Reserved\r
327     0,                          // Reserved\r
328     0,                          // Reserved\r
329     0,                          // Reserved\r
330     0,                          // Reserved\r
331     0,                          // Reserved\r
332     0,                          // Reserved\r
333     0,                          // Reserved\r
334     0,                          // Reserved\r
335     0,                          // Reserved\r
336     0,                          // Reserved\r
337     0,                          // Reserved\r
338     0,                          // Reserved\r
339     (void (*)(void))0xFEEDA5A5, // Header Marker\r
340 \r
341 #if defined (ADD_CRC)\r
342     (__imghdr_imagetype - 1),   // (0x04) Image Type\r
343      __imghdr_loadaddress,      // (0x08) Load_address\r
344 #else\r
345     __imghdr_imagetype,         // (0x04) Image Type\r
346     __imghdr_loadaddress,       // (0x08) Load_address\r
347 #endif\r
348     (void (*)(void))(((unsigned)_image_size) - 4),            // (0x0C) load_length, exclude 4 bytes CRC field.\r
349     0,                          // (0x10) CRC value (only applicable to NON Non-secure images).\r
350     0,                          // (0x14) Version (only applicable to DUAL_ENH image type.\r
351     0,                          // (0x18) EMC static memory configuration settings, required for EMC boot\r
352     (void (*)(void))IMG_BAUDRATE,       // (0x1C) image baudrate\r
353     0,                          // (0x20) reserved\r
354     (void (*)(void))0xEDDC94BD,         // (0x24) Image_marker\r
355     0,                          // (0x28) SBZ\r
356     0,                          // (0x2C) reserved\r
357     #ifdef W25Q128JVFM\r
358     /* SPIFI Descriptor - W25Q128JVFM */\r
359     (void (*)(void))0x00000000,         // 0xFFFFFFFF to default 1-bit SPI mode  ï¼›DevStrAdr\r
360     (void (*)(void))0x001870EF,         // mfgId + extCount\r
361     (void (*)(void))0x00000000,         // extid 0-3\r
362     (void (*)(void))0x00000000,         // extid 4-7\r
363     (void (*)(void))0x0001001D,         // caps\r
364     (void (*)(void))0x00000100,         // Blks + RESV1\r
365     (void (*)(void))0x00010000,         // blkSize\r
366     (void (*)(void))0x00000000,         // subBlks + subBlkSize\r
367     (void (*)(void))0x00000100,         // pageSize + RESV2\r
368     (void (*)(void))0x00003F00,         // maxReadSize\r
369     (void (*)(void))0x68506850,         // maxClkRate,maxReadRate,maxHSReadRate,maxProgramRate\r
370     (void (*)(void))0x04030050,         // maxHSProgramRate,initDeInitFxId,clearStatusFxId,getStatusFxId,\r
371     (void (*)(void))0x14110D09,         // setStatusFxId,setOptionsFxId,getReadCmdFxId,getWriteCmdFxId\r
372     #endif\r
373 \r
374      #ifdef MXL12835F\r
375      /* SPI Descriptor - MXL12835F */\r
376     (void (*)(void))0x00000000,         // 0xFFFFFFFF to default 1-bit SPI mode  ;DevStrAdr\r
377     (void (*)(void))0x001820C2,         // mfgId + extCount\r
378     (void (*)(void))0x00000000,         // extid 0-3\r
379     (void (*)(void))0x00000000,         // extid 4-7\r
380     (void (*)(void))0x0001001D,         // caps\r
381     (void (*)(void))0x00000100,         // Blks + RESV1\r
382     (void (*)(void))0x00010000,         // blkSize\r
383     (void (*)(void))0x00000000,         // subBlks + subBlkSize\r
384     (void (*)(void))0x00000100,         // pageSize + RESV2\r
385     (void (*)(void))0x00003F00,         // maxReadSize\r
386     (void (*)(void))0x68506850,         // maxClkRate,maxReadRate,maxHSReadRate,maxProgramRate\r
387     (void (*)(void))0x06030050,         // maxHSProgramRate,initDeInitFxId,clearStatusFxId,getStatusFxId\r
388     (void (*)(void))0x14110F0B,         // setStatusFxId,setOptionsFxId,getReadCmdFxId,getWriteCmdFxId\r
389     #endif\r
390 \r
391 }; /* End of g_pfnVectors */\r
392 \r
393 //*****************************************************************************\r
394 // Functions to carry out the initialization of RW and BSS data sections. These\r
395 // are written as separate functions rather than being inlined within the\r
396 // ResetISR() function in order to cope with MCUs with multiple banks of\r
397 // memory.\r
398 //*****************************************************************************\r
399 __attribute__ ((section(".after_vectors.init_data")))\r
400 void data_init(unsigned int romstart, unsigned int start, unsigned int len) {\r
401     unsigned int *pulDest = (unsigned int*) start;\r
402     unsigned int *pulSrc = (unsigned int*) romstart;\r
403     unsigned int loop;\r
404     for (loop = 0; loop < len; loop = loop + 4)\r
405         *pulDest++ = *pulSrc++;\r
406 }\r
407 \r
408 __attribute__ ((section(".after_vectors.init_bss")))\r
409 void bss_init(unsigned int start, unsigned int len) {\r
410     unsigned int *pulDest = (unsigned int*) start;\r
411     unsigned int loop;\r
412     for (loop = 0; loop < len; loop = loop + 4)\r
413         *pulDest++ = 0;\r
414 }\r
415 \r
416 //*****************************************************************************\r
417 // The following symbols are constructs generated by the linker, indicating\r
418 // the location of various points in the "Global Section Table". This table is\r
419 // created by the linker via the Code Red managed linker script mechanism. It\r
420 // contains the load address, execution address and length of each RW data\r
421 // section and the execution and length of each BSS (zero initialized) section.\r
422 //*****************************************************************************\r
423 extern unsigned int __data_section_table;\r
424 extern unsigned int __data_section_table_end;\r
425 extern unsigned int __bss_section_table;\r
426 extern unsigned int __bss_section_table_end;\r
427 \r
428 //*****************************************************************************\r
429 // Reset entry point for your code.\r
430 // Sets up a simple runtime environment and initializes the C/C++\r
431 // library.\r
432 //*****************************************************************************\r
433 __attribute__ ((section(".after_vectors.reset")))\r
434 void ResetISR(void) {\r
435 \r
436     // Disable interrupts\r
437     __asm volatile ("cpsid i");\r
438 \r
439 \r
440     // Enable SRAM clock used by Stack\r
441     __asm volatile ("LDR R0, =0x40000220\n\t"\r
442                     "MOV R1, #56\n\t"\r
443                     "STR R1, [R0]");\r
444 \r
445 #if defined (__USE_CMSIS)\r
446 // If __USE_CMSIS defined, then call CMSIS SystemInit code\r
447     SystemInit();\r
448 \r
449 #endif // (__USE_CMSIS)\r
450 \r
451     //\r
452     // Copy the data sections from flash to SRAM.\r
453     //\r
454     unsigned int LoadAddr, ExeAddr, SectionLen;\r
455     unsigned int *SectionTableAddr;\r
456 \r
457     // Load base address of Global Section Table\r
458     SectionTableAddr = &__data_section_table;\r
459 \r
460     // Copy the data sections from flash to SRAM.\r
461     while (SectionTableAddr < &__data_section_table_end) {\r
462         LoadAddr = *SectionTableAddr++;\r
463         ExeAddr = *SectionTableAddr++;\r
464         SectionLen = *SectionTableAddr++;\r
465         data_init(LoadAddr, ExeAddr, SectionLen);\r
466     }\r
467 \r
468     // At this point, SectionTableAddr = &__bss_section_table;\r
469     // Zero fill the bss segment\r
470     while (SectionTableAddr < &__bss_section_table_end) {\r
471         ExeAddr = *SectionTableAddr++;\r
472         SectionLen = *SectionTableAddr++;\r
473         bss_init(ExeAddr, SectionLen);\r
474     }\r
475 \r
476 #if !defined (__USE_CMSIS)\r
477 // Assume that if __USE_CMSIS defined, then CMSIS SystemInit code\r
478 // will enable the FPU\r
479 #if defined (__VFP_FP__) && !defined (__SOFTFP__)\r
480     //\r
481     // Code to enable the Cortex-M4 FPU only included\r
482     // if appropriate build options have been selected.\r
483     // Code taken from Section 7.1, Cortex-M4 TRM (DDI0439C)\r
484     //\r
485     // Read CPACR (located at address 0xE000ED88)\r
486     // Set bits 20-23 to enable CP10 and CP11 coprocessors\r
487     // Write back the modified value to the CPACR\r
488     asm volatile ("LDR.W R0, =0xE000ED88\n\t"\r
489                   "LDR R1, [R0]\n\t"\r
490                   "ORR R1, R1, #(0xF << 20)\n\t"\r
491                   "STR R1, [R0]");\r
492 #endif // (__VFP_FP__) && !(__SOFTFP__)\r
493 #endif // (__USE_CMSIS)\r
494 \r
495 \r
496 #if !defined (__USE_CMSIS)\r
497 // Assume that if __USE_CMSIS defined, then CMSIS SystemInit code\r
498 // will setup the VTOR register\r
499 \r
500     // Check to see if we are running the code from a non-zero\r
501     // address (eg RAM, external flash), in which case we need\r
502     // to modify the VTOR register to tell the CPU that the\r
503     // vector table is located at a non-0x0 address.\r
504     unsigned int * pSCB_VTOR = (unsigned int *) 0xE000ED08;\r
505     if ((unsigned int *)g_pfnVectors!=(unsigned int *) 0x00000000) {\r
506         *pSCB_VTOR = (unsigned int)g_pfnVectors;\r
507     }\r
508 #endif // (__USE_CMSIS)\r
509 #if defined (__cplusplus)\r
510     //\r
511     // Call C++ library initialisation\r
512     //\r
513     __libc_init_array();\r
514 #endif\r
515 \r
516     // Reenable interrupts\r
517     __asm volatile ("cpsie i");\r
518 \r
519 #if defined (__REDLIB__)\r
520     // Call the Redlib library, which in turn calls main()\r
521     __main();\r
522 #else\r
523     main();\r
524 #endif\r
525 \r
526     //\r
527     // main() shouldn't return, but if it does, we'll just enter an infinite loop\r
528     //\r
529     while (1) {\r
530         ;\r
531     }\r
532 }\r
533 \r
534 //*****************************************************************************\r
535 // Default core exception handlers. Override the ones here by defining your own\r
536 // handler routines in your application code.\r
537 //*****************************************************************************\r
538 WEAK_AV void NMI_Handler(void)\r
539 { while(1) {}\r
540 }\r
541 \r
542 WEAK_AV void HardFault_Handler(void)\r
543 { while(1) {}\r
544 }\r
545 \r
546 WEAK_AV void MemManage_Handler(void)\r
547 { while(1) {}\r
548 }\r
549 \r
550 WEAK_AV void BusFault_Handler(void)\r
551 { while(1) {}\r
552 }\r
553 \r
554 WEAK_AV void UsageFault_Handler(void)\r
555 { while(1) {}\r
556 }\r
557 \r
558 WEAK_AV void SVC_Handler(void)\r
559 { while(1) {}\r
560 }\r
561 \r
562 WEAK_AV void DebugMon_Handler(void)\r
563 { while(1) {}\r
564 }\r
565 \r
566 WEAK_AV void PendSV_Handler(void)\r
567 { while(1) {}\r
568 }\r
569 \r
570 WEAK_AV void SysTick_Handler(void)\r
571 { while(1) {}\r
572 }\r
573 \r
574 //*****************************************************************************\r
575 // Processor ends up here if an unexpected interrupt occurs or a specific\r
576 // handler is not present in the application code.\r
577 //*****************************************************************************\r
578 WEAK_AV void IntDefaultHandler(void)\r
579 { while(1) {}\r
580 }\r
581 \r
582 //*****************************************************************************\r
583 // Default application exception handlers. Override the ones here by defining\r
584 // your own handler routines in your application code. These routines call\r
585 // driver exception handlers or IntDefaultHandler() if no driver exception\r
586 // handler is included.\r
587 //*****************************************************************************\r
588 WEAK void WDT_BOD_IRQHandler(void)\r
589 {   WDT_BOD_DriverIRQHandler();\r
590 }\r
591 \r
592 WEAK void DMA0_IRQHandler(void)\r
593 {   DMA0_DriverIRQHandler();\r
594 }\r
595 \r
596 WEAK void GINT0_IRQHandler(void)\r
597 {   GINT0_DriverIRQHandler();\r
598 }\r
599 \r
600 WEAK void GINT1_IRQHandler(void)\r
601 {   GINT1_DriverIRQHandler();\r
602 }\r
603 \r
604 WEAK void PIN_INT0_IRQHandler(void)\r
605 {   PIN_INT0_DriverIRQHandler();\r
606 }\r
607 \r
608 WEAK void PIN_INT1_IRQHandler(void)\r
609 {   PIN_INT1_DriverIRQHandler();\r
610 }\r
611 \r
612 WEAK void PIN_INT2_IRQHandler(void)\r
613 {   PIN_INT2_DriverIRQHandler();\r
614 }\r
615 \r
616 WEAK void PIN_INT3_IRQHandler(void)\r
617 {   PIN_INT3_DriverIRQHandler();\r
618 }\r
619 \r
620 WEAK void UTICK0_IRQHandler(void)\r
621 {   UTICK0_DriverIRQHandler();\r
622 }\r
623 \r
624 WEAK void MRT0_IRQHandler(void)\r
625 {   MRT0_DriverIRQHandler();\r
626 }\r
627 \r
628 WEAK void CTIMER0_IRQHandler(void)\r
629 {   CTIMER0_DriverIRQHandler();\r
630 }\r
631 \r
632 WEAK void CTIMER1_IRQHandler(void)\r
633 {   CTIMER1_DriverIRQHandler();\r
634 }\r
635 \r
636 WEAK void SCT0_IRQHandler(void)\r
637 {   SCT0_DriverIRQHandler();\r
638 }\r
639 \r
640 WEAK void CTIMER3_IRQHandler(void)\r
641 {   CTIMER3_DriverIRQHandler();\r
642 }\r
643 \r
644 WEAK void FLEXCOMM0_IRQHandler(void)\r
645 {   FLEXCOMM0_DriverIRQHandler();\r
646 }\r
647 \r
648 WEAK void FLEXCOMM1_IRQHandler(void)\r
649 {   FLEXCOMM1_DriverIRQHandler();\r
650 }\r
651 \r
652 WEAK void FLEXCOMM2_IRQHandler(void)\r
653 {   FLEXCOMM2_DriverIRQHandler();\r
654 }\r
655 \r
656 WEAK void FLEXCOMM3_IRQHandler(void)\r
657 {   FLEXCOMM3_DriverIRQHandler();\r
658 }\r
659 \r
660 WEAK void FLEXCOMM4_IRQHandler(void)\r
661 {   FLEXCOMM4_DriverIRQHandler();\r
662 }\r
663 \r
664 WEAK void FLEXCOMM5_IRQHandler(void)\r
665 {   FLEXCOMM5_DriverIRQHandler();\r
666 }\r
667 \r
668 WEAK void FLEXCOMM6_IRQHandler(void)\r
669 {   FLEXCOMM6_DriverIRQHandler();\r
670 }\r
671 \r
672 WEAK void FLEXCOMM7_IRQHandler(void)\r
673 {   FLEXCOMM7_DriverIRQHandler();\r
674 }\r
675 \r
676 WEAK void ADC0_SEQA_IRQHandler(void)\r
677 {   ADC0_SEQA_DriverIRQHandler();\r
678 }\r
679 \r
680 WEAK void ADC0_SEQB_IRQHandler(void)\r
681 {   ADC0_SEQB_DriverIRQHandler();\r
682 }\r
683 \r
684 WEAK void ADC0_THCMP_IRQHandler(void)\r
685 {   ADC0_THCMP_DriverIRQHandler();\r
686 }\r
687 \r
688 WEAK void DMIC0_IRQHandler(void)\r
689 {   DMIC0_DriverIRQHandler();\r
690 }\r
691 \r
692 WEAK void HWVAD0_IRQHandler(void)\r
693 {   HWVAD0_DriverIRQHandler();\r
694 }\r
695 \r
696 WEAK void USB0_NEEDCLK_IRQHandler(void)\r
697 {   USB0_NEEDCLK_DriverIRQHandler();\r
698 }\r
699 \r
700 WEAK void USB0_IRQHandler(void)\r
701 {   USB0_DriverIRQHandler();\r
702 }\r
703 \r
704 WEAK void RTC_IRQHandler(void)\r
705 {   RTC_DriverIRQHandler();\r
706 }\r
707 \r
708 WEAK void FLEXCOMM10_IRQHandler(void)\r
709 {   FLEXCOMM10_DriverIRQHandler();\r
710 }\r
711 \r
712 WEAK void Reserved47_IRQHandler(void)\r
713 {   Reserved47_DriverIRQHandler();\r
714 }\r
715 \r
716 WEAK void PIN_INT4_IRQHandler(void)\r
717 {   PIN_INT4_DriverIRQHandler();\r
718 }\r
719 \r
720 WEAK void PIN_INT5_IRQHandler(void)\r
721 {   PIN_INT5_DriverIRQHandler();\r
722 }\r
723 \r
724 WEAK void PIN_INT6_IRQHandler(void)\r
725 {   PIN_INT6_DriverIRQHandler();\r
726 }\r
727 \r
728 WEAK void PIN_INT7_IRQHandler(void)\r
729 {   PIN_INT7_DriverIRQHandler();\r
730 }\r
731 \r
732 WEAK void CTIMER2_IRQHandler(void)\r
733 {   CTIMER2_DriverIRQHandler();\r
734 }\r
735 \r
736 WEAK void CTIMER4_IRQHandler(void)\r
737 {   CTIMER4_DriverIRQHandler();\r
738 }\r
739 \r
740 WEAK void RIT_IRQHandler(void)\r
741 {   RIT_DriverIRQHandler();\r
742 }\r
743 \r
744 WEAK void SPIFI0_IRQHandler(void)\r
745 {   SPIFI0_DriverIRQHandler();\r
746 }\r
747 \r
748 WEAK void FLEXCOMM8_IRQHandler(void)\r
749 {   FLEXCOMM8_DriverIRQHandler();\r
750 }\r
751 \r
752 WEAK void FLEXCOMM9_IRQHandler(void)\r
753 {   FLEXCOMM9_DriverIRQHandler();\r
754 }\r
755 \r
756 WEAK void SDIO_IRQHandler(void)\r
757 {   SDIO_DriverIRQHandler();\r
758 }\r
759 \r
760 WEAK void CAN0_IRQ0_IRQHandler(void)\r
761 {   CAN0_IRQ0_DriverIRQHandler();\r
762 }\r
763 \r
764 WEAK void CAN0_IRQ1_IRQHandler(void)\r
765 {   CAN0_IRQ1_DriverIRQHandler();\r
766 }\r
767 \r
768 WEAK void CAN1_IRQ0_IRQHandler(void)\r
769 {   CAN1_IRQ0_DriverIRQHandler();\r
770 }\r
771 \r
772 WEAK void CAN1_IRQ1_IRQHandler(void)\r
773 {   CAN1_IRQ1_DriverIRQHandler();\r
774 }\r
775 \r
776 WEAK void USB1_IRQHandler(void)\r
777 {   USB1_DriverIRQHandler();\r
778 }\r
779 \r
780 WEAK void USB1_NEEDCLK_IRQHandler(void)\r
781 {   USB1_NEEDCLK_DriverIRQHandler();\r
782 }\r
783 \r
784 WEAK void ETHERNET_IRQHandler(void)\r
785 {   ETHERNET_DriverIRQHandler();\r
786 }\r
787 \r
788 WEAK void ETHERNET_PMT_IRQHandler(void)\r
789 {   ETHERNET_PMT_DriverIRQHandler();\r
790 }\r
791 \r
792 WEAK void ETHERNET_MACLP_IRQHandler(void)\r
793 {   ETHERNET_MACLP_DriverIRQHandler();\r
794 }\r
795 \r
796 WEAK void Reserved68_IRQHandler(void)\r
797 {   Reserved68_DriverIRQHandler();\r
798 }\r
799 \r
800 WEAK void LCD_IRQHandler(void)\r
801 {   LCD_DriverIRQHandler();\r
802 }\r
803 \r
804 WEAK void SHA_IRQHandler(void)\r
805 {   SHA_DriverIRQHandler();\r
806 }\r
807 \r
808 WEAK void SMARTCARD0_IRQHandler(void)\r
809 {   SMARTCARD0_DriverIRQHandler();\r
810 }\r
811 \r
812 WEAK void SMARTCARD1_IRQHandler(void)\r
813 {   SMARTCARD1_DriverIRQHandler();\r
814 }\r
815 \r
816 //*****************************************************************************\r
817 \r
818 #if defined (DEBUG)\r
819 #pragma GCC pop_options\r
820 #endif // (DEBUG)\r