Files
kunlun/driver/src/hal/irq.c

175 lines
4.7 KiB
C
Raw Normal View History

2024-09-28 14:24:04 +08:00
/****************************************************************************
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
be copied by any method or incorporated into another program without
the express written consent of Aerospace C.Power. This Information or any portion
thereof remains the property of Aerospace C.Power. The Information contained herein
is believed to be accurate and Aerospace C.Power assumes no responsibility or
liability for its use in any way and conveys no license or title under
any patent or copyright and makes no representation or warranty that this
Information is free from patent or copyright infringement.
****************************************************************************/
/* os shim includes */
#include "os_types.h"
#include "os_mem.h"
#include "iot_io.h"
#include "iot_irq.h"
#include "intc.h"
#include "cpu.h"
volatile iot_addr_t hal_interrupt_handlers[HAL_VECTOR_COUNT];
volatile iot_addrword_t hal_interrupt_data [HAL_VECTOR_COUNT];
volatile iot_interrupt g_intr_info[HAL_VECTOR_COUNT];
uint32_t IRAM_ATTR hal_default_isr(uint32_t vector, iot_addrword_t data)
{
(void)vector;
(void)data;
return 0;
}
void IRAM_ATTR hal_deliver_interrupt( uint32_t vector )
{
iot_isr_t *isr;
iot_addrword_t data;
isr = (iot_isr_t *)hal_interrupt_handlers[vector];
data = hal_interrupt_data[vector];
// Call the ISR
isr( vector, data);
}
iot_irq_t iot_interrupt_create(uint32_t vector,
uint32_t priority,
iot_addrword_t data,
iot_isr_t *isr)
{
volatile iot_interrupt *intr;
intr = &g_intr_info[vector];
os_mem_set((void*)intr, 0x0, sizeof(iot_interrupt));
intr->vector = (uint8_t)vector;
intr->priority = (uint8_t)priority;
intr->cpu = cpu_get_mhartid();
intr->isr = isr;
intr->data = data;
return (iot_irq_t)intr;
}
void iot_interrupt_delete( iot_irq_t interrupt )
{
iot_interrupt_detach( interrupt );
}
void iot_interrupt_attach( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
uint32_t priority = intr->priority;
intc_set_priority( cpu, vector, priority );
if( hal_interrupt_handlers[vector] == (iot_addr_t)hal_default_isr ) {
hal_interrupt_handlers[vector] = (iot_addr_t)intr->isr;
hal_interrupt_data[vector] = (iot_addrword_t)intr->data;
}
}
void iot_interrupt_detach( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
if( hal_interrupt_handlers[vector] == (iot_addr_t)intr->isr ) {
hal_interrupt_handlers[vector] = (iot_addr_t)hal_default_isr;
hal_interrupt_data[vector] = 0;
}
}
void IRAM_ATTR iot_interrupt_mask( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
uint32_t old_ints;
old_ints = cpu_disable_irq();
intc_mask(cpu, vector);
cpu_enable_irq(old_ints);
}
void IRAM_ATTR iot_interrupt_unmask( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
uint32_t old_ints;
old_ints = cpu_disable_irq();
intc_unmask(cpu, vector);
cpu_enable_irq(old_ints);
}
void iot_interrupt_acknowledge( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
intc_ack(cpu, vector);
}
void iot_interrupt_configure( iot_irq_t interrupt, uint32_t level, uint32_t up)
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
intc_config( cpu, vector, level, up);
}
void iot_interrupt_priority( iot_irq_t interrupt, uint32_t priority )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
uint32_t vector = intr->vector;
uint32_t cpu = intr->cpu;
intc_set_priority( cpu, vector, priority);
}
void iot_interrupt_set_cpu( iot_irq_t interrupt, uint32_t cpu )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
intr->cpu = (uint8_t)cpu;
}
uint32_t iot_interrupt_get_cpu( iot_irq_t interrupt )
{
iot_interrupt *intr = (iot_interrupt *)interrupt;
return intr->cpu;
}
uint32_t iot_interrupt_init(uint32_t cpu)
{
uint32_t i;
intc_init(cpu);
for( i = 0; i < HAL_VECTOR_COUNT; i++ ){
hal_interrupt_handlers[i] = (iot_addr_t)hal_default_isr;
}
return 0;
}