Contiki-NG
startup_cc13xx_cc26xx_iar.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018, Texas Instruments Incorporated - http://www.ti.com/
3 * All rights reserved.
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 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the copyright holder nor the names of its
14 * contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28 * OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30/**
31 * \addtogroup cc13xx-cc26xx-cpu
32 * @{
33 *
34 * \file
35 * Startup file for IAR for CC13xx/CC26xx.
36 */
37/*---------------------------------------------------------------------------*/
38/* Check if compiler is IAR. */
39#if !(defined(__IAR_SYSTEMS_ICC__))
40#error "startup_cc13xx_cc26xx_iar.c: Unsupported compiler!"
41#endif
42/*---------------------------------------------------------------------------*/
43/* We need intrinsic functions for IAR (if used in source code). */
44#include <intrinsics.h>
45
46#include <ti/devices/DeviceFamily.h>
47#include DeviceFamily_constructPath(inc/hw_types.h)
48#include DeviceFamily_constructPath(driverlib/setup.h)
49#include DeviceFamily_constructPath(driverlib/interrupt.h)
50/*---------------------------------------------------------------------------*/
51/* Forward declaration of the reset ISR and the default fault handlers. */
52static void nmiISR(void);
53static void faultISR(void);
54static void intDefaultHandler(void);
55extern int main(void);
56
57extern void MPUFaultIntHandler(void);
58extern void BusFaultIntHandler(void);
59extern void UsageFaultIntHandler(void);
60extern void SVCallIntHandler(void);
61extern void DebugMonIntHandler(void);
62extern void PendSVIntHandler(void);
63extern void SysTickIntHandler(void);
64extern void GPIOIntHandler(void);
65extern void I2CIntHandler(void);
66extern void RFCCPE1IntHandler(void);
67extern void AONRTCIntHandler(void);
68extern void UART0IntHandler(void);
69extern void AUXSWEvent0IntHandler(void);
70extern void SSI0IntHandler(void);
71extern void SSI1IntHandler(void);
72extern void RFCCPE0IntHandler(void);
73extern void RFCHardwareIntHandler(void);
74extern void RFCCmdAckIntHandler(void);
75extern void I2SIntHandler(void);
76extern void AUXSWEvent1IntHandler(void);
77extern void WatchdogIntHandler(void);
78extern void Timer0AIntHandler(void);
79extern void Timer0BIntHandler(void);
80extern void Timer1AIntHandler(void);
81extern void Timer1BIntHandler(void);
82extern void Timer2AIntHandler(void);
83extern void Timer2BIntHandler(void);
84extern void Timer3AIntHandler(void);
85extern void Timer3BIntHandler(void);
86extern void CryptoIntHandler(void);
87extern void uDMAIntHandler(void);
88extern void uDMAErrIntHandler(void);
89extern void FlashIntHandler(void);
90extern void SWEvent0IntHandler(void);
91extern void AUXCombEventIntHandler(void);
92extern void AONProgIntHandler(void);
93extern void DynProgIntHandler(void);
94extern void AUXCompAIntHandler(void);
95extern void AUXADCIntHandler(void);
96extern void TRNGIntHandler(void);
97
98/* Default interrupt handlers */
99#pragma weak MPUFaultIntHandler = intDefaultHandler
100#pragma weak BusFaultIntHandler = intDefaultHandler
101#pragma weak UsageFaultIntHandler = intDefaultHandler
102#pragma weak SVCallIntHandler = intDefaultHandler
103#pragma weak DebugMonIntHandler = intDefaultHandler
104#pragma weak PendSVIntHandler = intDefaultHandler
105#pragma weak SysTickIntHandler = intDefaultHandler
106#pragma weak GPIOIntHandler = intDefaultHandler
107#pragma weak I2CIntHandler = intDefaultHandler
108#pragma weak RFCCPE1IntHandler = intDefaultHandler
109#pragma weak AONRTCIntHandler = intDefaultHandler
110#pragma weak UART0IntHandler = intDefaultHandler
111#pragma weak AUXSWEvent0IntHandler = intDefaultHandler
112#pragma weak SSI0IntHandler = intDefaultHandler
113#pragma weak SSI1IntHandler = intDefaultHandler
114#pragma weak RFCCPE0IntHandler = intDefaultHandler
115#pragma weak RFCHardwareIntHandler = intDefaultHandler
116#pragma weak RFCCmdAckIntHandler = intDefaultHandler
117#pragma weak I2SIntHandler = intDefaultHandler
118#pragma weak AUXSWEvent1IntHandler = intDefaultHandler
119#pragma weak WatchdogIntHandler = intDefaultHandler
120#pragma weak Timer0AIntHandler = intDefaultHandler
121#pragma weak Timer0BIntHandler = intDefaultHandler
122#pragma weak Timer1AIntHandler = intDefaultHandler
123#pragma weak Timer1BIntHandler = intDefaultHandler
124#pragma weak Timer2AIntHandler = intDefaultHandler
125#pragma weak Timer2BIntHandler = intDefaultHandler
126#pragma weak Timer3AIntHandler = intDefaultHandler
127#pragma weak Timer3BIntHandler = intDefaultHandler
128#pragma weak CryptoIntHandler = intDefaultHandler
129#pragma weak uDMAIntHandler = intDefaultHandler
130#pragma weak uDMAErrIntHandler = intDefaultHandler
131#pragma weak FlashIntHandler = intDefaultHandler
132#pragma weak SWEvent0IntHandler = intDefaultHandler
133#pragma weak AUXCombEventIntHandler = intDefaultHandler
134#pragma weak AONProgIntHandler = intDefaultHandler
135#pragma weak DynProgIntHandler = intDefaultHandler
136#pragma weak AUXCompAIntHandler = intDefaultHandler
137#pragma weak AUXADCIntHandler = intDefaultHandler
138#pragma weak TRNGIntHandler = intDefaultHandler
139/*---------------------------------------------------------------------------*/
140/* The entry point for the application startup code. */
141extern void __iar_program_start(void);
142
143/* Get stack start (highest address) symbol from linker file. */
144extern const void *STACK_TOP;
145/*---------------------------------------------------------------------------*/
146/*
147 * It is required to place something in the CSTACK segment to get the stack
148 * check feature in IAR to work as expected
149 */
150__root static void *dummy_stack @ ".stack";
151
152/*
153 * The vector table. Note that the proper constructs must be placed on this to
154 * ensure that it ends up at physical address 0x0000.0000 or at the start of
155 * the program if located at a start address other than 0.
156 */
157__root void(*const __vector_table[])(void) @ ".intvec" =
158{
159 (void (*)(void)) & STACK_TOP, /* 0 The initial stack pointer */
160 __iar_program_start, /* 1 The reset handler */
161 nmiISR, /* 2 The NMI handler */
162 faultISR, /* 3 The hard fault handler */
163 MPUFaultIntHandler, /* 4 The MPU fault handler */
164 BusFaultIntHandler, /* 5 The bus fault handler */
165 UsageFaultIntHandler, /* 6 The usage fault handler */
166 0, /* 7 Reserved */
167 0, /* 8 Reserved */
168 0, /* 9 Reserved */
169 0, /* 10 Reserved */
170 SVCallIntHandler, /* 11 SVCall handler */
171 DebugMonIntHandler, /* 12 Debug monitor handler */
172 0, /* 13 Reserved */
173 PendSVIntHandler, /* 14 The PendSV handler */
174 SysTickIntHandler, /* 15 The SysTick handler */
175 /* --- External interrupts --- */
176 GPIOIntHandler, /* 16 AON edge detect */
177 I2CIntHandler, /* 17 I2C */
178 RFCCPE1IntHandler, /* 18 RF Core Command & Packet Engine 1 */
179 intDefaultHandler, /* 19 Reserved */
180 AONRTCIntHandler, /* 20 AON RTC */
181 UART0IntHandler, /* 21 UART0 Rx and Tx */
182 AUXSWEvent0IntHandler, /* 22 AUX software event 0 */
183 SSI0IntHandler, /* 23 SSI0 Rx and Tx */
184 SSI1IntHandler, /* 24 SSI1 Rx and Tx */
185 RFCCPE0IntHandler, /* 25 RF Core Command & Packet Engine 0 */
186 RFCHardwareIntHandler, /* 26 RF Core Hardware */
187 RFCCmdAckIntHandler, /* 27 RF Core Command Acknowledge */
188 I2SIntHandler, /* 28 I2S */
189 AUXSWEvent1IntHandler, /* 29 AUX software event 1 */
190 WatchdogIntHandler, /* 30 Watchdog timer */
191 Timer0AIntHandler, /* 31 Timer 0 subtimer A */
192 Timer0BIntHandler, /* 32 Timer 0 subtimer B */
193 Timer1AIntHandler, /* 33 Timer 1 subtimer A */
194 Timer1BIntHandler, /* 34 Timer 1 subtimer B */
195 Timer2AIntHandler, /* 35 Timer 2 subtimer A */
196 Timer2BIntHandler, /* 36 Timer 2 subtimer B */
197 Timer3AIntHandler, /* 37 Timer 3 subtimer A */
198 Timer3BIntHandler, /* 38 Timer 3 subtimer B */
199 CryptoIntHandler, /* 39 Crypto Core Result available */
200 uDMAIntHandler, /* 40 uDMA Software */
201 uDMAErrIntHandler, /* 41 uDMA Error */
202 FlashIntHandler, /* 42 Flash controller */
203 SWEvent0IntHandler, /* 43 Software Event 0 */
204 AUXCombEventIntHandler, /* 44 AUX combined event */
205 AONProgIntHandler, /* 45 AON programmable 0 */
206 DynProgIntHandler, /* 46 Dynamic Programmable interrupt */
207 /* source (Default: PRCM) */
208 AUXCompAIntHandler, /* 47 AUX Comparator A */
209 AUXADCIntHandler, /* 48 AUX ADC new sample or ADC DMA */
210 /* done, ADC underflow, ADC overflow */
211 TRNGIntHandler /* 49 TRNG event */
212}
213/*---------------------------------------------------------------------------*/
214/*
215 * \brief Setup trim device.
216 * \return Return value determines whether to omit seg_init or not.
217 * 0 => omit seg_init
218 * 1 => run seg_init
219 *
220 * This function is called by __iar_program_start() early in the boot sequence.
221 * Copy the first 16 vectors from the read-only/reset table to the runtime
222 * RAM table. Fill the remaining vectors with a stub. This vector table will
223 * be updated at runtime.
224 */
225int
226__low_level_init(void)
227{
228 IntMasterDisable();
229
230 /* Final trim of device */
231 SetupTrimDevice();
232
233 /* Run seg_init */
234 return 1;
235}
236/*---------------------------------------------------------------------------*/
237/*
238 * \brief Non-Maskable Interrupt (NMI) ISR.
239 *
240 * This is the code that gets called when the processor receives a NMI. This
241 * simply enters an infinite loop, preserving the system state for examination
242 * by a debugger.
243 */
244static void
245nmiISR(void)
246{
247 /* Enter an infinite loop. */
248 for(;;) { /* hang */ }
249}
250/*---------------------------------------------------------------------------*/
251/*
252 * \brief Debug stack pointer.
253 * \param sp Stack pointer.
254 *
255 * Provide a view into the CPU state from the provided stack pointer.
256 */
257void
258debugStackPointer(uint32_t *sp)
259{
260 volatile uint32_t r0; /**< R0 register */
261 volatile uint32_t r1; /**< R1 register */
262 volatile uint32_t r2; /**< R2 register */
263 volatile uint32_t r3; /**< R3 register */
264 volatile uint32_t r12; /**< R12 register */
265 volatile uint32_t lr; /**< LR register */
266 volatile uint32_t pc; /**< PC register */
267 volatile uint32_t psr; /**< PSR register */
268
269 /* Cast to void to disable warnings of unused variables */
270 (void)(r0 = sp[0]);
271 (void)(r1 = sp[1]);
272 (void)(r2 = sp[2]);
273 (void)(r3 = sp[3]);
274 (void)(r12 = sp[4]);
275 (void)(lr = sp[5]);
276 (void)(pc = sp[6]);
277 (void)(psr = sp[7]);
278
279 /* Enter an infinite loop. */
280 for(;;) { /* hang */ }
281}
282/*---------------------------------------------------------------------------*/
283/*
284 * \brief CPU Fault ISR.
285 *
286 * This is the code that gets called when the processor receives a fault
287 * interrupt. Setup a call to debugStackPointer with the current stack pointer.
288 * The stack pointer in this case would be the CPU state which caused the CPU
289 * fault.
290 */
291static void
292faultISR(void)
293{
294 __asm__ __volatile__
295 (
296 "tst lr, #4 \n"
297 "ite eq \n"
298 "mrseq r0, msp \n"
299 "mrsne r0, psp \n"
300 "b debugStackPointer \n"
301 );
302}
303/*---------------------------------------------------------------------------*/
304/*
305 * \brief Interrupt Default Handler.
306 *
307 * This is the code that gets called when the processor receives an unexpected
308 * interrupt. This simply enters an infinite loop, preserving the system state
309 * for examination by a debugger.
310 */
311static void
312intDefaultHandler(void)
313{
314 /* Enter an infinite loop. */
315 for(;;) { /* hang */ }
316}
317/*---------------------------------------------------------------------------*/
318/** @} */
void debugStackPointer(uint32_t *sp)