📄 isr.c
字号:
/*
* File: isr.c
*/
#if !defined(__UART_H__)
#include "uart.h"
#endif
#if !defined(__ISR_H__)
#include "isr.h"
#endif
/*--------------------- Static Definitions ------------------------*/
#define IISR_MAX_HNDLR 21
/*--------------------- Static Types ------------------------------*/
/*--------------------- Static Macros -----------------------------*/
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
/*--------------------- Static Functions --------------------------*/
/*--------------------- Export Variables --------------------------*/
PFN_HOOK INTR_apfnIntrHandler[IISR_MAX_HNDLR] = {
IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler,
IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler,
IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler,
IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler,
IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler, IISR_vDummyHandler,
IISR_vDummyHandler
};
void INTR_vInit (void)
{
// Clear All interrupt
ASIC_INT_MASK = MASK_ALL & (~MASK_GLOBAL_INT); // All interrupt disabled except global bit
ASIC_INT_PEND = PEND_CLSALL; // All pending clear
ASIC_INT_MODE = 0; // All set to IRQ mode
}
PFN_HOOK INTR_vGetHandler (UINT8 u8Vector)
{
return INTR_apfnIntrHandler[u8Vector];
}
// Setup Interrupt Handler Vector Table
void INTR_vSetHandler (UINT8 u8Vector, PFN_HOOK pfnHandler)
{
INTR_apfnIntrHandler[u8Vector] = pfnHandler;
}
//
// Interrupt Handler Dummy Function
//
void IISR_vDummyHandler (void)
{
}
//
// Exception Handler Function
//
void EISR_ExcptHndlr_Undef (PUINT8 pu8RegAdr)
{
UART_iPrintk("\nUndef Instruction Address : %08x", (UINT32)(pu8RegAdr - 4));
UART_iPrintk(" Data : %08x", *(pu8RegAdr - 4));
do {} while (1);
}
void EISR_ExcptHndlr_Prefetch (PUINT8 pu8RegAdr)
{
UART_iPrintk("\nPrefetch Abort Address : %08x", (UINT32)(pu8RegAdr - 4));
UART_iPrintk(" Data : %08x", *(pu8RegAdr - 4));
do {} while (1);
}
void EISR_ExcptHndlr_Abort (PUINT8 pu8RegAdr)
{
UART_iPrintk("\nData Abort Address : %08x", (UINT32)(pu8RegAdr - 8));
UART_iPrintk(" Data : %08x", *(pu8RegAdr - 8));
do {} while (1);
}
void EISR_ExcptHndlr_Irq (void)
{
INT ii;
UINT32 u32PendBits, u32IntNo;
// get pending bits
u32PendBits = ASIC_INT_PEND;
// clear pending bit
ASIC_INT_PEND = u32PendBits;
// don't process those bits that is mask out
u32PendBits &= ~ASIC_INT_MASK;
for (ii = (IISR_MAX_HNDLR - 1); ii >= 0; ii--) {
u32IntNo = 0x00000001 << ii;
if ((u32PendBits & u32IntNo) != 0) {
// Call interrupt service routine
INTR_apfnIntrHandler[ii]();
}
}
}
void EISR_ExcptHndlr_Fiq (void)
{
INT ii;
UINT32 u32PendBits, u32IntNo;
// get pending bits
u32PendBits = ASIC_INT_PEND;
// clear pending bit
ASIC_INT_PEND = u32PendBits;
// don't process those bits that is mask out
u32PendBits &= ~ASIC_INT_MASK;
for (ii = (IISR_MAX_HNDLR - 1); ii >= 0; ii--) {
u32IntNo = 0x00000001 << ii;
if ((u32PendBits & u32IntNo) != 0) {
// Call interrupt service routine
INTR_apfnIntrHandler[ii]();
}
}
}
void INTR_vSwitchEnable (void)
{
ASIC_INT_MASK &= ~MASK_EXT0_INT;
}
void INTR_vSwitchDisable (void)
{
ASIC_INT_MASK |= MASK_EXT0_INT;
}
void INTR_vSwitchDma0Enable (void)
{
ASIC_INT_MASK &= ~MASK_GDMA0_INT;
}
void INTR_vSwitchDma0Disable (void)
{
ASIC_INT_MASK |= MASK_GDMA0_INT;
}
void INTR_vCriticalSectionEnter (void)
{
ASIC_INT_MASK |= MASK_GLOBAL_INT;
}
void INTR_vCriticalSectionLeave (void)
{
ASIC_INT_MASK &= ~MASK_GLOBAL_INT;
}
void INTR_vDisable (void)
{
// disabled all interrupt
ASIC_INT_MASK = MASK_ALL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -