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

📄 s3c2440disp.cpp

📁 该2440 BSP是由三星公司提供的wince5.0的BSP移植到到wince6.0下的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/*++
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 + -