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 + -
显示快捷键?