aboutsummaryrefslogtreecommitdiff
path: root/targets/mimxrt595_evk_freertos/vector_table.c
blob: f3fd92f204238cbf0b315ed674e8e54bdf4a6e3f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
// Copyright 2023 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.

#include <stdbool.h>

#include "pw_boot/boot.h"
#include "pw_boot_cortex_m/boot.h"
#include "pw_preprocessor/compiler.h"

// Extern symbols provided by linker script.
// This symbol contains the size of the image.
extern uint8_t _pw_image_size;

// Default handler to insert into the ARMv8-M vector table (below).
// This function exists for convenience. If a device isn't doing what you
// expect, it might have hit a fault and ended up here.
static void DefaultFaultHandler(void) {
  while (true) {
    // Wait for debugger to attach.
  }
}

// Default interrupt handler that entries in the ARMv8-M vector table (below)
// are aliased to, allowing them to be replaced at link time with OS or SDK
// implementations. If a device isn't doing what you expect, it might have
// raised an interrupt and ended up here.
static void DefaultInterruptHandler(void) {
  while (true) {
    // Wait for debugger to attach.
  }
}

// Default handlers to insert into the ARMv8-M vector table (below) that
// are likely to be replaced by OS implementations.
void SVC_Handler(void) PW_ALIAS(DefaultInterruptHandler);
void DebugMon_Handler(void) PW_ALIAS(DefaultInterruptHandler);
void PendSV_Handler(void) PW_ALIAS(DefaultInterruptHandler);
void SysTick_Handler(void) PW_ALIAS(DefaultInterruptHandler);

// Default handlers to insert into the ARMv8-M vector table (below) that
// are call a driver implementation that may be provided by the SDK.
static void WDT0_IRQHandler(void);
static void DMA0_IRQHandler(void);
static void GPIO_INTA_IRQHandler(void);
static void GPIO_INTB_IRQHandler(void);
static void PIN_INT0_IRQHandler(void);
static void PIN_INT1_IRQHandler(void);
static void PIN_INT2_IRQHandler(void);
static void PIN_INT3_IRQHandler(void);
static void UTICK0_IRQHandler(void);
static void MRT0_IRQHandler(void);
static void CTIMER0_IRQHandler(void);
static void CTIMER1_IRQHandler(void);
static void SCT0_IRQHandler(void);
static void CTIMER3_IRQHandler(void);
static void FLEXCOMM0_IRQHandler(void);
static void FLEXCOMM1_IRQHandler(void);
static void FLEXCOMM2_IRQHandler(void);
static void FLEXCOMM3_IRQHandler(void);
static void FLEXCOMM4_IRQHandler(void);
static void FLEXCOMM5_IRQHandler(void);
static void FLEXCOMM14_IRQHandler(void);
static void FLEXCOMM15_IRQHandler(void);
static void ADC0_IRQHandler(void);
static void Reserved39_IRQHandler(void);
static void ACMP_IRQHandler(void);
static void DMIC0_IRQHandler(void);
static void Reserved42_IRQHandler(void);
static void HYPERVISOR_IRQHandler(void);
static void SECURE_VIOLATION_IRQHandler(void);
static void HWVAD0_IRQHandler(void);
static void Reserved46_IRQHandler(void);
static void RNG_IRQHandler(void);
static void RTC_IRQHandler(void);
static void DSP_TIE_EXPSTATE1_IRQHandler(void);
static void MU_A_IRQHandler(void);
static void PIN_INT4_IRQHandler(void);
static void PIN_INT5_IRQHandler(void);
static void PIN_INT6_IRQHandler(void);
static void PIN_INT7_IRQHandler(void);
static void CTIMER2_IRQHandler(void);
static void CTIMER4_IRQHandler(void);
static void OS_EVENT_IRQHandler(void);
static void FLEXSPI0_FLEXSPI1_IRQHandler(void);
static void FLEXCOMM6_IRQHandler(void);
static void FLEXCOMM7_IRQHandler(void);
static void USDHC0_IRQHandler(void);
static void USDHC1_IRQHandler(void);
static void SGPIO_INTA_IRQHandler(void);
static void SGPIO_INTB_IRQHandler(void);
static void I3C0_IRQHandler(void);
static void USB0_IRQHandler(void);
static void USB0_NEEDCLK_IRQHandler(void);
static void WDT1_IRQHandler(void);
static void USB_PHYDCD_IRQHandler(void);
static void DMA1_IRQHandler(void);
static void PUF_IRQHandler(void);
static void POWERQUAD_IRQHandler(void);
static void CASPER_IRQHandler(void);
static void PMU_PMIC_IRQHandler(void);
static void HASHCRYPT_IRQHandler(void);
static void FLEXCOMM8_IRQHandler(void);
static void FLEXCOMM9_IRQHandler(void);
static void FLEXCOMM10_IRQHandler(void);
static void FLEXCOMM11_IRQHandler(void);
static void FLEXCOMM12_IRQHandler(void);
static void FLEXCOMM13_IRQHandler(void);
static void FLEXCOMM16_IRQHandler(void);
static void I3C1_IRQHandler(void);
static void FLEXIO_IRQHandler(void);
static void LCDIF_IRQHandler(void);
static void GPU_IRQHandler(void);
static void MIPI_IRQHandler(void);
static void Reserved88_IRQHandler(void);
static void SDMA_IRQHandler(void);

// This is the device's interrupt vector table. It's not referenced in any
// code because the platform (EVKMIMXRT595) expects this table to be present
// at the beginning of flash. The exact address is specified in the pw_boot
// configuration as part of the target config.

// This typedef is for convenience when building the vector table. With the
// exception of SP_main (0th entry in the vector table), image length (8th),
// type (9th), reserved 10th entry, and image load address (13th entry), all
// the entries of the vector table are function pointers.
typedef void (*InterruptHandler)(void);

PW_KEEP_IN_SECTION(".vector_table")
const InterruptHandler vector_table[] = {
    // Core Level - CM33

    // The starting location of the stack pointer.
    // This address is NOT an interrupt handler/function pointer, it is simply
    // the address that the main stack pointer should be initialized to. The
    // value is reinterpret casted because it needs to be in the vector table.
    [0] = (InterruptHandler)(&pw_boot_stack_high_addr),

    // Reset handler, dictates how to handle reset interrupt. This is the
    // address that the Program Counter (PC) is initialized to at boot.
    [1] = pw_boot_Entry,

    // NMI handler.
    [2] = DefaultFaultHandler,
    // HardFault handler.
    [3] = DefaultFaultHandler,
    // MemManage (MPU Fault) handler.
    [4] = DefaultFaultHandler,
    // BusFault handler.
    [5] = DefaultFaultHandler,
    // UsageFault handler.
    [6] = DefaultFaultHandler,
    // SecureFault handler.
    [7] = DefaultFaultHandler,
    // Image Length.
    [8] = (InterruptHandler)(&_pw_image_size),
    // Image Type.
    [9] = 0,
    // Reserved.
    [10] = 0,
    // SVCall handler.
    [11] = SVC_Handler,
    // DebugMon handler.
    [12] = DebugMon_Handler,
    // Image Load Address.
    [13] = (InterruptHandler)(&pw_boot_vector_table_addr),
    // PendSV handler.
    [14] = PendSV_Handler,
    // SysTick handler.
    [15] = SysTick_Handler,

    // Chip Level - MIMXRT595S_cm33

    // Watchdog timer interrupt.
    [16] = WDT0_IRQHandler,
    // DMA interrupt.
    [17] = DMA0_IRQHandler,
    // GPIO Interrupt A.
    [18] = GPIO_INTA_IRQHandler,
    // GPIO Interrupt B.
    [19] = GPIO_INTB_IRQHandler,
    // General Purpose Input/Output interrupt 0.
    [20] = PIN_INT0_IRQHandler,
    // General Purpose Input/Output interrupt 1.
    [21] = PIN_INT1_IRQHandler,
    // General Purpose Input/Output interrupt 2.
    [22] = PIN_INT2_IRQHandler,
    // General Purpose Input/Output interrupt 3.
    [23] = PIN_INT3_IRQHandler,
    // Micro-tick Timer.
    [24] = UTICK0_IRQHandler,
    // Multi-Rate Timer.
    [25] = MRT0_IRQHandler,
    // Standard counter/timer CTIMER0.
    [26] = CTIMER0_IRQHandler,
    // Standard counter/timer CTIMER1.
    [27] = CTIMER1_IRQHandler,
    // SCTimer/PWM.
    [28] = SCT0_IRQHandler,
    // Standard counter/timer CTIMER3.
    [29] = CTIMER3_IRQHandler,
    // FlexComm interrupt.
    [30] = FLEXCOMM0_IRQHandler,
    // FlexComm interrupt.
    [31] = FLEXCOMM1_IRQHandler,
    // FlexComm interrupt.
    [32] = FLEXCOMM2_IRQHandler,
    // FlexComm interrupt.
    [33] = FLEXCOMM3_IRQHandler,
    // FlexComm interrupt.
    [34] = FLEXCOMM4_IRQHandler,
    // FlexComm interrupt.
    [35] = FLEXCOMM5_IRQHandler,
    // FlexComm interrupt. Standalone SPI.
    [36] = FLEXCOMM14_IRQHandler,
    // FlexComm interrupt. Standalone I2C.
    [37] = FLEXCOMM15_IRQHandler,
    // Analog-to-Digital Converter interrupt.
    [38] = ADC0_IRQHandler,
    // Reserved interrupt.
    [39] = Reserved39_IRQHandler,
    // Analog comparator Interrupts.
    [40] = ACMP_IRQHandler,
    // Digital Microphone Interface interrupt.
    [41] = DMIC0_IRQHandler,
    // Reserved interrupt.
    [42] = Reserved42_IRQHandler,
    // Hypervisor interrupt.
    [43] = HYPERVISOR_IRQHandler,
    // Secure violation interrupt.
    [44] = SECURE_VIOLATION_IRQHandler,
    // Hardware Voice Activity Detector interrupt.
    [45] = HWVAD0_IRQHandler,
    // Reserved interrupt.
    [46] = Reserved46_IRQHandler,
    // Random Number Generator interrupt.
    [47] = RNG_IRQHandler,
    // Real Time Clock Alarm interrupt OR Wakeup timer interrupt.
    [48] = RTC_IRQHandler,
    // DSP interrupt.
    [49] = DSP_TIE_EXPSTATE1_IRQHandler,
    // Messaging Unit - Side A.
    [50] = MU_A_IRQHandler,
    // General Purpose Input/Output interrupt 4.
    [51] = PIN_INT4_IRQHandler,
    // General Purpose Input/Output interrupt 5.
    [52] = PIN_INT5_IRQHandler,
    // General Purpose Input/Output interrupt 6.
    [53] = PIN_INT6_IRQHandler,
    // General Purpose Input/Output interrupt 7.
    [54] = PIN_INT7_IRQHandler,
    // Standard counter/timer CTIMER2.
    [55] = CTIMER2_IRQHandler,
    // Standard counter/timer CTIMER4.
    [56] = CTIMER4_IRQHandler,
    // Event timer M33 Wakeup/interrupt.
    [57] = OS_EVENT_IRQHandler,
    // FlexSPI0_IRQ OR FlexSPI1_IRQ.
    [58] = FLEXSPI0_FLEXSPI1_IRQHandler,
    // FlexComm interrupt.
    [59] = FLEXCOMM6_IRQHandler,
    // FlexComm interrupt.
    [60] = FLEXCOMM7_IRQHandler,
    // USDHC interrupt.
    [61] = USDHC0_IRQHandler,
    // USDHC interrupt.
    [62] = USDHC1_IRQHandler,
    // Secure GPIO HS interrupt 0.
    [63] = SGPIO_INTA_IRQHandler,
    // Secure GPIO HS interrupt 1.
    [64] = SGPIO_INTB_IRQHandler,
    // Improved Inter Integrated Circuit 0 interrupt.
    [65] = I3C0_IRQHandler,
    // USB device.
    [66] = USB0_IRQHandler,
    // USB Activity Wake-up Interrupt.
    [67] = USB0_NEEDCLK_IRQHandler,
    // Watchdog timer 1 interrupt.
    [68] = WDT1_IRQHandler,
    // USBPHY DCD interrupt.
    [69] = USB_PHYDCD_IRQHandler,
    // DMA interrupt.
    [70] = DMA1_IRQHandler,
    // QuidKey interrupt.
    [71] = PUF_IRQHandler,
    // Powerquad interrupt.
    [72] = POWERQUAD_IRQHandler,
    // Caspar interrupt.
    [73] = CASPER_IRQHandler,
    // Power Management Control interrupt.
    [74] = PMU_PMIC_IRQHandler,
    // SHA interrupt.
    [75] = HASHCRYPT_IRQHandler,
    // FlexComm interrupt.
    [76] = FLEXCOMM8_IRQHandler,
    // FlexComm interrupt.
    [77] = FLEXCOMM9_IRQHandler,
    // FlexComm interrupt.
    [78] = FLEXCOMM10_IRQHandler,
    // FlexComm interrupt.
    [79] = FLEXCOMM11_IRQHandler,
    // FlexComm interrupt.
    [80] = FLEXCOMM12_IRQHandler,
    // FlexComm interrupt.
    [81] = FLEXCOMM13_IRQHandler,
    // FlexComm interrupt.
    [82] = FLEXCOMM16_IRQHandler,
    // Improved Inter Integrated Circuit 1 interrupt.
    [83] = I3C1_IRQHandler,
    // Flexible I/O interrupt.
    [84] = FLEXIO_IRQHandler,
    // Liquid Crystal Display interface interrupt.
    [85] = LCDIF_IRQHandler,
    // Graphics Processor Unit interrupt.
    [86] = GPU_IRQHandler,
    // MIPI interrupt.
    [87] = MIPI_IRQHandler,
    // Reserved interrupt.
    [88] = Reserved88_IRQHandler,
    // Smart DMA Engine Controller interrupt.
    [89] = SDMA_IRQHandler,
};

// Define handlers that call out to a driver handler provided by the SDK.
#define DRIVER_HANDLER(_IRQHandler, _DriverIRQHandler)            \
  void _DriverIRQHandler(void) PW_ALIAS(DefaultInterruptHandler); \
  static void _IRQHandler(void) { _DriverIRQHandler(); }

DRIVER_HANDLER(WDT0_IRQHandler, WDT0_DriverIRQHandler);
DRIVER_HANDLER(DMA0_IRQHandler, DMA0_DriverIRQHandler);
DRIVER_HANDLER(GPIO_INTA_IRQHandler, GPIO_INTA_DriverIRQHandler);
DRIVER_HANDLER(GPIO_INTB_IRQHandler, GPIO_INTB_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT0_IRQHandler, PIN_INT0_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT1_IRQHandler, PIN_INT1_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT2_IRQHandler, PIN_INT2_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT3_IRQHandler, PIN_INT3_DriverIRQHandler);
DRIVER_HANDLER(UTICK0_IRQHandler, UTICK0_DriverIRQHandler);
DRIVER_HANDLER(MRT0_IRQHandler, MRT0_DriverIRQHandler);
DRIVER_HANDLER(CTIMER0_IRQHandler, CTIMER0_DriverIRQHandler);
DRIVER_HANDLER(CTIMER1_IRQHandler, CTIMER1_DriverIRQHandler);
DRIVER_HANDLER(SCT0_IRQHandler, SCT0_DriverIRQHandler);
DRIVER_HANDLER(CTIMER3_IRQHandler, CTIMER3_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM0_IRQHandler, FLEXCOMM0_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM1_IRQHandler, FLEXCOMM1_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM2_IRQHandler, FLEXCOMM2_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM3_IRQHandler, FLEXCOMM3_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM4_IRQHandler, FLEXCOMM4_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM5_IRQHandler, FLEXCOMM5_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM14_IRQHandler, FLEXCOMM14_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM15_IRQHandler, FLEXCOMM15_DriverIRQHandler);
DRIVER_HANDLER(ADC0_IRQHandler, ADC0_DriverIRQHandler);
DRIVER_HANDLER(Reserved39_IRQHandler, Reserved39_DriverIRQHandler);
DRIVER_HANDLER(ACMP_IRQHandler, ACMP_DriverIRQHandler);
DRIVER_HANDLER(DMIC0_IRQHandler, DMIC0_DriverIRQHandler);
DRIVER_HANDLER(Reserved42_IRQHandler, Reserved42_DriverIRQHandler);
DRIVER_HANDLER(HYPERVISOR_IRQHandler, HYPERVISOR_DriverIRQHandler);
DRIVER_HANDLER(SECURE_VIOLATION_IRQHandler, SECURE_VIOLATION_DriverIRQHandler);
DRIVER_HANDLER(HWVAD0_IRQHandler, HWVAD0_DriverIRQHandler);
DRIVER_HANDLER(Reserved46_IRQHandler, Reserved46_DriverIRQHandler);
DRIVER_HANDLER(RNG_IRQHandler, RNG_DriverIRQHandler);
DRIVER_HANDLER(RTC_IRQHandler, RTC_DriverIRQHandler);
DRIVER_HANDLER(DSP_TIE_EXPSTATE1_IRQHandler,
               DSP_TIE_EXPSTATE1_DriverIRQHandler);
DRIVER_HANDLER(MU_A_IRQHandler, MU_A_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT4_IRQHandler, PIN_INT4_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT5_IRQHandler, PIN_INT5_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT6_IRQHandler, PIN_INT6_DriverIRQHandler);
DRIVER_HANDLER(PIN_INT7_IRQHandler, PIN_INT7_DriverIRQHandler);
DRIVER_HANDLER(CTIMER2_IRQHandler, CTIMER2_DriverIRQHandler);
DRIVER_HANDLER(CTIMER4_IRQHandler, CTIMER4_DriverIRQHandler);
DRIVER_HANDLER(OS_EVENT_IRQHandler, OS_EVENT_DriverIRQHandler);
DRIVER_HANDLER(FLEXSPI0_FLEXSPI1_IRQHandler,
               FLEXSPI0_FLEXSPI1_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM6_IRQHandler, FLEXCOMM6_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM7_IRQHandler, FLEXCOMM7_DriverIRQHandler);
DRIVER_HANDLER(USDHC0_IRQHandler, USDHC0_DriverIRQHandler);
DRIVER_HANDLER(USDHC1_IRQHandler, USDHC1_DriverIRQHandler);
DRIVER_HANDLER(SGPIO_INTA_IRQHandler, SGPIO_INTA_DriverIRQHandler);
DRIVER_HANDLER(SGPIO_INTB_IRQHandler, SGPIO_INTB_DriverIRQHandler);
DRIVER_HANDLER(I3C0_IRQHandler, I3C0_DriverIRQHandler);
DRIVER_HANDLER(USB0_IRQHandler, USB0_DriverIRQHandler);
DRIVER_HANDLER(USB0_NEEDCLK_IRQHandler, USB0_NEEDCLK_DriverIRQHandler);
DRIVER_HANDLER(WDT1_IRQHandler, WDT1_DriverIRQHandler);
DRIVER_HANDLER(USB_PHYDCD_IRQHandler, USB_PHYDCD_DriverIRQHandler);
DRIVER_HANDLER(DMA1_IRQHandler, DMA1_DriverIRQHandler);
DRIVER_HANDLER(PUF_IRQHandler, PUF_DriverIRQHandler);
DRIVER_HANDLER(POWERQUAD_IRQHandler, POWERQUAD_DriverIRQHandler);
DRIVER_HANDLER(CASPER_IRQHandler, CASPER_DriverIRQHandler);
DRIVER_HANDLER(PMU_PMIC_IRQHandler, PMU_PMIC_DriverIRQHandler);
DRIVER_HANDLER(HASHCRYPT_IRQHandler, HASHCRYPT_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM8_IRQHandler, FLEXCOMM8_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM9_IRQHandler, FLEXCOMM9_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM10_IRQHandler, FLEXCOMM10_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM11_IRQHandler, FLEXCOMM11_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM12_IRQHandler, FLEXCOMM12_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM13_IRQHandler, FLEXCOMM13_DriverIRQHandler);
DRIVER_HANDLER(FLEXCOMM16_IRQHandler, FLEXCOMM16_DriverIRQHandler);
DRIVER_HANDLER(I3C1_IRQHandler, I3C1_DriverIRQHandler);
DRIVER_HANDLER(FLEXIO_IRQHandler, FLEXIO_DriverIRQHandler);
DRIVER_HANDLER(LCDIF_IRQHandler, LCDIF_DriverIRQHandler);
DRIVER_HANDLER(GPU_IRQHandler, GPU_DriverIRQHandler);
DRIVER_HANDLER(MIPI_IRQHandler, MIPI_DriverIRQHandler);
DRIVER_HANDLER(Reserved88_IRQHandler, Reserved88_DriverIRQHandler);
DRIVER_HANDLER(SDMA_IRQHandler, SDMA_DriverIRQHandler);