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

📄 s3c2440disp.cpp~

📁 wince 5.0 BSP for OK2440
💻 CPP~
📖 第 1 页 / 共 3 页
字号:
/*++ 
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) 2001. Samsung Electronics, co. ltd  All rights reserved.

Module Name:  

Abstract:

	This file implements the S3C2440 LCD function

rev:
	2002.4.4	: First S3C2410 version (kwangyoon LEE, kwangyoon@samsung.com)

	2002.1.31	: CE.NET port (kwangyoon LEE, kwangyoon@samsung.com)

Notes: 
--*/

#include "precomp.h"
#ifdef CLEARTYPE
#include <ctblt.h>
#endif
#include <aablt.h>

DWORD gdwLCDVirtualFrameBase;

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

static	GPE		*gGPE = (GPE*)NULL;
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]))

// This prototype avoids problems exporting from .lib
BOOL APIENTRY GPEEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
							  PENGCALLBACKS  engineCallbacks);

// 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("SALCD2: 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 {
		RETAILMSG(0, (_T("SALCD2: DisplayInit: can't open '%s'\r\n"), gszBaseInstance));
	}

    return fOk;
}

BOOL APIENTRY DrvEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
							  PENGCALLBACKS  engineCallbacks)
{
	BOOL fOk = FALSE;

	// make sure we know where our registry configuration is
	if(gszBaseInstance[0] != 0) {
		fOk = GPEEnableDriver(engineVersion, cj, data, engineCallbacks);
	}

	return fOk;
}

//
// Main entry point for a GPE-compliant driver
//

GPE *GetGPE(void)
{
	if (!gGPE)
	{
		gGPE = new S3C2440DISP();
	}

	return gGPE;
}
/*
//dis by pht
#if (LCD_TYPE == TFT640_480)
WORD	TempBuffer[641][480];
#elif (LCD_TYPE == TFT240_320)
WORD	TempBuffer[321][240];
#endif
*/

S3C2440DISP::S3C2440DISP (void)
{
	HKEY hkDisplay = NULL;
	DWORD dwStatus, dwType, dwSize;
	
	RETAILMSG(1, (TEXT("++S3C2440DISP::S3C2440DISP\r\n")));

	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("LcdXsize_TFT"), NULL, &dwType, 
			(LPBYTE) &m_nScreenWidth, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("LcdYsize_TFT"), NULL, &dwType, 
			(LPBYTE) &m_nScreenHeight, &dwSize);
	}
	if(hkDisplay != NULL) {
		RegCloseKey(hkDisplay);
	}

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

	InitDisplay();
	// setup up display mode related constants
/*
#if (LCD_TYPE == TFT640_480)
	m_nScreenWidth  = 640;
	m_nScreenHeight = 480;
#elif (LCD_TYPE == TFT240_320)
	m_nScreenWidth  = 320;
	m_nScreenHeight = 240;
#endif
*/
	m_colorDepth = 16;
	m_cbScanLineLength = m_nScreenWidth * 2;
	m_FrameBufferSize = m_nScreenHeight * m_cbScanLineLength;
	
	// memory map register access window, frame buffer, and program LCD controller
	InitializeHardware();

#ifdef ROTATE
	m_iRotate = 0;//DMDO_90 or 0
	SetRotateParms();
#endif //ROTATE	

	// 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;	// ?
	m_pMode = &m_ModeInfo;
	
	// allocate primary display surface
#ifdef 	ROTATE
	m_pPrimarySurface = new GPESurfRotate(m_nScreenWidthSave, m_nScreenHeightSave, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);
#else
	m_pPrimarySurface = new GPESurf(m_nScreenWidth, m_nScreenHeight, (void*)(m_VirtualFrameBuffer), m_cbScanLineLength, m_ModeInfo.format);	
#endif //!ROTATE
	memset ((void*)m_pPrimarySurface->Buffer(), 0x0, m_FrameBufferSize);

	// init cursor related vars
	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;

#ifdef CLEARTYPE
	HKEY  hKey;
	DWORD dwValue;
	ULONG ulGamma = DEFAULT_CT_GAMMA;	
	
	if (ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE,szGamma,0, NULL,0,0,0,&hKey,&dwValue))
	{
	    if (dwValue == REG_OPENED_EXISTING_KEY)
	    {
		DWORD dwType = REG_DWORD;
		DWORD dwSize = sizeof(LONG);
		if (ERROR_SUCCESS == RegQueryValueEx(hKey,szGammaValue,0,&dwType,(BYTE *)&dwValue,&dwSize))
		{
		    ulGamma = dwValue;
		}
	    } 
	    else if (dwValue == REG_CREATED_NEW_KEY )
	    {
		RegSetValueEx(hKey,szGammaValue,0,REG_DWORD,(BYTE *)&ulGamma,sizeof(DWORD));
	    }
	    RegCloseKey(hKey);
	}

	SetClearTypeBltGamma(ulGamma);
	SetClearTypeBltMasks(gBitMasks[0], gBitMasks[1], gBitMasks[2]);
#endif //CLEARTYPE	

	RETAILMSG(0, (TEXT("--S3C2440DISP::S3C2440DISP\r\n")));
	((GPESurfRotate *)m_pPrimarySurface)->SetRotation(m_nScreenWidth, m_nScreenHeight, m_iRotate);

}


void S3C2440DISP:: InitDisplay()
{
	int i, j;
	volatile IOPreg *s2440IOP;
	volatile LCDreg *s2440LCD;    
	HKEY hkDisplay = NULL;
	DWORD dwStatus, dwType, dwSize;

	DWORD dwClkval_TFT, dwVbpd, dwVfpd, dwVspw, dwHbpd, dwHfpd, dwHspw, dwLcdXsize_TFT, dwLcdYsize_TFT;



	//s2440IOP = (IOPreg *)IOP_BASE;
	//s2440LCD = (LCDreg *)LCD_BASE; 


	s2440LCD = (volatile LCDreg*)VirtualAlloc(0,sizeof(LCDreg), MEM_RESERVE, PAGE_NOACCESS);
	if (s2440LCD == NULL) 
	{
	  DEBUGMSG (1,(TEXT("s2440LCD is not allocated\n\r")));
	}
	if (!VirtualCopy((PVOID)s2440LCD, (PVOID)LCD_BASE,sizeof(LCDreg), PAGE_READWRITE|PAGE_NOCACHE)) {
	  DEBUGMSG (1,(TEXT("s2440LCD is not mapped\n\r")));
	}

	s2440IOP = (volatile IOPreg*)VirtualAlloc(0,sizeof(IOPreg), MEM_RESERVE, PAGE_NOACCESS);
	if (s2440IOP == NULL) 
	{
	  DEBUGMSG (1,(TEXT("s2440IOP is not allocated\n\r")));
	}
	if (!VirtualCopy((PVOID)s2440IOP, (PVOID)IOP_BASE,sizeof(IOPreg), PAGE_READWRITE|PAGE_NOCACHE)) {
	  DEBUGMSG (1,(TEXT("s2440IOP is not mapped\n\r")));
	}



	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("Clkval_TFT"), NULL, &dwType, 
			(LPBYTE) &dwClkval_TFT, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Vbpd"), NULL, &dwType, 
			(LPBYTE) &dwVbpd, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Vfpd"), NULL, &dwType, 
			(LPBYTE) &dwVfpd, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Vspw"), NULL, &dwType, 
			(LPBYTE) &dwVspw, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Hbpd"), NULL, &dwType, 
			(LPBYTE) &dwHbpd, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Hfpd"), NULL, &dwType, 
			(LPBYTE) &dwHfpd, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("Hspw"), NULL, &dwType, 
			(LPBYTE) &dwHspw, &dwSize);
	}
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("LcdXsize_TFT"), NULL, &dwType, 
			(LPBYTE) &dwLcdXsize_TFT, &dwSize);
	}	
	if(dwStatus == ERROR_SUCCESS && dwType == REG_DWORD) {
		dwSize = sizeof(DWORD);
		dwStatus = RegQueryValueEx(hkDisplay, _T("LcdYsize_TFT"), NULL, &dwType, 
			(LPBYTE) &dwLcdYsize_TFT, &dwSize);
	}	


	// close the registry key
	if(hkDisplay != NULL) {
		RegCloseKey(hkDisplay);
	}

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





//	LCD port initialize.
	s2440IOP->rGPCUP  = 0xFFFFFFFF;
	s2440IOP->rGPCCON = 0xAAAAAAAA;

	s2440IOP->rGPDUP  = 0xFFFFFFFF;
	s2440IOP->rGPDCON = 0xAAAAAAAA;

	s2440IOP->rGPGCON &= ~(3 << 8);					// Set LCD_PWREN as output
	s2440IOP->rGPGCON |=  (1 << 8);

	s2440IOP->rGPGDAT |=  (1 << 4);					// Backlight ON

	s2440LCD->rLCDCON1   =  (dwClkval_TFT << 8) |		// VCLK = HCLK / ((CLKVAL + 1) * 2) -> About 7 Mhz  // ;;; SHL
							(0 << 7) |		// 0 : Each Frame
							(3 << 5) |		// TFT LCD Pannel
							(12<< 1) |		// 16bpp Mode
							(0 << 0) ;		// Disable LCD Output

	s2440LCD->rLCDCON2   =  (dwVbpd        << 24) |	// VBPD          :   1
							((dwLcdYsize_TFT-1) << 14) |	// Virtical Size : 320 - 1
							(dwVfpd        <<  6) |	// VFPD          :   2
							(dwVspw        <<  0) ;	// VSPW          :   1

	s2440LCD->rLCDCON3   =  (dwHbpd        << 19) |	// HBPD          :   6
							((dwLcdXsize_TFT-1)  <<  8) |	// HOZVAL_TFT    : 240 - 1
							(dwHfpd        <<  0) ;	// HFPD          :   2


	s2440LCD->rLCDCON4   =  (13        <<  8) |	// MVAL          :  13                              */
							(dwHspw        <<  0) ;	// HSPW          :   4                              */
	s2440LCD->rLCDCON5   =  (0 << 12) |		// BPP24BL       : LSB valid
							(1 << 11) |		// FRM565 MODE   : 5:6:5 Format
							(0 << 10) |		// INVVCLK       : VCLK Falling Edge
							(1 <<  9) |		// INVVLINE      : Inverted Polarity
							(1 <<  8) |		// INVVFRAME     : Inverted Polarity
							(0 <<  7) |		// INVVD         : Normal
							(0 <<  6) |		// INVVDEN       : Normal
							(0 <<  5) |		// INVPWREN      : Normal
							(0 <<  4) |		// INVENDLINE    : Normal
							(1 <<  3) |		// PWREN         : Disable PWREN
							(0 <<  2) |		// ENLEND        : Disable LEND signal
							(0 <<  1) |		// BSWP          : Swap Disable
							(1 <<  0) ;		// HWSWP         : Swap Enable

	s2440LCD->rLCDSADDR1 = ((FRAMEBUF_DMA_BASE >> 22) << 21) |
							((M5D(FRAMEBUF_DMA_BASE >> 1)) <<  0);

	s2440LCD->rLCDSADDR2 = M5D((FRAMEBUF_DMA_BASE + (dwLcdXsize_TFT * dwLcdYsize_TFT * 2)) >> 1);

	s2440LCD->rLCDSADDR3 = (((dwLcdXsize_TFT - dwLcdXsize_TFT) / 1) << 11) | (dwLcdXsize_TFT / 1);

//	s2440LCD->rLPCSEL    |= 0x3;	// for aiji
	s2440LCD->rLCDINTMSK |= (3);
	s2440LCD->rTCONSEL   &= ~(0x7);	// ;;; SHL
	s2440LCD->rTPAL       = 0x0;
	s2440LCD->rTCONSEL   &= ~((1<<4) | 1);								// Disable LCC3600, LCP3600
	s2440IOP->rGPGUP	  = s2440IOP->rGPGUP  & (~(1<<4)) | (1<<4);		// Pull-up disbale
	s2440IOP->rGPGCON	  = s2440IOP->rGPGCON & (~(3<<8)) | (3<<8);
	s2440LCD->rLCDCON1	 |= 1;											// Enable LCD output
/*
#if (LCD_TYPE == TFT640_480)

	FBuf = (struct FrameBuffer *) (FRAMEBUF_BASE);

	// Test LCD display status with R.G.B and White color.
	for (i=0; i<LCD_YSIZE_TFT/2; i++)
	{
		for (j=0; j<LCD_XSIZE_TFT; j++)
		{
			if (j<LCD_XSIZE_TFT/2)
				#if (LCDTYPE == TFT16BPP)
					FBuf->pixel[i][j]=0xffff;
				#else
					FBuf->pixel[i][j]=0xff;
				#endif
			else
				#if (LCDTYPE == TFT16BPP)
					FBuf->pixel[i][j]=0xf800;
				#else
					FBuf->pixel[i][j]=0xe0;
				#endif
		}
	}

	for (i=LCD_YSIZE_TFT/2; i<LCD_YSIZE_TFT; i++)
	{
		for (j=0; j<LCD_XSIZE_TFT; j++)
		{
			if (j<LCD_XSIZE_TFT/2)
				#if (LCDTYPE == TFT16BPP)
					FBuf->pixel[i][j]=0x07e0;
				#else
					FBuf->pixel[i][j]=0x1c;
				#endif
			else
				#if (LCDTYPE == TFT16BPP)
					FBuf->pixel[i][j]=0x001f;
				#else
					FBuf->pixel[i][j]=0x03;
				#endif
		}
	}

#elif (LCD_TYPE == TFT240_320)
	//memcpy((void *)FRAMEBUF_BASE, ScreenBitmap, ARRAY_SIZE_TFT_16BIT);
//    rle_express(ScreenBitmap, (unsigned short *)FRAMEBUF_BASE, 0x8a8c / 2);
#endif
*/

	RETAILMSG(1, (TEXT("--S3C2440DISP::InitDisplay done \r\n")));

}



⌨️ 快捷键说明

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