📄 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) 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 + -