Initial commit, code based on LPC1224 support and LPC812-MAX CMSIS-DAP interface...
[lpc11u3x] / core / bootstrap.c
1 /****************************************************************************
2  *   core/bootstrap.c
3  *
4  * This file holds the bootstrap code, the vector table, and nothing more.
5  * The bootstrap code is the code of the reset handler, which is called by
6  *   the bootloader (executed from internal ROM after power on or reset).
7  * The reset handler code perform copy of data section, clears bss, and
8  *   calls the main function.
9  *
10  *
11  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
12  *
13  * Example code from frozeneskimo.com :
14  *   http://dev.frozeneskimo.com/notes/getting_started_with_cortex_m3_cmsis_and_gnu_tools
15  *
16  * This program is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU General Public License as published by
18  * the Free Software Foundation, either version 2 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24  * GNU General Public License for more details.
25  *
26  * You should have received a copy of the GNU General Public License
27  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
28  *
29  *****************************************************************************/
32 extern unsigned int _end_stack;
33 extern unsigned int _end_text;
34 extern unsigned int _start_data;
35 extern unsigned int _end_data;
36 extern unsigned int _start_bss;
37 extern unsigned int _end_bss;
39 extern int main(void);
41 /* Cortex M0 core interrupt handlers */
42 void Reset_Handler(void);
43 void NMI_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
44 void HardFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
45 void SVC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
46 void PendSV_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
47 void SysTick_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
48 /* LPC12xx specific interrupt handlers */
49 void Pin_Int0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
50 void Pin_Int1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
51 void Pin_Int2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
52 void Pin_Int3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
53 void Pin_Int4_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
54 void Pin_Int5_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
55 void Pin_Int6_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
56 void Pin_Int7_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
57 void GPIO_GRP_INT0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
58 void GPIO_GRP_INT1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
59 void I2C_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
60 void TIMER_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
61 void TIMER_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
62 void TIMER_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
63 void TIMER_3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
64 void SSP_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
65 void SSP_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
66 void UART_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
67 void ADC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
68 void WDT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
69 void BOD_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
70 void USB_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
71 void USB_FIQ_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
72 void USB_Wakeup_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
73 void FLASH_EEPROM_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
77 void Dummy_Handler(void);
80 /***************************************************************************** */
81 /*                      Vector table                                           */
82 /***************************************************************************** */
83 void *vector_table[] __attribute__ ((section(".vectors"))) = {
84         &_end_stack, /* Initial SP value */ /* 0 */
85         Reset_Handler,
86         NMI_Handler,
87         HardFault_Handler,
88         0,
89         0, /* 5 */
90         0,
91         /* Entry 7 (8th entry) must contain the 2’s complement of the check-sum
92            of table entries 0 through 6. This causes the checksum of the first 8
93            table entries to be 0 */
94         (void *)0xDEADBEEF, /* Actually, this is done using an external tool. */
95         0,
96         0,
97         0, /* 10 */
98         SVC_Handler,
99         0,
100         0,
101         PendSV_Handler,
102         SysTick_Handler, /* 15 */
103         /* LPC11U3x specific interrupt vectors, refer to chapter 6 of LPC11U3x User manual (UM10462) */
104         Pin_Int0_Handler,     /* 16 */ /* IRQ0 */
105         Pin_Int1_Handler,
106         Pin_Int2_Handler,
107         Pin_Int3_Handler,
108         Pin_Int4_Handler, /* 20 */
109         Pin_Int5_Handler, /* 21 */ /* IRQ5 */
110         Pin_Int6_Handler,
111         Pin_Int7_Handler,
112         GPIO_GRP_INT0_Handler,
113         GPIO_GRP_INT1_Handler, /* 25 */
114         0, /* 26 */ /* IRQ10 */
115         0,
116         0,
117         0,
118         SSP_1_Handler, /* 30 */
119         I2C_0_Handler, /* 31 */ /* IRQ15 */
120         TIMER_0_Handler, /* CT16B0 */
121         TIMER_1_Handler, /* CT16B1 */
122         TIMER_2_Handler, /* CT32B0 */
123         TIMER_3_Handler, /* CT32B1 */ /* 35 */
124         SSP_0_Handler, /* 36 */ /* IRQ20 */
125         UART_0_Handler,
126         USB_Handler,
127         USB_FIQ_Handler,
128         ADC_Handler, /* 40 */
129         WDT_Handler, /* 41 */ /* IRQ25 */
130         BOD_Handler,
131         FLASH_EEPROM_Handler,
132         0,
133         0, /* 45 */
134         USB_Wakeup_Handler,   /* 46 */ /* IRQ30 */
135         0,
136 };
139 extern void rom_helpers_init(void);
140 /*
141  * This is the entry point of the programm
142  * It does the set up of the memory and then starts the main.
143  */
144 void Reset_Handler(void) {
145         unsigned int *src, *dst;
147         /* Copy data section from flash to RAM */
148         src = &_end_text;
149         dst = &_start_data;
150         while (dst < &_end_data)
151                 *dst++ = *src++;
153         /* Clear the bss section */
154         dst = &_start_bss;
155         while (dst < &_end_bss)
156                 *dst++ = 0;
158         /* Initialize rom based division helpers */
159         rom_helpers_init();
160         /* Start main programm */
161         main();
164 void Dummy_Handler(void) {
165         while (1);