初始提交
This commit is contained in:
174
driver/src/hal/irq.c
Executable file
174
driver/src/hal/irq.c
Executable file
@@ -0,0 +1,174 @@
|
||||
/****************************************************************************
|
||||
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user