/** | |
* @file drvs_int.h | |
* @brief Public APIs of int drivers | |
* | |
* Copyright (C) 2017 Sanechips Technology Co., Ltd. | |
* @author Dongdong Zhang <Zhang.Dongdong@sanechips.com.cn> | |
* | |
* This program is free software; you can redistribute it and/or modify | |
* it under the terms of the GNU General Public License version 2 as | |
* published by the Free Software Foundation. | |
* | |
*/ | |
#ifndef _DRVS_INT_H | |
#define _DRVS_INT_H | |
/******************************************************************************* | |
* Include header files * | |
******************************************************************************/ | |
#include "drvs_general.h" | |
#ifdef _OS_LINUX | |
#include <linux/irq.h> | |
#endif | |
/******************************************************************************* | |
* Macro definitions * | |
******************************************************************************/ | |
#define INT_PRI_NUM 15 /* 0-highest, 15-lowest, but 15 is always be masked in gic*/ | |
/*so in fact, only 0-14 can generate interrupt*/ | |
#define MAX_NEST_NUM 32 /* maximum number of nested interrupt */ | |
#define INT_TABLE_END 0xFFFF | |
#define INT_VECTOR_DEFAULT 0xFFFF | |
#define INT_PRIORITY_DEFAULT 14 | |
#define INT_INVALID_INTLINE 0xFFFFFFFF | |
#if 1//modify by xxx ndef _OS_LINUX | |
/* | |
* 0-15: SGI (software generated interrupts) | |
* 16-31: PPI (private peripheral interrupts) | |
* 32+: SPI (shared peripheral interrupts) | |
*/ | |
#define GIC_PPI_START 16 | |
#define GIC_SPI_START 32 | |
#define RESERVED_INT 0xffff | |
/* | |
* software generated interrupts | |
*/ | |
#define SGI0_INT (0) | |
#define SGI1_INT (1) | |
#define SGI2_INT (2) | |
#define SGI3_INT (3) | |
#define SGI4_INT (4) | |
#define SGI5_INT (5) | |
#define SGI6_INT (6) | |
#define SGI7_INT (7) | |
#define SGI8_INT (8) | |
#define SGI9_INT (9) | |
#define SGI10_INT (10) | |
#define SGI11_INT (11) | |
#define SGI12_INT (12) | |
#define SGI13_INT (13) | |
#define SGI14_INT (14) | |
#define SGI15_INT (15) | |
/* | |
* private peripheral interrupts | |
*/ | |
#define GLOBAL_TIMER_INT (27) | |
#define LEGACY_FIQ_INT (28) | |
#define PRIVATE_TIMER_INT (29) | |
#define PRIVATE_WDT_INT (30) | |
#define LEGACY_IRQ_INT (31) | |
/* | |
* shared peripheral interrupts | |
*/ | |
#define UART0_INT (GIC_SPI_START+0) | |
#define UART1_INT (GIC_SPI_START+1) | |
#define UART2_INT (GIC_SPI_START+2) | |
#define SSP0_INT (GIC_SPI_START+3) | |
#define PS_SYS_COUNTER (GIC_SPI_START+4) | |
#define RTC_ALARM_INT (GIC_SPI_START+5) | |
#define RTC_TIMER_INT (GIC_SPI_START+6) | |
#define I2S0_INT (GIC_SPI_START+7) | |
#define I2S1_INT (GIC_SPI_START+8) | |
#define USIM1_INT (GIC_SPI_START+9) | |
#define I2C1_INT (GIC_SPI_START+10) | |
#define PMIC_I2C_INT (GIC_SPI_START+11) | |
#define KEYPAD_INT (GIC_SPI_START+12) | |
#define SD1_INT (GIC_SPI_START+13) | |
#define WLAN_PRIORITY_POS_INT (GIC_SPI_START+14) | |
#define WLAN_PRIORITY_NEG_INT (GIC_SPI_START+15) | |
#define SD0_INT (GIC_SPI_START+16) | |
#define ICP_PHY_INT (GIC_SPI_START+17) | |
#define ICP_M0_INT (GIC_SPI_START+18) | |
#define TIMER0_INT (GIC_SPI_START+19) /*ps timer0*/ | |
#define TIMER1_INT (GIC_SPI_START+20) /*ps timer1*/ | |
#define PS_RM_TIMER_INT (GIC_SPI_START+21) /*ps rm timer*/ | |
#define GSMIF_RFSSCR_INT (GIC_SPI_START+22) | |
#define GSMIF_RFSSCT_INT (GIC_SPI_START+23) | |
#define GSMIF_GP0_INT (GIC_SPI_START+24) | |
#define GSMIF_T_INT (GIC_SPI_START+25) | |
#define GSMIF_TL_INT (GIC_SPI_START+26) | |
#define GPRS_INT0 (GIC_SPI_START+27) | |
#define GPRS_INT1 (GIC_SPI_START+28) | |
#define DSP_INT0 (GIC_SPI_START+29) | |
#define DSP_INT1 (GIC_SPI_START+30) | |
#define DSP_INT2 (GIC_SPI_START+31) | |
#define DSP_INT3 (GIC_SPI_START+32) | |
#define DSP_INT4 (GIC_SPI_START+33) | |
#define DSP_INT6 (GIC_SPI_START+34) | |
#define DSP_INT7 (GIC_SPI_START+35) | |
#define GSM_LPM_INT0 (GIC_SPI_START+36) | |
#define RCOUT1_INT (GIC_SPI_START+37) | |
#define DMAC0_INT (GIC_SPI_START+38) /*ps dma int1 to ps*/ | |
#define DMAC1_INT (GIC_SPI_START+39) /*phy dma int1 to ps*/ | |
#define NAND_INT (GIC_SPI_START+40) | |
#define USB_INT (GIC_SPI_START+41) | |
#define USB_POWERDWN_UP_INT (GIC_SPI_START+42) | |
#define USB_POWERDWN_DOWN_INT (GIC_SPI_START+43) | |
#define HSIC_INT (GIC_SPI_START+44) | |
#define HSIC_POWERDWN_UP_INT (GIC_SPI_START+45) | |
#define HSIC_POWERDWN_DOWN_INT (GIC_SPI_START+46) | |
#define GSM_USIM_INT (GIC_SPI_START+48) | |
#define EX8IN1_INT (GIC_SPI_START+51) /*only used by int driver*/ | |
#define EX0_INT (GIC_SPI_START+52) | |
#define EX1_INT (GIC_SPI_START+53) | |
#define EX2_INT (GIC_SPI_START+54) | |
#define EX3_INT (GIC_SPI_START+55) | |
#define EX4_INT (GIC_SPI_START+56) | |
#define EX5_INT (GIC_SPI_START+57) | |
#define EX6_INT (GIC_SPI_START+58) | |
#define EX7_INT (GIC_SPI_START+59) | |
#define SSC0_CONFLICT_INT (GIC_SPI_START+60) | |
#define TD_LPM4_INT (GIC_SPI_START+61) | |
#define TD_FRM_INT (GIC_SPI_START+62) | |
#define TD_FRM32K_INT (GIC_SPI_START+63) | |
#define LTE_LPM2_INT (GIC_SPI_START+64) | |
#define LTE_LPM4_INT (GIC_SPI_START+65) | |
#define LTE_LPM5_INT (GIC_SPI_START+66) | |
#define GSM_LPM_INT1 (GIC_SPI_START+67) | |
#define LTE_TPU_INT (GIC_SPI_START+68) | |
#define WD_LPM4_INT (GIC_SPI_START+69) | |
#define WD_FRM_INT (GIC_SPI_START+70) | |
#define EDCP_INT (GIC_SPI_START+71) | |
#define SD1_DATA1_INT (GIC_SPI_START+72) | |
#if defined (_CHIP_ZX297520V3) | |
#define UART0_RXD_INT (GIC_SPI_START+73) | |
#elif defined (_CHIP_ZX297520V2) | |
#define UART0_CTS_INT (GIC_SPI_START+73) | |
#endif | |
#define SPIFC0_INT (GIC_SPI_START+74) | |
#define TIMER2_INT (GIC_SPI_START+75) /*ps timer2*/ | |
#define PS_WDT_INT (GIC_SPI_START+76) | |
#define ICP_AP_INT (GIC_SPI_START+77) | |
#define SSP1_INT (GIC_SPI_START+78) | |
#define SD0_DATA1_INT (GIC_SPI_START+79) | |
#define TDM_INT (GIC_SPI_START+80) | |
#define PHY_TIMER0_INT (GIC_SPI_START+81) | |
#define PHY_TIMER1_INT (GIC_SPI_START+82) | |
#define TD_MODEM_INT0 (GIC_SPI_START+83) | |
#define TD_MODEM_INT1 (GIC_SPI_START+84) | |
#define TD_MODEM_INT2 (GIC_SPI_START+85) | |
#define LTE_MODEM_INT0 (GIC_SPI_START+86) | |
#define LTE_MODEM_INT1 (GIC_SPI_START+87) | |
#define LTE_MODEM_INT2 (GIC_SPI_START+88) | |
#define WD_MODEM_INT0 (GIC_SPI_START+89) | |
#define WD_MODEM_INT1 (GIC_SPI_START+90) | |
#define WD_MODEM_INT2 (GIC_SPI_START+91) | |
#define TD_LPM_ZSP_EXT_INT (GIC_SPI_START+92) | |
#define LTE_LPM1_INT (GIC_SPI_START+93) | |
#define WD_LPM3_INT (GIC_SPI_START+94) | |
#define EDCP_PHY_INT (GIC_SPI_START+95) | |
#define GIC_INT_NUM (EDCP_PHY_INT+1) | |
/*virtual external 8in1 interrupts*/ | |
#define EX8_INT (GIC_SPI_START+96) | |
#define EX9_INT (GIC_SPI_START+97) | |
#define EX10_INT (GIC_SPI_START+98) | |
#define EX11_INT (GIC_SPI_START+99) | |
#define EX12_INT (GIC_SPI_START+100) | |
#define EX13_INT (GIC_SPI_START+101) | |
#define EX14_INT (GIC_SPI_START+102) | |
#define EX15_INT (GIC_SPI_START+103) | |
#define EX8IN1_INT_NUM (8) | |
#define INT_LINES_NUM (EX15_INT+1) | |
#if 0 /*7520V2 reserved*/ | |
/* | |
*virtual gpio interrupts | |
*interrupt number should be defined by user | |
*example: | |
* #define GPIO23_INT (GPIO_INT0_START+23) | |
* #define GPIO130_INT (GPIO_INT1_START+3) or (GPIO_INT0_START+130) | |
*/ | |
/* | |
*gpio0 --- GPIO_INT0_START | |
*gpio127 --- GPIO_INT0_END | |
*/ | |
#define GPIO_INT0_START (EX15_INT+1) | |
#define GPIO_INT0_END (GPIO_INT0_START+127) | |
/* | |
*gpio128 --- GPIO_INT1_START | |
*gpio255 --- GPIO_INT1_END | |
*/ | |
#define GPIO_INT1_START (GPIO_INT0_END+1) | |
#define GPIO_INT1_END (GPIO_INT1_START+127) | |
#define INT_LINES_NUM (GPIO_INT1_END + 1) /*ÖжϸöÊý*/ | |
#endif | |
#endif | |
/******************************************************************************* | |
* Type definitions * | |
******************************************************************************/ | |
typedef struct _T_zDrvIntTable | |
{ | |
UINT32 uIntLine; /*the intline of the dev*/ | |
UINT32 uIntPri; /*hardware priority*/ | |
UINT32 vector; /*OSE vector,should be convert to type OSVECTOR */ | |
UINT32 level; /*CPU trigger level*/ | |
} | |
T_zDrvIntTable; | |
#ifdef _OS_TOS | |
typedef enum _T_zDrvIntLineLevel | |
{ | |
INT_HIGHLEVEL = 0x00, /* 00: high level */ | |
INT_LOWLEVEL = 0x01, /* 01: low level */ | |
INT_POSEDGE = 0x02, /* 10: raise edge */ | |
INT_NEGEDGE = 0x03, /* 11: fall edge */ | |
INT_DEFAULT_LEVEL, | |
} | |
T_zDrvIntLineLevel; | |
#endif | |
#ifdef _OS_LINUX | |
typedef enum _T_zDrvIntLineLevel | |
{ | |
INT_HIGHLEVEL = IRQ_TYPE_LEVEL_HIGH, /* 0x4: high level */ | |
INT_LOWLEVEL = IRQ_TYPE_LEVEL_LOW, /* 0x8: low level */ | |
INT_POSEDGE = IRQ_TYPE_EDGE_RISING, /* 0x1: raise edge */ | |
INT_NEGEDGE = IRQ_TYPE_EDGE_FALLING, /* 0x2: fall edge */ | |
INT_DUALEDGE = IRQ_TYPE_EDGE_BOTH, /* 0x3: fall and raise edge, it can only be applyed to GPIO int */ | |
INT_DEFAULT_LEVEL = 0xf, | |
} | |
T_zDrvIntLineLevel; | |
#endif | |
/******************************************************************************* | |
* Global function declarations * | |
******************************************************************************/ | |
/** | |
*@brief This function is used to install isr into tos | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param pEntry the point to isr entry | |
*@param pName isr name | |
*@param level int line trigger level | |
* | |
*@note the level is source trigger level. if you don't know the int trigger level, you can set the level:INT_DEFAULT_LEVEL. | |
* | |
*@return id of interrupt handler process if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_InstallIsr(UINT32 line, VOID *pEntry, const CHAR * pName, | |
T_zDrvIntLineLevel level); | |
/** | |
*@brief This function is used to uninstall isr | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_UninstallIsr(UINT32 line); | |
/** | |
*@brief This function is used to mask irq | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
VOID zDrvInt_MaskIrq(UINT32 line); | |
/** | |
*@brief This function is used to unmask irq | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
VOID zDrvInt_UnmaskIrq(UINT32 line); | |
/** | |
*@brief This function is used to set int trigger level | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param level int line trigger level | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_SetLineLevel(UINT32 line, T_zDrvIntLineLevel level); | |
/** | |
*@brief This function is used to clear int status | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_ClearInt(UINT32 line); | |
/** | |
*@brief This function is used to set int priority | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param pri priority number | |
* | |
*@return 0 if successed, errcode otherwise. | |
*/ | |
VOID zDrvInt_SetLinePri(UINT32 line, UINT32 pri); | |
#ifdef _OS_LINUX | |
/** | |
*@brief This function is used to install isr into linux | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param pEntry the point to isr entry | |
*@param pName isr name | |
*@param level int line trigger level | |
* | |
*@note the level is source trigger level. if you don't know the int trigger level, you can set the level:INT_DEFAULT_LEVEL. | |
* | |
*@return id of interrupt handler process if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_InstallFastIsr( UINT32 uiLine, VOID *pEntry, const CHAR * pName, | |
T_zDrvIntLineLevel level); | |
/** | |
*@brief This function is used to install nested isr for interrupt line uiLine. | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param pEntry the point to isr entry | |
*@param pName isr name | |
* | |
*@return id of interrupt handler process if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_InstallNestedIsr( UINT32 uiLine, VOID *pEntry, const CHAR * pName); | |
#endif | |
#ifdef _OS_TOS | |
/** | |
*@brief This function is used to install isr into tos | |
*@param line interrupt line(0--INT_LINES_NUM) | |
*@param pEntry the point to isr entry | |
*@param pName isr name | |
*@param level int line trigger level | |
* | |
*@note the level is source trigger level. if you don't know the int trigger level, you can set the level:INT_DEFAULT_LEVEL. | |
* | |
*@return id of interrupt handler process if successed, errcode otherwise. | |
*/ | |
SINT32 zDrvInt_InstallIsrDsr(UINT32 line, VOID *pIsrEntry, | |
VOID *pDsrEntry, T_zDrvIntLineLevel level); | |
/** | |
*@brief This function is used to distinguish whether this interrupt need to delay umask or not | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@note invoked by os. | |
* | |
*@return 0 if need to delay umask; 1 otherwise. | |
*/ | |
SINT32 zDrvInt_DelayUnmask(UINT32 intLine); | |
/** | |
*@brief This function is used to initiate interrupt controller, can only be used when system bringing up | |
* | |
*@param none. | |
* | |
*@return none. | |
*/ | |
VOID zDrvInt_Initiate(VOID); | |
/** | |
*@brief This function is used to delay unmask an interrupt when isr is completed. | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@note it must be used before installing irq, and you should unmask this int manually after isr is completed. | |
* | |
*@return none. | |
*/ | |
VOID zDrvInt_DelayUnmaskAdd(UINT32 intLine); | |
/** | |
*@brief This function is used to remove the delay unmask function for an interrupt. | |
*@param line interrupt line(0--INT_LINES_NUM) | |
* | |
*@return none. | |
*/ | |
VOID zDrvInt_DelayUnmaskRemove(UINT32 intLine); | |
#endif | |
#endif /* DRVS_INT_H */ |