xref: /aosp_15_r20/external/pigweed/targets/mimxrt595_evk_freertos/vector_table.c (revision 61c4878ac05f98d0ceed94b57d316916de578985)
1 // Copyright 2023 The Pigweed Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4 // use this file except in compliance with the License. You may obtain a copy of
5 // the License at
6 //
7 //     https://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11 // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12 // License for the specific language governing permissions and limitations under
13 // the License.
14 
15 #include <stdbool.h>
16 
17 #include "pw_boot/boot.h"
18 #include "pw_boot_cortex_m/boot.h"
19 #include "pw_preprocessor/compiler.h"
20 
21 // Extern symbols provided by linker script.
22 // This symbol contains the size of the image.
23 extern uint8_t _pw_image_size;
24 
25 // Default handler to insert into the ARMv8-M vector table (below).
26 // This function exists for convenience. If a device isn't doing what you
27 // expect, it might have hit a fault and ended up here.
DefaultFaultHandler(void)28 static void DefaultFaultHandler(void) {
29   while (true) {
30     // Wait for debugger to attach.
31   }
32 }
33 
34 // Default interrupt handler that entries in the ARMv8-M vector table (below)
35 // are aliased to, allowing them to be replaced at link time with OS or SDK
36 // implementations. If a device isn't doing what you expect, it might have
37 // raised an interrupt and ended up here.
DefaultInterruptHandler(void)38 static void DefaultInterruptHandler(void) {
39   while (true) {
40     // Wait for debugger to attach.
41   }
42 }
43 
44 // Default handlers to insert into the ARMv8-M vector table (below) that
45 // are likely to be replaced by OS implementations.
46 void SVC_Handler(void) PW_ALIAS(DefaultInterruptHandler);
47 void DebugMon_Handler(void) PW_ALIAS(DefaultInterruptHandler);
48 void PendSV_Handler(void) PW_ALIAS(DefaultInterruptHandler);
49 void SysTick_Handler(void) PW_ALIAS(DefaultInterruptHandler);
50 
51 // Default handlers to insert into the ARMv8-M vector table (below) that
52 // are call a driver implementation that may be provided by the SDK.
53 static void WDT0_IRQHandler(void);
54 static void DMA0_IRQHandler(void);
55 static void GPIO_INTA_IRQHandler(void);
56 static void GPIO_INTB_IRQHandler(void);
57 static void PIN_INT0_IRQHandler(void);
58 static void PIN_INT1_IRQHandler(void);
59 static void PIN_INT2_IRQHandler(void);
60 static void PIN_INT3_IRQHandler(void);
61 static void UTICK0_IRQHandler(void);
62 static void MRT0_IRQHandler(void);
63 static void CTIMER0_IRQHandler(void);
64 static void CTIMER1_IRQHandler(void);
65 static void SCT0_IRQHandler(void);
66 static void CTIMER3_IRQHandler(void);
67 static void FLEXCOMM0_IRQHandler(void);
68 static void FLEXCOMM1_IRQHandler(void);
69 static void FLEXCOMM2_IRQHandler(void);
70 static void FLEXCOMM3_IRQHandler(void);
71 static void FLEXCOMM4_IRQHandler(void);
72 static void FLEXCOMM5_IRQHandler(void);
73 static void FLEXCOMM14_IRQHandler(void);
74 static void FLEXCOMM15_IRQHandler(void);
75 static void ADC0_IRQHandler(void);
76 static void Reserved39_IRQHandler(void);
77 static void ACMP_IRQHandler(void);
78 static void DMIC0_IRQHandler(void);
79 static void Reserved42_IRQHandler(void);
80 static void HYPERVISOR_IRQHandler(void);
81 static void SECURE_VIOLATION_IRQHandler(void);
82 static void HWVAD0_IRQHandler(void);
83 static void Reserved46_IRQHandler(void);
84 static void RNG_IRQHandler(void);
85 static void RTC_IRQHandler(void);
86 static void DSP_TIE_EXPSTATE1_IRQHandler(void);
87 static void MU_A_IRQHandler(void);
88 static void PIN_INT4_IRQHandler(void);
89 static void PIN_INT5_IRQHandler(void);
90 static void PIN_INT6_IRQHandler(void);
91 static void PIN_INT7_IRQHandler(void);
92 static void CTIMER2_IRQHandler(void);
93 static void CTIMER4_IRQHandler(void);
94 static void OS_EVENT_IRQHandler(void);
95 static void FLEXSPI0_FLEXSPI1_IRQHandler(void);
96 static void FLEXCOMM6_IRQHandler(void);
97 static void FLEXCOMM7_IRQHandler(void);
98 static void USDHC0_IRQHandler(void);
99 static void USDHC1_IRQHandler(void);
100 static void SGPIO_INTA_IRQHandler(void);
101 static void SGPIO_INTB_IRQHandler(void);
102 static void I3C0_IRQHandler(void);
103 static void USB0_IRQHandler(void);
104 static void USB0_NEEDCLK_IRQHandler(void);
105 static void WDT1_IRQHandler(void);
106 static void USB_PHYDCD_IRQHandler(void);
107 static void DMA1_IRQHandler(void);
108 static void PUF_IRQHandler(void);
109 static void POWERQUAD_IRQHandler(void);
110 static void CASPER_IRQHandler(void);
111 static void PMU_PMIC_IRQHandler(void);
112 static void HASHCRYPT_IRQHandler(void);
113 static void FLEXCOMM8_IRQHandler(void);
114 static void FLEXCOMM9_IRQHandler(void);
115 static void FLEXCOMM10_IRQHandler(void);
116 static void FLEXCOMM11_IRQHandler(void);
117 static void FLEXCOMM12_IRQHandler(void);
118 static void FLEXCOMM13_IRQHandler(void);
119 static void FLEXCOMM16_IRQHandler(void);
120 static void I3C1_IRQHandler(void);
121 static void FLEXIO_IRQHandler(void);
122 static void LCDIF_IRQHandler(void);
123 static void GPU_IRQHandler(void);
124 static void MIPI_IRQHandler(void);
125 static void Reserved88_IRQHandler(void);
126 static void SDMA_IRQHandler(void);
127 
128 // This is the device's interrupt vector table. It's not referenced in any
129 // code because the platform (EVKMIMXRT595) expects this table to be present
130 // at the beginning of flash. The exact address is specified in the pw_boot
131 // configuration as part of the target config.
132 
133 // This typedef is for convenience when building the vector table. With the
134 // exception of SP_main (0th entry in the vector table), image length (8th),
135 // type (9th), reserved 10th entry, and image load address (13th entry), all
136 // the entries of the vector table are function pointers.
137 typedef void (*InterruptHandler)(void);
138 
139 PW_KEEP_IN_SECTION(".vector_table")
140 const InterruptHandler vector_table[] = {
141     // Core Level - CM33
142 
143     // The starting location of the stack pointer.
144     // This address is NOT an interrupt handler/function pointer, it is simply
145     // the address that the main stack pointer should be initialized to. The
146     // value is reinterpret casted because it needs to be in the vector table.
147     [0] = (InterruptHandler)(&pw_boot_stack_high_addr),
148 
149     // Reset handler, dictates how to handle reset interrupt. This is the
150     // address that the Program Counter (PC) is initialized to at boot.
151     [1] = pw_boot_Entry,
152 
153     // NMI handler.
154     [2] = DefaultFaultHandler,
155     // HardFault handler.
156     [3] = DefaultFaultHandler,
157     // MemManage (MPU Fault) handler.
158     [4] = DefaultFaultHandler,
159     // BusFault handler.
160     [5] = DefaultFaultHandler,
161     // UsageFault handler.
162     [6] = DefaultFaultHandler,
163     // SecureFault handler.
164     [7] = DefaultFaultHandler,
165     // Image Length.
166     [8] = (InterruptHandler)(&_pw_image_size),
167     // Image Type.
168     [9] = 0,
169     // Reserved.
170     [10] = 0,
171     // SVCall handler.
172     [11] = SVC_Handler,
173     // DebugMon handler.
174     [12] = DebugMon_Handler,
175     // Image Load Address.
176     [13] = (InterruptHandler)(&pw_boot_vector_table_addr),
177     // PendSV handler.
178     [14] = PendSV_Handler,
179     // SysTick handler.
180     [15] = SysTick_Handler,
181 
182     // Chip Level - MIMXRT595S_cm33
183 
184     // Watchdog timer interrupt.
185     [16] = WDT0_IRQHandler,
186     // DMA interrupt.
187     [17] = DMA0_IRQHandler,
188     // GPIO Interrupt A.
189     [18] = GPIO_INTA_IRQHandler,
190     // GPIO Interrupt B.
191     [19] = GPIO_INTB_IRQHandler,
192     // General Purpose Input/Output interrupt 0.
193     [20] = PIN_INT0_IRQHandler,
194     // General Purpose Input/Output interrupt 1.
195     [21] = PIN_INT1_IRQHandler,
196     // General Purpose Input/Output interrupt 2.
197     [22] = PIN_INT2_IRQHandler,
198     // General Purpose Input/Output interrupt 3.
199     [23] = PIN_INT3_IRQHandler,
200     // Micro-tick Timer.
201     [24] = UTICK0_IRQHandler,
202     // Multi-Rate Timer.
203     [25] = MRT0_IRQHandler,
204     // Standard counter/timer CTIMER0.
205     [26] = CTIMER0_IRQHandler,
206     // Standard counter/timer CTIMER1.
207     [27] = CTIMER1_IRQHandler,
208     // SCTimer/PWM.
209     [28] = SCT0_IRQHandler,
210     // Standard counter/timer CTIMER3.
211     [29] = CTIMER3_IRQHandler,
212     // FlexComm interrupt.
213     [30] = FLEXCOMM0_IRQHandler,
214     // FlexComm interrupt.
215     [31] = FLEXCOMM1_IRQHandler,
216     // FlexComm interrupt.
217     [32] = FLEXCOMM2_IRQHandler,
218     // FlexComm interrupt.
219     [33] = FLEXCOMM3_IRQHandler,
220     // FlexComm interrupt.
221     [34] = FLEXCOMM4_IRQHandler,
222     // FlexComm interrupt.
223     [35] = FLEXCOMM5_IRQHandler,
224     // FlexComm interrupt. Standalone SPI.
225     [36] = FLEXCOMM14_IRQHandler,
226     // FlexComm interrupt. Standalone I2C.
227     [37] = FLEXCOMM15_IRQHandler,
228     // Analog-to-Digital Converter interrupt.
229     [38] = ADC0_IRQHandler,
230     // Reserved interrupt.
231     [39] = Reserved39_IRQHandler,
232     // Analog comparator Interrupts.
233     [40] = ACMP_IRQHandler,
234     // Digital Microphone Interface interrupt.
235     [41] = DMIC0_IRQHandler,
236     // Reserved interrupt.
237     [42] = Reserved42_IRQHandler,
238     // Hypervisor interrupt.
239     [43] = HYPERVISOR_IRQHandler,
240     // Secure violation interrupt.
241     [44] = SECURE_VIOLATION_IRQHandler,
242     // Hardware Voice Activity Detector interrupt.
243     [45] = HWVAD0_IRQHandler,
244     // Reserved interrupt.
245     [46] = Reserved46_IRQHandler,
246     // Random Number Generator interrupt.
247     [47] = RNG_IRQHandler,
248     // Real Time Clock Alarm interrupt OR Wakeup timer interrupt.
249     [48] = RTC_IRQHandler,
250     // DSP interrupt.
251     [49] = DSP_TIE_EXPSTATE1_IRQHandler,
252     // Messaging Unit - Side A.
253     [50] = MU_A_IRQHandler,
254     // General Purpose Input/Output interrupt 4.
255     [51] = PIN_INT4_IRQHandler,
256     // General Purpose Input/Output interrupt 5.
257     [52] = PIN_INT5_IRQHandler,
258     // General Purpose Input/Output interrupt 6.
259     [53] = PIN_INT6_IRQHandler,
260     // General Purpose Input/Output interrupt 7.
261     [54] = PIN_INT7_IRQHandler,
262     // Standard counter/timer CTIMER2.
263     [55] = CTIMER2_IRQHandler,
264     // Standard counter/timer CTIMER4.
265     [56] = CTIMER4_IRQHandler,
266     // Event timer M33 Wakeup/interrupt.
267     [57] = OS_EVENT_IRQHandler,
268     // FlexSPI0_IRQ OR FlexSPI1_IRQ.
269     [58] = FLEXSPI0_FLEXSPI1_IRQHandler,
270     // FlexComm interrupt.
271     [59] = FLEXCOMM6_IRQHandler,
272     // FlexComm interrupt.
273     [60] = FLEXCOMM7_IRQHandler,
274     // USDHC interrupt.
275     [61] = USDHC0_IRQHandler,
276     // USDHC interrupt.
277     [62] = USDHC1_IRQHandler,
278     // Secure GPIO HS interrupt 0.
279     [63] = SGPIO_INTA_IRQHandler,
280     // Secure GPIO HS interrupt 1.
281     [64] = SGPIO_INTB_IRQHandler,
282     // Improved Inter Integrated Circuit 0 interrupt.
283     [65] = I3C0_IRQHandler,
284     // USB device.
285     [66] = USB0_IRQHandler,
286     // USB Activity Wake-up Interrupt.
287     [67] = USB0_NEEDCLK_IRQHandler,
288     // Watchdog timer 1 interrupt.
289     [68] = WDT1_IRQHandler,
290     // USBPHY DCD interrupt.
291     [69] = USB_PHYDCD_IRQHandler,
292     // DMA interrupt.
293     [70] = DMA1_IRQHandler,
294     // QuidKey interrupt.
295     [71] = PUF_IRQHandler,
296     // Powerquad interrupt.
297     [72] = POWERQUAD_IRQHandler,
298     // Caspar interrupt.
299     [73] = CASPER_IRQHandler,
300     // Power Management Control interrupt.
301     [74] = PMU_PMIC_IRQHandler,
302     // SHA interrupt.
303     [75] = HASHCRYPT_IRQHandler,
304     // FlexComm interrupt.
305     [76] = FLEXCOMM8_IRQHandler,
306     // FlexComm interrupt.
307     [77] = FLEXCOMM9_IRQHandler,
308     // FlexComm interrupt.
309     [78] = FLEXCOMM10_IRQHandler,
310     // FlexComm interrupt.
311     [79] = FLEXCOMM11_IRQHandler,
312     // FlexComm interrupt.
313     [80] = FLEXCOMM12_IRQHandler,
314     // FlexComm interrupt.
315     [81] = FLEXCOMM13_IRQHandler,
316     // FlexComm interrupt.
317     [82] = FLEXCOMM16_IRQHandler,
318     // Improved Inter Integrated Circuit 1 interrupt.
319     [83] = I3C1_IRQHandler,
320     // Flexible I/O interrupt.
321     [84] = FLEXIO_IRQHandler,
322     // Liquid Crystal Display interface interrupt.
323     [85] = LCDIF_IRQHandler,
324     // Graphics Processor Unit interrupt.
325     [86] = GPU_IRQHandler,
326     // MIPI interrupt.
327     [87] = MIPI_IRQHandler,
328     // Reserved interrupt.
329     [88] = Reserved88_IRQHandler,
330     // Smart DMA Engine Controller interrupt.
331     [89] = SDMA_IRQHandler,
332 };
333 
334 // Define handlers that call out to a driver handler provided by the SDK.
335 #define DRIVER_HANDLER(_IRQHandler, _DriverIRQHandler)            \
336   void _DriverIRQHandler(void) PW_ALIAS(DefaultInterruptHandler); \
337   static void _IRQHandler(void) { _DriverIRQHandler(); }
338 
339 DRIVER_HANDLER(WDT0_IRQHandler, WDT0_DriverIRQHandler);
340 DRIVER_HANDLER(DMA0_IRQHandler, DMA0_DriverIRQHandler);
341 DRIVER_HANDLER(GPIO_INTA_IRQHandler, GPIO_INTA_DriverIRQHandler);
342 DRIVER_HANDLER(GPIO_INTB_IRQHandler, GPIO_INTB_DriverIRQHandler);
343 DRIVER_HANDLER(PIN_INT0_IRQHandler, PIN_INT0_DriverIRQHandler);
344 DRIVER_HANDLER(PIN_INT1_IRQHandler, PIN_INT1_DriverIRQHandler);
345 DRIVER_HANDLER(PIN_INT2_IRQHandler, PIN_INT2_DriverIRQHandler);
346 DRIVER_HANDLER(PIN_INT3_IRQHandler, PIN_INT3_DriverIRQHandler);
347 DRIVER_HANDLER(UTICK0_IRQHandler, UTICK0_DriverIRQHandler);
348 DRIVER_HANDLER(MRT0_IRQHandler, MRT0_DriverIRQHandler);
349 DRIVER_HANDLER(CTIMER0_IRQHandler, CTIMER0_DriverIRQHandler);
350 DRIVER_HANDLER(CTIMER1_IRQHandler, CTIMER1_DriverIRQHandler);
351 DRIVER_HANDLER(SCT0_IRQHandler, SCT0_DriverIRQHandler);
352 DRIVER_HANDLER(CTIMER3_IRQHandler, CTIMER3_DriverIRQHandler);
353 DRIVER_HANDLER(FLEXCOMM0_IRQHandler, FLEXCOMM0_DriverIRQHandler);
354 DRIVER_HANDLER(FLEXCOMM1_IRQHandler, FLEXCOMM1_DriverIRQHandler);
355 DRIVER_HANDLER(FLEXCOMM2_IRQHandler, FLEXCOMM2_DriverIRQHandler);
356 DRIVER_HANDLER(FLEXCOMM3_IRQHandler, FLEXCOMM3_DriverIRQHandler);
357 DRIVER_HANDLER(FLEXCOMM4_IRQHandler, FLEXCOMM4_DriverIRQHandler);
358 DRIVER_HANDLER(FLEXCOMM5_IRQHandler, FLEXCOMM5_DriverIRQHandler);
359 DRIVER_HANDLER(FLEXCOMM14_IRQHandler, FLEXCOMM14_DriverIRQHandler);
360 DRIVER_HANDLER(FLEXCOMM15_IRQHandler, FLEXCOMM15_DriverIRQHandler);
361 DRIVER_HANDLER(ADC0_IRQHandler, ADC0_DriverIRQHandler);
362 DRIVER_HANDLER(Reserved39_IRQHandler, Reserved39_DriverIRQHandler);
363 DRIVER_HANDLER(ACMP_IRQHandler, ACMP_DriverIRQHandler);
364 DRIVER_HANDLER(DMIC0_IRQHandler, DMIC0_DriverIRQHandler);
365 DRIVER_HANDLER(Reserved42_IRQHandler, Reserved42_DriverIRQHandler);
366 DRIVER_HANDLER(HYPERVISOR_IRQHandler, HYPERVISOR_DriverIRQHandler);
367 DRIVER_HANDLER(SECURE_VIOLATION_IRQHandler, SECURE_VIOLATION_DriverIRQHandler);
368 DRIVER_HANDLER(HWVAD0_IRQHandler, HWVAD0_DriverIRQHandler);
369 DRIVER_HANDLER(Reserved46_IRQHandler, Reserved46_DriverIRQHandler);
370 DRIVER_HANDLER(RNG_IRQHandler, RNG_DriverIRQHandler);
371 DRIVER_HANDLER(RTC_IRQHandler, RTC_DriverIRQHandler);
372 DRIVER_HANDLER(DSP_TIE_EXPSTATE1_IRQHandler,
373                DSP_TIE_EXPSTATE1_DriverIRQHandler);
374 DRIVER_HANDLER(MU_A_IRQHandler, MU_A_DriverIRQHandler);
375 DRIVER_HANDLER(PIN_INT4_IRQHandler, PIN_INT4_DriverIRQHandler);
376 DRIVER_HANDLER(PIN_INT5_IRQHandler, PIN_INT5_DriverIRQHandler);
377 DRIVER_HANDLER(PIN_INT6_IRQHandler, PIN_INT6_DriverIRQHandler);
378 DRIVER_HANDLER(PIN_INT7_IRQHandler, PIN_INT7_DriverIRQHandler);
379 DRIVER_HANDLER(CTIMER2_IRQHandler, CTIMER2_DriverIRQHandler);
380 DRIVER_HANDLER(CTIMER4_IRQHandler, CTIMER4_DriverIRQHandler);
381 DRIVER_HANDLER(OS_EVENT_IRQHandler, OS_EVENT_DriverIRQHandler);
382 DRIVER_HANDLER(FLEXSPI0_FLEXSPI1_IRQHandler,
383                FLEXSPI0_FLEXSPI1_DriverIRQHandler);
384 DRIVER_HANDLER(FLEXCOMM6_IRQHandler, FLEXCOMM6_DriverIRQHandler);
385 DRIVER_HANDLER(FLEXCOMM7_IRQHandler, FLEXCOMM7_DriverIRQHandler);
386 DRIVER_HANDLER(USDHC0_IRQHandler, USDHC0_DriverIRQHandler);
387 DRIVER_HANDLER(USDHC1_IRQHandler, USDHC1_DriverIRQHandler);
388 DRIVER_HANDLER(SGPIO_INTA_IRQHandler, SGPIO_INTA_DriverIRQHandler);
389 DRIVER_HANDLER(SGPIO_INTB_IRQHandler, SGPIO_INTB_DriverIRQHandler);
390 DRIVER_HANDLER(I3C0_IRQHandler, I3C0_DriverIRQHandler);
391 DRIVER_HANDLER(USB0_IRQHandler, USB0_DriverIRQHandler);
392 DRIVER_HANDLER(USB0_NEEDCLK_IRQHandler, USB0_NEEDCLK_DriverIRQHandler);
393 DRIVER_HANDLER(WDT1_IRQHandler, WDT1_DriverIRQHandler);
394 DRIVER_HANDLER(USB_PHYDCD_IRQHandler, USB_PHYDCD_DriverIRQHandler);
395 DRIVER_HANDLER(DMA1_IRQHandler, DMA1_DriverIRQHandler);
396 DRIVER_HANDLER(PUF_IRQHandler, PUF_DriverIRQHandler);
397 DRIVER_HANDLER(POWERQUAD_IRQHandler, POWERQUAD_DriverIRQHandler);
398 DRIVER_HANDLER(CASPER_IRQHandler, CASPER_DriverIRQHandler);
399 DRIVER_HANDLER(PMU_PMIC_IRQHandler, PMU_PMIC_DriverIRQHandler);
400 DRIVER_HANDLER(HASHCRYPT_IRQHandler, HASHCRYPT_DriverIRQHandler);
401 DRIVER_HANDLER(FLEXCOMM8_IRQHandler, FLEXCOMM8_DriverIRQHandler);
402 DRIVER_HANDLER(FLEXCOMM9_IRQHandler, FLEXCOMM9_DriverIRQHandler);
403 DRIVER_HANDLER(FLEXCOMM10_IRQHandler, FLEXCOMM10_DriverIRQHandler);
404 DRIVER_HANDLER(FLEXCOMM11_IRQHandler, FLEXCOMM11_DriverIRQHandler);
405 DRIVER_HANDLER(FLEXCOMM12_IRQHandler, FLEXCOMM12_DriverIRQHandler);
406 DRIVER_HANDLER(FLEXCOMM13_IRQHandler, FLEXCOMM13_DriverIRQHandler);
407 DRIVER_HANDLER(FLEXCOMM16_IRQHandler, FLEXCOMM16_DriverIRQHandler);
408 DRIVER_HANDLER(I3C1_IRQHandler, I3C1_DriverIRQHandler);
409 DRIVER_HANDLER(FLEXIO_IRQHandler, FLEXIO_DriverIRQHandler);
410 DRIVER_HANDLER(LCDIF_IRQHandler, LCDIF_DriverIRQHandler);
411 DRIVER_HANDLER(GPU_IRQHandler, GPU_DriverIRQHandler);
412 DRIVER_HANDLER(MIPI_IRQHandler, MIPI_DriverIRQHandler);
413 DRIVER_HANDLER(Reserved88_IRQHandler, Reserved88_DriverIRQHandler);
414 DRIVER_HANDLER(SDMA_IRQHandler, SDMA_DriverIRQHandler);
415