📄 s3c2440disp.cpp
字号:
}
if (m_CursorRect.top <= rectl.bottom && m_CursorRect.bottom >= rectl.top &&
m_CursorRect.left <= rectl.right && m_CursorRect.right >= rectl.left)
{
CursorOff();
m_CursorForcedOff = TRUE;
}
}
// check for source overlap with cursor and turn off cursor if overlaps
if (blitParameters->pSrc == m_pPrimarySurface) // only care if source is main display surface
{
if (blitParameters->prclSrc != NULL) // make sure there is a valid prclSrc
{
rectl = *blitParameters->prclSrc; // if so, use it
}
else
{
rectl = m_CursorRect; // if not, use the CUrsor rect - this forces the cursor to be turned off in this case
}
if (m_CursorRect.top < rectl.bottom && m_CursorRect.bottom > rectl.top &&
m_CursorRect.left < rectl.right && m_CursorRect.right > rectl.left)
{
CursorOff();
m_CursorForcedOff = TRUE;
}
}
}
// see if there are any optimized software blits available
EmulatedBltSelect02(blitParameters);
EmulatedBltSelect08(blitParameters);
EmulatedBltSelect16(blitParameters);
RETAILMSG(DBGLCD1, (TEXT("--S3C2440DISP::BltPrepare\r\n")));
return S_OK;
}
SCODE S3C2440DISP::BltComplete(GPEBltParms *blitParameters)
{
RETAILMSG(DBGLCD1, (TEXT("++S3C2440DISP::BltComplete\r\n")));
// see if cursor was forced off because of overlap with source or destination and turn back on
if (m_CursorForcedOff)
{
m_CursorForcedOff = FALSE;
CursorOn();
}
//DispPerfEnd(0);
RETAILMSG(DBGLCD1, (TEXT("--S3C2440DISP::BltComplete\r\n")));
return S_OK;
}
INT S3C2440DISP::InVBlank(void)
{
static BOOL value = FALSE;
RETAILMSG(DBGLCD, (TEXT("S3C2440DISP::InVBlank\r\n")));
value = !value;
return value;
}
SCODE S3C2440DISP::SetPalette(const PALETTEENTRY *source, USHORT firstEntry, USHORT numEntries)
{
RETAILMSG(DBGLCD, (TEXT("S3C2440DISP::SetPalette\r\n")));
if (firstEntry < 0 || firstEntry + numEntries > 256 || source == NULL)
{
return E_INVALIDARG;
}
return S_OK;
}
VIDEO_POWER_STATE
PmToVideoPowerState(CEDEVICE_POWER_STATE pmDx)
{
VIDEO_POWER_STATE vps;
RETAILMSG(DBGLCD,(_T("++PmToVideoPowerState\r\n")));
switch(pmDx) {
case D0: // turn the display on
vps = VideoPowerOn;
break;
case D1: // if asked for a state we don't support, go to the next lower one
case D2:
case D3:
case D4:
vps = VideoPowerOff;
break;
default:
RETAILMSG(DBGLCD , (L"PmToVideoPowerState: mapping unknown PM state %d to VideoPowerOn\r\n", pmDx));
vps = VideoPowerOn;
break;
}
return vps;
}
// this routine maps video power states to PM power states.
CEDEVICE_POWER_STATE
VideoToPmPowerState(VIDEO_POWER_STATE vps)
{
CEDEVICE_POWER_STATE pmDx;
RETAILMSG(DBGLCD,(_T("++VideoToPmPowerState\r\n")));
switch(vps)
{
case VideoPowerOn:
pmDx = D0;
break;
case VideoPowerStandBy:
pmDx = D1;
break;
case VideoPowerSuspend:
pmDx = (CEDEVICE_POWER_STATE)D2;
break;
case VideoPowerOff:
pmDx = (CEDEVICE_POWER_STATE)D4;
break;
default:
pmDx = D0;
RETAILMSG(DBGLCD, (L"VideoToPmPowerState: mapping unknown video state %d to pm state %d\r\n",
vps, pmDx));
break;
}
return pmDx;
}
#define ESC_SUCCESS 0x00000001
#define ESC_FAILED 0xFFFFFFFF
#define ESC_NOT_SUPPORTED 0x00000000
ULONG S3C2440DISP::DrvEscape(
SURFOBJ *pso,
ULONG iEsc,
ULONG cjIn,
PVOID pvIn,
ULONG cjOut,
PVOID pvOut)
{
ULONG Result = 0;
LPWSTR pszFname = L"S3C2440DISP::DrvEscape";
RETAILMSG(DBGLCD1,(_T("++DrvEscape\r\n")));
switch (iEsc)
{
case QUERYESCSUPPORT:
if (sizeof (DWORD) == cjIn)
{
DWORD SupportChk;
SupportChk = *(DWORD *)pvIn;
if ((SupportChk == QUERYESCSUPPORT) ||
(SupportChk == GETGXINFO) ||
(SupportChk == GETPOWERMANAGEMENT) ||
(SupportChk == SETPOWERMANAGEMENT) ||
(SupportChk == IOCTL_POWER_CAPABILITIES) ||
(SupportChk == IOCTL_POWER_QUERY) ||
(SupportChk == IOCTL_POWER_SET) ||
(SupportChk == IOCTL_POWER_GET))
{
Result = ESC_SUCCESS;
}
else
{
Result = ESC_NOT_SUPPORTED;
}
}
else
{
SetLastError(ERROR_INVALID_PARAMETER);
Result = ESC_FAILED;
}
break;
#ifdef ROTATE
case DRVESC_GETSCREENROTATION:
*(int *)pvOut = ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8) | ((BYTE)m_iRotate);
Result = DISP_CHANGE_SUCCESSFUL;
break;
case DRVESC_SETSCREENROTATION:
if ((cjIn == DMDO_0) ||(cjIn == DMDO_90) ||(cjIn == DMDO_180) ||(cjIn == DMDO_270))
{
return DynRotate(cjIn);
}
Result = DISP_CHANGE_BADMODE;
break;
#endif
case GETGXINFO:
Result = GetGameXInfo(iEsc, cjIn, pvIn, cjOut, pvOut);
if (Result != ESC_SUCCESS)
{
// Shouldn't get here if everything was ok.
SetLastError(ERROR_INVALID_PARAMETER);
Result = ESC_FAILED;
}
break;
case SETPOWERMANAGEMENT:
if ((cjIn >= sizeof (VIDEO_POWER_MANAGEMENT)) && (pvIn != NULL))
{
PVIDEO_POWER_MANAGEMENT pvpm = (PVIDEO_POWER_MANAGEMENT)pvIn;
if (pvpm->Length >= sizeof (VIDEO_POWER_MANAGEMENT))
{
switch (pvpm->PowerState)
{
case VideoPowerStandBy:
case VideoPowerOn:
SetDisplayPower(VideoPowerOn);
Result = ESC_SUCCESS;
break;
case VideoPowerOff:
case VideoPowerSuspend:
SetDisplayPower(VideoPowerOff);
Result = ESC_SUCCESS;
break;
}
}
}
if (Result != ESC_SUCCESS)
{
// Shouldn't get here if everything was ok.
SetLastError(ERROR_INVALID_PARAMETER);
Result = ESC_FAILED;
}
break;
case GETPOWERMANAGEMENT:
RETAILMSG(DBGLCD, (L"%s::GETPOWERMANAGEMENT\n", pszFname));
if ((cjOut >= sizeof (VIDEO_POWER_MANAGEMENT)) && (pvOut != NULL))
{
PVIDEO_POWER_MANAGEMENT pvpm = (PVIDEO_POWER_MANAGEMENT)pvOut;
pvpm->Length = sizeof (VIDEO_POWER_MANAGEMENT);
pvpm->DPMSVersion = 0;
pvpm->PowerState = m_VideoPowerState;
Result = ESC_SUCCESS;
}
else
{
// Shouldn't get here if everything was ok.
SetLastError(ERROR_INVALID_PARAMETER);
Result = ESC_FAILED;
}
break;
case IOCTL_POWER_CAPABILITIES:
// tell the power manager about ourselves
RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_CAPABILITIES\r\n", pszFname));
if (pvOut != NULL && cjOut == sizeof(POWER_CAPABILITIES))
{
__try
{
PPOWER_CAPABILITIES ppc = (PPOWER_CAPABILITIES) pvOut;
memset(ppc, 0, sizeof(*ppc));
ppc->DeviceDx = 0x11; // support D0 and D4
Result = ESC_SUCCESS;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(DBGLCD, (L"%s: exception in ioctl1\r\n"));
}
}
break;
case IOCTL_POWER_QUERY:
if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
{
// return a good status on any valid query, since we are always ready to
// change power states.
__try
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE) pvOut;
if(VALID_DX(NewDx))
{
// this is a valid Dx state so return a good status
Result = ESC_SUCCESS;
}
RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_QUERY %u %s\r\n", pszFname,
NewDx, Result == ESC_SUCCESS ? L"succeeded" : L"failed"));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(DBGLCD, (L"%s: exception in ioctl2\r\n"));
}
}
break;
case IOCTL_POWER_SET:
if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
{
__try
{
CEDEVICE_POWER_STATE NewDx = *(PCEDEVICE_POWER_STATE) pvOut;
CEDEVICE_POWER_STATE CurrentDx;
if(VALID_DX(NewDx))
{
VIDEO_POWER_STATE ulPowerState = PmToVideoPowerState(NewDx);
SetDisplayPower(ulPowerState);
CurrentDx = VideoToPmPowerState((VIDEO_POWER_STATE)m_VideoPowerState);
Result = ESC_SUCCESS;
RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_SET %u: passing back %u\r\n", pszFname,
NewDx, CurrentDx));
}
else
{
RETAILMSG(DBGLCD,
(L"%s: IOCTL_POWER_SET: invalid state request %u\r\n", pszFname, NewDx));
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(DBGLCD, (L"%s: exception in ioctl3\r\n"));
}
}
break;
case IOCTL_POWER_GET:
if(pvOut != NULL && cjOut == sizeof(CEDEVICE_POWER_STATE))
{
__try
{
CEDEVICE_POWER_STATE CurrentDx = D0;//VideoToPmPowerState((VIDEO_POWER_STATE)m_VideoPowerState);
*(PCEDEVICE_POWER_STATE) pvOut = D0; //CurrentDx;
Result = ESC_SUCCESS;
RETAILMSG(DBGLCD, (L"%s: IOCTL_POWER_GET: passing back %u\r\n", pszFname,
CurrentDx));
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
RETAILMSG(DBGLCD, (L"%s: exception in ioctl4\r\n"));
}
}
break;
}
RETAILMSG(DBGLCD1,(_T("--DrvEscape\r\n")));
return Result;
}
//#endif //CLEARTYPE
#undef ESC_NOT_SUPPORTED
#undef ESC_FAILED
#undef ESC_SUCCESS
void S3C2440DISP::SetDisplayPower(ULONG PowerState)
{
static BYTE * pVideoMemory = NULL;
WORD *ptr;
RETAILMSG(DBGLCD,(_T("++SetDisplayPower\r\n")));
// If we're already in the appropriate state, just return
if (m_VideoPowerState == PowerState)
{
return;
}
if (PowerState == VideoPowerOff)
{
m_VideoPowerState = VideoPowerOff;
m_CursorDisabled = TRUE;
CursorOff();
// Save video memory
if (NULL == pVideoMemory)
{
pVideoMemory = new BYTE [m_FrameBufferSize];
}
if (NULL != pVideoMemory)
{
memcpy(pVideoMemory, m_pPrimarySurface->Buffer(), m_FrameBufferSize);
}
// Blank the screen
memset ((void*)m_pPrimarySurface->Buffer(), 0x0, m_FrameBufferSize);
// Swap the buffer in the primary surface with that of our off screen buffer.
if (NULL != pVideoMemory)
{
BYTE * pTempBuffer = (BYTE*)m_pPrimarySurface->Buffer();
m_pPrimarySurface->Init(m_nScreenWidth, m_nScreenHeight, pVideoMemory, m_cbScanLineLength, m_pMode->format);
DynRotate(m_iRotate);
pVideoMemory = pTempBuffer;
}
// Let the setting take effect before disabling the controller
Sleep(100);
// disable LCD controller
RETAILMSG(DBGLCD, (TEXT("SetDisplayPower: disable LCD controller \r\n")));
// Set Board Control Register (BCR) for Sharp LCD mode
//set_BCRVal (NOMASK, BCR_LCD_LQ039Q2DS01_16BPP | BCR_LCD_POWER_OFF | BCR_BACKLIGHT_OFF, INPOWERHANDLER);
//Added by APR ++
#ifdef SMARTFON
v_s2440CLKPWR->CLKCON &= ~(1<<5);
RETAILMSG(1,(TEXT("S3C2440DISP::SetDisplayPower Powered Down.\n")));
#endif
//APR --
}
else
{
//Added by APR ++ Turn the clock to LCD on
#ifdef SMARTFON
v_s2440CLKPWR->CLKCON |= (1<<5);
RETAILMSG(1,(TEXT("S3C2440DISP::SetDisplayPower Powered Up.\n")));
#endif
//APR --
m_VideoPowerState = VideoPowerOn;
// init "palette" area - just has some flags for 16bpp active display mode
ptr = (WORD*)m_VirtualFrameBuffer;
ptr[0] = 0x2000;
for(int index = 1; index < 16; index++)
{
ptr[index] = 0x00000000;
}
// clear rest of frame buffer out
for(index = 0; index < 320*240; index++)
{
if(index < 3200)
{
ptr[index + 16] = 0xf800;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -