📄 vd_drvescape.cpp
字号:
//
// Copyright (c) Chrontel Inc.. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Chrontel end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
/*++
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.
Module Name:
vd_DrvEscape.cpp
Abstract:
Functions:
Notes:
Revision:
12/20/02, Roger Yu, Create the file
--*/
#include "precomp.h"
#include "XSLGPE.h"
#include "vga.h"
#include "palette.h" // for 8Bpp we use the natural palette
#ifdef CLEARTYPE
#include <ctblt.h>
#endif //CLEARTYPE
//#include <libi2c.h>
#include "chrontel.h"
static unsigned supportEsc[]={
QUERYESCSUPPORT,
GETVFRAMEPHYSICAL,
GETVFRAMELEN,
SETPOWERMANAGEMENT,
GETPOWERMANAGEMENT,
CONTRASTCOMMAND,
#ifdef CLEARTYPE
DRVESC_GETGAMMAVALUE,
DRVESC_SETGAMMAVALUE,
#endif //CLEARTYPE
// DRVESC_I2CRW,
};
static unsigned supportEscNum = sizeof(supportEsc)/sizeof(unsigned);
BOOL isCrtcTimeSet;
#ifdef CLEARTYPE
extern GetGammaValue(ULONG * pGamma);
extern SetGammaValue(ULONG ulGamma, BOOL bUpdateReg);
#endif //CLEARTYPE
ULONG XSLGPE::DrvEscape(
SURFOBJ *pso,
ULONG iEsc,
ULONG cjIn,
PVOID pvIn,
ULONG cjOut,
PVOID pvOut)
{
int RetVal = 0; // default return value: "not supported"
DWORD EscapeFunction;
unsigned i;
if (QUERYESCSUPPORT==iEsc) {
EscapeFunction = *((DWORD *)pvIn);
for (i=0; i<supportEscNum; i++)
if (EscapeFunction==supportEsc[i]) return 1; // found supported code
return 0; // Escape Code not supported
}
switch (iEsc) {
#ifdef CLEARTYPE
case DRVESC_GETGAMMAVALUE:
return GetGammaValue((ULONG *)pvOut);
case DRVESC_SETGAMMAVALUE:
return SetGammaValue(cjIn, *(BOOL *)pvIn);
#endif //CLEARTYPE
case GETVFRAMEPHYSICAL:
if (cjIn ==0) // Only handle page 0
{
// This works as long as the frame buffers are in a contiguous region.
*(DWORD *)pvOut = (ULONG)m_pvFlatFrameBuffer;
RetVal = 1;
} else
{
*(DWORD *)pvOut = NULL;
}
break;
case GETVFRAMELEN:
*(DWORD *)pvOut = (ULONG)m_cbScanLineLength * m_cyPhysicalScreen;
RetVal = 1;
break;
case SETPOWERMANAGEMENT:
CHDBG(( TEXT("XSLGPE::SETPOWERMANGEMENT, ######State = %d####\n"), ((PVIDEO_POWER_MANAGEMENT)pvIn)->PowerState ))
PowerHandler( ((PVIDEO_POWER_MANAGEMENT)pvIn)->PowerState != VideoPowerOn);
RetVal =1;
break;
case GETPOWERMANAGEMENT:
*((PVIDEO_POWER_MANAGEMENT)pvOut) = videoPMState;
RetVal=1;
break;
case CONTRASTCOMMAND:
ContrastCmd(cjIn, pvIn, cjOut, pvOut);
RetVal=1;
break;
/*
case DRVESC_I2CRW:
break;
case DRVESC_GETTIMING:
((PDISPTIMING)pvOut)->dwDotClock = FindBestClock( ((PDISPTIMING)pvOut)->dwDotClock, 0, NULL, NULL);
RetVal =1;
break;
case DRVESC_SETTIMING:
SetCrtcTiming( (PDISPTIMING)pvIn);
DispDrvrPowerHandler(FALSE); // Turn on video output
isCrtcTimeSet = TRUE;
RetVal = 1;
break;
*/
case DRVESC_GETVOEABILITY:
if (pvOut) *((unsigned *)pvOut) = hVodDev;
RetVal = 1;
break;
case DRVESC_GETVOEDEVICE:
if (pvOut) *((unsigned *)pvOut) = hVideoOutDevice;
RetVal = 1;
break;
// Change VOD device, For example., change from TV to TMDS or DVI
case DRVESC_CHANGEVOEDEVICE:
{
unsigned vo = *((unsigned *)pvIn);
// Need switch to default STN panel? (we only support 640x480)
if (vo & VOD_ATTR_DEFAULT) {
// if ((m_nScreenWidth==640) && (m_nScreenHeight==480))
{
PowerHandler( TRUE); // power off device
//NOTE: need modify for different BSP system
bIsTftPanel = m_IsTftPanel;
hVideoOutDevice = VOD_ATTR_DEFAULT; // no VOD needed
// find timing for default local panel
int sy;
sy = (m_IsDualPanel) ? (m_nScreenHeight/2) : m_nScreenHeight;
dptVideoTiming = *FindCrtcTiming(m_nScreenWidth, sy, FALSE);
SetDmaDescriptor(m_IsDualPanel, 0, m_nScreenWidth, m_nScreenHeight, 0); // no double line needed
PowerHandler( FALSE); // power on device
RetVal = 1;
}
}
else { // switch to chrontel VOD device
int i;
i=0; vo = vo & VOD_ATTR_CHVOE;
vo &= hVodDev;
if (vo)
//NOTE: setup device even it is same
// if ((INVALID_HANDLE_VALUE != hNewVod))
{
PowerHandler( TRUE); // power off device
Sleep(200);
vod_Initialize(vo);
if (vod_GetConnectStatus(vo))
{
bIsTftPanel =1;
// find timiing for CHVOE device
dptVideoTiming = *FindCrtcTiming(m_nScreenWidth, m_nScreenHeight, TRUE);
SetDmaDescriptor(0, 0, m_nScreenWidth, m_nScreenHeight, dptVideoTiming.flFlags.bLineDouble);
hVideoOutDevice = vo;
}
PowerHandler( FALSE); // power on with new VOD
RetVal=1;
} // end of if
} // end of else
}
break;
case DRVESC_GETDIMMENSION:
{
unsigned *prt = (unsigned *)pvOut;
if (prt) {
prt[0] = m_nScreenWidth;
prt[1] = m_nScreenHeight;
prt[2] = m_colorDepth;
prt[3] = 0; // no rotation
}
cjOut = 4*sizeof(unsigned);
}
RetVal =1;
break;
default:
RetVal = 0;
}
return RetVal;;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -