200 lines
5.5 KiB
C
200 lines
5.5 KiB
C
#ifndef __HWI_H__
|
||
#define __HWI_H__
|
||
|
||
|
||
//=================================================
|
||
#define IRQ_EMUEXCPT_IDX 0
|
||
#define IRQ_EXCEPTION_IDX 1
|
||
#define IRQ_SYSCALL_IDX 2
|
||
#define IRQ_TICK_TMR_IDX 3
|
||
#define IRQ_TIME0_IDX 4
|
||
#define IRQ_TIME1_IDX 5
|
||
#define IRQ_TIME2_IDX 6
|
||
#define IRQ_UART0_IDX 7
|
||
#define IRQ_UART1_IDX 8
|
||
|
||
#define IRQ_SPI1_IDX 10
|
||
#define IRQ_IIC0_IDX 11
|
||
#define IRQ_PORT_IDX 12
|
||
#define IRQ_GPADC_IDX 13
|
||
#define IRQ_UART2_IDX 14
|
||
#define IRQ_LRCT_IDX 15
|
||
|
||
#define IRQ_GPCNT0_IDX 16
|
||
#define IRQ_QDEC0_IDX 17
|
||
#define IRQ_SD0_IDX 18
|
||
#define IRQ_USB_SOF_IDX 19
|
||
#define IRQ_USB_CTRL_IDX 20
|
||
|
||
#define IRQ_TIME3_IDX 22
|
||
#define IRQ_LED_IDX 23
|
||
#define IRQ_SD0_BRK_IDX 24
|
||
#define IRQ_MCPWM_TMR_IDX 25
|
||
#define IRQ_MCPWM_CHX_IDX 26
|
||
#define IRQ_PMU_TMR0_IDX 27
|
||
#define IRQ_PMU_TMR1_IDX 28
|
||
|
||
#define IRQ_SPI2_IDX 31
|
||
|
||
#define IRQ_P33_IDX 33
|
||
#define IRQ_PINR_IDX 34
|
||
#define IRQ_PMU_SOFT0_IDX 35
|
||
#define IRQ_PMU_SOFT1_IDX 36
|
||
#define IRQ_PMU_SOFT2_IDX 37
|
||
#define IRQ_PMU_SOFT3_IDX 38
|
||
|
||
#define IRQ_PMU_TMR2_IDX 40
|
||
#define IRQ_PMU_TMR3_IDX 41
|
||
|
||
#define IRQ_SRC0_IDX 66
|
||
#define IRQ_SPI0_IDX 68
|
||
|
||
#define IRQ_DCP_IDX 70
|
||
|
||
#define IRQ_DBI_IDX 72
|
||
#define IRQ_JPG_IDX 73
|
||
#define IRQ_GPU_IDX 74
|
||
|
||
#define IRQ_ADC_IDX 88
|
||
#define IRQ_AUDIO_IDX 89
|
||
|
||
#define IRQ_BT_TIMEBASE_IDX 100
|
||
#define IRQ_BLE_RX_IDX 101
|
||
#define IRQ_BLE_EVENT_IDX 102
|
||
#define IRQ_BT_CLKN_IDX 103
|
||
#define IRQ_BREDR_IDX 104
|
||
#define IRQ_BT_RXMCH 105
|
||
#define IRQ_SYNC_IDX 106
|
||
|
||
#define IRQ_SOFT0_IDX 120
|
||
#define IRQ_SOFT1_IDX 121
|
||
#define IRQ_SOFT2_IDX 122
|
||
#define IRQ_SOFT3_IDX 123
|
||
#define IRQ_SOFT4_IDX 124
|
||
#define IRQ_SOFT5_IDX 125
|
||
#define IRQ_SOFT6_IDX 126
|
||
#define IRQ_SOFT7_IDX 127
|
||
|
||
#define MAX_IRQ_ENTRY_NUM 128
|
||
|
||
//=================================================
|
||
|
||
//=================================================
|
||
void interrupt_init();
|
||
|
||
/* --------------------------------------------------------------------------*/
|
||
/**
|
||
* @brief 中断注册函数
|
||
*
|
||
* @param index 中断号
|
||
* @param priority 优先级,范围0-6可用
|
||
* @param handler 中断服务函数
|
||
* @param cpu_id 相应中断服务函数的CPU
|
||
*/
|
||
/* ----------------------------------------------------------------------------*/
|
||
void request_irq(u8 index, u8 priority, void (*handler)(void), u8 cpu_id);
|
||
|
||
void unrequest_irq(u8 index);
|
||
|
||
void reg_set_ip(unsigned char index, unsigned char priority, u8 cpu_id);
|
||
|
||
/* --------------------------------------------------------------------------*/
|
||
/**
|
||
* @brief 设置不可屏蔽中断(不可屏蔽中断不区分优先级)
|
||
* cpu多核同步默认使用0,其他使用1。
|
||
*
|
||
* @param index 中断号
|
||
* @param priority 不可屏蔽优先级,范围 0、1 (CPU_IRQ_IPMASK_LEVEL == 6)
|
||
* @param cpu_id 相应中断服务函数的CPU
|
||
*/
|
||
/* ----------------------------------------------------------------------------*/
|
||
void irq_unmask_set(u8 index, u8 priority, u8 cpu_id);
|
||
|
||
/* --------------------------------------------------------------------------*/
|
||
/**
|
||
* @brief 取消不可屏蔽中断
|
||
* cpu多核同步默认使用0,其他使用1。
|
||
*
|
||
* @param index 中断号
|
||
* @param priority 不可屏蔽优先级,范围 0、1、2、3、4、5
|
||
* @param cpu_id 相应中断服务函数的CPU
|
||
*/
|
||
/* ----------------------------------------------------------------------------*/
|
||
void irq_unmask_unset(u8 index, u8 priority, u8 cpu_id);
|
||
|
||
void bit_clr_ie(unsigned char index);
|
||
void bit_set_ie(unsigned char index);
|
||
bool irq_read(u32 index);
|
||
|
||
#define irq_disable(x) bit_clr_ie(x)
|
||
#define irq_enable(x) bit_set_ie(x)
|
||
|
||
void unmask_enter_critical(void);
|
||
void unmask_exit_critical(void);
|
||
|
||
//---------------------------------------------//
|
||
// low power waiting
|
||
//---------------------------------------------//
|
||
__attribute__((always_inline))
|
||
static inline void lp_waiting(int *ptr, int pnd, int cpd, char inum)
|
||
{
|
||
#if 0
|
||
q32DSP(core_num())->IWKUP_NUM = inum;
|
||
while (!(*ptr & pnd)) {
|
||
asm volatile("idle");
|
||
}
|
||
*ptr |= cpd;
|
||
#else
|
||
int con;
|
||
q32DSP(core_num())->IWKUP_NUM = inum;
|
||
asm volatile(
|
||
" goto 2f \n\t"
|
||
" 1: \n\t"
|
||
" idle \n\t"
|
||
" 2: \n\t"
|
||
" %0 = [%1] \n\t"
|
||
" rep 1 { \n\t" // disable_bpu
|
||
" if((%0 & %2)==0) goto 1b \n\t"
|
||
" } \n\t"
|
||
:"=&r"(con)
|
||
:"r"(ptr), "r"(pnd), "0"(con)
|
||
:
|
||
);
|
||
*ptr = con | cpd;
|
||
#endif
|
||
}
|
||
|
||
//---------------------------------------------//
|
||
// interrupt cli/sti
|
||
//---------------------------------------------//
|
||
|
||
static inline int int_cli(void)
|
||
{
|
||
int msg;
|
||
asm volatile("cli %0" : "=r"(msg) :);
|
||
return msg;
|
||
}
|
||
|
||
static inline void int_sti(int msg)
|
||
{
|
||
asm volatile("sti %0" :: "r"(msg));
|
||
}
|
||
|
||
#ifdef IRQ_TIME_COUNT_EN
|
||
void irq_handler_enter(int irq);
|
||
|
||
void irq_handler_exit(int irq);
|
||
|
||
void irq_handler_times_dump();
|
||
#else
|
||
|
||
#define irq_handler_enter(irq) do { }while(0)
|
||
#define irq_handler_exit(irq) do { }while(0)
|
||
#define irq_handler_times_dump() do { }while(0)
|
||
|
||
#endif
|
||
|
||
|
||
#endif
|
||
|