📄 pf_isr.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 + -