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

📄 sdhcmain.cpp

📁 SBC2410 WinCE 5.0 BSP.绝大多数驱动已经调通。
💻 CPP
字号:
//
// 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) 2002 BSQUARE Corporation.  All rights reserved.
// DO NOT REMOVE --- BEGIN EXTERNALLY DEVELOPED SOURCE CODE ID 40973--- DO NOT REMOVE

#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include <s2410.h>
#include <SDCardDDK.h>
#include <SDHCD.h>
#include "SDIOControllerBase.h"



    // initialize debug zones
SD_DEBUG_INSTANTIATE_ZONES(
     TEXT("SDHC_SC2410"), // module name
     ZONE_ENABLE_INIT | ZONE_ENABLE_ERROR | ZONE_ENABLE_WARN, 
     TEXT("Interrupts"),
     TEXT("Send Handler "), 
     TEXT("Responses"), 
     TEXT("Receive Data"),                   
     TEXT("Clock Control"), 
     TEXT("Transmit Data"), 
     TEXT(""), 
     TEXT(""),
     TEXT(""),
     TEXT(""),
     TEXT(""));


#define SDHCD_SLOTS 1
#define SDHCD_REGISTRY_BASE_PATH TEXT("Drivers\\SDCARD\\HostController\\SDHCD")

BOOL g_fRegisteredWithBusDriver;

///////////////////////////////////////////////////////////////////////////////
//  SDHDCardDllEntry - the main dll entry point
//  Input:  hInstance - the instance that is attaching
//          Reason - the reason for attaching
//          pReserved - 
//  Output: 
//  Return: TRUE
//  Notes:  this is only used to initialize the zones
///////////////////////////////////////////////////////////////////////////////
BOOL DllEntry(HINSTANCE hInstance, ULONG Reason, LPVOID pReserved)
{
    BOOL fRet = TRUE;

    if(Reason == DLL_PROCESS_ATTACH) 
	{
        DEBUGREGISTER(hInstance);
        DisableThreadLibraryCalls( (HMODULE) hInstance );

        if( !SDInitializeCardLib() )
        {
            fRet = FALSE;
        }
        else if( !SD_API_SUCCESS( SDHCDInitializeHCLib() ) ) 
        {
            SDDeinitializeCardLib();
            fRet = FALSE;
        }

        g_fRegisteredWithBusDriver = FALSE;
    }

    if(Reason == DLL_PROCESS_DETACH) 
	{	
        SDHCDDeinitializeHCLib();
        SDDeinitializeCardLib();
    }

    return(TRUE);
}



///////////////////////////////////////////////////////////////////////////////
//  SDH_Init - the init entry point 
//  Input:  dwContext - the context for this init
//  Output: 
//  Return: returns instance context
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
extern "C"
DWORD SDH_Init(DWORD dwContext)
{
    DWORD                   dwRet = 0;           // return value    
    PSDCARD_HC_CONTEXT      pHostContext = NULL; // new HC context
    SD_API_STATUS           status;              // SD status
    LPCTSTR pszActiveKey = (LPCTSTR) dwContext;
    CSDIOControllerBase* pController = NULL;

    DEBUGMSG(SDCARD_ZONE_INIT, (TEXT("SDHC +Init\n")));
    RETAILMSG(1, (TEXT("SDHC +Init\r\n")));
    ASSERT( g_fRegisteredWithBusDriver == FALSE );

    // Allocate the context
	status = SDHCDAllocateContext(SDHCD_SLOTS/*, sizeof(SDHCD_HARDWARE_CONTEXT)*/, &pHostContext);

    if(!SD_API_SUCCESS(status)) 
	{
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD: Failed to allocate context : 0x%08X \n"), status));
	 RETAILMSG(1, (TEXT("SDHCD: Failed to allocate context : 0x%08X \n"), status));
        goto EXIT;
    }

    // Create the SD Host Controller object
    pController = CreateSDIOController( pHostContext );
    if( pController == NULL ) {
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHC Failed to allocate SD Host Controller object\n")));
	 RETAILMSG(1, (TEXT("SDHC Failed to allocate SD Host Controller object\n")));
        goto EXIT;
    }

    // Set our extension
    pHostContext->pHCSpecificContext = pController;

    // Read SD Host Controller Info from registry.
    if (!pController->InterpretCapabilities((LPCTSTR)dwContext)) {
        goto EXIT;
    }

    // now register the host controller 
    status = SDHCDRegisterHostController(pHostContext);

    if(!SD_API_SUCCESS(status)) 
	{
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("SDHCD: Failed to register host controller: %0x08X \n"),status));
	 RETAILMSG(1, (TEXT("SDHCD: Failed to register host controller: %0x08X \n"),status));
        goto EXIT;
    }
    g_fRegisteredWithBusDriver = TRUE;

    // return the controller context
    dwRet = (DWORD)pController;
    
EXIT:
    if( dwRet == 0 )
    {
        if( pHostContext ) 
        {
            // deregister the host controller
            if (g_fRegisteredWithBusDriver) 
            {
                SDHCDDeregisterHostController(pHostContext);
                g_fRegisteredWithBusDriver = FALSE;
            }

            // delete the SD Host Controller object
            if( pController )
            {
                delete pController;
            }

            // cleanup the host context
            SDHCDDeleteContext(pHostContext);
        }
    }

    DEBUGMSG(SDCARD_ZONE_INIT, (TEXT("SDHC -Init\n")));
    RETAILMSG(1, (TEXT("SDHC +Init dwRet=0x%x\r\n",dwRet)));
    return dwRet;
}


///////////////////////////////////////////////////////////////////////////////
//  SDH_PreDeinit - the predeinit entry point 
//  Input:  hDeviceContext - the context returned from SDH_Init
//  Output: 
//  Return: always returns TRUE
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
extern "C"
BOOL SDH_PreDeinit(DWORD hDeviceContext)
{
    CSDIOControllerBase *pController = (CSDIOControllerBase*)hDeviceContext;

    if( g_fRegisteredWithBusDriver )
    {
        PSDCARD_HC_CONTEXT pHostContext = pController->GetHostContext();

        pController->PreDeinit();

        // deregister the host controller
        SDHCDDeregisterHostController(pHostContext);

        g_fRegisteredWithBusDriver = FALSE;
    }

    return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
//  SDH_Deinit - the deinit entry point 
//  Input:  hDeviceContext - the context returned from SDH_Init
//  Output: 
//  Return: always returns TRUE
//  Notes:  
///////////////////////////////////////////////////////////////////////////////
extern "C"
BOOL SDH_Deinit(DWORD hDeviceContext)
{
    CSDIOControllerBase *pController = (CSDIOControllerBase*)hDeviceContext;
    PSDCARD_HC_CONTEXT pHostContext = pController->GetHostContext();

    if( g_fRegisteredWithBusDriver )
    {
        // deregister the host controller
        SDHCDDeregisterHostController(pHostContext);

        g_fRegisteredWithBusDriver = FALSE;
    }

    // delete the SD Host Controller object
    delete pController;

    // Cleanup the host context
    SDHCDDeleteContext(pHostContext);

    return TRUE;
}



///////////////////////////////////////////////////////////////////////////////
//  SDH_IOControl - the I/O control entry point
//  Input:  hOpenContext - the context returned from SDH_Open
//          dwCode - the ioctl code
//          pBufIn - the input buffer from the user
//          dwLenIn - the length of the input buffer
//          pBufOut - the output buffer from the user
//          dwLenOut - the length of the output buffer
//          pdwActualOut - the size of the transfer
//  Output: 
//  Return: FALSE
//  Notes:  Not used
///////////////////////////////////////////////////////////////////////////////
extern "C"
BOOL SDH_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn,
                   PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDHCD: +-SDH_IOControl \n")));
    RETAILMSG(1, (TEXT("SDHCD: +-SDH_IOControl\r\n")));
    return FALSE;;
}

///////////////////////////////////////////////////////////////////////////////
//  SDH_Open - the open entry point for the bus driver
//  Input:  hDeviceContext - the device context from SDH_Init
//          AccessCode - the desired access
//          ShareMode - the desired share mode
//  Output: 
//  Return: 0
//  Notes:  not used
///////////////////////////////////////////////////////////////////////////////
extern "C"
DWORD SDH_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDHCD: +-SDH_Open\n")));
    RETAILMSG(1, (TEXT("SDHCD: +-SDH_Open\r\n")));
    CSDIOControllerBase *pController = (CSDIOControllerBase*)hDeviceContext;
    return (DWORD) pController;
}



///////////////////////////////////////////////////////////////////////////////
//  SDH_Close - the close entry point 
//  Input:  hOpenContext - the context returned from SDH_Open
//  Output: 
//  Return: TRUE
//  Notes:  not used
///////////////////////////////////////////////////////////////////////////////
extern "C"
BOOL SDH_Close(DWORD hOpenContext)
{
	DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDHCD: +-SDH_Close\n")));
       RETAILMSG(1, (TEXT("SDHCD: +-SDH_Close\r\n")));
	return TRUE;
}

///////////////////////////////////////////////////////////////////////////////
//  SDH_PowerDown - the power down entry point
//  Input:  hDeviceContext - the device context from SDH_Init
//  Output: 
//  Notes:  preforms no actions
///////////////////////////////////////////////////////////////////////////////
extern "C"
void SDH_PowerDown(DWORD hDeviceContext)
{
	DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDHCD: +-SDH_PowerDown\n")));
       RETAILMSG(1, (TEXT("SDHCD: +-SDH_PowerDown\r\n")));
    CSDIOControllerBase *pController = (CSDIOControllerBase*)hDeviceContext;
    if( pController )
    {
        pController->OnPowerDown();
    }
    return;
}

///////////////////////////////////////////////////////////////////////////////
//  SDH_PowerUp - the power up entry point 
//  Input:  hDeviceContext - the device context from SDH_Init
//  Output: 
//  Notes:  preforms no actions
///////////////////////////////////////////////////////////////////////////////
extern "C"
void SDH_PowerUp(DWORD  hDeviceContext)
{
    DEBUGMSG(SDCARD_ZONE_FUNC, (TEXT("SDHCD: +-SDH_PowerUp\n")));
    RETAILMSG(1, (TEXT("SDHCD: +-SDH_PowerUp\r\n")));
    CSDIOControllerBase *pController = (CSDIOControllerBase*)hDeviceContext;
    if( pController )
    {
        pController->OnPowerUp();
    }
    return;
}

// DO NOT REMOVE --- END EXTERNALLY DEVELOPED SOURCE CODE ID --- DO NOT REMOVE

⌨️ 快捷键说明

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