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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? intr.c

?? s3c2440 WINCE 5.00 官方bsp
?? C
字號:
//
// 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;
}

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜视频在线观看一区二区三区| 国产69精品久久99不卡| 国产尤物一区二区在线| 在线一区二区视频| 精品久久久久久久久久久院品网| 国产精品美女www爽爽爽| 日本欧美在线观看| 99re这里都是精品| 久久综合久久综合亚洲| 亚洲综合一区二区精品导航| 国产一区二区视频在线播放| 欧美日韩中文国产| 亚洲欧美怡红院| 精品亚洲国产成人av制服丝袜| 91电影在线观看| 国产精品色婷婷| 国产精品影视在线| 日韩欧美亚洲一区二区| 亚洲电影欧美电影有声小说| 99免费精品视频| 中文字幕精品在线不卡| 国产原创一区二区三区| 日韩欧美综合一区| 天天综合网天天综合色| 欧美性猛片xxxx免费看久爱| 日韩伦理免费电影| 成人综合婷婷国产精品久久蜜臀| 欧美v日韩v国产v| 亚洲国产精品人人做人人爽| 一本到高清视频免费精品| 中文一区二区完整视频在线观看| 激情综合网av| 精品理论电影在线| 韩日精品视频一区| 欧美mv日韩mv国产网站app| 五月婷婷综合激情| 欧美精品v国产精品v日韩精品| 亚洲精品精品亚洲| 日本二三区不卡| 亚洲国产美女搞黄色| 日本电影亚洲天堂一区| 亚洲国产va精品久久久不卡综合| 在线国产亚洲欧美| 亚洲国产综合色| 欧美夫妻性生活| 奇米影视一区二区三区| 日韩免费观看高清完整版 | 国产精品―色哟哟| 国产精品综合av一区二区国产馆| 久久精品综合网| 高清av一区二区| 亚洲手机成人高清视频| 91视频在线观看| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产电影| 精品午夜一区二区三区在线观看 | 6080亚洲精品一区二区| 日韩不卡一二三区| 欧美精品一区二区三区蜜桃 | 亚洲成av人片| 日韩一区二区在线免费观看| 国产美女视频一区| 亚洲视频在线观看一区| 欧美唯美清纯偷拍| 国产久卡久卡久卡久卡视频精品| 国产精品色噜噜| 在线成人免费观看| 国产精品一卡二卡在线观看| 中文字幕在线观看一区二区| 精品视频一区三区九区| 精品一区二区三区欧美| 亚洲精品亚洲人成人网| 日韩精品一区二区三区视频在线观看 | 日韩福利视频网| 国产亚洲精久久久久久| 欧美在线小视频| 国产成人av电影免费在线观看| 亚洲精品高清在线| 亚洲精品一线二线三线无人区| 色综合久久九月婷婷色综合| 免费三级欧美电影| 亚洲三级在线免费观看| 日韩欧美一区在线观看| av亚洲产国偷v产偷v自拍| 免费不卡在线视频| 亚洲精品免费视频| 久久综合视频网| 在线免费亚洲电影| 国产成人免费视频网站高清观看视频| 尤物在线观看一区| 久久亚洲二区三区| 欧美麻豆精品久久久久久| 成人免费高清在线观看| 激情av综合网| 图片区小说区国产精品视频| 国产精品久久久久久久久免费樱桃| 在线成人小视频| 欧美性猛片xxxx免费看久爱| 成人午夜av影视| 国产精品1区2区| 久久精品国产一区二区三| 午夜精品视频一区| 亚洲人成网站精品片在线观看 | 国产高清亚洲一区| 激情六月婷婷久久| 秋霞电影一区二区| 婷婷综合另类小说色区| 亚洲国产一区二区三区| 一区二区三区中文字幕精品精品 | 96av麻豆蜜桃一区二区| 国产成人精品影视| 麻豆成人免费电影| 三级影片在线观看欧美日韩一区二区 | 精品久久久久久久久久久久久久久| 精品视频免费在线| 在线观看日韩一区| 在线观看欧美黄色| 91日韩精品一区| 成人国产精品免费观看动漫 | 国产精品热久久久久夜色精品三区| 91在线视频免费观看| 99这里只有久久精品视频| 国产一区二区三区在线看麻豆| 天天影视色香欲综合网老头| 一区二区三区不卡视频在线观看| 国产日韩av一区| 欧美成人a视频| 日韩欧美一区二区视频| 欧美日韩另类一区| 欧美视频一区二区三区四区| av成人免费在线| av日韩在线网站| 91蝌蚪porny| 一本到一区二区三区| 国产精品69毛片高清亚洲| 成人免费va视频| 91在线一区二区三区| 99视频精品全部免费在线| 成人黄页在线观看| 在线一区二区三区做爰视频网站| 色综合天天综合网国产成人综合天| 丰满亚洲少妇av| www.欧美日韩| 色婷婷av一区二区三区之一色屋| 在线亚洲+欧美+日本专区| 在线一区二区三区做爰视频网站| 成人视屏免费看| 91美女片黄在线观看91美女| 色噜噜久久综合| 欧美区一区二区三区| 精品国产伦理网| 国产精品无圣光一区二区| 国产精品区一区二区三区| 中文字幕一区免费在线观看| 亚洲人成亚洲人成在线观看图片| 日韩在线卡一卡二| 国产在线不卡一区| 99精品黄色片免费大全| 色国产综合视频| 在线精品国精品国产尤物884a| 欧美mv日韩mv亚洲| 中文字幕一区二区三区蜜月| 一级日本不卡的影视| 另类小说一区二区三区| 粉嫩欧美一区二区三区高清影视| 91网站视频在线观看| 欧美日韩国产电影| 国产日韩精品一区二区三区在线| 五月婷婷另类国产| 国产一二精品视频| 欧美四级电影在线观看| 欧美大尺度电影在线| 国产欧美视频在线观看| 日韩精品欧美成人高清一区二区| 国产一区二区三区| 欧美最猛性xxxxx直播| 精品国产乱码久久久久久图片 | 老司机午夜精品99久久| 国产一二三精品| 日韩精品一区二区三区老鸭窝| 久久综合九色综合欧美亚洲| 亚洲综合无码一区二区| 精品在线你懂的| 色琪琪一区二区三区亚洲区| 日韩欧美国产1| 亚洲精品美国一| 国产成a人亚洲| 欧美日韩国产a| 亚洲精品一二三| 国产成人h网站| 日韩欧美在线一区二区三区| 性做久久久久久免费观看| 成人av资源在线| 久久亚洲免费视频| 欧美aaa在线| 欧美一区二区私人影院日本| 伊人性伊人情综合网| 国产在线观看一区二区| 欧美一区二区啪啪| 免费成人在线观看|