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

📄 wdc_ints.c

📁 WinDriver目录下的源码
💻 C
字号:
/********************************************************************
*  File: wdc_ints.c - Implementation of WDC interrupt handling API  *
*                                                                   *
*  Copyright (c) 2005 Jungo Ltd.  http://www.jungo.com              *
*********************************************************************/

#include "wdc_lib.h"
#include "wdc_defs.h"
#include "wdc_err.h"

#if defined(WINCE) && defined(WD_CE_ENHANCED_INTR)
static WD_ITEMS *GetInterruptItem(WDC_DEVICE *pDev)
{
    DWORD i;
    for (i=0; i < pDev->cardReg.Card.dwItems; i++)
    {
        if (pDev->cardReg.Card.Item[i].item == ITEM_INTERRUPT && 
            pDev->cardReg.Card.Item[i].I.Int.hInterrupt == pDev->Int.hInterrupt)
        {
            return &pDev->cardReg.Card.Item[i];
        }
    }
    return NULL;
}
#endif

/*************************************************************
  Functions implementations
 *************************************************************/
DWORD DLLCALLCONV WDC_IntEnable(WDC_DEVICE_HANDLE hDev, WD_TRANSFER *pTransCmds,
    DWORD dwNumCmds, DWORD dwOptions, INT_HANDLER funcIntHandler, PVOID pData,
    BOOL fUseKP)
{
    DWORD dwStatus;
    PWDC_DEVICE pDev = (PWDC_DEVICE)hDev;

    WDC_Trace("WDC_IntEnable entered\n");

    if (!funcIntHandler || !WdcIsValidDevHandle(hDev))
    {
        WDC_Err("WDC_IntEnable: %s",
            !funcIntHandler ? "Error - NULL event handler callback function\n" : WdcGetLastErrStr());
        return WD_INVALID_PARAMETER;
    }

    if (pDev->hIntThread)
    {
        WDC_Trace("WDC_IntEnable: Interrupt is already enabled\n");
        return WD_OPERATION_ALREADY_DONE;
    }
    
    if (!pDev->Int.hInterrupt)
    {
        WDC_Trace("WDC_IntEnable: Error - No interrupt handle\n");
        return WD_INVALID_PARAMETER;
    }
    
    if (fUseKP)
    {
        if (!WDC_IS_KP(pDev))
        {
            WDC_Err("WDC_IntEnable: Error - No Kernel PlugIn handle\n");
            return WD_INVALID_PARAMETER;
        }

        pDev->Int.kpCall.hKernelPlugIn = WDC_GET_KP_HANDLE(pDev);
    }
    
    if (dwNumCmds && !pTransCmds)
    {
        WDC_Err("WDC_IntEnable: Error - No interrupt transfer commands "
            "(expecting %ld commands)\n", dwNumCmds);
        return WD_INVALID_PARAMETER;
    }

    pDev->Int.dwOptions |= dwOptions;
    pDev->Int.Cmd = pTransCmds;
    pDev->Int.dwCmds = dwNumCmds;

    dwStatus = InterruptEnable(&pDev->hIntThread, WDC_GetWDHandle(),
        &pDev->Int, funcIntHandler, pData);

    if (WD_STATUS_SUCCESS != dwStatus)
    {
        WDC_Err("WDC_IntEnable: Failed enabling interrupt.\n"
            "Error 0x%lx - %s\n", dwStatus, Stat2Str(dwStatus));

        pDev->hIntThread = NULL;
        return dwStatus;
    }

#if defined(WINCE) && defined(WD_CE_ENHANCED_INTR)
    {
        WD_ITEMS *pIntItem = GetInterruptItem(pDev);
        if (!pIntItem)
        {
            WDC_Err("WDC_IntEnable: Failed enabling interrupt - missing interrupt item\n");
            InterruptDisable(pDev->hIntThread);
            pDev->hIntThread = NULL;
            return WD_FAILED_ENABLING_INTERRUPT;
        }
        CEInterruptEnhance(pDev->hIntThread, pIntItem->I.Val.dw4);
    }
#endif

    WDC_Trace("WDC_IntEnable: Interrupt enabled successfully\n");
    
    return WD_STATUS_SUCCESS;
}

DWORD DLLCALLCONV WDC_IntDisable(WDC_DEVICE_HANDLE hDev)
{
    DWORD dwStatus = WD_STATUS_SUCCESS;
    PWDC_DEVICE pDev = (PWDC_DEVICE)hDev;

    WDC_Trace("WDC_IntDisable entered\n");
    
    if (!WdcIsValidDevHandle(hDev))
    {
        WDC_Err("WDC_IntDisable: %s\n", WdcGetLastErrStr());
        return WD_INVALID_PARAMETER;
    }
        
    if (!pDev->hIntThread)
    {
        WDC_Trace("WDC_IntDisable: Interrupt is already disabled\n");
        return WD_OPERATION_ALREADY_DONE;
    }
    
    dwStatus = InterruptDisable(pDev->hIntThread);

    if (WD_STATUS_SUCCESS == dwStatus)
        WDC_Trace("WDC_IntDisable: Interrupt disabled successfully\n");
    else
    {
        WDC_Err("WDC_IntDisable: Failed disabling interrupt.\n"
            "Error 0x%lx - %s\n", dwStatus, Stat2Str(dwStatus));
    }
    
    pDev->hIntThread = NULL;

    return dwStatus;
}

BOOL DLLCALLCONV WDC_IntIsEnabled(WDC_DEVICE_HANDLE hDev)
{
#if defined(DEBUG)
    if (!WdcIsValidDevHandle(hDev))
    {
        WDC_Err("WDC_IntIsEnabled: %s", WdcGetLastErrStr());
        return FALSE;
    }
#endif
    
    return (BOOL)((PWDC_DEVICE)hDev)->hIntThread;
}

⌨️ 快捷键说明

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