sdiocontroller.cpp

来自「S3C24A0的完整BSP包,对开发此芯片的开发者很有用.」· C++ 代码 · 共 211 行

CPP
211
字号
//
// 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 <s3c24a0_ioport.h>
#include <s3c24a0_clkpwr.h>
#include <s3c24a0_sdi.h>
#include <s3c24a0_dma.h>

#include <creg.hxx>
#include <ddkreg.h>
#include <SDCardDDK.h>
#include <SDHCD.h>

#include "SDIOController.h"

///////////////////////////////////////////////////////////////////////////////
//  CSDIOController::CSDIOController - CSDIOController constructor
//  Input:  pHCContext - hardware context
//  Notes:  
//          
///////////////////////////////////////////////////////////////////////////////
CSDIOController::CSDIOController( PSDCARD_HC_CONTEXT pHCContext )
: CSDIOControllerBase( pHCContext )
{
}

///////////////////////////////////////////////////////////////////////////////
//  CSDIOController::~CSDIOController - CSDIOController destructor
//  Input:  
//  Notes:  
//          
///////////////////////////////////////////////////////////////////////////////
CSDIOController::~CSDIOController()
{
}

#define CARD_DETECT_GPIO_TEXT TEXT("CardDetectGPIO")
#define CARD_DETECT_MASK_TEXT TEXT("CardDetectMask")
#define CARD_DETECT_FLAG_TEXT TEXT("CardDetectFlag")
#define CARD_DETECT_CONTROL_MASK_TEXT TEXT("CardDetectControlMask")
#define CARD_DETECT_CONTROL_FLAG_TEXT TEXT("CardDetectControlFlag")
#define CARD_DETECT_PULLUP_MASK_TEXT TEXT("CardDetectPullupMask")
#define CARD_DETECT_PULLUP_FLAG_TEXT TEXT("CardDetectPullupFlag")

#define CARD_READWRITE_GPIO_TEXT TEXT("CardReadWriteGPIO")
#define CARD_READWRITE_MASK_TEXT TEXT("CardReadWriteMask")
#define CARD_READWRITE_FLAG_TEXT TEXT("CardReadWriteFlag")
#define CARD_READWRITE_CONTROL_MASK_TEXT TEXT("CardReadWriteControlMask")
#define CARD_READWRITE_CONTROL_FLAG_TEXT TEXT("CardReadWriteControlFlag")
#define CARD_READWRITE_PULLUP_MASK_TEXT TEXT("CardReadWritePullupMask")
#define CARD_READWRITE_PULLUP_FLAG_TEXT TEXT("CardReadWritePullupFlag")

BOOL CSDIOController::CustomSetup( LPCTSTR pszRegistryPath )
{
    BOOL fRetVal = TRUE;
    CReg regDevice; // encapsulated device key
    HKEY hKeyDevice = OpenDeviceKey(pszRegistryPath);
    if ( (hKeyDevice == NULL) || !regDevice.Open(hKeyDevice, NULL) ) {
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("CSDIOControllerBase::InterpretCapabilities: Failed to open device key\n")));
        fRetVal = FALSE;
        goto FUNCTION_EXIT;
    }

    // read the card detect GPIO settings
    LPCTSTR pszCardDetectGPIO = regDevice.ValueSZ( CARD_DETECT_GPIO_TEXT );
    if( pszCardDetectGPIO && pszCardDetectGPIO[0] >= TEXT('a') && pszCardDetectGPIO[0] <= TEXT('z') )
    {
        m_chCardDetectGPIO = (char)pszCardDetectGPIO[0] - ('a'-'A');
    }
    else if( pszCardDetectGPIO && pszCardDetectGPIO[0] >= TEXT('A') && pszCardDetectGPIO[0] <= TEXT('Z') )
    {
        m_chCardDetectGPIO = (char)pszCardDetectGPIO[0];
    }
    else
    {
        // invalid SDIO SYSINTR value!
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("invalid SDIO SYSINTR value!\n")));
        fRetVal = FALSE;
        goto FUNCTION_EXIT;
    }
    m_dwCardDetectMask = regDevice.ValueDW( CARD_DETECT_MASK_TEXT );
    m_dwCardDetectFlag = regDevice.ValueDW( CARD_DETECT_FLAG_TEXT );
    m_dwCardDetectControlMask = regDevice.ValueDW( CARD_DETECT_CONTROL_MASK_TEXT );
    m_dwCardDetectControlFlag = regDevice.ValueDW( CARD_DETECT_CONTROL_FLAG_TEXT );
    m_dwCardDetectPullupMask = regDevice.ValueDW( CARD_DETECT_PULLUP_MASK_TEXT );
    m_dwCardDetectPullupFlag = regDevice.ValueDW( CARD_DETECT_PULLUP_FLAG_TEXT );

    // read the card read/write GPIO settings
    LPCTSTR pszCardReadWriteGPIO = regDevice.ValueSZ( CARD_READWRITE_GPIO_TEXT );
    if( pszCardReadWriteGPIO && pszCardReadWriteGPIO[0] >= TEXT('a') && pszCardReadWriteGPIO[0] <= TEXT('h') )
    {
        m_chCardReadWriteGPIO = (char)pszCardReadWriteGPIO[0] - ('a'-'A');
    }
    else if( pszCardReadWriteGPIO || pszCardReadWriteGPIO[0] >= TEXT('A') && pszCardReadWriteGPIO[0] <= TEXT('H') )
    {
        m_chCardReadWriteGPIO = (char)pszCardReadWriteGPIO[0];
    }
    else
    {
        // invalid SDIO SYSINTR value!
        DEBUGMSG(SDCARD_ZONE_ERROR, (TEXT("invalid SDIO SYSINTR value!\n")));
        if (hKeyDevice) RegCloseKey(hKeyDevice);
        fRetVal = FALSE;
        goto FUNCTION_EXIT;
    }
    m_dwCardReadWriteMask = regDevice.ValueDW( CARD_READWRITE_MASK_TEXT );
    m_dwCardReadWriteFlag = regDevice.ValueDW( CARD_READWRITE_FLAG_TEXT );
    m_dwCardReadWriteControlMask = regDevice.ValueDW( CARD_READWRITE_CONTROL_MASK_TEXT );
    m_dwCardReadWriteControlFlag = regDevice.ValueDW( CARD_READWRITE_CONTROL_FLAG_TEXT );
    m_dwCardReadWritePullupMask = regDevice.ValueDW( CARD_READWRITE_PULLUP_MASK_TEXT );
    m_dwCardReadWritePullupFlag = regDevice.ValueDW( CARD_READWRITE_PULLUP_FLAG_TEXT );

FUNCTION_EXIT:
    if (hKeyDevice) RegCloseKey(hKeyDevice);
    return fRetVal;
}

BOOL CSDIOController::InitializeHardware( BOOL bOnPowerUp )
{
    // Configure GPIO pin to detect WRITE-PROTECT status
    switch( m_chCardReadWriteGPIO )
    {
    case 'U':
        vm_pIOPreg->GPCON_U  = ( vm_pIOPreg->GPCON_U & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
	    vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;        
        break;
    case 'M':
        vm_pIOPreg->GPCON_M  = ( vm_pIOPreg->GPCON_M & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
	    vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
        break;
    case 'L':
        vm_pIOPreg->GPCON_L  = ( vm_pIOPreg->GPCON_L & m_dwCardReadWriteControlMask ) | m_dwCardReadWriteControlFlag;
	    vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardReadWritePullupMask ) | m_dwCardReadWritePullupFlag;
        break;
    default:
        ASSERT(0); // invalid GPIO! We should never get here!
        return FALSE;
    }

    // Configure GPIO pin to detect CARD PRESENT status
    
	switch( m_chCardDetectGPIO )
    {
    case 'U':
        vm_pIOPreg->GPCON_U  = ( vm_pIOPreg->GPCON_U & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
		vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;        
        break;
    case 'M':
        vm_pIOPreg->GPCON_M  = ( vm_pIOPreg->GPCON_M & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
	    vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
        break;
    case 'L':
        vm_pIOPreg->GPCON_L  = ( vm_pIOPreg->GPCON_L & m_dwCardDetectControlMask ) | m_dwCardDetectControlFlag;
	    vm_pIOPreg->GPPU   = ( vm_pIOPreg->GPPU & m_dwCardDetectPullupMask ) | m_dwCardDetectPullupFlag;
        break;
    default:
        ASSERT(0); // invalid GPIO! We should never get here!
        return FALSE;
    }
    
    return TRUE;
}

void CSDIOController::DeinitializeHardware( BOOL bOnPowerDown )
{
    // nothing to do
}

BOOL CSDIOController::IsCardWriteProtected()
{
	
	//return ( ( vm_pIOPreg->GPDAT & m_dwCardReadWriteMask ) == m_dwCardReadWriteFlag ) ? TRUE  : FALSE;
    return false;

}

BOOL CSDIOController::IsCardPresent()
{
 //  	RETAILMSG(1, (TEXT("CSDIOController::IsCardPresent: rGPDAT %x\n"),vm_pIOPreg->GPDAT));
     
	return ( ( vm_pIOPreg->GPDAT & m_dwCardDetectMask ) == m_dwCardDetectFlag ) ? FALSE : TRUE;
	//	vm_pIOPreg->GPCON_L &= ~(0x03<<10); 
	//return ( (vm_pIOPreg->GPDAT&(0x01<<5)) == 0 ) ? TRUE  : FALSE;

	 

 //   return ( vm_pIOPreg->GPDAT & 1<<11 ) ? FALSE  : TRUE;

}

CSDIOControllerBase* CreateSDIOController( PSDCARD_HC_CONTEXT pHCContext )
{
    return new CSDIOController( pHCContext );
}

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

⌨️ 快捷键说明

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