📄 s3c2440disp.cpp
字号:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 2003. Samsung Electronics, co. ltd All rights reserved.
Module Name:
Abstract:
This file implements the S3C2440 LCD function
rev:
2003.6.28 : First S3C2440 version (jaeyong Lee, jaeyong2.lee@samsung.com)
Notes:
--*/
#include "precomp.h"
#include <aablt.h>
#include <gxinfo.h>
#define DBGLCD 1
#define DBGLCD1 1
#define SSBPP_DEFAULT 16
#define SSFREQ_DEFAULT 60
DWORD gdwLCDVirtualFrameBase;
INSTANTIATE_GPE_ZONES(0x3,"MGDI Driver","unused1","unused2") // Start with errors and warnings
DDGPE *gGPE = (DDGPE *)NULL;
PENGCALLBACKS ourengineCallbacks;
//static ulong gBitMasks[] = { 0xF800, 0x07E0, 0x001F }; // 565 MODE
static TCHAR gszBaseInstance[256] = _T("Drivers\\Display\\S3C2440\\CONFIG");
#define dim(x) (sizeof(x) / sizeof(x[0]))
//Added by APR ++
static volatile S3C2440A_CLKPWR_REG *v_s2440CLKPWR; // CLCKPWR (needed to enable display clocks)
//APR --
EGPEFormat eFormat[] =
{
gpe8Bpp,
gpe16Bpp,
gpe24Bpp,
gpe32Bpp,
};
EDDGPEPixelFormat ePixelFormat[4] =
{
ddgpePixelFormat_8bpp,
ddgpePixelFormat_565,
ddgpePixelFormat_8880,
ddgpePixelFormat_8888,
};
ULONG BitMasks[][3] =
{
{ 0, 0, 0 },
{ 0xF800, 0x07E0, 0x001F },
{ 0xFF0000, 0x00FF00, 0x0000FF },
{ 0x00FF0000, 0x0000FF00, 0x000000FF }
};
// This prototype avoids problems exporting from .lib
BOOL APIENTRY GPEEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
PENGCALLBACKS engineCallbacks);
BOOL APIENTRY DrvEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
PENGCALLBACKS engineCallbacks)
{
BOOL fOk = FALSE;
if(gszBaseInstance[0] != 0) {
RETAILMSG(DBGLCD,(_T("gszBaseInstance is valid\r\n")));
fOk = GPEEnableDriver(engineVersion, cj, data, engineCallbacks);
ourengineCallbacks = engineCallbacks;
}
RETAILMSG(DBGLCD,(_T("-DrvEnableDriver\r\n")));
return fOk;
}
BOOL ConvertStringToGuid (LPCTSTR pszGuid, GUID *pGuid)
{
UINT Data4[8];
int Count;
BOOL fOk = FALSE;
TCHAR *pszGuidFormat = _T("{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}");
RETAILMSG(DBGLCD1,(_T("++ConvertStringToGuid\r\n")));
DEBUGCHK(pGuid != NULL && pszGuid != NULL);
__try
{
if (_stscanf(pszGuid, pszGuidFormat, &pGuid->Data1,
&pGuid->Data2, &pGuid->Data3, &Data4[0], &Data4[1], &Data4[2], &Data4[3],
&Data4[4], &Data4[5], &Data4[6], &Data4[7]) == 11)
{
for(Count = 0; Count < (sizeof(Data4) / sizeof(Data4[0])); Count++)
{
pGuid->Data4[Count] = (UCHAR) Data4[Count];
}
}
fOk = TRUE;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
RETAILMSG(DBGLCD1,(_T("--ConvertStringToGuid\r\n")));
return fOk;
}
BOOL AdvertisePowerInterface(HMODULE hInst)
{
BOOL fOk = FALSE;
HKEY hk;
DWORD dwStatus;
TCHAR szTemp[MAX_PATH];
GUID gClass;
RETAILMSG(DBGLCD, (TEXT("++AdvertisePowerInterface\n")));
// assume we are advertising the default class
fOk = ConvertStringToGuid(PMCLASS_DISPLAY, &gClass);
DEBUGCHK(fOk);
// check for an override in the registry
dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("System\\GDI\\Drivers"), 0, 0, &hk);
if(dwStatus == ERROR_SUCCESS)
{
DWORD dwType, dwSize;
dwSize = sizeof(szTemp);
dwStatus = RegQueryValueEx(hk, _T("DisplayPowerClass"), NULL, &dwType, (LPBYTE) szTemp, &dwSize);
if(dwStatus == ERROR_SUCCESS && dwType == REG_SZ)
{
// got a guid string, convert it to a guid
GUID gTemp;
fOk = ConvertStringToGuid(szTemp, &gTemp);
DEBUGCHK(fOk);
if(fOk)
{
gClass = gTemp;
}
}
// release the registry key
RegCloseKey(hk);
}
// figure out what device name to advertise
if(fOk)
{
fOk = GetModuleFileName(hInst, szTemp, sizeof(szTemp)/sizeof(szTemp[0]));
DEBUGCHK(fOk);
}
// now advertise the interface
if(fOk)
{
fOk = AdvertiseInterface(&gClass, szTemp, TRUE);
DEBUGCHK(fOk);
}
RETAILMSG(DBGLCD, (TEXT("--AdvertisePowerInterface\n")));
return fOk;
}
// Main entry point for a GPE-compliant driver
GPE *GetGPE(void)
{
RETAILMSG(DBGLCD,(_T("+GetGPE() called\r\n")));
if (!gGPE)
{
gGPE = new S3C2440DISP();
}
RETAILMSG(DBGLCD,(_T("-GetGPE()\r\n")));
return gGPE;
}
// GWES will invoke this routine once prior to making any other calls into the driver.
// This routine needs to save its instance path information and return TRUE. If it
// returns FALSE, GWES will abort the display initialization.
BOOL APIENTRY
DisplayInit(LPCTSTR pszInstance, DWORD dwNumMonitors)
{
DWORD dwStatus;
HKEY hkDisplay;
BOOL fOk = FALSE;
RETAILMSG(1, (_T("s3c2440disp: display instance '%s', num monitors %d\r\n"), \
pszInstance != NULL ? pszInstance : _T("<NULL>"), dwNumMonitors));
if(pszInstance != NULL)
{
_tcsncpy(gszBaseInstance, pszInstance, dim(gszBaseInstance));
}
v_s2440CLKPWR = (volatile S3C2440A_CLKPWR_REG *)VirtualAlloc(0, sizeof(S3C2440A_CLKPWR_REG), MEM_RESERVE, PAGE_NOACCESS);
if (!v_s2440CLKPWR)
{
RETAILMSG(1, (TEXT("#####Display::InitializeHardware VirtualAlloc failed!\r\n")));
return FALSE;
}
if (!VirtualCopy((PVOID)v_s2440CLKPWR, (PVOID)(S3C2440A_BASE_REG_PA_CLOCK_POWER>>8), sizeof(S3C2440A_CLKPWR_REG), PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL ))
{
RETAILMSG(1, (TEXT("#####Display::InitializeHardware VirtualCopy failed!\r\n")));
return FALSE;
}
// sanity check the path by making sure it exists
dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, &hkDisplay);
if(dwStatus == ERROR_SUCCESS)
{
RegCloseKey(hkDisplay);
fOk = TRUE;
}
else
{
// jylee
RETAILMSG(1, (_T("S3C2440DISP: DisplayInit: can't open '%s'\r\n"), gszBaseInstance));
}
RETAILMSG(DBGLCD,(_T("-DisplayInit\r\n")));
return fOk;
}
S3C2440DISP::S3C2440DISP (void)
{
ULONG fbSize;
ULONG fbOffset;
ULONG offsetX, offsetY;
HKEY hkDisplay = NULL;
DWORD dwLCDPhysicalFrameBase;
DWORD dwStatus, dwType, dwSize;
HKEY hKey;
RETAILMSG(DBGLCD, (TEXT("++S3C2440DISP::S3C2440DISP\r\n")));
// setup up display mode related constants
m_nScreenWidth = 800; //c ksk 20060821
m_nScreenHeight = 480; //c ksk 20060821
m_colorDepth = SSBPP_DEFAULT;
m_cxPhysicalScreen = 800; //c ksk 20060821
m_cyPhysicalScreen = 480; //c ksk 20060821
m_cbScanLineLength = m_nScreenWidth * 2;
m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;
m_VideoPowerState = VideoPowerOn;
m_pPrimarySurface = NULL;
m_pVideoMemoryHeap = NULL;
//APR check
m_pModeEx = &m_ModeInfoEx;
m_pMode = &m_ModeInfoEx.modeInfo;
memset(m_pModeEx, 0, sizeof(GPEModeEx));
m_pModeEx->dwSize = sizeof(GPEModeEx);
m_pModeEx->dwVersion = GPEMODEEX_CURRENTVERSION;
// Setup main ModeInfo
m_pMode->modeId = 0;
m_pMode->Bpp = SSBPP_DEFAULT;
m_pMode->frequency = SSFREQ_DEFAULT;
m_pMode->width = m_nScreenWidth;
m_pMode->height = m_nScreenHeight;
// Setup Rotation Info
m_nScreenHeightSave = m_pMode->height;
m_nScreenWidthSave = m_pMode->width;
m_iRotate = GetRotateModeFromReg();
SetRotateParams();
// compute frame buffer displayable area offset
offsetX = (m_cxPhysicalScreen - m_nScreenWidth) / 2;
offsetY = (m_cyPhysicalScreen - m_nScreenHeight) / 2;
fbOffset = (offsetY * m_cbScanLineLength) + offsetX;
int nBPP = m_pMode->Bpp/8 - 1;
switch (m_pMode->Bpp)
{
// case 8:
case 16:
case 24:
case 32:
m_pMode->format = eFormat[nBPP];
m_pModeEx->ePixelFormat = ePixelFormat[nBPP];
m_pModeEx->lPitch = m_pMode->width * m_pMode->Bpp / 8;
m_pModeEx->dwRBitMask = BitMasks[nBPP][0];
m_pModeEx->dwGBitMask = BitMasks[nBPP][1];
m_pModeEx->dwBBitMask = BitMasks[nBPP][2];
break;
default:
RETAILMSG(1,(TEXT("Invalid BPP value passed to driver - Bpp = %d\r\n"), m_pMode->Bpp));
m_pMode->format = gpeUndefined;
break;
}
// compute physical frame buffer size
// for DDraw enabled, make sure we also have some off-screen video memory available for surface allocations
//fbSize = (((m_cyPhysicalScreen * m_cbScanLineLength) >> 20) + 1) << 20; // set size to next highest 1MB boundary
//APR: for now we are taking it as 1 MB
//fbSize = (1024 * 1024);
fbSize = 0xc0000;//(800 * 480*2);
// open the registry key and read our configuration
dwStatus = RegOpenKeyEx(HKEY_LOCAL_MACHINE, gszBaseInstance, 0, 0, &hkDisplay);
dwType = REG_DWORD;
if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD)
{
dwSize = sizeof(DWORD);
dwStatus = RegQueryValueEx(hkDisplay, _T("LCDVirtualFrameBase"), NULL, &dwType,
(LPBYTE) &gdwLCDVirtualFrameBase, &dwSize);
}
if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD)
{
dwSize = sizeof(DWORD);
dwStatus = RegQueryValueEx(hkDisplay, _T("LCDPhysicalFrameBase"), NULL, &dwType,
(LPBYTE) &dwLCDPhysicalFrameBase, &dwSize);
}
// close the registry key
if(hkDisplay != NULL)
{
RegCloseKey(hkDisplay);
}
RETAILMSG(DBGLCD, (TEXT("LCDPhysicalFrameBase (PHY : 0x%x) and of size 0x%x \n\r"), dwLCDPhysicalFrameBase, fbSize));
//did we get everything?
if(dwStatus != ERROR_SUCCESS)
{
RETAILMSG(1, (_T("S3C2440DISP: InitializeHardware: couldn't read registry configuration\r\n")));
return;
}
#if 0
// Use CreateFileMapping/MapViewOfFile to guarantee the VirtualFrameBuffer
// pointer is allocated in shared memory.
m_hVFBMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, fbSize, NULL);
if (m_hVFBMapping != NULL)
{
m_VirtualFrameBuffer = (DWORD)MapViewOfFile(m_hVFBMapping, FILE_MAP_WRITE, 0, 0, 0);
}
else
{
m_VirtualFrameBuffer = NULL;
RETAILMSG(1, (TEXT("CreateFileMapping Failed\r\n")));
return;
}
if (!VirtualCopy((void *)m_VirtualFrameBuffer, (void *)(dwLCDPhysicalFrameBase >> 8), fbSize, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL))
{
RETAILMSG(1, (TEXT("VirtualCopy Failed\r\n")));
return;
}
//CeSetMemoryAttributes ((void *)m_VirtualFrameBuffer, (void *)(dwLCDPhysicalFrameBase >> 8), fbSize, PAGE_WRITECOMBINE);
#endif
// Direct Access for frame buffer, Because GWES is running in kernel region
m_VirtualFrameBuffer = gdwLCDVirtualFrameBase;
RETAILMSG(DBGLCD, (TEXT("m_VirtualFrameBuffer is mapped at %x(PHY : %x) and of size %x \n\r"), m_VirtualFrameBuffer, dwLCDPhysicalFrameBase, fbSize));
memset ((void*)m_VirtualFrameBuffer, 0x0, fbSize);
m_pVideoMemoryHeap = new SurfaceHeap(fbSize, m_VirtualFrameBuffer, NULL, NULL);
if(!m_pVideoMemoryHeap)
{
RETAILMSG (1, (L"Failed to create surface heap on internal SRAM memory\n"));
return;
}
#if 0 //{ taken to setmode
//Allocate our primary surface here
if(FAILED(AllocSurface((DDGPESurf **)&m_pPrimarySurface, m_nScreenWidth,
m_nScreenHeight, m_pMode->format, m_pModeEx->ePixelFormat,
GPE_REQUIRE_VIDEO_MEMORY)))
{
RETAILMSG (1, (L"Couldn't allocate primary surface\n"));
return;
}
#endif //}
//memset((PUCHAR) m_pPrimarySurface->Buffer(), 0,
// (m_nScreenWidth * m_pMode->width * m_pMode->Bpp/8) * m_nScreenHeight);
RETAILMSG(DBGLCD, (TEXT("10\r\n")));
m_CursorVisible = FALSE;
m_CursorDisabled = TRUE;
m_CursorForcedOff = FALSE;
RETAILMSG(DBGLCD, (TEXT("11\r\n")));
memset (&m_CursorRect, 0x0, sizeof(m_CursorRect));
RETAILMSG(DBGLCD, (TEXT("12\r\n")));
m_CursorBackingStore = NULL;
m_CursorXorShape = NULL;
m_CursorAndShape = NULL;
RETAILMSG(DBGLCD, (TEXT("13\r\n")));
AdvertisePowerInterface(g_hmodDisplayDll);
RETAILMSG(DBGLCD, (TEXT("--S3C2440DISP::S3C2440DISP\r\n")));
}
S3C2440DISP::~S3C2440DISP()
{
RETAILMSG(DBGLCD,(_T("++S3C2440DISP::~S3C2440DISP\r\n")));
if (m_VirtualFrameBuffer != NULL)
UnmapViewOfFile((LPVOID)m_VirtualFrameBuffer);
if (m_hVFBMapping != NULL)
CloseHandle(m_hVFBMapping);
RETAILMSG(DBGLCD,(_T("--S3C2440DISP::~S3C2440DISP\r\n")));
}
SCODE S3C2440DISP::SetMode (INT modeId, HPALETTE *palette)
{
// jylee
RETAILMSG(DBGLCD, (TEXT("++S3C2440DISP::SetMode\r\n")));
if (modeId != 0)
{
RETAILMSG(1, (TEXT("S3C2440DISP::SetMode Want mode %d, only have mode 0\r\n"),modeId));
return E_INVALIDARG;
}
if (palette)
{
RETAILMSG(DBGLCD, (TEXT("Calling EngCreatePalette\r\n")));
// *palette = ourengineCallbacks->EngCreatePalette(PAL_BITFIELDS, 0, NULL, gBitMasks[0], gBitMasks[1], gBitMasks[2]);
int nBPP = m_pMode->Bpp/8 - 1;
switch (m_pMode->Bpp)
{
//case 8:
case 16:
case 24:
case 32:
*palette = ourengineCallbacks->EngCreatePalette (PAL_BITFIELDS,
0,
NULL,
BitMasks[nBPP][0],
BitMasks[nBPP][1],
BitMasks[nBPP][2]);
break;
default :
RETAILMSG(1, (TEXT("ERR !!! S3C2440DISP::SetMode , m_pMode->Bpp = %d \r\n"),m_pMode->Bpp));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -