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 
38 /* External declaration for the reset handler that is to be called when the */
39 /* processor is started                                                     */
40 extern void _c_int00(void);
41 
42 /* External declaration for system initialization function                  */
43 extern void SystemInit(void);
44 
45 /* Linker variable that marks the top of the stack. */
46 extern uint32_t __STACK_TOP;
47 
48 /* Forward declaration of the default fault handlers. */
49 void Default_Handler(void) __attribute__((weak));
50 extern void Reset_Handler(void) __attribute__((weak));
51 
52 /* Cortex-M4 Processor Exceptions */
53 extern void NMI_Handler(void) __attribute__((weak, alias("Default_Handler")));
54 extern void HardFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
55 extern void MemManage_Handler(void) __attribute__((weak, alias("Default_Handler")));
56 extern void BusFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
57 extern void UsageFault_Handler(void) __attribute__((weak, alias("Default_Handler")));
58 extern void SVC_Handler(void) __attribute__((weak, alias("Default_Handler")));
59 extern void DebugMon_Handler(void) __attribute__((weak, alias("Default_Handler")));
60 extern void PendSV_Handler(void) __attribute__((weak, alias("Default_Handler")));
61 extern void SysTick_Handler(void) __attribute__((weak, alias("Default_Handler")));
62 
63 /* device specific interrupt handler */
64 extern void GPIOA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
65 extern void GPIOB_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
66 extern void GPIOC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
67 extern void GPIOD_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
68 extern void GPIOE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
69 extern void UART0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
70 extern void UART1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
71 extern void SSI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
72 extern void I2C0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
73 extern void PWM0_FAULT_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
74 extern void PWM0_0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
75 extern void PWM0_1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
76 extern void PWM0_2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
77 extern void QEI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
78 extern void ADC0SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
79 extern void ADC0SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
80 extern void ADC0SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
81 extern void ADC0SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
82 extern void WATCHDOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
83 extern void TIMER0A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
84 extern void TIMER0B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
85 extern void TIMER1A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
86 extern void TIMER1B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
87 extern void TIMER2A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
88 extern void TIMER2B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
89 extern void COMP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
90 extern void COMP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
91 extern void COMP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
92 extern void SYSCTL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
93 extern void FLASH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
94 extern void GPIOF_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
95 extern void GPIOG_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
96 extern void GPIOH_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
97 extern void UART2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
98 extern void SSI1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
99 extern void TIMER3A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
100 extern void TIMER3B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
101 extern void I2C1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
102 extern void CAN0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
103 extern void CAN1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
104 extern void EMAC0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
105 extern void HIBERNATE_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
106 extern void USB0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
107 extern void PWM0_3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
108 extern void UDMA_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
109 extern void UDMAERR_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
110 extern void ADC1SS0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
111 extern void ADC1SS1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
112 extern void ADC1SS2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
113 extern void ADC1SS3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
114 extern void EPI0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
115 extern void GPIOJ_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
116 extern void GPIOK_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
117 extern void GPIOL_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
118 extern void SSI2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
119 extern void SSI3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
120 extern void UART3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
121 extern void UART4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
122 extern void UART5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
123 extern void UART6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
124 extern void UART7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
125 extern void I2C2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
126 extern void I2C3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
127 extern void TIMER4A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
128 extern void TIMER4B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
129 extern void TIMER5A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
130 extern void TIMER5B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
131 extern void SYSEXC_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
132 extern void I2C4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
133 extern void I2C5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
134 extern void GPIOM_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
135 extern void GPION_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
136 extern void TAMPER0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
137 extern void GPIOP0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
138 extern void GPIOP1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
139 extern void GPIOP2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
140 extern void GPIOP3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
141 extern void GPIOP4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
142 extern void GPIOP5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
143 extern void GPIOP6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
144 extern void GPIOP7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
145 extern void GPIOQ0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
146 extern void GPIOQ1_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
147 extern void GPIOQ2_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
148 extern void GPIOQ3_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
149 extern void GPIOQ4_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
150 extern void GPIOQ5_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
151 extern void GPIOQ6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
152 extern void GPIOQ7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
153 extern void SHA0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
154 extern void AES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
155 extern void DES0_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
156 extern void TIMER6A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
157 extern void TIMER6B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
158 extern void TIMER7A_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
159 extern void TIMER7B_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
160 extern void I2C6_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
161 extern void I2C7_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
162 extern void I2C8_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
163 extern void I2C9_IRQHandler(void) __attribute__((weak, alias("Default_Handler")));
164 
165 /* Interrupt vector table.  Note that the proper constructs must be placed on this to */
166 /* ensure that it ends up at physical address 0x0000.0000 or at the start of          */
167 /* the program if located at a start address other than 0.                            */
168 #pragma RETAIN(interruptVectors)
169 #pragma DATA_SECTION(interruptVectors, ".intvecs")
170 void (* const interruptVectors[])(void) =
171 {
172     (void (*)(void))((uint32_t)&__STACK_TOP),
173     /* The initial stack pointer */
174     Reset_Handler,                          /* The reset handler         */
175     NMI_Handler,                            /* The NMI handler           */
176     HardFault_Handler,                      /* The hard fault handler    */
177     MemManage_Handler,                      /* The MPU fault handler     */
178     BusFault_Handler,                       /* The bus fault handler     */
179     UsageFault_Handler,                     /* The usage fault handler   */
180     0,                                      /* Reserved                  */
181     0,                                      /* Reserved                  */
182     0,                                      /* Reserved                  */
183     0,                                      /* Reserved                  */
184     SVC_Handler,                            /* SVCall handler            */
185     DebugMon_Handler,                       /* Debug monitor handler     */
186     0,                                      /* Reserved                  */
187     PendSV_Handler,                         /* The PendSV handler        */
188     SysTick_Handler,                        /* The SysTick handler       */
189     GPIOA_IRQHandler,                       /* GPIO Port A               */
190     GPIOB_IRQHandler,                       /* GPIO Port B               */
191     GPIOC_IRQHandler,                       /* GPIO Port C               */
192     GPIOD_IRQHandler,                       /* GPIO Port D               */
193     GPIOE_IRQHandler,                       /* GPIO Port E               */
194     UART0_IRQHandler,                       /* UART0 Rx and Tx           */
195     UART1_IRQHandler,                       /* UART1 Rx and Tx           */
196     SSI0_IRQHandler,                        /* SSI0 Rx and Tx            */
197     I2C0_IRQHandler,                        /* I2C0 Master and Slave     */
198     PWM0_FAULT_IRQHandler,                  /* PWM Fault                 */
199     PWM0_0_IRQHandler,                      /* PWM Generator 0           */
200     PWM0_1_IRQHandler,                      /* PWM Generator 1           */
201     PWM0_2_IRQHandler,                      /* PWM Generator 2           */
202     QEI0_IRQHandler,                        /* Quadrature Encoder 0      */
203     ADC0SS0_IRQHandler,                     /* ADC Sequence 0            */
204     ADC0SS1_IRQHandler,                     /* ADC Sequence 1            */
205     ADC0SS2_IRQHandler,                     /* ADC Sequence 2            */
206     ADC0SS3_IRQHandler,                     /* ADC Sequence 3            */
207     WATCHDOG_IRQHandler,                    /* Watchdog timer            */
208     TIMER0A_IRQHandler,                     /* Timer 0 subtimer A        */
209     TIMER0B_IRQHandler,                     /* Timer 0 subtimer B        */
210     TIMER1A_IRQHandler,                     /* Timer 1 subtimer A        */
211     TIMER1B_IRQHandler,                     /* Timer 1 subtimer B        */
212     TIMER2A_IRQHandler,                     /* Timer 2 subtimer A        */
213     TIMER2B_IRQHandler,                     /* Timer 2 subtimer B        */
214     COMP0_IRQHandler,                       /* Analog Comparator 0       */
215     COMP1_IRQHandler,                       /* Analog Comparator 1       */
216     COMP2_IRQHandler,                       /* Analog Comparator 2       */
217     SYSCTL_IRQHandler,                      /* System Control            */
218     FLASH_IRQHandler,                       /* FLASH Control             */
219     GPIOF_IRQHandler,                       /* GPIO Port F               */
220     GPIOG_IRQHandler,                       /* GPIO Port G               */
221     GPIOH_IRQHandler,                       /* GPIO Port H               */
222     UART2_IRQHandler,                       /* UART2 Rx and Tx           */
223     SSI1_IRQHandler,                        /* SSI1 Rx and Tx            */
224     TIMER3A_IRQHandler,                     /* Timer 3 subtimer A        */
225     TIMER3B_IRQHandler,                     /* Timer 3 subtimer B        */
226     I2C1_IRQHandler,                        /* I2C1 Master and Slave     */
227     CAN0_IRQHandler,                        /* CAN0                      */
228     CAN1_IRQHandler,                        /* CAN1                      */
229     EMAC0_IRQHandler,                       /* Ethernet                  */
230     HIBERNATE_IRQHandler,                   /* Hibernate                 */
231     USB0_IRQHandler,                        /* USB0                      */
232     PWM0_3_IRQHandler,                      /* PWM Generator 3           */
233     UDMA_IRQHandler,                        /* uDMA Software Transfer    */
234     UDMAERR_IRQHandler,                     /* uDMA Error                */
235     ADC1SS0_IRQHandler,                     /* ADC1 Sequence 0           */
236     ADC1SS1_IRQHandler,                     /* ADC1 Sequence 1           */
237     ADC1SS2_IRQHandler,                     /* ADC1 Sequence 2           */
238     ADC1SS3_IRQHandler,                     /* ADC1 Sequence 3           */
239     EPI0_IRQHandler,                        /* External Bus Interface 0  */
240     GPIOJ_IRQHandler,                       /* GPIO Port J               */
241     GPIOK_IRQHandler,                       /* GPIO Port K               */
242     GPIOL_IRQHandler,                       /* GPIO Port L               */
243     SSI2_IRQHandler,                        /* SSI2 Rx and Tx            */
244     SSI3_IRQHandler,                        /* SSI3 Rx and Tx            */
245     UART3_IRQHandler,                       /* UART3 Rx and Tx           */
246     UART4_IRQHandler,                       /* UART4 Rx and Tx           */
247     UART5_IRQHandler,                       /* UART5 Rx and Tx           */
248     UART6_IRQHandler,                       /* UART6 Rx and Tx           */
249     UART7_IRQHandler,                       /* UART7 Rx and Tx           */
250     I2C2_IRQHandler,                        /* I2C2 Master and Slave     */
251     I2C3_IRQHandler,                        /* I2C3 Master and Slave     */
252     TIMER4A_IRQHandler,                     /* Timer 4 subtimer A        */
253     TIMER4B_IRQHandler,                     /* Timer 4 subtimer B        */
254     TIMER5A_IRQHandler,                     /* Timer 5 subtimer A        */
255     TIMER5B_IRQHandler,                     /* Timer 5 subtimer B        */
256     SYSEXC_IRQHandler,                      /* FPU                       */
257     0,                                      /* Reserved                  */
258     0,                                      /* Reserved                  */
259     I2C4_IRQHandler,                        /* I2C4 Master and Slave     */
260     I2C5_IRQHandler,                        /* I2C5 Master and Slave     */
261     GPIOM_IRQHandler,                       /* GPIO Port M               */
262     GPION_IRQHandler,                       /* GPIO Port N               */
263     0,                                      /* Reserved                  */
264     TAMPER0_IRQHandler,                     /* Tamper                    */
265     GPIOP0_IRQHandler,                      /* GPIO Port P(Summary or P0)*/
266     GPIOP1_IRQHandler,                      /* GPIO Port P1              */
267     GPIOP2_IRQHandler,                      /* GPIO Port P2              */
268     GPIOP3_IRQHandler,                      /* GPIO Port P3              */
269     GPIOP4_IRQHandler,                      /* GPIO Port P4              */
270     GPIOP5_IRQHandler,                      /* GPIO Port P5              */
271     GPIOP6_IRQHandler,                      /* GPIO Port P6              */
272     GPIOP7_IRQHandler,                      /* GPIO Port P7              */
273     GPIOQ0_IRQHandler,                      /* GPIO Port Q(Summary or Q0)*/
274     GPIOQ1_IRQHandler,                      /* GPIO Port Q1              */
275     GPIOQ2_IRQHandler,                      /* GPIO Port Q2              */
276     GPIOQ3_IRQHandler,                      /* GPIO Port Q3              */
277     GPIOQ4_IRQHandler,                      /* GPIO Port Q4              */
278     GPIOQ5_IRQHandler,                      /* GPIO Port Q5              */
279     GPIOQ6_IRQHandler,                      /* GPIO Port Q6              */
280     GPIOQ7_IRQHandler,                      /* GPIO Port Q7              */
281     0,                                      /* Reserved                  */
282     0,                                      /* Reserved                  */
283     SHA0_IRQHandler,                        /* SHA/MD5 0                 */
284     AES0_IRQHandler,                        /* AES 0                     */
285     DES0_IRQHandler,                        /* DES3DES 0                 */
286     0,                                      /* Reserved                  */
287     TIMER6A_IRQHandler,                     /* Timer 6 subtimer A        */
288     TIMER6B_IRQHandler,                     /* Timer 6 subtimer B        */
289     TIMER7A_IRQHandler,                     /* Timer 7 subtimer A        */
290     TIMER7B_IRQHandler,                     /* Timer 7 subtimer B        */
291     I2C6_IRQHandler,                        /* I2C6 Master and Slave     */
292     I2C7_IRQHandler,                        /* I2C7 Master and Slave     */
293     0,                                      /* Reserved                  */
294     0,                                      /* Reserved                  */
295     0,                                      /* Reserved                  */
296     0,                                      /* Reserved                  */
297     0,                                      /* Reserved                  */
298     I2C8_IRQHandler,                        /* I2C8 Master and Slave     */
299     I2C9_IRQHandler,                        /* I2C9 Master and Slave     */
300     0,                                      /* Reserved                  */
301     0,                                      /* Reserved                  */
302     0,                                      /* Reserved                  */
303 };
304 
305 /* Forward declaration of the default fault handlers. */
306 /* This is the code that gets called when the processor first starts execution */
307 /* following a reset event.  Only the absolutely necessary set is performed,   */
308 /* after which the application supplied entry() routine is called.  Any fancy  */
309 /* actions (such as making decisions based on the reset cause register, and    */
310 /* resetting the bits in that register) are left solely in the hands of the    */
311 /* application.                                                                */
Reset_Handler(void)312 void Reset_Handler(void)
313 {
314     SystemInit();
315 
316     /* Jump to the CCS C Initialization Routine. */
317     __asm("    .global _c_int00\n"
318           "    b.w     _c_int00");
319 }
320 
321 /* This is the code that gets called when the processor receives an unexpected  */
322 /* interrupt.  This simply enters an infinite loop, preserving the system state */
323 /* for examination by a debugger.                                               */
Default_Handler(void)324 void Default_Handler(void)
325 {
326     /* Fault trap exempt from ULP advisor */
327 #pragma diag_push
328 #pragma CHECK_ULP("-2.1")
329 
330     /* Enter an infinite loop. */
331     while (1)
332     {
333     }
334 
335 #pragma diag_pop
336 }
337