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 + -
显示快捷键?