1 /******************************************************************************
2 *
3 * Copyright (C) 2017 Texas Instruments Incorporated - http://www.ti.com/
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 *  Redistributions of source code must retain the above copyright
10 *  notice, this list of conditions and the following disclaimer.
11 *
12 *  Redistributions in binary form must reproduce the above copyright
13 *  notice, this list of conditions and the following disclaimer in the
14 *  documentation and/or other materials provided with the
15 *  distribution.
16 *
17 *  Neither the name of Texas Instruments Incorporated nor the names of
18 *  its contributors may be used to endorse or promote products derived
19 *  from this software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33  *****************************************************************************/
34 
35 #include <stdint.h>
36 
37 #ifndef HWREG
38     #define HWREG(x) (*((volatile uint32_t *)(x)))
39 #endif
40 
41 /* Reserve space for the system stack.                      */
42 extern uint32_t __StackTop;
43 typedef void(*pFunc)(void);
44 
45 /* Entry point for the application.                         */
46 extern int entry(void);
47 
48 /* External declaration for system initialization function  */
49 extern void SystemInit(void);
50 
51 /* Forward declaration of the default fault handlers.   */
52 void Default_Handler(void) __attribute__((weak));
53 extern void Reset_Handler(void) __attribute__((weak));
54 
55 /* Cortex-M4 Processor Exceptions */
56 extern void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
57 extern void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
58 extern void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
59 extern void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
60 extern void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
61 extern void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
62 extern void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
63 extern void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
64 extern void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
65 
66 /* device specific interrupt handler */
67 extern void GPIOA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
68 extern void GPIOB_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
69 extern void GPIOC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
70 extern void GPIOD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
71 extern void GPIOE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
72 extern void UART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
73 extern void UART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
74 extern void SSI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
75 extern void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
76 extern void PWM0_FAULT_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
77 extern void PWM0_0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
78 extern void PWM0_1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
79 extern void PWM0_2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
80 extern void QEI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
81 extern void ADC0SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
82 extern void ADC0SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
83 extern void ADC0SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
84 extern void ADC0SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
85 extern void WATCHDOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
86 extern void TIMER0A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
87 extern void TIMER0B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
88 extern void TIMER1A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
89 extern void TIMER1B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
90 extern void TIMER2A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
91 extern void TIMER2B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
92 extern void COMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
93 extern void COMP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
94 extern void COMP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
95 extern void SYSCTL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
96 extern void FLASH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
97 extern void GPIOF_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
98 extern void GPIOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
99 extern void GPIOH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
100 extern void UART2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
101 extern void SSI1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
102 extern void TIMER3A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
103 extern void TIMER3B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
104 extern void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
105 extern void CAN0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
106 extern void CAN1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
107 extern void EMAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
108 extern void HIBERNATE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
109 extern void USB0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
110 extern void PWM0_3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
111 extern void UDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
112 extern void UDMAERR_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
113 extern void ADC1SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
114 extern void ADC1SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
115 extern void ADC1SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
116 extern void ADC1SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
117 extern void EPI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
118 extern void GPIOJ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
119 extern void GPIOK_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
120 extern void GPIOL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
121 extern void SSI2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
122 extern void SSI3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
123 extern void UART3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
124 extern void UART4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
125 extern void UART5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
126 extern void UART6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
127 extern void UART7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
128 extern void I2C2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
129 extern void I2C3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
130 extern void TIMER4A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
131 extern void TIMER4B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
132 extern void TIMER5A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
133 extern void TIMER5B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
134 extern void SYSEXC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
135 extern void I2C4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
136 extern void I2C5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
137 extern void GPIOM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
138 extern void GPION_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
139 extern void TAMPER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
140 extern void GPIOP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
141 extern void GPIOP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
142 extern void GPIOP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
143 extern void GPIOP3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
144 extern void GPIOP4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
145 extern void GPIOP5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
146 extern void GPIOP6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
147 extern void GPIOP7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
148 extern void GPIOQ0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
149 extern void GPIOQ1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
150 extern void GPIOQ2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
151 extern void GPIOQ3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
152 extern void GPIOQ4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
153 extern void GPIOQ5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
154 extern void GPIOQ6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
155 extern void GPIOQ7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
156 extern void SHA0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
157 extern void AES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
158 extern void DES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
159 extern void TIMER6A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
160 extern void TIMER6B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
161 extern void TIMER7A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
162 extern void TIMER7B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
163 extern void I2C6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
164 extern void I2C7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
165 extern void I2C8_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
166 extern void I2C9_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
167 
168 
169 /* The vector table.  Note that the proper constructs must be placed on this to */
170 /* ensure that it ends up at physical address 0x0000.0000 or at the start of    */
171 /* the program if located at a start address other than 0.                      */
172 
173 void (* const interruptVectors[])(void) __attribute__((section(".intvecs"))) =
174 {
175     (pFunc) &__StackTop,
176     /* The initial stack pointer */
177     Reset_Handler,                          /* The reset handler         */
178     NMI_Handler,                            /* The NMI handler           */
179     HardFault_Handler,                      /* The hard fault handler    */
180     MemManage_Handler,                      /* The MPU fault handler     */
181     BusFault_Handler,                       /* The bus fault handler     */
182     UsageFault_Handler,                     /* The usage fault handler   */
183     0,                                      /* Reserved                  */
184     0,                                      /* Reserved                  */
185     0,                                      /* Reserved                  */
186     0,                                      /* Reserved                  */
187     SVC_Handler,                            /* SVCall handler            */
188     DebugMon_Handler,                       /* Debug monitor handler     */
189     0,                                      /* Reserved                  */
190     PendSV_Handler,                         /* The PendSV handler        */
191     SysTick_Handler,                        /* The SysTick handler       */
192     GPIOA_IRQHandler,                       /* GPIO Port A               */
193     GPIOB_IRQHandler,                       /* GPIO Port B               */
194     GPIOC_IRQHandler,                       /* GPIO Port C               */
195     GPIOD_IRQHandler,                       /* GPIO Port D               */
196     GPIOE_IRQHandler,                       /* GPIO Port E               */
197     UART0_IRQHandler,                       /* UART0 Rx and Tx           */
198     UART1_IRQHandler,                       /* UART1 Rx and Tx           */
199     SSI0_IRQHandler,                        /* SSI0 Rx and Tx            */
200     I2C0_IRQHandler,                        /* I2C0 Master and Slave     */
201     PWM0_FAULT_IRQHandler,                  /* PWM Fault                 */
202     PWM0_0_IRQHandler,                      /* PWM Generator 0           */
203     PWM0_1_IRQHandler,                      /* PWM Generator 1           */
204     PWM0_2_IRQHandler,                      /* PWM Generator 2           */
205     QEI0_IRQHandler,                        /* Quadrature Encoder 0      */
206     ADC0SS0_IRQHandler,                     /* ADC Sequence 0            */
207     ADC0SS1_IRQHandler,                     /* ADC Sequence 1            */
208     ADC0SS2_IRQHandler,                     /* ADC Sequence 2            */
209     ADC0SS3_IRQHandler,                     /* ADC Sequence 3            */
210     WATCHDOG_IRQHandler,                    /* Watchdog timer            */
211     TIMER0A_IRQHandler,                     /* Timer 0 subtimer A        */
212     TIMER0B_IRQHandler,                     /* Timer 0 subtimer B        */
213     TIMER1A_IRQHandler,                     /* Timer 1 subtimer A        */
214     TIMER1B_IRQHandler,                     /* Timer 1 subtimer B        */
215     TIMER2A_IRQHandler,                     /* Timer 2 subtimer A        */
216     TIMER2B_IRQHandler,                     /* Timer 2 subtimer B        */
217     COMP0_IRQHandler,                       /* Analog Comparator 0       */
218     COMP1_IRQHandler,                       /* Analog Comparator 1       */
219     COMP2_IRQHandler,                       /* Analog Comparator 2       */
220     SYSCTL_IRQHandler,                      /* System Control            */
221     FLASH_IRQHandler,                       /* FLASH Control             */
222     GPIOF_IRQHandler,                       /* GPIO Port F               */
223     GPIOG_IRQHandler,                       /* GPIO Port G               */
224     GPIOH_IRQHandler,                       /* GPIO Port H               */
225     UART2_IRQHandler,                       /* UART2 Rx and Tx           */
226     SSI1_IRQHandler,                        /* SSI1 Rx and Tx            */
227     TIMER3A_IRQHandler,                     /* Timer 3 subtimer A        */
228     TIMER3B_IRQHandler,                     /* Timer 3 subtimer B        */
229     I2C1_IRQHandler,                        /* I2C1 Master and Slave     */
230     CAN0_IRQHandler,                        /* CAN0                      */
231     CAN1_IRQHandler,                        /* CAN1                      */
232     EMAC0_IRQHandler,                       /* Ethernet                  */
233     HIBERNATE_IRQHandler,                   /* Hibernate                 */
234     USB0_IRQHandler,                        /* USB0                      */
235     PWM0_3_IRQHandler,                      /* PWM Generator 3           */
236     UDMA_IRQHandler,                        /* uDMA Software Transfer    */
237     UDMAERR_IRQHandler,                     /* uDMA Error                */
238     ADC1SS0_IRQHandler,                     /* ADC1 Sequence 0           */
239     ADC1SS1_IRQHandler,                     /* ADC1 Sequence 1           */
240     ADC1SS2_IRQHandler,                     /* ADC1 Sequence 2           */
241     ADC1SS3_IRQHandler,                     /* ADC1 Sequence 3           */
242     EPI0_IRQHandler,                        /* External Bus Interface 0  */
243     GPIOJ_IRQHandler,                       /* GPIO Port J               */
244     GPIOK_IRQHandler,                       /* GPIO Port K               */
245     GPIOL_IRQHandler,                       /* GPIO Port L               */
246     SSI2_IRQHandler,                        /* SSI2 Rx and Tx            */
247     SSI3_IRQHandler,                        /* SSI3 Rx and Tx            */
248     UART3_IRQHandler,                       /* UART3 Rx and Tx           */
249     UART4_IRQHandler,                       /* UART4 Rx and Tx           */
250     UART5_IRQHandler,                       /* UART5 Rx and Tx           */
251     UART6_IRQHandler,                       /* UART6 Rx and Tx           */
252     UART7_IRQHandler,                       /* UART7 Rx and Tx           */
253     I2C2_IRQHandler,                        /* I2C2 Master and Slave     */
254     I2C3_IRQHandler,                        /* I2C3 Master and Slave     */
255     TIMER4A_IRQHandler,                     /* Timer 4 subtimer A        */
256     TIMER4B_IRQHandler,                     /* Timer 4 subtimer B        */
257     TIMER5A_IRQHandler,                     /* Timer 5 subtimer A        */
258     TIMER5B_IRQHandler,                     /* Timer 5 subtimer B        */
259     SYSEXC_IRQHandler,                      /* FPU                       */
260     0,                                      /* Reserved                  */
261     0,                                      /* Reserved                  */
262     I2C4_IRQHandler,                        /* I2C4 Master and Slave     */
263     I2C5_IRQHandler,                        /* I2C5 Master and Slave     */
264     GPIOM_IRQHandler,                       /* GPIO Port M               */
265     GPION_IRQHandler,                       /* GPIO Port N               */
266     0,                                      /* Reserved                  */
267     TAMPER0_IRQHandler,                     /* Tamper                    */
268     GPIOP0_IRQHandler,                      /* GPIO Port P(Summary or P0)*/
269     GPIOP1_IRQHandler,                      /* GPIO Port P1              */
270     GPIOP2_IRQHandler,                      /* GPIO Port P2              */
271     GPIOP3_IRQHandler,                      /* GPIO Port P3              */
272     GPIOP4_IRQHandler,                      /* GPIO Port P4              */
273     GPIOP5_IRQHandler,                      /* GPIO Port P5              */
274     GPIOP6_IRQHandler,                      /* GPIO Port P6              */
275     GPIOP7_IRQHandler,                      /* GPIO Port P7              */
276     GPIOQ0_IRQHandler,                      /* GPIO Port Q(Summary or Q0)*/
277     GPIOQ1_IRQHandler,                      /* GPIO Port Q1              */
278     GPIOQ2_IRQHandler,                      /* GPIO Port Q2              */
279     GPIOQ3_IRQHandler,                      /* GPIO Port Q3              */
280     GPIOQ4_IRQHandler,                      /* GPIO Port Q4              */
281     GPIOQ5_IRQHandler,                      /* GPIO Port Q5              */
282     GPIOQ6_IRQHandler,                      /* GPIO Port Q6              */
283     GPIOQ7_IRQHandler,                      /* GPIO Port Q7              */
284     0,                                      /* Reserved                  */
285     0,                                      /* Reserved                  */
286     SHA0_IRQHandler,                        /* SHA/MD5 0                 */
287     AES0_IRQHandler,                        /* AES 0                     */
288     DES0_IRQHandler,                        /* DES3DES 0                 */
289     0,                                      /* Reserved                  */
290     TIMER6A_IRQHandler,                     /* Timer 6 subtimer A        */
291     TIMER6B_IRQHandler,                     /* Timer 6 subtimer B        */
292     TIMER7A_IRQHandler,                     /* Timer 7 subtimer A        */
293     TIMER7B_IRQHandler,                     /* Timer 7 subtimer B        */
294     I2C6_IRQHandler,                        /* I2C6 Master and Slave     */
295     I2C7_IRQHandler,                        /* I2C7 Master and Slave     */
296     0,                                      /* Reserved                  */
297     0,                                      /* Reserved                  */
298     0,                                      /* Reserved                  */
299     0,                                      /* Reserved                  */
300     0,                                      /* Reserved                  */
301     I2C8_IRQHandler,                        /* I2C8 Master and Slave     */
302     I2C9_IRQHandler,                        /* I2C9 Master and Slave     */
303     0,                                      /* Reserved                  */
304     0,                                      /* Reserved                  */
305     0                                       /* Reserved                  */
306 };
307 
308 /* The following are constructs created by the linker, indicating where the     */
309 /* the "data" and "bss" segments reside in memory.  The initializers for the    */
310 /* for the "data" segment resides immediately following the "text" segment.     */
311 extern uint32_t __data_load__;
312 extern uint32_t __data_start__;
313 extern uint32_t __data_end__;
314 
315 
316 /* This is the code that gets called when the processor first starts execution  */
317 /* following a reset event.  Only the absolutely necessary set is performed,    */
318 /* after which the application supplied entry() routine is called.  Any fancy   */
319 /* actions (such as making decisions based on the reset cause register, and     */
320 /* resetting the bits in that register) are left solely in the hands of the     */
321 /* application.                                                                 */
Reset_Handler(void)322 void Reset_Handler(void)
323 {
324     uint32_t *pui32Src, *pui32Dest;
325 
326     //
327     // Copy the data segment initializers from flash to SRAM.
328     //
329     pui32Src = &__data_load__;
330     for (pui32Dest = &__data_start__; pui32Dest < &__data_end__;)
331     {
332         *pui32Dest++ = *pui32Src++;
333     }
334 
335     /* Call system initialization routine */
336     SystemInit();
337 
338     /* Jump to the main initialization routine. */
339     entry();
340 }
341 
342 /* This is the code that gets called when the processor receives an unexpected  */
343 /* interrupt.  This simply enters an infinite loop, preserving the system state */
344 /* for examination by a debugger.                                               */
Default_Handler(void)345 void Default_Handler(void)
346 {
347     /* Enter an infinite loop. */
348     while (1)
349     {
350     }
351 }