/**
 ******************************************************************************
 * @addtogroup PIOS PIOS Core hardware abstraction layer
 * @{
 *
 * @file       vector_stm32f4xx.c
 * @author     The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
 * @brief      C based vectors for F4
 * @see        The GNU Public License (GPL) Version 3
 *
 *****************************************************************************/
/*
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
 * for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

/** interrupt handler */
typedef void (vector)(void);

/** default interrupt handler */
static void default_io_handler(void)
{
    for (;;) {
        ;
    }
}

/** prototypes an interrupt handler */
#define HANDLER(_name) extern vector _name __attribute__((weak, alias("default_io_handler")))

HANDLER(WWDG_IRQHandler); // Window WatchDog
HANDLER(PVD_IRQHandler); // PVD through EXTI Line detection
HANDLER(TAMP_STAMP_IRQHandler); // Tamper and TimeStamps through the EXTI line
HANDLER(RTC_WKUP_IRQHandler); // RTC Wakeup through the EXTI line
HANDLER(FLASH_IRQHandler); // FLASH
HANDLER(RCC_IRQHandler); // RCC
HANDLER(EXTI0_IRQHandler); // EXTI Line0
HANDLER(EXTI1_IRQHandler); // EXTI Line1
HANDLER(EXTI2_IRQHandler); // EXTI Line2
HANDLER(EXTI3_IRQHandler); // EXTI Line3
HANDLER(EXTI4_IRQHandler); // EXTI Line4
HANDLER(DMA1_Stream0_IRQHandler); // DMA1 Stream 0
HANDLER(DMA1_Stream1_IRQHandler); // DMA1 Stream 1
HANDLER(DMA1_Stream2_IRQHandler); // DMA1 Stream 2
HANDLER(DMA1_Stream3_IRQHandler); // DMA1 Stream 3
HANDLER(DMA1_Stream4_IRQHandler); // DMA1 Stream 4
HANDLER(DMA1_Stream5_IRQHandler); // DMA1 Stream 5
HANDLER(DMA1_Stream6_IRQHandler); // DMA1 Stream 6
HANDLER(ADC_IRQHandler); // ADC1, ADC2 and ADC3s
HANDLER(CAN1_TX_IRQHandler); // CAN1 TX
HANDLER(CAN1_RX0_IRQHandler); // CAN1 RX0
HANDLER(CAN1_RX1_IRQHandler); // CAN1 RX1
HANDLER(CAN1_SCE_IRQHandler); // CAN1 SCE
HANDLER(EXTI9_5_IRQHandler); // External Line[9:5]s
HANDLER(TIM1_BRK_TIM9_IRQHandler); // TIM1 Break and TIM9
HANDLER(TIM1_UP_TIM10_IRQHandler); // TIM1 Update and TIM10
HANDLER(TIM1_TRG_COM_TIM11_IRQHandler); // TIM1 Trigger and Commutation and TIM11
HANDLER(TIM1_CC_IRQHandler); // TIM1 Capture Compare
HANDLER(TIM2_IRQHandler); // TIM2
HANDLER(TIM3_IRQHandler); // TIM3
HANDLER(TIM4_IRQHandler); // TIM4
HANDLER(I2C1_EV_IRQHandler); // I2C1 Event
HANDLER(I2C1_ER_IRQHandler); // I2C1 Error
HANDLER(I2C2_EV_IRQHandler); // I2C2 Event
HANDLER(I2C2_ER_IRQHandler); // I2C2 Error
HANDLER(SPI1_IRQHandler); // SPI1
HANDLER(SPI2_IRQHandler); // SPI2
HANDLER(USART1_IRQHandler); // USART1
HANDLER(USART2_IRQHandler); // USART2
HANDLER(USART3_IRQHandler); // USART3
HANDLER(EXTI15_10_IRQHandler); // External Line[15:10]s
HANDLER(RTC_Alarm_IRQHandler); // RTC Alarm (A and B) through EXTI Line
HANDLER(OTG_FS_WKUP_IRQHandler); // USB OTG FS Wakeup through EXTI line
HANDLER(TIM8_BRK_TIM12_IRQHandler); // TIM8 Break and TIM12
HANDLER(TIM8_UP_TIM13_IRQHandler); // TIM8 Update and TIM13
HANDLER(TIM8_TRG_COM_TIM14_IRQHandler); // TIM8 Trigger and Commutation and TIM14
HANDLER(TIM8_CC_IRQHandler); // TIM8 Capture Compare
HANDLER(DMA1_Stream7_IRQHandler); // DMA1 Stream7
HANDLER(FSMC_IRQHandler); // FSMC
HANDLER(SDIO_IRQHandler); // SDIO
HANDLER(TIM5_IRQHandler); // TIM5
HANDLER(SPI3_IRQHandler); // SPI3
HANDLER(USART4_IRQHandler); // UART4
HANDLER(USART5_IRQHandler); // UART5
HANDLER(TIM6_DAC_IRQHandler); // TIM6 and DAC1&2 underrun errors
HANDLER(TIM7_IRQHandler); // TIM7
HANDLER(DMA2_Stream0_IRQHandler); // DMA2 Stream 0
HANDLER(DMA2_Stream1_IRQHandler); // DMA2 Stream 1
HANDLER(DMA2_Stream2_IRQHandler); // DMA2 Stream 2
HANDLER(DMA2_Stream3_IRQHandler); // DMA2 Stream 3
HANDLER(DMA2_Stream4_IRQHandler); // DMA2 Stream 4
HANDLER(ETH_IRQHandler); // Ethernet
HANDLER(ETH_WKUP_IRQHandler); // Ethernet Wakeup through EXTI line
HANDLER(CAN2_TX_IRQHandler); // CAN2 TX
HANDLER(CAN2_RX0_IRQHandler); // CAN2 RX0
HANDLER(CAN2_RX1_IRQHandler); // CAN2 RX1
HANDLER(CAN2_SCE_IRQHandler); // CAN2 SCE
HANDLER(OTG_FS_IRQHandler); // USB OTG FS
HANDLER(DMA2_Stream5_IRQHandler); // DMA2 Stream 5
HANDLER(DMA2_Stream6_IRQHandler); // DMA2 Stream 6
HANDLER(DMA2_Stream7_IRQHandler); // DMA2 Stream 7
HANDLER(USART6_IRQHandler); // USART6
HANDLER(I2C3_EV_IRQHandler); // I2C3 event
HANDLER(I2C3_ER_IRQHandler); // I2C3 error
HANDLER(OTG_HS_EP1_OUT_IRQHandler); // USB OTG HS End Point 1 Out
HANDLER(OTG_HS_EP1_IN_IRQHandler); // USB OTG HS End Point 1 In
HANDLER(OTG_HS_WKUP_IRQHandler); // USB OTG HS Wakeup through EXTI
HANDLER(OTG_HS_IRQHandler); // USB OTG HS
HANDLER(DCMI_IRQHandler); // DCMI
HANDLER(CRYP_IRQHandler); // CRYP crypto
HANDLER(HASH_RNG_IRQHandler); // Hash and Rng
HANDLER(FPU_IRQHandler); // FPU

/** stm32f4xx interrupt vector table */
vector *io_vectors[] __attribute__((section(".io_vectors"))) = {
    WWDG_IRQHandler, // Window WatchDog
    PVD_IRQHandler, // PVD through EXTI Line detection
    TAMP_STAMP_IRQHandler, // Tamper and TimeStamps through the EXTI line
    RTC_WKUP_IRQHandler, // RTC Wakeup through the EXTI line
    FLASH_IRQHandler, // FLASH
    RCC_IRQHandler, // RCC
    EXTI0_IRQHandler, // EXTI Line0
    EXTI1_IRQHandler, // EXTI Line1
    EXTI2_IRQHandler, // EXTI Line2
    EXTI3_IRQHandler, // EXTI Line3
    EXTI4_IRQHandler, // EXTI Line4
    DMA1_Stream0_IRQHandler, // DMA1 Stream 0
    DMA1_Stream1_IRQHandler, // DMA1 Stream 1
    DMA1_Stream2_IRQHandler, // DMA1 Stream 2
    DMA1_Stream3_IRQHandler, // DMA1 Stream 3
    DMA1_Stream4_IRQHandler, // DMA1 Stream 4
    DMA1_Stream5_IRQHandler, // DMA1 Stream 5
    DMA1_Stream6_IRQHandler, // DMA1 Stream 6
    ADC_IRQHandler, // ADC1, ADC2 and ADC3s
    CAN1_TX_IRQHandler, // CAN1 TX
    CAN1_RX0_IRQHandler, // CAN1 RX0
    CAN1_RX1_IRQHandler, // CAN1 RX1
    CAN1_SCE_IRQHandler, // CAN1 SCE
    EXTI9_5_IRQHandler, // External Line[9:5]s
    TIM1_BRK_TIM9_IRQHandler, // TIM1 Break and TIM9
    TIM1_UP_TIM10_IRQHandler, // TIM1 Update and TIM10
    TIM1_TRG_COM_TIM11_IRQHandler, // TIM1 Trigger and Commutation and TIM11
    TIM1_CC_IRQHandler, // TIM1 Capture Compare
    TIM2_IRQHandler, // TIM2
    TIM3_IRQHandler, // TIM3
    TIM4_IRQHandler, // TIM4
    I2C1_EV_IRQHandler, // I2C1 Event
    I2C1_ER_IRQHandler, // I2C1 Error
    I2C2_EV_IRQHandler, // I2C2 Event
    I2C2_ER_IRQHandler, // I2C2 Error
    SPI1_IRQHandler, // SPI1
    SPI2_IRQHandler, // SPI2
    USART1_IRQHandler, // USART1
    USART2_IRQHandler, // USART2
    USART3_IRQHandler, // USART3
    EXTI15_10_IRQHandler, // External Line[15:10]s
    RTC_Alarm_IRQHandler, // RTC Alarm (A and B) through EXTI Line
    OTG_FS_WKUP_IRQHandler, // USB OTG FS Wakeup through EXTI line
    TIM8_BRK_TIM12_IRQHandler, // TIM8 Break and TIM12
    TIM8_UP_TIM13_IRQHandler, // TIM8 Update and TIM13
    TIM8_TRG_COM_TIM14_IRQHandler, // TIM8 Trigger and Commutation and TIM14
    TIM8_CC_IRQHandler, // TIM8 Capture Compare
    DMA1_Stream7_IRQHandler, // DMA1 Stream7
    FSMC_IRQHandler, // FSMC
    SDIO_IRQHandler, // SDIO
    TIM5_IRQHandler, // TIM5
    SPI3_IRQHandler, // SPI3
    USART4_IRQHandler, // UART4
    USART5_IRQHandler, // UART5
    TIM6_DAC_IRQHandler, // TIM6 and DAC1&2 underrun errors
    TIM7_IRQHandler, // TIM7
    DMA2_Stream0_IRQHandler, // DMA2 Stream 0
    DMA2_Stream1_IRQHandler, // DMA2 Stream 1
    DMA2_Stream2_IRQHandler, // DMA2 Stream 2
    DMA2_Stream3_IRQHandler, // DMA2 Stream 3
    DMA2_Stream4_IRQHandler, // DMA2 Stream 4
    ETH_IRQHandler, // Ethernet
    ETH_WKUP_IRQHandler, // Ethernet Wakeup through EXTI line
    CAN2_TX_IRQHandler, // CAN2 TX
    CAN2_RX0_IRQHandler, // CAN2 RX0
    CAN2_RX1_IRQHandler, // CAN2 RX1
    CAN2_SCE_IRQHandler, // CAN2 SCE
    OTG_FS_IRQHandler, // USB OTG FS
    DMA2_Stream5_IRQHandler, // DMA2 Stream 5
    DMA2_Stream6_IRQHandler, // DMA2 Stream 6
    DMA2_Stream7_IRQHandler, // DMA2 Stream 7
    USART6_IRQHandler, // USART6
    I2C3_EV_IRQHandler, // I2C3 event
    I2C3_ER_IRQHandler, // I2C3 error
    OTG_HS_EP1_OUT_IRQHandler, // USB OTG HS End Point 1 Out
    OTG_HS_EP1_IN_IRQHandler, // USB OTG HS End Point 1 In
    OTG_HS_WKUP_IRQHandler, // USB OTG HS Wakeup through EXTI
    OTG_HS_IRQHandler, // USB OTG HS
    DCMI_IRQHandler, // DCMI
    CRYP_IRQHandler, // CRYP crypto
    HASH_RNG_IRQHandler, // Hash and Rng
    FPU_IRQHandler, // FPU
};

/**
 * @}
 */