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

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

?? intr.c

?? SMDK2440 s3c2440 WINCE 5.00 bsp 編譯通過(guò)
?? C
字號(hào):
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//------------------------------------------------------------------------------
//
//  File: interrupt.c
//
//  This file implement major part of interrupt module for S3C3210X SoC.
//
#include <windows.h>
#include <ceddk.h>
#include <nkintr.h>
#include <oal.h>
#include <s3c2440a.h>
#include <s3c2440a_intr.h>
#include <intr.h>
 
extern volatile UINT32 g_oalLastSysIntr; 


//------------------------------------------------------------------------------
//
//  Globals:  g_pIntrRegs/g_pPortRegs
//
//  The global variables are storing virual address for interrupt and port
//  registers for use in interrupt handling to avoid possible time consumig
//  call to OALPAtoVA function.
//
static S3C2440A_INTR_REG *g_pIntrRegs; 
static S3C2440A_IOPORT_REG *g_pPortRegs;

//  Function pointer to profiling timer ISR routine.
//
PFN_PROFILER_ISR g_pProfilerISR = NULL;
 

//------------------------------------------------------------------------------
//
//  Function:  OALIntrInit
//
//  This function initialize interrupt mapping, hardware and call platform
//  specific initialization.
//
BOOL OALIntrInit()
{
    BOOL rc = FALSE;
    
    OALMSG( OAL_FUNC&&OAL_INTR, (L"+OALInterruptInit\r\n") );

    // Initialize interrupt mapping
    OALIntrMapInit();

    // First get uncached virtual addresses
    g_pIntrRegs = (S3C2440A_INTR_REG*)OALPAtoVA(
        S3C2440A_BASE_REG_PA_INTR, FALSE
    );
    g_pPortRegs = (S3C2440A_IOPORT_REG*)OALPAtoVA(
        S3C2440A_BASE_REG_PA_IOPORT, FALSE
    );

    // Mask and clear external interrupts
    OUTREG32(&g_pPortRegs->EINTMASK, 0xFFFFFFFF);
    OUTREG32(&g_pPortRegs->EINTPEND, 0xFFFFFFFF);

    // Mask and clear internal interrupts
    OUTREG32(&g_pIntrRegs->INTMSK, 0xFFFFFFFF);
    OUTREG32(&g_pIntrRegs->SRCPND, 0xFFFFFFFF);

    // S3C2440A developer notice (page 4) warns against writing a 1 to any
    // 0 bit field in the INTPND register.  Instead we'll write the INTPND
    // value itself.
    OUTREG32(&g_pIntrRegs->INTPND, INREG32(&g_pIntrRegs->INTPND));

    // Unmask the system tick timer interrupt
    CLRREG32(&g_pIntrRegs->INTMSK, 1 << IRQ_TIMER4);

#ifdef OAL_BSP_CALLBACKS
    // Give BSP change to initialize subordinate controller
    rc = BSPIntrInit();
#else
    rc = TRUE;
#endif

    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALInterruptInit(rc = %d)\r\n", rc));
    return rc;
}



//------------------------------------------------------------------------------
//
//  Function:  OALIntrRequestIrqs
//
//  This function returns IRQs for CPU/SoC devices based on their
//  physical address.
//
BOOL OALIntrRequestIrqs(DEVICE_LOCATION *pDevLoc, UINT32 *pCount, UINT32 *pIrqs)
{
    BOOL rc = FALSE;

    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIntrRequestIrqs(0x%08x->%d/%d/0x%08x/%d, 0x%08x, 0x%08x)\r\n",
        pDevLoc, pDevLoc->IfcType, pDevLoc->BusNumber, pDevLoc->LogicalLoc,
        pDevLoc->Pin, pCount, pIrqs
    ));

    // This shouldn't happen
    if (*pCount < 1) goto cleanUp;

#ifdef OAL_BSP_CALLBACKS
    rc = BSPIntrRequestIrqs(pDevLoc, pCount, pIrqs);
#endif    

cleanUp:        
    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrRequestIrqs(rc = %d)\r\n", rc));
    return rc;
}


//------------------------------------------------------------------------------
//
//  Function:  OALIntrEnableIrqs
//
BOOL OALIntrEnableIrqs(UINT32 count, const UINT32 *pIrqs)
{
    BOOL rc = TRUE;
    UINT32 i, mask, irq;

    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIntrEnableIrqs(%d, 0x%08x)\r\n", count, pIrqs
    ));

    for (i = 0; i < count; i++) {
#ifndef OAL_BSP_CALLBACKS
        irq = pIrqs[i];
#else
        // Give BSP chance to enable irq on subordinate interrupt controller
        irq = BSPIntrEnableIrq(pIrqs[i]);
#endif
        if (irq == OAL_INTR_IRQ_UNDEFINED) continue;
        // Depending on IRQ number use internal or external mask register
        if (irq <= IRQ_ADC) {
            // Use interrupt mask register
            CLRREG32(&g_pIntrRegs->INTMSK, 1 << irq);
        } else if (irq <= IRQ_EINT7) {
            // Use external mask register
            CLRREG32(&g_pIntrRegs->INTMSK, 1 << IRQ_EINT4_7);
            CLRREG32(&g_pPortRegs->EINTMASK, 1 << (irq - IRQ_EINT4 + 4));
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);
            CLRREG32(&g_pPortRegs->EINTMASK, mask);
            mask = 1 << IRQ_EINT8_23;
            if ((INREG32(&g_pIntrRegs->INTPND) & mask) != 0) {
                OUTREG32(&g_pIntrRegs->INTPND, mask);
            }
            CLRREG32( &g_pIntrRegs->INTMSK, 1 << IRQ_EINT8_23);
        } else {
            rc = FALSE;
        }
    }        

    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrEnableIrqs(rc = %d)\r\n", rc));
    return rc;    
}


//------------------------------------------------------------------------------
//
//  Function:  OALIntrDisableIrqs
//
VOID OALIntrDisableIrqs(UINT32 count, const UINT32 *pIrqs)
{
    UINT32 i, mask, irq;

    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIntrDisableIrqs(%d, 0x%08x)\r\n", count, pIrqs
    ));

    for (i = 0; i < count; i++) {
#ifndef OAL_BSP_CALLBACKS
        irq = pIrqs[i];
#else
        // Give BSP chance to disable irq on subordinate interrupt controller
        irq = BSPIntrDisableIrq(pIrqs[i]);
        if (irq == OAL_INTR_IRQ_UNDEFINED) continue;
#endif
        // Depending on IRQ number use internal or external mask register
        if (irq <= IRQ_ADC) {
            // Use interrupt mask register
            mask = 1 << irq;
            SETREG32(&g_pIntrRegs->INTMSK, mask);
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            SETREG32(&g_pPortRegs->EINTMASK, mask);
        }
    }

    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrDisableIrqs\r\n"));
}


//------------------------------------------------------------------------------
//
//  Function:  OALIntrDoneIrqs
//
VOID OALIntrDoneIrqs(UINT32 count, const UINT32 *pIrqs)
{
    UINT32 i, mask, irq;

    OALMSG(OAL_INTR&&OAL_VERBOSE, (
        L"+OALIntrDoneIrqs(%d, 0x%08x)\r\n", count, pIrqs
    ));

    for (i = 0; i < count; i++) {
#ifndef OAL_BSP_CALLBACKS
        irq = pIrqs[i];
#else
        // Give BSP chance to finish irq on subordinate interrupt controller
        irq = BSPIntrDoneIrq(pIrqs[i]);
#endif    
        // Depending on IRQ number use internal or external mask register
        if (irq <= IRQ_ADC) {
            // Use interrupt mask register
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            CLRREG32(&g_pIntrRegs->INTMSK, mask);
        } else if (irq <= IRQ_EINT23) {
            // Use external mask register
            mask = 1 << (irq - IRQ_EINT4 + 4);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);
            CLRREG32(&g_pPortRegs->EINTMASK, mask);
        }    
    }

    OALMSG(OAL_INTR&&OAL_VERBOSE, (L"-OALIntrDoneIrqs\r\n"));
}


//------------------------------------------------------------------------------
//
//  Function:  OEMInterruptHandler
//
ULONG OEMInterruptHandler(ULONG ra)
{
    UINT32 sysIntr = SYSINTR_NOP;
    UINT32 irq, irq2, mask;

    // Get pending interrupt(s)
    irq = INREG32(&g_pIntrRegs->INTOFFSET);

    // System timer interrupt?
    if (irq == IRQ_TIMER4) {

        // Clear the interrupt
        OUTREG32(&g_pIntrRegs->SRCPND, 1 << IRQ_TIMER4);
        OUTREG32(&g_pIntrRegs->INTPND, 1 << IRQ_TIMER4);

        // Rest is on timer interrupt handler
        sysIntr = OALTimerIntrHandler();
	}    
    // Profiling timer interrupt?
    else if (irq == IRQ_TIMER2)
    {
        // Mask and Clear the interrupt.
        mask = 1 << irq;
        SETREG32(&g_pIntrRegs->INTMSK, mask);
        OUTREG32(&g_pIntrRegs->SRCPND, mask);
        OUTREG32(&g_pIntrRegs->INTPND, mask);

        // The rest is up to the profiling interrupt handler (if profiling
        // is enabled).
        //
        if (g_pProfilerISR)
        {
            sysIntr = g_pProfilerISR(ra);
        }
    }
    else 
    {

#ifdef OAL_ILTIMING
        if (g_oalILT.active) {
            g_oalILT.isrTime1 = OALTimerCountsSinceSysTick();
            g_oalILT.savedPC = 0;
            g_oalILT.interrupts++;
        }        
#endif
    
        if (irq == IRQ_EINT4_7 || irq == IRQ_EINT8_23) { // 4 or 5

            // Find external interrupt number
            mask = INREG32(&g_pPortRegs->EINTPEND);
            mask &= ~INREG32(&g_pPortRegs->EINTMASK);
            mask = (mask ^ (mask - 1)) >> 5;
            irq2 = IRQ_EINT4;
            while (mask != 0) {
                mask >>= 1;
                irq2++;
            }

            // Mask and clear interrupt
            mask = 1 << (irq2 - IRQ_EINT4 + 4);
            SETREG32(&g_pPortRegs->EINTMASK, mask);
            OUTREG32(&g_pPortRegs->EINTPEND, mask);

            // Clear primary interrupt
            mask = 1 << irq;
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            OUTREG32(&g_pIntrRegs->INTPND, mask);

            // From now we care about this irq
            irq = irq2;

        }  else {

            // Mask and clear interrupt
            mask = 1 << irq;
            SETREG32(&g_pIntrRegs->INTMSK, mask);
            OUTREG32(&g_pIntrRegs->SRCPND, mask);
            OUTREG32(&g_pIntrRegs->INTPND, mask);

        }

        // First find if IRQ is claimed by chain
        sysIntr = NKCallIntChain((UCHAR)irq);
        if (sysIntr == SYSINTR_CHAIN || !NKIsSysIntrValid(sysIntr)) {
            // IRQ wasn't claimed, use static mapping
            sysIntr = OALIntrTranslateIrq(irq);
        }
    }

	g_oalLastSysIntr = sysIntr;
    return sysIntr;
}

//------------------------------------------------------------------------------

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99麻豆久久久国产精品免费| 51午夜精品国产| 视频一区二区中文字幕| 国产欧美视频一区二区| 欧美美女一区二区三区| 91丨porny丨中文| 国产在线麻豆精品观看| 日本成人在线网站| 亚洲一区二区欧美| 亚洲视频1区2区| 中文幕一区二区三区久久蜜桃| 91精品午夜视频| 欧美在线啊v一区| 91视频xxxx| 成人手机电影网| 国产剧情在线观看一区二区| 久久综合综合久久综合| 丝袜亚洲精品中文字幕一区| 亚洲精品视频在线观看免费| 中文字幕高清一区| 国产欧美一区二区精品婷婷| 精品日韩欧美一区二区| 欧美美女一区二区三区| 欧美日韩一区在线观看| 欧美在线看片a免费观看| 日本韩国一区二区三区| 91麻豆免费观看| 色综合久久88色综合天天| 91片在线免费观看| 99re视频这里只有精品| www.欧美日韩| 99久久精品久久久久久清纯| 国产69精品一区二区亚洲孕妇| 国产一区二区不卡在线| 精品一二线国产| 国产精品自拍一区| 国产成人av网站| 成人午夜在线免费| 99久久精品国产麻豆演员表| 99国产精品国产精品久久| 97国产一区二区| 欧美中文字幕一区| 欧美精品色综合| 日韩免费性生活视频播放| 欧美一区二区日韩| 精品福利二区三区| 久久精品亚洲精品国产欧美kt∨| 精品国产露脸精彩对白| 欧美国产丝袜视频| 亚洲人成在线播放网站岛国| 一区二区三区日韩| 亚洲最大的成人av| 亚洲 欧美综合在线网络| 日本欧美一区二区三区| 韩国欧美一区二区| 暴力调教一区二区三区| 欧美性大战xxxxx久久久| 欧美美女一区二区| 久久久夜色精品亚洲| 1000部国产精品成人观看| 亚洲综合免费观看高清完整版在线| 天堂va蜜桃一区二区三区| 黄色日韩三级电影| 97久久人人超碰| 在线成人午夜影院| 欧美激情在线一区二区| 一区二区三区在线免费播放| 男女性色大片免费观看一区二区 | 午夜成人免费视频| 精品一区二区三区日韩| 成人av资源站| 欧美精品久久一区二区三区| 久久综合色婷婷| 亚洲黄色免费电影| 国产真实乱偷精品视频免| 99re热这里只有精品视频| 欧美一区二区福利视频| 国产精品乱码一区二区三区软件 | 成人欧美一区二区三区小说| 亚洲成在人线在线播放| 激情小说欧美图片| 91国产精品成人| 久久久久久一二三区| 一区二区三区91| 国产精品1024| 91麻豆精品国产91久久久使用方法 | 久久精品国产久精国产爱| 不卡视频免费播放| 日韩视频一区在线观看| 综合在线观看色| 久久91精品国产91久久小草| 色综合久久天天| 2欧美一区二区三区在线观看视频| 亚洲三级在线观看| 国产精品一区二区在线观看网站| 欧美三级三级三级爽爽爽| 亚洲国产成人在线| 久久99日本精品| 欧美日韩高清一区二区三区| 中文字幕视频一区| 国产精品一区二区黑丝| 91精品视频网| 亚洲精品国产精华液| 盗摄精品av一区二区三区| 日韩欧美综合一区| 五月婷婷欧美视频| 色哟哟一区二区在线观看 | 26uuu精品一区二区在线观看| 亚洲免费av高清| 成人激情图片网| 久久夜色精品一区| 免费观看一级欧美片| 在线观看亚洲成人| 亚洲天天做日日做天天谢日日欢| 国产精品一区二区在线播放 | 日日夜夜免费精品视频| 91麻豆免费在线观看| 国产精品久久久久aaaa樱花 | 久久综合九色综合97_久久久| 午夜精品久久久久久久久| 色婷婷亚洲一区二区三区| 日韩理论片网站| 成人不卡免费av| 日本一区二区三区dvd视频在线| 美女www一区二区| 欧美不卡视频一区| 麻豆国产精品一区二区三区| 6080国产精品一区二区| 亚洲午夜国产一区99re久久| 欧美性受xxxx| 午夜伊人狠狠久久| 欧美麻豆精品久久久久久| 舔着乳尖日韩一区| 91麻豆精品国产91久久久久久久久 | 亚洲另类色综合网站| 91丝袜美女网| 亚洲自拍偷拍av| 欧美欧美欧美欧美首页| 视频一区欧美日韩| 日韩欧美123| 国产精品一品二品| 国产精品美女久久久久av爽李琼| 成人在线一区二区三区| 欧美经典一区二区| 成人av动漫在线| 亚洲综合色噜噜狠狠| 欧美日韩精品综合在线| 麻豆精品新av中文字幕| 精品福利视频一区二区三区| 国产激情视频一区二区在线观看| 国产精品毛片a∨一区二区三区| 91丨porny丨最新| 亚洲成人激情综合网| 3d成人动漫网站| 韩国毛片一区二区三区| 亚洲欧洲另类国产综合| 欧美午夜精品理论片a级按摩| 日韩一区欧美二区| 久久免费看少妇高潮| 91丨porny丨蝌蚪视频| 婷婷六月综合网| 久久伊人中文字幕| 99久久精品国产观看| 视频一区中文字幕国产| 久久精品日产第一区二区三区高清版 | 国产清纯白嫩初高生在线观看91 | 91免费国产在线| 午夜精品久久久久久久99水蜜桃| 日韩精品一区国产麻豆| 国产成人精品午夜视频免费| 亚洲精品成a人| 日韩午夜电影在线观看| 99视频有精品| 免费成人av在线| 国产精品美女久久久久高潮| 欧美日韩一区二区在线观看视频| 久久99国产精品麻豆| 亚洲美女在线一区| 欧美精品一区在线观看| 一本在线高清不卡dvd| 久久国产精品99久久久久久老狼| 亚洲四区在线观看| 日韩免费观看2025年上映的电影| av不卡一区二区三区| 青青草国产成人av片免费 | 美国十次了思思久久精品导航| 国产精品久久久久久久久免费相片 | av中文字幕不卡| 久久99国产精品免费网站| 亚洲美女屁股眼交3| 久久久久久久综合色一本| 欧美男人的天堂一二区| 成人av在线影院| 久久99精品久久久| 亚洲国产成人av好男人在线观看| 欧美精品一区二区在线观看| 欧美视频三区在线播放| av中文字幕一区| 国产成人av网站| 国产在线精品免费av|