/******************************************************************************* | |
* (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved. | |
* | |
* @file riscv_hal.c | |
* @author Microsemi SoC Products Group | |
* @brief Implementation of Hardware Abstraction Layer for Mi-V soft processors | |
* | |
* SVN $Revision: 9835 $ | |
* SVN $Date: 2018-03-19 19:11:35 +0530 (Mon, 19 Mar 2018) $ | |
*/ | |
#include <stdlib.h> | |
#include <stdint.h> | |
#include <unistd.h> | |
#include "riscv_hal.h" | |
#include "FreeRTOS.h" | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
#define RTC_PRESCALER 100UL | |
#define SUCCESS 0U | |
#define ERROR 1U | |
/*------------------------------------------------------------------------------ | |
* | |
*/ | |
uint8_t Invalid_IRQHandler(void); | |
uint8_t External_1_IRQHandler(void); | |
uint8_t External_2_IRQHandler(void); | |
uint8_t External_3_IRQHandler(void); | |
uint8_t External_4_IRQHandler(void); | |
uint8_t External_5_IRQHandler(void); | |
uint8_t External_6_IRQHandler(void); | |
uint8_t External_7_IRQHandler(void); | |
uint8_t External_8_IRQHandler(void); | |
uint8_t External_9_IRQHandler(void); | |
uint8_t External_10_IRQHandler(void); | |
uint8_t External_11_IRQHandler(void); | |
uint8_t External_12_IRQHandler(void); | |
uint8_t External_13_IRQHandler(void); | |
uint8_t External_14_IRQHandler(void); | |
uint8_t External_15_IRQHandler(void); | |
uint8_t External_16_IRQHandler(void); | |
uint8_t External_17_IRQHandler(void); | |
uint8_t External_18_IRQHandler(void); | |
uint8_t External_19_IRQHandler(void); | |
uint8_t External_20_IRQHandler(void); | |
uint8_t External_21_IRQHandler(void); | |
uint8_t External_22_IRQHandler(void); | |
uint8_t External_23_IRQHandler(void); | |
uint8_t External_24_IRQHandler(void); | |
uint8_t External_25_IRQHandler(void); | |
uint8_t External_26_IRQHandler(void); | |
uint8_t External_27_IRQHandler(void); | |
uint8_t External_28_IRQHandler(void); | |
uint8_t External_29_IRQHandler(void); | |
uint8_t External_30_IRQHandler(void); | |
uint8_t External_31_IRQHandler(void); | |
/*------------------------------------------------------------------------------ | |
* | |
*/ | |
extern void Software_IRQHandler(void); | |
extern void Timer_IRQHandle( void ); | |
/*------------------------------------------------------------------------------ | |
* RISC-V interrupt handler for external interrupts. | |
*/ | |
uint8_t (*ext_irq_handler_table[32])(void) = | |
{ | |
Invalid_IRQHandler, | |
External_1_IRQHandler, | |
External_2_IRQHandler, | |
External_3_IRQHandler, | |
External_4_IRQHandler, | |
External_5_IRQHandler, | |
External_6_IRQHandler, | |
External_7_IRQHandler, | |
External_8_IRQHandler, | |
External_9_IRQHandler, | |
External_10_IRQHandler, | |
External_11_IRQHandler, | |
External_12_IRQHandler, | |
External_13_IRQHandler, | |
External_14_IRQHandler, | |
External_15_IRQHandler, | |
External_16_IRQHandler, | |
External_17_IRQHandler, | |
External_18_IRQHandler, | |
External_19_IRQHandler, | |
External_20_IRQHandler, | |
External_21_IRQHandler, | |
External_22_IRQHandler, | |
External_23_IRQHandler, | |
External_24_IRQHandler, | |
External_25_IRQHandler, | |
External_26_IRQHandler, | |
External_27_IRQHandler, | |
External_28_IRQHandler, | |
External_29_IRQHandler, | |
External_30_IRQHandler, | |
External_31_IRQHandler | |
}; | |
/*------------------------------------------------------------------------------ | |
* | |
*/ | |
void handle_m_ext_interrupt(void) | |
{ | |
uint32_t int_num = PLIC_ClaimIRQ(); | |
uint8_t disable = EXT_IRQ_KEEP_ENABLED; | |
disable = ext_irq_handler_table[int_num](); | |
PLIC_CompleteIRQ(int_num); | |
if(EXT_IRQ_DISABLE == disable) | |
{ | |
PLIC_DisableIRQ((IRQn_Type)int_num); | |
} | |
} | |
#ifdef __cplusplus | |
} | |
#endif |