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

📄 sdhc_s3c2450.cpp

📁 S3C2450BSP开发包,里面有很多资料。可以提供大家参考下。有什么需要解决问题。可以联系我QQ:314661
💻 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.
//

#include <windows.h>
#include <nkintr.h>
#include <ceddk.h>
#include <s3c2450.h>
#include "SDHC_s3c2450.h"

#include <cebuscfg.h>




BOOL 
CSDHController::Init(
                     LPCTSTR pszActiveKey
                     )
{

	S3C2450_CLKPWR_REG *pCLKPWR;
	S3C2450_HSMMC_REG *pHSMMC;
	S3C2450_IOPORT_REG *pIOPreg;
	
	RETAILMSG(0,(TEXT("CSDHController::Init\n")));

	//GPIO Setting
    //----- 1. Map the GPIO registers needed to enable the SDI controller -----
    pIOPreg = (S3C2450_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2450_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pIOPreg == NULL) 
    {
        RETAILMSG (1,(TEXT("GPIO registers not allocated\r\n")));
		return FALSE;
    }
    if (!VirtualCopy((PVOID)pIOPreg, (PVOID)(S3C2450_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2450_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("GPIO registers not mapped\r\n")));

		return FALSE;
    }

    pCLKPWR = (S3C2450_CLKPWR_REG *)VirtualAlloc(0, sizeof(S3C2450_CLKPWR_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pCLKPWR == NULL) 
    {
        RETAILMSG (1,(TEXT("Clock & Power Management Special Register not allocated\n\r")));
        return FALSE;
    }
    if (!VirtualCopy((PVOID)pCLKPWR, (PVOID)(S3C2450_BASE_REG_PA_CLOCK_POWER >> 8), sizeof(S3C2450_CLKPWR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("Clock & Power Management Special Register not mapped\n\r")));
        return FALSE;
    }

    pHSMMC = (S3C2450_HSMMC_REG *)VirtualAlloc(0, sizeof(S3C2450_HSMMC_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pHSMMC == NULL) 
    {
        RETAILMSG (1,(TEXT("HSMMC Special Register not allocated\n\r")));
        return FALSE;
    }
    if (!VirtualCopy((PVOID)pHSMMC, (PVOID)(S3C2450_BASE_REG_PA_HSMMC >> 8), sizeof(S3C2450_HSMMC_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("HSMMC Special Register not mapped\n\r")));
        return FALSE;
    }	

//	pIOPreg->GPFCON &= ~(0x3<<14);
//	pIOPreg->GPFCON |= (0x1<<14);	

	pIOPreg->GPLCON &= ~(0xFFFFF);
	pIOPreg->GPLCON |= (0xAAAAA);
//	pIOPreg->GPLUDP &= ~(0xFFFFF);
//	pIOPreg->GPLUDP |= (0xAAAAA);

	pIOPreg->GPJCON &= ~(0x3F << 26);
	pIOPreg->GPJCON |= (0x2A << 26);
	
//	pIOPreg->GPJUDP &= ~(0x3F << 26);
//	pIOPreg->GPJUDP |= (0x2A << 26);

	pHSMMC->CONTROL2 = (pHSMMC->CONTROL2 & ~(0xffffffff)) | (0x1<<15)|(0x1<<14)|(0x1<<8)|(0x2/*EPLL*/<<4);
	pHSMMC->CONTROL3 = (0<<31) | (1<<23) | (0<<15) | (1<<7);
	RETAILMSG(0,(TEXT("pHSMMC->CONTROL2 = 0x%X\n"),pHSMMC->CONTROL2));
	pCLKPWR->HCLKCON |= (0x1<<16);
	pCLKPWR->SCLKCON |= (0x1<<13);	
	pCLKPWR->SCLKCON |= (0x1<<12);
//	pCLKPWR->CLKDIV1 |= (0x3<<6);
	
	VirtualFree((PVOID) pIOPreg, 0, MEM_RELEASE);
	VirtualFree((PVOID) pCLKPWR, 0, MEM_RELEASE);
	VirtualFree((PVOID) pHSMMC, 0, MEM_RELEASE);
	
	return CSDHCBase::Init(pszActiveKey);
}

void
CSDHController::PowerUp()
{
	S3C2450_CLKPWR_REG *pCLKPWR;
	S3C2450_HSMMC_REG *pHSMMC;
	S3C2450_IOPORT_REG *pIOPreg;
	S3C2450_INTR_REG *pINTreg;

	//GPIO Setting
    //----- 1. Map the GPIO registers needed to enable the SDI controller -----
    pIOPreg = (S3C2450_IOPORT_REG *)VirtualAlloc(0, sizeof(S3C2450_IOPORT_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pIOPreg == NULL) 
    {
        RETAILMSG (1,(TEXT("GPIO registers not allocated\r\n")));
		return;
    }
    if (!VirtualCopy((PVOID)pIOPreg, (PVOID)(S3C2450_BASE_REG_PA_IOPORT >> 8), sizeof(S3C2450_IOPORT_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("GPIO registers not mapped\r\n")));

		return;
    }

    pCLKPWR = (S3C2450_CLKPWR_REG *)VirtualAlloc(0, sizeof(S3C2450_CLKPWR_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pCLKPWR == NULL) 
    {
        RETAILMSG (1,(TEXT("Clock & Power Management Special Register not allocated\n\r")));
        return;
    }
    if (!VirtualCopy((PVOID)pCLKPWR, (PVOID)(S3C2450_BASE_REG_PA_CLOCK_POWER >> 8), sizeof(S3C2450_CLKPWR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("Clock & Power Management Special Register not mapped\n\r")));
        return;
    }

    pHSMMC = (S3C2450_HSMMC_REG *)VirtualAlloc(0, sizeof(S3C2450_HSMMC_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pHSMMC == NULL) 
    {
        RETAILMSG (1,(TEXT("HSMMC Special Register not allocated\n\r")));
        return;
    }
    if (!VirtualCopy((PVOID)pHSMMC, (PVOID)(S3C2450_BASE_REG_PA_HSMMC >> 8), sizeof(S3C2450_HSMMC_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("HSMMC Special Register not mapped\n\r")));
        return;
    }	
    
    pINTreg = (S3C2450_INTR_REG *)VirtualAlloc(0, sizeof(S3C2450_INTR_REG), MEM_RESERVE, PAGE_NOACCESS);
    if (pINTreg == NULL) 
    {
        RETAILMSG (1,(TEXT("HSMMC Special Register not allocated\n\r")));
        return;
    }
    if (!VirtualCopy((PVOID)pINTreg, (PVOID)(S3C2450_BASE_REG_PA_INTR >> 8), sizeof(S3C2450_INTR_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCACHE)) {
        RETAILMSG (1,(TEXT("HSMMC Special Register not mapped\n\r")));
        return;
    }    

//	pIOPreg->GPFCON &= ~(0x3<<14);
//	pIOPreg->GPFCON |= (0x1<<14);	

	pIOPreg->GPLCON &= ~(0xFFFFF);
	pIOPreg->GPLCON |= (0xAAAAA);
//	pIOPreg->GPLUDP &= ~(0xFFFFF);
//	pIOPreg->GPLUDP |= (0x55555);

	pIOPreg->GPJCON &= ~(0x3F << 26);
	pIOPreg->GPJCON |= (0x2A << 26);
//	pIOPreg->GPJUDP &= ~(0x3F << 26);
//	pIOPreg->GPJUDP |= (0x15 << 26);
	
	pHSMMC->CONTROL2 = (pHSMMC->CONTROL2 & ~(0xffffffff)) | (0x1<<15)|(0x1<<14)|(0x1<<8)|(0x2/*EPLL*/<<4);
	pHSMMC->CONTROL3 = (0<<31) | (1<<23) | (0<<15) | (1<<7);
	
	pCLKPWR->HCLKCON |= (0x1<<16);
	pCLKPWR->SCLKCON |= (0x1<<13);	
	pCLKPWR->SCLKCON |= (0x1<<12);	
	
	RETAILMSG(0,(TEXT("HSMMC!!!!!!!!!!! pINTreg->INTMSK = 0x%08X\n"),pINTreg->INTMSK));
	RETAILMSG(0,(TEXT("HSMMC!!!!!!!!!!! pHSMMC->NORINTSTSEN = 0x%08X\n"),pHSMMC->NORINTSTSEN));
	
	
	VirtualFree((PVOID) pINTreg, 0, MEM_RELEASE);
	VirtualFree((PVOID) pIOPreg, 0, MEM_RELEASE);
	VirtualFree((PVOID) pCLKPWR, 0, MEM_RELEASE);
	VirtualFree((PVOID) pHSMMC, 0, MEM_RELEASE);	
	
	CSDHCBase::PowerUp();
}

extern "C"
PCSDHCBase
CreateHSMMCHCObject(
                    )
{
    return new CSDHController;
}


VOID 
CSDHController::DestroyHSMMCHCObject(
                     PCSDHCBase pSDHC
                     )
{
    DEBUGCHK(pSDHC);
    delete pSDHC;
}

⌨️ 快捷键说明

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