| // 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" |
| |
| // Default handler to insert into the ARMv7-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. |
| } |
| } |
| |
| // This typedef is for convenience when building the vector table. With the |
| // exception of SP_main (0th entry in the vector table), all the entries of the |
| // vector table are function pointers. |
| typedef void (*InterruptHandler)(void); |
| |
| void SVC_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| void PendSV_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| void SysTick_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| |
| void MemManage_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| void BusFault_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| void UsageFault_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| void DebugMon_Handler(void) PW_ALIAS(DefaultFaultHandler); |
| |
| void am_brownout_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_watchdog_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_rtc_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_vcomp_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_ioslave_ios_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_ioslave_acc_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster3_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster4_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster5_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster6_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_iomaster7_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_ctimer_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_uart_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_uart1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_uart2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_uart3_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_adc_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_mspi0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_mspi1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_mspi2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_clkgen_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_cryptosec_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_sdio_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_usb_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpu_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_disp_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_dsi_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr3_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr4_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr5_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr6_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimer_cmpr7_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_stimerof_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_audadc0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_dspi2s0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_dspi2s1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_dspi2s2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_dspi2s3_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_pdm0_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_pdm1_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_pdm2_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_pdm3_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio0_001f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio0_203f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio0_405f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio0_607f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio1_001f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio1_203f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio1_405f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_gpio1_607f_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer00_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer01_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer02_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer03_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer04_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer05_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer06_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer07_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer08_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer09_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer10_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer11_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer12_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer13_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer14_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_timer15_isr(void) PW_ALIAS(DefaultFaultHandler); |
| void am_cachecpu_isr(void) PW_ALIAS(DefaultFaultHandler); |
| |
| PW_KEEP_IN_SECTION(".vector_table") |
| const InterruptHandler vector_table[] = { |
| // Cortex-M CPU specific interrupt handlers. |
| (InterruptHandler)(&pw_boot_stack_high_addr), |
| pw_boot_Entry, // The reset handler |
| DefaultFaultHandler, // The NMI handler |
| DefaultFaultHandler, // The hard fault handler |
| DefaultFaultHandler, // The MemManage_Handler |
| DefaultFaultHandler, // The BusFault_Handler |
| DefaultFaultHandler, // The UsageFault_Handler |
| 0, // Reserved |
| 0, // Reserved |
| 0, // Reserved |
| 0, // Reserved |
| SVC_Handler, // SVCall handler |
| DefaultFaultHandler, // Debug monitor handler |
| 0, // Reserved |
| PendSV_Handler, // The PendSV handler |
| SysTick_Handler, // The SysTick handler |
| // Vendor specific peripheral interrupt handlers. |
| am_brownout_isr, // 0: Brownout (rstgen) |
| am_watchdog_isr, // 1: Watchdog (WDT) |
| am_rtc_isr, // 2: RTC |
| am_vcomp_isr, // 3: Voltage Comparator |
| am_ioslave_ios_isr, // 4: I/O Responder general |
| am_ioslave_acc_isr, // 5: I/O Responder access |
| am_iomaster0_isr, // 6: I/O Controller 0 |
| am_iomaster1_isr, // 7: I/O Controller 1 |
| am_iomaster2_isr, // 8: I/O Controller 2 |
| am_iomaster3_isr, // 9: I/O Controller 3 |
| am_iomaster4_isr, // 10: I/O Controller 4 |
| am_iomaster5_isr, // 11: I/O Controller 5 |
| am_iomaster6_isr, // 12: I/O Controller 6 (I3C/I2C/SPI) |
| am_iomaster7_isr, // 13: I/O Controller 7 (I3C/I2C/SPI) |
| am_ctimer_isr, // 14: OR of all timerX interrupts |
| am_uart_isr, // 15: UART0 |
| am_uart1_isr, // 16: UART1 |
| am_uart2_isr, // 17: UART2 |
| am_uart3_isr, // 18: UART3 |
| am_adc_isr, // 19: ADC |
| am_mspi0_isr, // 20: MSPI0 |
| am_mspi1_isr, // 21: MSPI1 |
| am_mspi2_isr, // 22: MSPI2 |
| am_clkgen_isr, // 23: ClkGen |
| am_cryptosec_isr, // 24: Crypto Secure |
| DefaultFaultHandler, // 25: Reserved |
| am_sdio_isr, // 26: SDIO |
| am_usb_isr, // 27: USB |
| am_gpu_isr, // 28: GPU |
| am_disp_isr, // 29: DISP |
| am_dsi_isr, // 30: DSI |
| DefaultFaultHandler, // 31: Reserved |
| am_stimer_cmpr0_isr, // 32: System Timer Compare0 |
| am_stimer_cmpr1_isr, // 33: System Timer Compare1 |
| am_stimer_cmpr2_isr, // 34: System Timer Compare2 |
| am_stimer_cmpr3_isr, // 35: System Timer Compare3 |
| am_stimer_cmpr4_isr, // 36: System Timer Compare4 |
| am_stimer_cmpr5_isr, // 37: System Timer Compare5 |
| am_stimer_cmpr6_isr, // 38: System Timer Compare6 |
| am_stimer_cmpr7_isr, // 39: System Timer Compare7 |
| am_stimerof_isr, // 40: System Timer Cap Overflow |
| DefaultFaultHandler, // 41: Reserved |
| am_audadc0_isr, // 42: Audio ADC |
| DefaultFaultHandler, // 43: Reserved |
| am_dspi2s0_isr, // 44: I2S0 |
| am_dspi2s1_isr, // 45: I2S1 |
| am_dspi2s2_isr, // 46: I2S2 |
| am_dspi2s3_isr, // 47: I2S3 |
| am_pdm0_isr, // 48: PDM0 |
| am_pdm1_isr, // 49: PDM1 |
| am_pdm2_isr, // 50: PDM2 |
| am_pdm3_isr, // 51: PDM3 |
| DefaultFaultHandler, // 52: Reserved |
| DefaultFaultHandler, // 53: Reserved |
| DefaultFaultHandler, // 54: Reserved |
| DefaultFaultHandler, // 55: Reserved |
| am_gpio0_001f_isr, // 56: GPIO N0 pins 0-31 |
| am_gpio0_203f_isr, // 57: GPIO N0 pins 32-63 |
| am_gpio0_405f_isr, // 58: GPIO N0 pins 64-95 |
| am_gpio0_607f_isr, // 59: GPIO N0 pins 96-104, virtual 105-127 |
| am_gpio1_001f_isr, // 60: GPIO N1 pins 0-31 |
| am_gpio1_203f_isr, // 61: GPIO N1 pins 32-63 |
| am_gpio1_405f_isr, // 62: GPIO N1 pins 64-95 |
| am_gpio1_607f_isr, // 63: GPIO N1 pins 96-104, virtual 105-127 |
| DefaultFaultHandler, // 64: Reserved |
| DefaultFaultHandler, // 65: Reserved |
| DefaultFaultHandler, // 66: Reserved |
| am_timer00_isr, // 67: timer0 |
| am_timer01_isr, // 68: timer1 |
| am_timer02_isr, // 69: timer2 |
| am_timer03_isr, // 70: timer3 |
| am_timer04_isr, // 71: timer4 |
| am_timer05_isr, // 72: timer5 |
| am_timer06_isr, // 73: timer6 |
| am_timer07_isr, // 74: timer7 |
| am_timer08_isr, // 75: timer8 |
| am_timer09_isr, // 76: timer9 |
| am_timer10_isr, // 77: timer10 |
| am_timer11_isr, // 78: timer11 |
| am_timer12_isr, // 79: timer12 |
| am_timer13_isr, // 80: timer13 |
| am_timer14_isr, // 81: timer14 |
| am_timer15_isr, // 82: timer15 |
| am_cachecpu_isr // 83: CPU cache |
| }; |