亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? isr.c

?? Cirrus Logic EP7312處理器部分控制程序。
?? C
字號(hào):
//****************************************************************************
//
// ISR.C - Routines to handle the IRQ and FIQ interrupts
//
// Copyright (c) 1998-1999 Cirrus Logic, Inc.
//
//****************************************************************************
#include "ep7312.h"
#include "lib7312.h"

//****************************************************************************
//
// The following four functions are Angel SWIs which are used to get and set
// the address of the handler for the IRQ and FIQ events.
//
//****************************************************************************
PFNISR Angel_GetIRQ(int iSWINum) __attribute__ ((interrupt ("SWI")));
long Angel_SetIRQ(int iSWINum, PFNISR pfnIsr)__attribute__ ((interrupt ("SWI")));
PFNISR Angel_GetFIQ(int iSWINum)__attribute__ ((interrupt ("SWI")));
long Angel_SetFIQ(int iSWINum, PFNISR pfnIsr)__attribute__ ((interrupt ("SWI")));

PFNISR Angel_GetIRQ(int iSWINum){}
long Angel_SetIRQ(int iSWINum, PFNISR pfnIsr){return 0;}
PFNISR Angel_GetFIQ(int iSWINum){}
long Angel_SetFIQ(int iSWINum, PFNISR pfnIsr){return 0;}

//****************************************************************************
//
// IRQShell is the assembly language IRQ handler which takes care of saving
// the registers which can be destroyed by C code according to the APCS.
//
//****************************************************************************
extern void IRQShell(void);

//****************************************************************************
//
// FIQShell is the assembly language FIQ handler which takes care of saving
// the registers which can be destroyed by C code according to the APCS.
//
//****************************************************************************
extern void FIQShell(void);

//****************************************************************************
//
// The following variables are used by the IRQ handler.  They contain a
// pointer to the original IRQ handler, the number of times the IRQ interrupt
// has been hooked (and therefore the number of times it must be unhooked
// before it is actually removed from the system), and pointers to the
// handlers for the various interrupt sources.
//
//****************************************************************************
PFNISR pfnOldIRQ = 0;
static int iIRQRefCount = 0;
static PFNISR pfnCodecHandler = 0;
static PFNISR pfnADCHandler = 0;
static PFNISR pfnUART1Handler = 0;
static PFNISR pfnUART2Handler = 0;
static PFNISR pfnKbdHandler = 0;
static PFNISR pfnSSI2Handler = 0;
static PFNISR pfnParallelHandler = 0;

//****************************************************************************
//
// The following variables are used by the FIQ handler.  They contain a
// pointer to the original FIQ handler, the number of times the FIQ interrupt
// has been hooked (and therefore the number of times it must be unhooked
// before it is actually removed from the system), and pointers to the
// handlers for the various interrupt sources.
//
//****************************************************************************
PFNISR pfnOldFIQ = 0;
static int iFIQRefCount = 0;
static PFNISR pfnDAIHandler = 0;

//****************************************************************************
//
// IRQHandler is the routine which handles the actual IRQ interrupts.  It
// will call the specific handler for each interrupt source (if it has been
// registered) and will clear the interrupt source.
//
//****************************************************************************
void
IRQHandler(void)
{
    unsigned long * volatile pulPtr = (unsigned long *)HwBaseAddress;
    long lIntStatus, lData;

    //
    // Retrieve the value of the interrupt status register so that we can find
    // out why this interrupt was triggered.
    //
    lIntStatus = pulPtr[HwIntStatus >> 2] & pulPtr[HwIntMask >> 2];

    //
    // See if the codec triggered the interrupt.
    //
    if(lIntStatus & HwIrqCodec)
    {
        //
        // If there is a handler function for the codec interrupt, then call it
        // now.
        //
        if(pfnCodecHandler)
        {
            (*pfnCodecHandler)();
        }

        //
        // We've handled the codec interrupt, so issue a codec EOI.
        //
        pulPtr[HwCodecEOI >> 2] = 0;
    }

    //
    // See if the ADC triggered the interrupt.
    //
    if(lIntStatus & HwIrqSpi)
    {
        //
        // If there is a handler function for the ADC interrupt, then call it
        // now.
        //
        if(pfnADCHandler)
        {
            (*pfnADCHandler)();
        }

        //
        // Otherwise, read the data sample from the ADC to clear the interrupt.
        //
        else
        {
            lData = pulPtr[HwSpiData >> 2];
        }
    }

    //
    // See if UART1 triggered the interrupt.
    //
    if((lIntStatus & HwIrqUartRx) || (lIntStatus & HwIrqUartTx))
    {
        //
        // If there is a handler function for the UART1 interrupt, then call it
        // now.
        //
        if(pfnUART1Handler)
        {
            (*pfnUART1Handler)();
        }
    }

    //
    // See if the RTC triggered the interrupt.
    //
    if(lIntStatus & HwIrqRtcMatch)
    {
        //
        // We've handled the RTC interrupt, so issue a RTC EOI.
        //
        pulPtr[HwRtcMatchEOI >> 2] = 0;
    }

    //
    // See if the parallel port triggered the interrupt.
    //
    if(lIntStatus & HwIrqExt3)
    {
        //
        // If there is a handler function for the parallel interrupt, then call
        // it now.
        //
        if(pfnParallelHandler)
        {
            (*pfnParallelHandler)();
        }
    }

    //
    // Retrieve the value of the second interrupt status register.
    //
    lIntStatus = pulPtr[HwIntStatus2 >> 2] & pulPtr[HwIntMask2 >> 2];

    //
    // See if the keyboard triggered the interrupt.
    //
    if(lIntStatus & HwIrqKeyboard)
    {
        //
        // If there is a handler function for the keyboard interrupt, then call
        // it now.
        //
        if(pfnKbdHandler)
        {
            (*pfnKbdHandler)();
        }

        //
        // Clear the keyboard interrupt.
        //
        pulPtr[HwKeyboardEOI >> 2] = 0;
    }

    //
    // See if UART2 triggered the interrupt.
    //
    if((lIntStatus & HwIrqUartRx) || (lIntStatus & HwIrqUartTx))
    {
        //
        // If there is a handler function for the UART2 interrupt, then call it
        // now.
        //
        if(pfnUART2Handler)
        {
            (*pfnUART2Handler)();
        }
    }

    //
    // See if the SSI2 triggered the interrupt.
    //
    if((lIntStatus & HwIrqSSI2Rx) || (lIntStatus & HwIrqSSI2Tx))
    {
        //
        // If there is a handler function for the SSI2 interrupt, then call it
        // now.
        //
        if(pfnSSI2Handler)
        {
            (*pfnSSI2Handler)();
        }
    }
}

//****************************************************************************
//
// FIQHandler is the routine which handles the actual FIQ interrupts.  It
// will call the specific handler for each interrupt source (if it has been
// registered) and will clear the interrupt source.
//
//****************************************************************************
void
FIQHandler(void)
{
    unsigned long * volatile pulPtr = (unsigned long *)HwBaseAddress;
    long lIntStatus;

    //
    // Retrieve the value of the interrupt status register so that we can find
    // out why this interrupt was triggered.
    //
    lIntStatus = pulPtr[HwIntStatus3 >> 2] & pulPtr[HwIntMask3 >> 2];

    //
    // See if the DAI triggered the interrupt.
    //
    if(lIntStatus & HwFiqDAI)
    {
        //
        // If there is a handler function for the DAI interrupt, then call it
        // now.
        //
        if(pfnDAIHandler)
        {
            (*pfnDAIHandler)();
        }
    }
}

//****************************************************************************
//
// InterruptInstallIRQ will install the global IRQ handler.
//
//****************************************************************************
void
InterruptInstallIRQ(void)
{
    //
    // Do not install the IRQ handler if it has already been installed.
    //
    if(!pfnOldIRQ)
    {
        //
        // Get the address of the current IRQ handler from Angel.
        //
        pfnOldIRQ = Angel_GetIRQ(0xFD);

        //
        // Tell Angel to call our IRQ handler instead.  We will chain to the
        // original IRQ handler.
        //
        Angel_SetIRQ(0xFC, IRQShell);
    }

    //
    // Increment the reference count of the number of times we were requested
    // to install the IRQ handler.
    //
    iIRQRefCount++;
}

//****************************************************************************
//
// InterruptRemoveIRQ removes the global IRQ handler.
//
//****************************************************************************
void
InterruptRemoveIRQ(void)
{
    //
    // If we have installed our IRQ handler and the reference count is not
    // being decremented to zero, then remove our IRQ handler.
    //
    if(pfnOldIRQ && !(--iIRQRefCount))
    {
        //
        // Set the original IRQ handler as the IRQ handler, thereby removing
        // ourself from the chain.
        //
        Angel_SetIRQ(0xFC, pfnOldIRQ);

        //
        // Forget the address of the original IRQ handler.
        //
        pfnOldIRQ = 0;
    }
}

//****************************************************************************
//
// InterruptInstallFIQ will install the global FIQ handler.
//
//****************************************************************************
void
InterruptInstallFIQ(void)
{
    //
    // Do not install the FIQ handler if it has already been installed.
    //
    if(!pfnOldFIQ)
    {
        //
        // Get the address of the current FIQ handler from Angel.
        //
        pfnOldFIQ = Angel_GetFIQ(0xFF);

        //
        // Tell Angel to call our FIQ handler instead.  We will chain to the
        // original FIQ handler.
        //
        Angel_SetFIQ(0xFE, FIQShell);
    }

    //
    // Increment the reference count of the number of times we were requested
    // to install the FIQ handler.
    //
    iFIQRefCount++;
}

//****************************************************************************
//
// InterruptRemoveFIQ removes the global FIQ handler.
//
//****************************************************************************
void
InterruptRemoveFIQ(void)
{
    //
    // If we have installed our FIQ handler and the reference count is not
    // being decremented to zero, then remove our FIQ handler.
    //
    if(pfnOldFIQ && !(--iFIQRefCount))
    {
        //
        // Set the original FIQ handler as the FIQ handler, thereby removing
        // ourself from the chain.
        //
        Angel_SetFIQ(0xFE, pfnOldFIQ);

        //
        // Forget the address of the original FIQ handler.
        //
        pfnOldFIQ = 0;
    }
}

//****************************************************************************
//
// InterruptSetCodecHandler sets the address of the routine that handles the
// codec interrupt source.
//
//****************************************************************************
void
InterruptSetCodecHandler(PFNISR pfnCodec)
{
    //
    // Remember the address of the codec handler routine.
    //
    pfnCodecHandler = pfnCodec;
}

//****************************************************************************
//
// InterruptSetADCHandler sets the address of the routine that handles the
// ADC interrupt source.
//
//****************************************************************************
void
InterruptSetADCHandler(PFNISR pfnADC)
{
    //
    // Remember the address of the ADC handler routine.
    //
    pfnADCHandler = pfnADC;
}

//****************************************************************************
//
// InterruptSetDAIHandler sets the address of the routine that handles the
// DAI interrupt source.
//
//****************************************************************************
void
InterruptSetDAIHandler(PFNISR pfnDAI)
{
    //
    // Remember the address of the DAI handler routine.
    //
    pfnDAIHandler = pfnDAI;
}

//****************************************************************************
//
// InterruptSetUART1Handler sets the address of the routine that handles the
// UART1 interrupt source.
//
//****************************************************************************
void
InterruptSetUART1Handler(PFNISR pfnUART1)
{
    //
    // Remember the address of the UART1 handler routine.
    //
    pfnUART1Handler = pfnUART1;
}

//****************************************************************************
//
// InteruptSetUART2Handler sets the address of the routine that handles the
// UART2 interrupt source.
//
//****************************************************************************
void
InterruptSetUART2Handler(PFNISR pfnUART2)
{
    //
    // Remember the address of the UART2 handler routine.
    //
    pfnUART2Handler = pfnUART2;
}

//****************************************************************************
//
// InterruptSetKbdHandler sets the address of the routine that handles the
// keyboard interrupt source.
//
//****************************************************************************
void
InterruptSetKbdHandler(PFNISR pfnKbd)
{
    //
    // Remember the address of the keyboard handler routine.
    //
    pfnKbdHandler = pfnKbd;
}

//****************************************************************************
//
// InterruptSetSSI2Handler sets the address of the routine that handles the
// SSI2 interrupt sources.
//
//****************************************************************************
void
InterruptSetSSI2Handler(PFNISR pfnSSI2)
{
    //
    // Remember the address of the SSI2 handler routine.
    //
    pfnSSI2Handler = pfnSSI2;
}

//****************************************************************************
//
// InterruptSetParallelHandler sets the address of the routine that handles
// the parallel port interrupt source.
//
//****************************************************************************
void
InterruptSetParallelHandler(PFNISR pfnParallel)
{
    //
    // Remember the address of the parallel handler routine.
    //
    pfnParallelHandler = pfnParallel;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看一区二区精品视频| 国产日韩v精品一区二区| 日韩精品一区二区三区中文不卡| 久久久久久久网| 天天影视网天天综合色在线播放| 成人激情图片网| 精品久久久三级丝袜| 一区二区三区自拍| 成人美女视频在线看| 精品国产三级a在线观看| 亚洲狠狠爱一区二区三区| k8久久久一区二区三区| 国产亚洲欧美中文| 麻豆成人免费电影| 欧美精品色综合| 亚洲v日本v欧美v久久精品| va亚洲va日韩不卡在线观看| 久久综合国产精品| 美腿丝袜亚洲色图| 日韩免费观看2025年上映的电影| 五月天一区二区三区| 色婷婷亚洲综合| 亚洲视频在线一区观看| 成人ar影院免费观看视频| 久久免费国产精品| 国产一区二区0| 久久奇米777| 国产盗摄女厕一区二区三区| 精品国产网站在线观看| 国产一区二区福利视频| 欧美成人性战久久| 国产精品一二二区| 国产午夜亚洲精品羞羞网站| 顶级嫩模精品视频在线看| 国产日韩一级二级三级| 大白屁股一区二区视频| 亚洲视频在线一区观看| 在线观看亚洲专区| 日韩黄色在线观看| 精品99999| 国产成人精品亚洲午夜麻豆| 亚洲国产精品99久久久久久久久| 成人福利在线看| 一区二区久久久| 欧美日韩在线三区| 久久精品72免费观看| 久久美女艺术照精彩视频福利播放| 国产精品一二一区| 综合欧美一区二区三区| 欧美色手机在线观看| 日韩国产在线观看| 久久亚洲精华国产精华液| 成人免费观看av| 亚洲一区二区三区美女| 日韩三级伦理片妻子的秘密按摩| 韩国v欧美v日本v亚洲v| 亚洲天堂福利av| 538prom精品视频线放| 国产美女娇喘av呻吟久久| 亚洲欧洲一区二区在线播放| 欧美在线观看一区| 国产一区啦啦啦在线观看| 亚洲日本中文字幕区| 欧美一区日韩一区| 丁香婷婷综合五月| 日日夜夜免费精品| 国产欧美一区二区精品仙草咪| 色偷偷久久人人79超碰人人澡| 日本不卡视频在线观看| 国产欧美一区在线| 91.xcao| 国产麻豆视频精品| 一区二区在线观看免费视频播放 | 波多野结衣中文一区| 亚洲欧美经典视频| 亚洲精品一区二区三区影院 | 东方aⅴ免费观看久久av| 一区二区高清在线| 国产日产欧产精品推荐色| 欧美亚洲精品一区| 99久久久免费精品国产一区二区| 日本视频中文字幕一区二区三区 | 久久久国产午夜精品| 欧美影院一区二区三区| 国产成人av电影在线| 免费成人美女在线观看.| 亚洲三级在线看| 国产日产欧美一区二区视频| 日韩一区二区三区四区| 在线观看亚洲专区| 99久久综合精品| 国产精品一区免费在线观看| 丝袜国产日韩另类美女| 亚洲男人天堂av网| 亚洲国产成人一区二区三区| 欧美一级在线免费| 欧美无砖专区一中文字| 91香蕉视频黄| 不卡的电视剧免费网站有什么| 精品无人区卡一卡二卡三乱码免费卡 | 亚洲chinese男男1069| 国产精品初高中害羞小美女文| 久久久久一区二区三区四区| 91麻豆精品国产91久久久久久 | 国产一区在线精品| 麻豆一区二区三| 日本中文在线一区| 亚洲一区精品在线| 亚洲精品一二三| 亚洲精品日产精品乱码不卡| 中文字幕欧美激情| 中文一区二区完整视频在线观看| 欧美成人伊人久久综合网| 欧美精品一卡二卡| 欧美日韩另类一区| 欧美精品亚洲一区二区在线播放| 精品视频全国免费看| 91免费看`日韩一区二区| 成人高清av在线| 99精品久久99久久久久| 色婷婷精品大视频在线蜜桃视频| 成人看片黄a免费看在线| 成人激情小说网站| 色偷偷成人一区二区三区91| 在线亚洲精品福利网址导航| 日本韩国精品在线| 欧美夫妻性生活| 欧美电影免费观看高清完整版在| 日韩精品中文字幕在线不卡尤物| 欧美变态凌虐bdsm| 国产区在线观看成人精品| 日本一区二区三区电影| 亚洲欧美另类久久久精品| 亚洲一级不卡视频| 午夜成人免费视频| 国产呦精品一区二区三区网站| 豆国产96在线|亚洲| 色综合天天综合在线视频| 欧美巨大另类极品videosbest | 久久久精品天堂| 亚洲欧洲av一区二区三区久久| 亚洲精品成人悠悠色影视| 日精品一区二区三区| 九九视频精品免费| 波多野结衣91| 欧美三级日韩在线| 国产日韩欧美一区二区三区乱码| 最新不卡av在线| 免费的国产精品| av色综合久久天堂av综合| 欧美三级中文字幕| 久久精品亚洲麻豆av一区二区| 亚洲综合一区在线| 国产精品一区2区| 欧美日韩一区视频| 国产欧美综合色| 青青青爽久久午夜综合久久午夜| 成人丝袜高跟foot| 欧美喷潮久久久xxxxx| 欧美极品少妇xxxxⅹ高跟鞋 | 亚洲美女少妇撒尿| 激情欧美一区二区三区在线观看| 色诱视频网站一区| 久久久久久一二三区| 同产精品九九九| 99久久久无码国产精品| 精品久久人人做人人爽| 午夜av一区二区三区| av在线不卡免费看| 久久久99免费| 日产欧产美韩系列久久99| 色综合久久久久| 国产精品无码永久免费888| 久久狠狠亚洲综合| 欧洲国产伦久久久久久久| 国产精品妹子av| 国产精品一区一区| 精品少妇一区二区三区视频免付费| 亚洲午夜免费福利视频| caoporen国产精品视频| 久久久精品天堂| 激情小说亚洲一区| 日韩一区二区三区av| 天天综合天天做天天综合| 91成人看片片| 亚洲综合另类小说| 91黄色激情网站| 亚洲在线一区二区三区| 成人国产精品免费| 国产欧美精品区一区二区三区| 精品综合久久久久久8888| 欧美一区二区播放| 日韩精品视频网| 欧美精品一二三| 五月综合激情网| 欧美三级在线视频| 午夜激情久久久| 日韩一区国产二区欧美三区| 亚洲香蕉伊在人在线观| 色视频一区二区|