根据SOC Addr 去定义一个相关结构体,取得硬件中断信息。
#define INTCON (*(volatile intcon_t *) MAKE_IMU_REG(GFX_IMU_PIC_INT_MASK))
#define MAKE_IMU_REG(reg) (PIF_BASE_ADDRESS + (mm##reg))
typedef struct {
uint32_t InterruptMask;
uint32_t InterruptLevel;
uint32_t InterruptEdge;
uint8_t InterruptPriority[NUM_INTCON_INPUTS];
uint32_t InterruptPending;
uint32_t InterruptLine;
uint32_t InterruptID;
} intcon_t;
union GFX_IMU_PIC_INT_MASK {
struct {
#if defined(LITTLEENDIAN_CPU)
uint32_t MASK_0 : 1;
uint32_t MASK_1 : 1;
uint32_t MASK_2 : 1;
uint32_t MASK_3 : 1;
uint32_t MASK_4 : 1;
uint32_t MASK_5 : 1;
uint32_t MASK_6 : 1;
uint32_t MASK_7 : 1;
uint32_t MASK_8 : 1;
uint32_t MASK_9 : 1;
uint32_t MASK_10 : 1;
uint32_t MASK_11 : 1;
uint32_t MASK_12 : 1;
uint32_t MASK_13 : 1;
uint32_t MASK_14 : 1;
uint32_t MASK_15 : 1;
uint32_t MASK_16 : 1;
uint32_t MASK_17 : 1;
uint32_t MASK_18 : 1;
uint32_t MASK_19 : 1;
uint32_t MASK_20 : 1;
uint32_t MASK_21 : 1;
uint32_t MASK_22 : 1;
uint32_t MASK_23 : 1;
uint32_t MASK_24 : 1;
uint32_t MASK_25 : 1;
uint32_t MASK_26 : 1;
uint32_t MASK_27 : 1;
uint32_t MASK_28 : 1;
uint32_t MASK_29 : 1;
uint32_t MASK_30 : 1;
uint32_t MASK_31 : 1;
#elif defined(BIGENDIAN_CPU)
uint32_t MASK_31 : 1;
uint32_t MASK_30 : 1;
uint32_t MASK_29 : 1;
uint32_t MASK_28 : 1;
uint32_t MASK_27 : 1;
uint32_t MASK_26 : 1;
uint32_t MASK_25 : 1;
uint32_t MASK_24 : 1;
uint32_t MASK_23 : 1;
uint32_t MASK_22 : 1;
uint32_t MASK_21 : 1;
uint32_t MASK_20 : 1;
uint32_t MASK_19 : 1;
uint32_t MASK_18 : 1;
uint32_t MASK_17 : 1;
uint32_t MASK_16 : 1;
uint32_t MASK_15 : 1;
uint32_t MASK_14 : 1;
uint32_t MASK_13 : 1;
uint32_t MASK_12 : 1;
uint32_t MASK_11 : 1;
uint32_t MASK_10 : 1;
uint32_t MASK_9 : 1;
uint32_t MASK_8 : 1;
uint32_t MASK_7 : 1;
uint32_t MASK_6 : 1;
uint32_t MASK_5 : 1;
uint32_t MASK_4 : 1;
uint32_t MASK_3 : 1;
uint32_t MASK_2 : 1;
uint32_t MASK_1 : 1;
uint32_t MASK_0 : 1;
#endif
} bitfields, bits;
uint32_t u32All;
int32_t i32All;
float f32All;
};
当中断函数发生时,可以用中断函数表来调用相应的中断函数:
typedef void (*IsrPtr)(void);
IsrPtr IsrPICTable[NUM_INTCON_INPUTS];
IsrPICTableCurrentInterruptID;
IsrPtr IsrPICTable[NUM_INTCON_INPUTS] = {
&UnassignedIsr, // 0
&UnassignedIsr, // 1
&UnassignedIsr, // 2
&UnassignedIsr, // 3
&UnassignedIsr, // 4
&UnassignedIsr, // 5
&UnassignedIsr, // 6
&UnassignedIsr, // 7
&UnassignedIsr, // 8
&UnassignedIsr, // 9
&UnassignedIsr, // 10
&UnassignedIsr, // 11
&UnassignedIsr, // 12
&UnassignedIsr, // 13
&UnassignedIsr, // 14
&UnassignedIsr, // 15
&UnassignedIsr, // 16
&UnassignedIsr, // 17
&UnassignedIsr, // 18
&UnassignedIsr, // 19
&UnassignedIsr, // 20
&UnassignedIsr, // 21
&UnassignedIsr, // 22
&UnassignedIsr, // 23
&UnassignedIsr, // 24
&UnassignedIsr, // 25
&UnassignedIsr, // 26
&UnassignedIsr, // 27
&UnassignedIsr, // 28
&UnassignedIsr, // 29
&UnassignedIsr, // 30
&UnassignedIsr, // 31
};
typedef struct {
int8_t InterruptId; // Interrupt ID of this interrupt level
uint8_t IntrDefaultStatus; // Interrupt on by default PIC_DEFAULT_INTR_e
uint8_t IntrTriggerType; // level or edge, PIC_TRIGGER_TYPE_e
//uint8_t IntrClearType; // Clear interrupt before being processed, PIC_INTR_CLEAR_TYPE_e
uint8_t Reserved;
IsrPtr IsrHandler;
} InterruptConfig_t;
const InterruptConfig_t InterruptConfig[] =
{
{ .InterruptId = PIC_LOCAL_DOORBELL_GFXOFF, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrGfxDoorbellHandler },
{ .InterruptId = PIC_RLC_TO_IMU_MSG, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrRLCMsg },
{ .InterruptId = PIC_GFX_ACCESS_GFXOFF, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrGfxAccessViolation },
{ .InterruptId = PIC_C2PMSG0, .IntrDefaultStatus = PIC_DEFAULT_INTR_ON, .IntrTriggerType = PIC_TRIGGER_EDGE, .IsrHandler = &IsrMP1Msg },
{ .InterruptId = INTERRUPT_CONFIG_LIST_TERMINATOR, }, // Termination token (zero taken for PIC[0])
};
for (i = 0; INTERRUPT_CONFIG_LIST_TERMINATOR != InterruptConfig[i].InterruptId; i++) {
InterruptID = (uint32_t) InterruptConfig[i].InterruptId; //casting is safe, only negative value should be INTERRUPT_CONFIG_LIST_TERMINATOR
RegisterPicInterrupt(InterruptID, InterruptConfig[i].IntrDefaultStatus, InterruptConfig[i].IntrTriggerType, InterruptConfig[i].IsrHandler);
}