s3c24a0disp.cpp

来自「S3C24A0的完整BSP包,对开发此芯片的开发者很有用.」· C++ 代码 · 共 1,374 行 · 第 1/3 页

CPP
1,374
字号
/*++
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 S3C24A0 LCD function

rev:
	2003.6.28	: First S3C24A0 version (jaeyong Lee, jaeyong2.lee@samsung.com)

Notes: 
--*/

#include "precomp.h"
#include <aablt.h>

#define DBGLCD	0
#define DBGLCD1	0

DWORD gdwLCDVirtualFrameBase;

INSTANTIATE_GPE_ZONES(0x3,"MGDI Driver","unused1","unused2")	// Start with errors and warnings

#ifdef	DD_ENABLE
DDGPE	*gGPE = (DDGPE *)NULL;
#else	// DD_ENABLE
static GPE	 *gGPE					= (GPE*)NULL;
#endif	// DD_ENABLE

PENGCALLBACKS  ourengineCallbacks;

static ulong gBitMasks[]			= { 0xF800, 0x07E0, 0x001F };		// 565 MODE
static TCHAR gszBaseInstance[256]	= _T("Drivers\\Display\\S3C24A0\\CONFIG");

#define dim(x) (sizeof(x) / sizeof(x[0]))

// 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;
}

// this routine converts a string into a GUID and returns TRUE if the
// conversion was successful.
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}");

	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)
	{
	}

	return fOk;
}

// This routine notifies the OS that we support the Power Manager IOCTLs (through
// ExtEscape(), which calls DrvEscape()).
BOOL
AdvertisePowerInterface(HMODULE hInst)
{
	BOOL fOk = FALSE;
	HKEY hk;
	DWORD dwStatus;
	TCHAR szTemp[MAX_PATH];
	GUID gClass;

	RETAILMSG(1, (TEXT("##### In 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);
		RETAILMSG(1, (_T("#####ADVERTISED INTERFACE#####\n")));
		DEBUGCHK(fOk);
	}
    
	return fOk;
}

//
// Main entry point for a GPE-compliant driver
//
GPE *GetGPE(void)
{
	RETAILMSG(DBGLCD,(_T("+GetGPE()\r\n")));
	if (!gGPE)
	{
		gGPE = new S3C24A0DISP();
	}

	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;
	// jylee
	RETAILMSG(DBGLCD,(_T("+DisplayInit\r\n")));
	RETAILMSG(DBGLCD, (_T("s3c24A0disp: display instance '%s', num monitors %d\r\n"), \
		pszInstance != NULL ? pszInstance : _T("<NULL>"), dwNumMonitors));
	if(pszInstance != NULL) {
		_tcsncpy(gszBaseInstance, pszInstance, dim(gszBaseInstance));
	}
	// 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(DBGLCD, (_T("S3C24A0DISP: DisplayInit: can't open '%s'\r\n"), gszBaseInstance));
	}
	
	RETAILMSG(DBGLCD,(_T("-DisplayInit\r\n")));
	
    return fOk;
}

WORD	TempBuffer[241][320];

S3C24A0DISP::S3C24A0DISP (void)
{
	DWORD		oldMode;
	ULONG		fbSize;
	ULONG		fbOffset;
	ULONG		offsetX, offsetY;
	WORD *ptr;
	DWORD index;
	HKEY hkDisplay = NULL;
	DWORD dwLCDPhysicalFrameBase;
	DWORD dwStatus, dwType, dwSize;

	// jylee
	RETAILMSG(DBGLCD, (TEXT("++S3C24A0DISP::S3C24A0DISP\r\n")));
	oldMode = SetKMode(TRUE);
	
	RETAILMSG(DBGLCD, (_T("1\r\n")));	
	
	// setup up display mode related constants
	m_nScreenWidth = 240;
	m_nScreenHeight = 320;
	m_colorDepth = 16;

	m_cxPhysicalScreen = 240;
	m_cyPhysicalScreen = 320;

	m_cbScanLineLength = m_nScreenWidth * 2;
	m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;
        m_VideoPowerState = VideoPowerOn;
	
	RETAILMSG(DBGLCD, (_T("2\r\n")));	

	// setup ModeInfo structure
	m_ModeInfo.modeId = 0;
	m_ModeInfo.width = m_nScreenWidth;
	m_ModeInfo.height = m_nScreenHeight;
	m_ModeInfo.Bpp = m_colorDepth;
	m_ModeInfo.format = gpe16Bpp;
	m_ModeInfo.frequency = 60;	// ?
	// yadisp
#ifdef DD_ENABLE
	m_pModeEx.modeInfo = m_ModeInfo;
	RETAILMSG(DBGLCD, (_T("2.5\r\n")));
#endif

	RETAILMSG(DBGLCD, (_T("3\r\n")));	

	m_pMode = &m_ModeInfo;
	
	// compute frame buffer displayable area offset
	offsetX = (m_cxPhysicalScreen - m_nScreenWidth) / 2;
	offsetY = (m_cyPhysicalScreen - m_nScreenHeight) / 2;
	fbOffset = (offsetY * m_cbScanLineLength) + offsetX;

    // compute physical frame buffer size
    fbSize = (((m_cyPhysicalScreen * m_cbScanLineLength) >> 20) + 1) << 20;        // set size to next highest 1MB boundary

	RETAILMSG(DBGLCD, (_T("4\r\n")));	
    // for DDraw enabled, make sure we also have some off-screen video memory available for surface allocations
        fbSize = (3 * 1024 * 1024);

	RETAILMSG(DBGLCD, (_T("5\r\n")));	
	// 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);
	}

	// did we get everything?
	if(dwStatus != ERROR_SUCCESS) {
		// jylee
		RETAILMSG(DBGLCD, (_T("S3C24A0LCD: couldn't get registry configuration\r\n")));
		return;
	}

    // 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);

	RETAILMSG(DBGLCD, (_T("6\r\n")));	
    if (m_hVFBMapping != NULL) {
            m_VirtualFrameBuffer = (DWORD)MapViewOfFile(m_hVFBMapping, FILE_MAP_WRITE, 0, 0, 0);
				RETAILMSG(DBGLCD, (_T("7\r\n")));	
    } else {
        m_VirtualFrameBuffer = NULL;
    }

        if (VirtualCopy((void *)m_VirtualFrameBuffer, (void *)(dwLCDPhysicalFrameBase >> 8), fbSize, PAGE_READWRITE | PAGE_NOCACHE | PAGE_PHYSICAL)) 
            CeSetMemoryAttributes ((void *)m_VirtualFrameBuffer, (void *)(dwLCDPhysicalFrameBase >> 8), fbSize, PAGE_WRITECOMBINE);

	RETAILMSG(DBGLCD, (_T("8\r\n")));	
	
	RETAILMSG(DBGLCD, (TEXT("m_VirtualFrameBuffer is mapped at %x(PHY : %x) and of size %x \n\r"), m_VirtualFrameBuffer, gdwLCDVirtualFrameBase, fbSize));

	//fbSize = 0x100000;	// reset fbSize to what's actually there

	RETAILMSG(DBGLCD, (_T("9\r\n")));

	memset ((void*)m_VirtualFrameBuffer, 0x0, fbSize);

	m_VirtualFrameBuffer += fbOffset;
	fbSize -= fbOffset;

	m_p2DVideoMemory = new Node2D(m_cbScanLineLength * 8UL / m_pMode->Bpp, fbSize / m_cbScanLineLength, 0, 0, 4);
	if(!m_p2DVideoMemory)
	{
		RETAILMSG (1, (L"new Node2D failed\n"));
		return;
	}

	if(FAILED(AllocSurface(&m_pPrimarySurface, m_nScreenWidth, m_nScreenHeight, m_pMode->format, GPE_REQUIRE_VIDEO_MEMORY)))
	{
		RETAILMSG (1, (L"Couldn't allocate primary surface\n"));
		return;
	}
	m_CursorVisible = FALSE;
	m_CursorDisabled = TRUE;
	m_CursorForcedOff = FALSE;
	memset (&m_CursorRect, 0x0, sizeof(m_CursorRect));
	m_CursorBackingStore = NULL;
	m_CursorXorShape = NULL;
	m_CursorAndShape = NULL;


	AdvertisePowerInterface(g_hmodDisplayDll);
	RETAILMSG(DBGLCD, (TEXT("--S3C24A0DISP::S3C24A0DISP\r\n")));

}

S3C24A0DISP::~S3C24A0DISP()
{
	if (m_VirtualFrameBuffer != NULL)
		UnmapViewOfFile((LPVOID)m_VirtualFrameBuffer);
	if (m_hVFBMapping != NULL)
		CloseHandle(m_hVFBMapping);
}


SCODE S3C24A0DISP::SetMode (INT modeId, HPALETTE *palette)
{
	// jylee
	RETAILMSG(DBGLCD, (TEXT("++S3C24A0DISP::SetMode\r\n")));

	if (modeId != 0)
	{
		RETAILMSG(DBGLCD, (TEXT("S3C24A0DISP::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]);
		RETAILMSG(DBGLCD, (TEXT("Returning from EngCreatePalette\r\n")));
	}

	RETAILMSG(DBGLCD, (TEXT("--S3C24A0DISP::SetMode\r\n")));

	return S_OK;
}

SCODE S3C24A0DISP::GetModeInfo(GPEMode *mode,	INT modeNumber)
{
	// jylee
	RETAILMSG(DBGLCD, (TEXT("++S3C24A0DISP::GetModeInfo\r\n")));

	if (modeNumber != 0)
	{
		return E_INVALIDARG;
	}

	*mode = m_ModeInfo;

	RETAILMSG(DBGLCD, (TEXT("--S3C24A0DISP::GetModeInfo\r\n")));

	return S_OK;
}

int	S3C24A0DISP::NumModes()
{
	RETAILMSG(DBGLCD1, (TEXT("++S3C24A0DISP::NumModes\r\n")));
	RETAILMSG(DBGLCD, (TEXT("--S3C24A0DISP::NumModes\r\n")));
	return	1;
}

void	S3C24A0DISP::CursorOn (void)
{
	UCHAR	*ptrScreen = (UCHAR*)m_pPrimarySurface->Buffer();
	UCHAR	*ptrLine;
	UCHAR	*cbsLine;
	UCHAR	*xorLine;
	UCHAR	*andLine;
	int		x, y;


#if 1
	if (!m_CursorForcedOff && !m_CursorDisabled && !m_CursorVisible)
	{
		for (y = m_CursorRect.top; y < m_CursorRect.bottom; y++)
		{
			if (y < 0)
			{
				continue;
			}
			if (y >= m_nScreenHeight)
			{
				break;
			}

			ptrLine = &ptrScreen[y * m_pPrimarySurface->Stride()];
			cbsLine = &m_CursorBackingStore[(y - m_CursorRect.top) * (m_CursorSize.x * (m_colorDepth >> 3))];
			xorLine = &m_CursorXorShape[(y - m_CursorRect.top) * m_CursorSize.x];
			andLine = &m_CursorAndShape[(y - m_CursorRect.top) * m_CursorSize.x];

			for (x = m_CursorRect.left; x < m_CursorRect.right; x++)
			{
				if (x < 0)
				{
					continue;
				}
				if (x >= m_nScreenWidth)
				{
					break;
				}
				cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3)] = ptrLine[x * (m_colorDepth >> 3)];
				ptrLine[x * (m_colorDepth >> 3)] &= andLine[x - m_CursorRect.left];
				ptrLine[x * (m_colorDepth >> 3)] ^= xorLine[x - m_CursorRect.left];
				if (m_colorDepth > 8)
				{
					cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 1] = ptrLine[x * (m_colorDepth >> 3) + 1];
					ptrLine[x * (m_colorDepth >> 3) + 1] &= andLine[x - m_CursorRect.left];
					ptrLine[x * (m_colorDepth >> 3) + 1] ^= xorLine[x - m_CursorRect.left];
					if (m_colorDepth > 16)
					{
						cbsLine[(x - m_CursorRect.left) * (m_colorDepth >> 3) + 2] = ptrLine[x * (m_colorDepth >> 3) + 2];
						ptrLine[x * (m_colorDepth >> 3) + 2] &= andLine[x - m_CursorRect.left];
						ptrLine[x * (m_colorDepth >> 3) + 2] ^= xorLine[x - m_CursorRect.left];
					}
				}
			}
		}
	
		m_CursorVisible = TRUE;
	}
#endif	
    
	RETAILMSG(DBGLCD1, (TEXT("--S3C24A0DISP::CursorOn\r\n")));

⌨️ 快捷键说明

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