isr.c
来自「source code of armboot for s3c4510」· C语言 代码 · 共 186 行
C
186 行
/*
* File: isr.c
*/
#if !defined(__ISR_H__)
#include "isr.h"
#endif
#if !defined(__DEVICE_H__)
#include "device.h"
#endif
#include "armboot.h"
/*--------------------- Static Definitions ------------------------*/
#define IISR_MAX_HNDLR 36
/*--------------------- Static Types ------------------------------*/
/*--------------------- Static Macros -----------------------------*/
/*--------------------- Static Classes ----------------------------*/
/*--------------------- Static Variables --------------------------*/
/*--------------------- Static Functions --------------------------*/
/*--------------------- Export Variables --------------------------*/
#if 0
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, 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)
{
#ifndef __OS_LINUX
// Mask All interrupt
ASIC_INT_INTMASK = INTMASK_ALL; // All interrupt disabled except global bit
ASIC_INT_EXTMASK = EXTMASK_ALL & (~MASK_GLOBAL_INT); // All interrupt disabled except global bit
#endif
// Clear pending interrupt (internal and external)
ASIC_INT_INTTST = 0x0;
ASIC_INT_EXTTST = 0x0;
// disable all PCI interrupt for preventing system hang up
ASIC_PCI_PCIINTEN = 0;
// clear all pending interrupt
ASIC_PCI_PCIINTST = PCIINTST_ALL_CLR;
ASIC_INT_INTMOD = 0; // All set to IRQ mode
ASIC_INT_EXTMOD = 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)
{
printf("\nUndef Instruction Address : %08x", (UINT32)(pu8RegAdr - 4));
printf(" Data : %08x", *((PUINT32)(pu8RegAdr - 4)));
do {} while (1);
}
void EISR_ExcptHndlr_Prefetch (PUINT8 pu8RegAdr)
{
printf("\nPrefetch Abort Address : %08x", (UINT32)(pu8RegAdr - 4));
printf(" Data : %08x", *((PUINT32)(pu8RegAdr - 4)));
do {} while (1);
}
void EISR_ExcptHndlr_Abort (PUINT8 pu8RegAdr)
{
printf("\nData Abort Address : %08x", (UINT32)(pu8RegAdr - 8));
printf(" Data : %08x", *((PUINT32)(pu8RegAdr - 8)));
do {} while (1);
}
void EISR_ExcptHndlr_Irq (void)
{
// ASIC_INT_OFFSET_IRQ will have the IRQ Offset that need to serve, and those mask out won't be here
// Need to clear the interrupt in each ISR block.
while (ASIC_INT_OFFSET_IRQ != INT_OFFSET_NOINT)
INTR_apfnIntrHandler[ASIC_INT_OFFSET_IRQ]();
}
void EISR_ExcptHndlr_Fiq (void)
{
// ASIC_INT_OFFSET_FIQ will have the IRQ Offset that need to serve, and those mask out won't be here
// Need to clear the interrupt in each ISR block.
while (ASIC_INT_OFFSET_FIQ != INT_OFFSET_NOINT)
INTR_apfnIntrHandler[ASIC_INT_OFFSET_FIQ]();
}
#endif
void INTR_vSwitchEnable (void)
{
#ifdef __SWITCH_CPUIF_PCI
ASIC_INT_INTMASK &= ~MASK_PCI_H_INT;
ASIC_PCI_PCIINTEN |= PCI_PCIINTEN_INA;
#else // local bus
ASIC_INT_EXTMASK &= ~(1 << VEC_EXT5_INT);
#endif
}
void INTR_vSwitchDisable (void)
{
#ifdef __SWITCH_CPUIF_PCI
ASIC_INT_INTMASK |= MASK_PCI_H_INT;
ASIC_PCI_PCIINTEN &= ~PCI_PCIINTEN_INA;
#else // local bus
ASIC_INT_EXTMASK |= (1 << VEC_EXT5_INT);
#endif
}
#if 0
void INTR_vSwitchDma0Enable (void)
{
// do nothing
}
void INTR_vSwitchDma0Disable (void)
{
// do nothing
}
void INTR_vCriticalSectionEnter (void)
{
ASIC_INT_EXTMASK |= MASK_GLOBAL_INT;
}
void INTR_vCriticalSectionLeave (void)
{
ASIC_INT_EXTMASK &= ~MASK_GLOBAL_INT;
}
#endif
void INTR_vDisable (void)
{
// disabled all interrupt
ASIC_INT_INTMASK = INTMASK_ALL;
ASIC_INT_EXTMASK = EXTMASK_ALL;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?