227 lines
12 KiB
C
227 lines
12 KiB
C
/**
|
|
* @file interrupt.c
|
|
* @brief
|
|
*
|
|
* Copyright (c) 2021 Bouffalolab team
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you 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
|
|
*
|
|
* http://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 <stdint.h>
|
|
|
|
#include "../risc-v/Core/Include/clic.h"
|
|
#include "../risc-v/Core/Include/cmsis_compatible_gcc.h"
|
|
|
|
typedef void (*pFunc)(void);
|
|
extern void Trap_Handler(void);
|
|
extern void Interrupt_Handler(void);
|
|
void Interrupt_Handler_Stub(void);
|
|
|
|
void clic_msip_handler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void clic_mtimer_handler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void clic_mext_handler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void clic_csoft_handler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void BMX_ERR_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void BMX_TO_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void L1C_BMX_ERR_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void L1C_BMX_TO_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_BMX_ERR_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void RF_TOP_INT0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void RF_TOP_INT1_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void DMA_BMX_ERR_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_GMAC_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_CDET_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_PKA_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_TRNG_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_AES_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SEC_SHA_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void DMA_ALL_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MJPEG_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void CAM_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void I2S_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void IRTX_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void IRRX_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void USB_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void EMAC_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SF_CTRL_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void GPADC_DMA_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void EFUSE_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void SPI_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void UART0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void UART1_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void I2C_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void PWM_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void TIMER_CH0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void TIMER_CH1_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void TIMER_WDT_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void KYS_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void QDEC0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void QDEC1_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void QDEC2_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void GPIO_INT0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void TOUCH_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void M154_REQ_ENH_ACK_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void M154_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void M154_AES_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void PDS_WAKEUP_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void HBN_OUT0_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void HBN_OUT1_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void BOR_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void WIFI_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void BZ_PHY_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void BLE_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_TXRX_TIMER_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_TXRX_MISC_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_RX_TRG_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_TX_TRG_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_GEN_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void MAC_PORT_TRG_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
void WIFI_IPC_PUBLIC_IRQHandler_Wrapper(void) __attribute__((weak, alias("Interrupt_Handler_Stub")));
|
|
|
|
const pFunc __Vectors[] __attribute__((section(".init"), aligned(64))) = {
|
|
0, /* */
|
|
0, /* */
|
|
0, /* */
|
|
clic_msip_handler_Wrapper, /* 3 */
|
|
0, /* */
|
|
0, /* */
|
|
0, /* */
|
|
clic_mtimer_handler_Wrapper, /* 7 */
|
|
(pFunc)0x00000001, /* */
|
|
0, /* */
|
|
(pFunc)0x00000102, /* */ //disable log as default
|
|
clic_mext_handler_Wrapper, /* 11 */
|
|
clic_csoft_handler_Wrapper, /* 12 */
|
|
0, /* */
|
|
0, /* */
|
|
0, /* */
|
|
BMX_ERR_IRQHandler_Wrapper, /* 16 + 0 */
|
|
BMX_TO_IRQHandler_Wrapper, /* 16 + 1 */
|
|
L1C_BMX_ERR_IRQHandler_Wrapper, /* 16 + 2 */
|
|
L1C_BMX_TO_IRQHandler_Wrapper, /* 16 + 3 */
|
|
SEC_BMX_ERR_IRQHandler_Wrapper, /* 16 + 4 */
|
|
RF_TOP_INT0_IRQHandler_Wrapper, /* 16 + 5 */
|
|
RF_TOP_INT1_IRQHandler_Wrapper, /* 16 + 6 */
|
|
0, /* 16 + 7 */
|
|
DMA_BMX_ERR_IRQHandler_Wrapper, /* 16 + 8 */
|
|
SEC_GMAC_IRQHandler_Wrapper, /* 16 + 9 */
|
|
SEC_CDET_IRQHandler_Wrapper, /* 16 + 10 */
|
|
SEC_PKA_IRQHandler_Wrapper, /* 16 + 11 */
|
|
SEC_TRNG_IRQHandler_Wrapper, /* 16 + 12 */
|
|
SEC_AES_IRQHandler_Wrapper, /* 16 + 13 */
|
|
SEC_SHA_IRQHandler_Wrapper, /* 16 + 14 */
|
|
DMA_ALL_IRQHandler_Wrapper, /* 16 + 15 */
|
|
MJPEG_IRQHandler_Wrapper, /* 16 + 16 */
|
|
CAM_IRQHandler_Wrapper, /* 16 + 17 */
|
|
I2S_IRQHandler_Wrapper, /* 16 + 18 */
|
|
IRTX_IRQHandler_Wrapper, /* 16 + 19 */
|
|
IRRX_IRQHandler_Wrapper, /* 16 + 20 */
|
|
USB_IRQHandler_Wrapper, /* 16 + 21 */
|
|
EMAC_IRQHandler_Wrapper, /* 16 + 22 */
|
|
SF_CTRL_IRQHandler_Wrapper, /* 16 + 23 */
|
|
0, /* 16 + 24 */
|
|
GPADC_DMA_IRQHandler_Wrapper, /* 16 + 25 */
|
|
EFUSE_IRQHandler_Wrapper, /* 16 + 26 */
|
|
SPI_IRQHandler_Wrapper, /* 16 + 27 */
|
|
0, /* 16 + 28 */
|
|
UART0_IRQHandler_Wrapper, /* 16 + 29 */
|
|
UART1_IRQHandler_Wrapper, /* 16 + 30 */
|
|
0, /* 16 + 31 */
|
|
I2C_IRQHandler_Wrapper, /* 16 + 32 */
|
|
0, /* 16 + 33 */
|
|
PWM_IRQHandler_Wrapper, /* 16 + 34 */
|
|
0, /* 16 + 35 */
|
|
TIMER_CH0_IRQHandler_Wrapper, /* 16 + 36 */
|
|
TIMER_CH1_IRQHandler_Wrapper, /* 16 + 37 */
|
|
TIMER_WDT_IRQHandler_Wrapper, /* 16 + 38 */
|
|
KYS_IRQHandler_Wrapper, /* 16 + 39 */
|
|
QDEC0_IRQHandler_Wrapper, /* 16 + 40 */
|
|
QDEC1_IRQHandler_Wrapper, /* 16 + 41 */
|
|
QDEC2_IRQHandler_Wrapper, /* 16 + 42 */
|
|
0, /* 16 + 43 */
|
|
GPIO_INT0_IRQHandler_Wrapper, /* 16 + 44 */
|
|
TOUCH_IRQHandler_Wrapper, /* 16 + 45 */
|
|
0, /* 16 + 46 */
|
|
M154_REQ_ENH_ACK_IRQHandler_Wrapper, /* 16 + 47 */
|
|
M154_IRQHandler_Wrapper, /* 16 + 48 */
|
|
M154_AES_IRQHandler_Wrapper, /* 16 + 49 */
|
|
PDS_WAKEUP_IRQHandler_Wrapper, /* 16 + 50 */
|
|
HBN_OUT0_IRQHandler_Wrapper, /* 16 + 51 */
|
|
HBN_OUT1_IRQHandler_Wrapper, /* 16 + 52 */
|
|
BOR_IRQHandler_Wrapper, /* 16 + 53 */
|
|
WIFI_IRQHandler_Wrapper, /* 16 + 54 */
|
|
BZ_PHY_IRQHandler_Wrapper, /* 16 + 55 */
|
|
BLE_IRQHandler_Wrapper, /* 16 + 56 */
|
|
MAC_TXRX_TIMER_IRQHandler_Wrapper, /* 16 + 57 */
|
|
MAC_TXRX_MISC_IRQHandler_Wrapper, /* 16 + 58 */
|
|
MAC_RX_TRG_IRQHandler_Wrapper, /* 16 + 59 */
|
|
MAC_TX_TRG_IRQHandler_Wrapper, /* 16 + 60 */
|
|
MAC_GEN_IRQHandler_Wrapper, /* 16 + 61 */
|
|
MAC_PORT_TRG_IRQHandler_Wrapper, /* 16 + 62 */
|
|
WIFI_IPC_PUBLIC_IRQHandler_Wrapper, /* 16 + 63 */
|
|
};
|
|
|
|
void __IRQ_ALIGN64 Trap_Handler_Stub(void)
|
|
{
|
|
Trap_Handler();
|
|
}
|
|
|
|
void __IRQ Interrupt_Handler_Stub(void)
|
|
{
|
|
Interrupt_Handler();
|
|
}
|
|
|
|
void clic_enable_interrupt(uint32_t source)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIE + source) = 1;
|
|
}
|
|
|
|
void clic_disable_interrupt(uint32_t source)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIE + source) = 0;
|
|
}
|
|
|
|
void clic_set_pending(uint32_t source)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIP + source) = 1;
|
|
}
|
|
|
|
void clic_clear_pending(uint32_t source)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTIP + source) = 0;
|
|
}
|
|
|
|
void clic_set_intcfg(uint32_t source, uint32_t intcfg)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTCFG + source) = intcfg;
|
|
}
|
|
|
|
uint8_t clic_get_intcfg(uint32_t source)
|
|
{
|
|
return *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_INTCFG + source);
|
|
}
|
|
|
|
void clic_set_cliccfg(uint32_t cfg)
|
|
{
|
|
*(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_CFG) = cfg;
|
|
}
|
|
|
|
uint8_t clic_get_cliccfg(void)
|
|
{
|
|
return *(volatile uint8_t *)(CLIC_HART0_ADDR + CLIC_CFG);
|
|
}
|