⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pf_isr.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
字号:

//
//      Copyright (c) Renesas Technology Corp. 2002-2003 All Rights Reserved.
//
//      OEM Adaptation Layer
//
//----------------------------------------------------------------------------
//
//  FILE      : PF_ISR.C
//  CREATED   : 2002. 1.31
//  MODIFIED  : 2003.08.06
//  AUTHOR    : Renesas Technology Corp.
//  HARDWARE  : RENESAS HS7751RSTC01H (S1-E, ITS-DS5)
//  TARGET OS : Microsoft(R) Windows(R) CE .NET 4.2
//  NOTES     : 
//  FUNCTION  : Interrupt service routine for Peripheral FPGA interrupts
//  HISTORY   :
//              2002. 1.31
//              - Created for HS7751RSTC01H.
//              2002. 5. 2
//              - Adapted for System FPGA and Peripheral FPGA specification
//               changes from supporting 64MB flash memory board.
//              - Filename is changed from "ccISRs.c" to "PF_ISR.C".
//              2002. 6. 1
//              - PCMCIA ISR is implemented by refering source of PFM-DS8.
//              2002. 8.27
//              - Interrupt mask is considered when checking each interrupt
//               requests.
//              2002. 9. 9
//              - Header style is changed and file information is added.
//              2002. 9.26
//              - Released for HS7751RSTC01H.
//              2002. 10.2
//              - PCI ISR is implemented.

#include <windows.h>
#include <nkintr.h>
#include <stdlib.h>
#include <stdio.h>
#include "s1e.h"
#include "oalintr.h"
#include "shx.h"
#include "pciext.h"

#include "drv_glob.h"

#define pDriverGlobals ((PDRIVER_GLOBALS) DRIVER_GLOBALS_PHYSICAL_MEMORY_START) 

DWORD C_Peripheral_FPGA_ISR(void)
{
USHORT wStatus;
USHORT wMask;
BYTE   bIrq=-1;
DWORD  nSysIntr=SYSINTR_NOP;
// 02.12.06
USHORT pcmcia_intr;

    wStatus = READ_REGISTER_USHORT(PF_INTSR);
    wMask  =  READ_REGISTER_USHORT(PF_INTMR);

    // Note that each bit in the FPGA interrupt status register reports that
    // corresponding device is requesting interrupt or not.
    // This is NOT the electrical signal level of each interrupt request line.

    if (wStatus &~ wMask & PF_INTSR_REQ_ETHER) { // ethernet interrupt
        // Mask ethernet interrupt (FPGA register).
        WRITE_REGISTER_USHORT(PF_INTMR,READ_REGISTER_USHORT(PF_INTMR) | PF_INTMR_MASK_ETHER);
        return SYSINTR_ETHER;
    }
    else if (wStatus &~ wMask & PF_INTSR_REQ_PCMCIA){
        //Mask PCMCIA interrupts (FPGA register)
        WRITE_REGISTER_USHORT(PF_INTMR,READ_REGISTER_USHORT(PF_INTMR) | PF_INTMR_MASK_PCMCIA);
// 02.12.06
        pcmcia_intr = READ_REGISTER_USHORT(MR_SHPC_INTR);
        pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR = READ_REGISTER_USHORT(MR_SHPC_INTR);

//      if (pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_CARD_DETECT){
        if (pcmcia_intr & MR_SHPC_INTR_CARD_DETECT){
//#ifdef DEBUG 
#ifndef DEBUG 
            PrintLED("-DETECT-");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_CARD_DETECT;
            return SYSINTR_PCMCIA_STATE;
        }

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_STSCHG){
        else if(pcmcia_intr & MR_SHPC_INTR_STSCHG){
#ifdef DEBUG 
            PrintLED("-STSCHG-");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_STSCHG;
            return SYSINTR_PCMCIA_STATE;
        } 

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_IREQ_CHG){
        else if(pcmcia_intr & MR_SHPC_INTR_IREQ_CHG){
#ifdef DEBUG 
            PrintLED("IREQ_CHG");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_IREQ_CHG;
            return SYSINTR_PCMCIA_LEVEL;
        }

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_CARD_PWR){
        else if(pcmcia_intr & MR_SHPC_INTR_CARD_PWR){
#ifdef DEBUG 
            PrintLED("CARD_PWR");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_CARD_PWR;
            return SYSINTR_PCMCIA_STATE;
        } 

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_RDY_CHG){
        else if(pcmcia_intr & MR_SHPC_INTR_RDY_CHG){
#ifdef DEBUG 
            PrintLED("RDY_CHG");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_RDY_CHG;
            return SYSINTR_PCMCIA_STATE;
        }

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_BAT_WARN){
        else if(pcmcia_intr & MR_SHPC_INTR_BAT_WARN){

#ifdef DEBUG 
            PrintLED("BAT_WARN");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_BAT_WARN;
            return SYSINTR_PCMCIA_STATE;
        }

//      else if(pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR & MR_SHPC_INTR_BAT_DEAD){
        else if(pcmcia_intr & MR_SHPC_INTR_BAT_DEAD){
#ifdef DEBUG 
            PrintLED("BAT_DEAD");
#endif
            pDriverGlobals->pcm.PCMCIA_DrvGlob_ISR &=~ MR_SHPC_INTR_BAT_DEAD;
            return SYSINTR_PCMCIA_STATE;
        }
        else{
//#ifdef DEBUG 
#ifndef DEBUG 
//          PrintLED("- NOP -");
            PrintLED("- pcmcia -");
#endif
            WRITE_REGISTER_USHORT(PF_INTMR,
                READ_REGISTER_USHORT(PF_INTMR) & ~PF_INTMR_MASK_PCMCIA);
            return SYSINTR_NOP;
        }
    }
    else if(wStatus &~ wMask & PF_INTSR_REQ_PCI){ // Detect Hi-level bit from Bit15-8(represents PCI interrupt).

        if (wStatus & PF_INTSR_REQ_PCI_INTA)//5V INTA or 3.3V INTA
            bIrq=IRQ_INTA;
        else
        if (wStatus & PF_INTSR_REQ_PCI_INTB)//5V INTB or 3.3V INTB
            bIrq=IRQ_INTB;
        else
        if (wStatus & PF_INTSR_REQ_PCI_INTC)//5V INTC or 3.3V INTC
            bIrq=IRQ_INTC;
        else
        if (wStatus & PF_INTSR_REQ_PCI_INTD)//5V INTD or 3.3V INTD
            bIrq=IRQ_INTD;

        if (bIrq==(BYTE)-1)
            return SYSINTR_NOP;
        else
            OEMPciIntrDisable(bIrq);
        // Call interrupt chain to see if any installed ISRs handle this interrupt
        nSysIntr = NKCallIntChain((BYTE)bIrq);
        if (nSysIntr == SYSINTR_CHAIN) {
            nSysIntr = OEMTranslateIrq(bIrq);
        }

        return (nSysIntr==-1? SYSINTR_NOP: nSysIntr);
    }
    else{
//#ifdef DEBUG
#ifndef DEBUG
        PrintLED("INTR_CHAIN");
//      PrintLED("- NOP -");
        PrintLED("- FPGA -");
#endif
        // Call interrupt chain to see if any installed ISRs handle this interrupt
//      nSysIntr = NKCallIntChain((BYTE)bIrq);
//      if (nSysIntr == SYSINTR_CHAIN) {
//          nSysIntr = OEMTranslateIrq(bIrq);
//      }
//      return (nSysIntr==-1? SYSINTR_NOP: nSysIntr);
        return SYSINTR_NOP;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -