📄 sdhc_s3c2450.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 + -