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

📄 ioctl.c

📁 LP1071 无线局域网卡WinCE驱动程序
💻 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.
//
//-----------------------------------------------------------------------------
//
// Copyright (C) 2004-2006,2007 Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//
//-----------------------------------------------------------------------------
//
//  File: ioctl.c
//
//  This file implements the OEM's IO Control (IOCTL) functions and declares
//  global variables used by the IOCTL component.
//
//-----------------------------------------------------------------------------
#include <bsp.h>


//-----------------------------------------------------------------------------
// EXTERNAL FUNCTIONS
//-----------------------------------------------------------------------------
extern BOOL OALNandFCSetCfg(NANDFC_IOCTL_CFG *pCfg);
extern BOOL OALNandFCGetCfg(NANDFC_IOCTL_CFG *pCfg);
extern HANDLE SC_CreateMutex(LPSECURITY_ATTRIBUTES lpsa, BOOL bInitialOwner, LPCTSTR lpName);

//-----------------------------------------------------------------------------
// Global Variables
BOOL g_oalPostInit = FALSE;
HANDLE g_oalPmicMutex;


//------------------------------------------------------------------------------
//
//  Global: g_oalIoctlPlatformType/OEM
//
//  Platform Type/OEM
//
LPCWSTR g_oalIoCtlPlatformType = IOCTL_PLATFORM_TYPE;
LPCWSTR g_oalIoCtlPlatformOEM  = IOCTL_PLATFORM_OEM;

//------------------------------------------------------------------------------
//
//  Global: g_oalIoctlProcessorVendor/Name/Core
//
//  Processor information
//
LPCWSTR g_oalIoCtlProcessorVendor = IOCTL_PROCESSOR_VENDOR;
LPCWSTR g_oalIoCtlProcessorName   = IOCTL_PROCESSOR_NAME;
LPCWSTR g_oalIoCtlProcessorCore   = IOCTL_PROCESSOR_CORE;

//------------------------------------------------------------------------------
//
//  Global: g_oalIoctlInstructionSet
//
//  Processor instruction set identifier
//
UINT32 g_oalIoCtlInstructionSet = IOCTL_PROCESSOR_INSTRUCTION_SET;
UINT32 g_oalIoCtlClockSpeed = IOCTL_PROCESSOR_CLOCK_SPEED;


//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlHalPostInit
//
//  This function is the next OAL routine called by the kernel after OEMInit and
//  provides a context for initializing other aspects of the device prior to
//  general boot.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalPostInit(
    UINT32 code, VOID *pInpBuffer, UINT32 inpSize, VOID *pOutBuffer,
    UINT32 outSize, UINT32 *pOutSize)
{

    // Set flag to indicate it is okay to call Sleep within OAL
    g_oalPostInit = TRUE;

    // Initialize platform OAL critical sections
    g_oalPmicMutex = SC_CreateMutex(NULL, FALSE, L"MUTEX_PMIC");
    
    return(TRUE);

}


//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlHalPresuspend
//
//  This function implements IOCTL_HAL_PRESUSPEND which provides the OAL 
//  the time needed to prepare for a suspend operation. Any preparation is 
//  completed while the system is still in threaded mode.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalPresuspend(
    UINT32 code, VOID* pInpBuffer, UINT32 inpSize, VOID* pOutBuffer, 
    UINT32 outSize, UINT32 *pOutSize) 
{
    // Do nothing for now.
    //
    return(TRUE);
}



//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlQueryDispSettings
//
//  This function implements IOCTL_HAL_QUERY_DISPLAYSETTINGS and is used by 
//  graphics device interface (GDI) to query the kernel for information about 
//  a preferred resolution for the system to use.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlQueryDispSettings (
    UINT32 code, VOID *lpInBuf, UINT32 nInBufSize, VOID *lpOutBuf, 
    UINT32 nOutBufSize, UINT32 *lpBytesReturned) 
{
    DWORD dwErr = 0;

    if (lpBytesReturned) {
        *lpBytesReturned = 0;
    }

    if (!lpOutBuf) {
        dwErr = ERROR_INVALID_PARAMETER;
    } 
    else if (sizeof(DWORD)*3 > nOutBufSize) {
        dwErr = ERROR_INSUFFICIENT_BUFFER;
    } else {
        __try {

            ((PDWORD)lpOutBuf)[0] = (DWORD) BSP_PREF_DISPLAY_WIDTH;
            ((PDWORD)lpOutBuf)[1] = (DWORD) BSP_PREF_DISPLAY_HEIGHT;
            ((PDWORD)lpOutBuf)[2] = (DWORD) BSP_PREF_DISPLAY_BPP;

            if (lpBytesReturned) {
                *lpBytesReturned = sizeof (DWORD) * 3;
            }

        } __except (EXCEPTION_EXECUTE_HANDLER) {
            dwErr = ERROR_INVALID_PARAMETER;
        }
    }

    if (dwErr) {
        NKSetLastError (dwErr);
    }

    return !dwErr;
}

//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlHalSetNANDFCCfg
//
//  This function provides a mechanism for configuring the NAND flash interface
//  on i.MX27.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalSetNANDFCCfg(UINT32 code, VOID *pInpBuffer,
    UINT32 inpSize, VOID *pOutBuffer, UINT32 outSize, UINT32 *pOutSize)
{
    BOOL rc = FALSE;

    OALMSG(OAL_IOCTL&&OAL_FUNC, (L"+OALIoCtlHalEnableHwClock\r\n"));

    // Check input parameters
    if (pInpBuffer == NULL || inpSize < sizeof(NANDFC_IOCTL_CFG))
    {
        NKSetLastError(ERROR_INVALID_PARAMETER);
        OALMSG(OAL_WARN, (
            L"WARN: IOCTL_HAL_SET_NANDFC_CFG invalid parameter.\r\n"
        ));
        goto cleanUp;
    }
    
    // Call function itself
    rc = OALNandFCSetCfg((NANDFC_IOCTL_CFG *)pInpBuffer);

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

//------------------------------------------------------------------------------
//
//  Function:  OALIoCtlHalGetNANDFCCfg
//
//  This function provides a mechanism for obtaining the NAND flash interface
//  configuration on i.MX27.
//
//------------------------------------------------------------------------------
BOOL OALIoCtlHalGetNANDFCCfg(UINT32 code, VOID *pInpBuffer,
    UINT32 inpSize, VOID *pOutBuffer, UINT32 outSize, UINT32 *pOutSize)
{
    BOOL rc = FALSE;

    OALMSG(OAL_IOCTL&&OAL_FUNC, (L"+OALIoCtlHalGetNANDFCCfg\r\n"));

    // Check input parameters
    if (pOutBuffer == NULL || outSize < sizeof(NANDFC_IOCTL_CFG))
    {
        NKSetLastError(ERROR_INVALID_PARAMETER);
        OALMSG(OAL_WARN, (
            L"WARN: IOCTL_HAL_GET_NANDFC_CFG invalid parameter.\r\n"
        ));
        goto cleanUp;
    }

    // Call function itself
    rc = OALNandFCGetCfg((NANDFC_IOCTL_CFG *)pOutBuffer);

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

//------------------------------------------------------------------------------
//
//  Global: g_oalIoCtlTable[]
//
//  IOCTL handler table. This table includes the IOCTL code/handler pairs
//  defined in the IOCTL configuration file. This global array is exported
//  via oal_ioctl.h and is used by the OAL IOCTL component.
//
const OAL_IOCTL_HANDLER g_oalIoCtlTable[] = {
#include "ioctl_tab.h"
};

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

⌨️ 快捷键说明

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