Changes ported from modules, to support multiple tmp101 sensors.
[dtplug] / 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 M3 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 MemFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
46 void BusFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
47 void UsageFault_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
48 void SVC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
49 void PendSV_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
50 void SysTick_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
51 /* LPC17xx specific interrupt handlers */
52 void WDT_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
53 void TIMER_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
54 void TIMER_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
55 void TIMER_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
56 void TIMER_3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
57 void UART_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
58 void UART_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
59 void UART_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
60 void UART_3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
61 void PWM_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
62 void I2C_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
63 void I2C_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
64 void I2C_2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
65 void SPI_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
66 void SSP_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
67 void SSP_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
68 void PLL_0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
69 void RTC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
70 void EINT0_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
71 void EINT1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
72 void EINT2_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
73 void EINT3_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
74 void ADC_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
75 void BOD_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
76 void USB_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
77 void CAN_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
78 void GPDMA_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
79 void I2S_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
80 void Ethernet_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
81 void Repetitive_Int_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
82 void Motor_Ctrl_PWM_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
83 void Quadrature_Enc_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
84 void PLL_1_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
85 void USB_Act_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
86 void CAN_Act_Handler(void) __attribute__ ((weak, alias ("Dummy_Handler")));
90 void Dummy_Handler(void);
93 /***************************************************************************** */
94 /*                      Vector table                                           */
95 /***************************************************************************** */
96 void *vector_table[] __attribute__ ((section(".vectors"))) = {
97         &_end_stack, /* Initial SP value */ /* 0 */
98         Reset_Handler,
99         NMI_Handler,
100         HardFault_Handler,
101         MemFault_Handler,
102         BusFault_Handler, /* 5 */
103         UsageFault_Handler,
104         /* Entry 7 (8th entry) must contain the 2’s complement of the check-sum
105            of table entries 0 through 6. This causes the checksum of the first 8
106            table entries to be 0 */
107         (void *)0xDEADBEEF, /* Actually, this is done using an external tool. */
108         0,
109         0,
110         0, /* 10 */
111         SVC_Handler,
112         0,
113         0,
114         PendSV_Handler,
115         SysTick_Handler, /* 15 */
116         /* LPC17xx specific interrupt vectors, see chapter 6 of LPC17xx User manual (UM10360) */
117         WDT_Handler,     /* 16 */
118         TIMER_0_Handler,
119         TIMER_1_Handler,
120         TIMER_2_Handler,
121         TIMER_3_Handler, /* 20 */
122         UART_0_Handler,
123         UART_1_Handler,
124         UART_2_Handler,
125         UART_3_Handler,
126         PWM_1_Handler,   /* 25 */
127         I2C_0_Handler,
128         I2C_1_Handler,
129         I2C_2_Handler,
130         SPI_Handler,
131         SSP_0_Handler,   /* 30 */
132         SSP_1_Handler,
133         PLL_0_Handler,
134         RTC_Handler,
135         EINT0_Handler,
136         EINT1_Handler,   /* 35 */
137         EINT2_Handler,
138         EINT3_Handler,
139         ADC_Handler,
140         BOD_Handler,
141         USB_Handler,     /* 40 */
142         CAN_Handler,
143         GPDMA_Handler,
144         I2S_Handler,
145         Ethernet_Handler,
146         Repetitive_Int_Handler, /* 45 */
147         Motor_Ctrl_PWM_Handler,
148         Quadrature_Enc_Handler,
149         PLL_1_Handler,
150         USB_Act_Handler,
151         CAN_Act_Handler, /* 50 */
152 };
155 extern void rom_helpers_init(void);
156 /*
157  * This is the entry point of the programm
158  * It does the set up of the memory and then starts the main.
159  */
160 void Reset_Handler(void) {
161         unsigned int *src, *dst;
162         
163         /* Copy data section from flash to RAM */
164         src = &_end_text;
165         dst = &_start_data;
166         while (dst < &_end_data)
167                 *dst++ = *src++;
169         /* Clear the bss section */
170         dst = &_start_bss;
171         while (dst < &_end_bss)
172                 *dst++ = 0;
174         /* Initialize rom based helpers */
175         rom_helpers_init();
176         /* Start main programm */
177         main();
180 void Dummy_Handler(void) {
181         while (1);