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

📄 ioctl.c

📁 Windows CE 6.0 BSP for VOIPAC Board (PXA270) Version 2b.
💻 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:  ioctl.c
//
#include <windows.h>
#include <nkintr.h>
#include <oal.h>


//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlHalRequestSysIntr
//
//  This function return existing SysIntr for non-shareable IRQs and create
//  new Irq -> SysIntr mapping for shareable.
//
BOOL OALIoCtlHalRequestSysIntr(
    UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer, 
    UINT32 outSize, UINT32 *pOutSize
) {
    BOOL rc;
    UINT32 *pInpData = pInpBuffer, sysIntr;

    OALMSG(OAL_INTR&&OAL_FUNC, (L"+OALIoCtlHalRequestSysIntr\r\n"));

    // We know output size already
    if (pOutSize != NULL) *pOutSize = sizeof(UINT32);

    // Check input parameters
    if (pInpBuffer == NULL || inpSize < sizeof(UINT32) || 
        pOutBuffer == NULL || outSize < sizeof(UINT32)
    ) {
        NKSetLastError(ERROR_INVALID_PARAMETER);
        rc = FALSE;
        OALMSG(OAL_WARN, (
            L"WARN: IOCTL_HAL_REQUEST_SYSINTR invalid parameters\r\n"
        ));
        goto cleanUp;
    }

    // Find if it is new or old call type
    if (inpSize > sizeof(UINT32) && pInpData[0] == -1) {
        // Second UINT32 contains flags, third and subsequents IRQs
        sysIntr = OALIntrRequestSysIntr(
            inpSize/sizeof(UINT32) - 2, &pInpData[2], pInpData[1]
        );
    } else {        
        // This is legacy call, first UINT32 contains IRQ
        sysIntr = OALIntrRequestSysIntr(1, pInpData, 0);
    }

    // Store obtained SYSINTR
    *(UINT32*)pOutBuffer = sysIntr;
    rc = TRUE;
    
cleanUp:
    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIoCtlHalRequestSysIntr(rc = %d)\r\n", rc
    ));
    return rc;
}


//------------------------------------------------------------------------------
//
//  Function:  OEMReleaseSysIntr
//
//  This function releases a previously-requested SYSINTR.
//
BOOL OALIoCtlHalReleaseSysIntr(
    UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer, 
    UINT32 outSize, UINT32 *pOutSize
) {
    BOOL rc;
    
    OALMSG(OAL_INTR&&OAL_FUNC, (L"+OALIoCtlHalRequestSysIntr\r\n"));

    // We know output size
    if (pOutSize != NULL) *pOutSize = 0;

    // Check input parameters
    if (pInpBuffer == NULL || inpSize < sizeof(UINT32)) {
        OALMSG(OAL_WARN, (
            L"WARN: IOCTL_HAL_RELEASE_SYSINTR invalid parameters\r\n"
        ));
        NKSetLastError(ERROR_INVALID_PARAMETER);
        rc = FALSE;
        goto cleanUp;
    }

    // Call function itself
    rc = OALIntrReleaseSysIntr(*(UINT32*)pInpBuffer);
    
cleanUp:
    OALMSG(OAL_INTR&&OAL_FUNC, (
        L"+OALIoCtlHalRequestSysIntr(rc = %d)\r\n", rc
    ));
    return rc;
}


//------------------------------------------------------------------------------
//
//  Function: OALIoCtlHalRequestIrq
//
//  This function returns IRQ for device on given location.
//
BOOL OALIoCtlHalRequestIrq(
    UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer, 
    UINT32 outSize, UINT32 *pOutSize
) {
    BOOL rc = FALSE;
    DEVICE_LOCATION *pDevLoc, devLoc;
    UINT32 count;
    
    OALMSG(OAL_INTR&&OAL_FUNC, (L"+OALIoCtlHalRequestIrq\r\n"));

    // Check parameters
    if (
        pInpBuffer == NULL || inpSize < sizeof(DEVICE_LOCATION) ||
        pOutBuffer == NULL || outSize < sizeof(UINT32)
    ) {
        NKSetLastError(ERROR_INVALID_PARAMETER);
        OALMSG(OAL_WARN, (
            L"WARN: IOCTL_HAL_REQUEST_IRQ invalid parameters\r\n"
        ));
        goto cleanUp;
    }

    // Call function itself (we must first fix PCI bus device location...)
    pDevLoc = (DEVICE_LOCATION*)pInpBuffer;
    memcpy(&devLoc, pDevLoc, sizeof(devLoc));
    if (devLoc.IfcType == PCIBus) devLoc.BusNumber >>= 8;
    count = outSize/sizeof(UINT32);
    rc = OALIntrRequestIrqs(&devLoc, &count, pOutBuffer);
    if (pOutSize != NULL) *pOutSize = count * sizeof(UINT32);

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

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

⌨️ 快捷键说明

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