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

📄 control.cpp

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************
 * Name        : control.cpp
 * Title       : MBX WinCE driver DrvEscmodule
 * Author(s)   : Imagination Technologies
 * Created	   : 19th June 2003
 *
 * Copyright   : 2003 by Imagination Technologies. All rights reserved.
 *             : No part of this software, either material or conceptual 
 *             : may be copied or distributed, transmitted, transcribed,
 *             : stored in a retrieval system or translated into any 
 *             : human or computer language in any form by any means,
 *             : electronic, mechanical, manual or other-wise, or 
 *             : disclosed to third parties without the express written
 *             : permission of Imagination Technologies Limited, Unit 8,
 *             : HomePark Industrial Estate, King's Langley, Hertfordshire,
 *             : WD4 8LZ, U.K.
 *
 * Description : MBX WinCE driver DrvEscape handler.
 *
 * Platform    : WinCE
 *
 * Modifications:-
 * $Log: control.cpp $
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 *  --- Revision Logs Removed --- 
 *
 ****************************************************************************/

#include	"precomp.h"

// profiling
#include	"dispperf.h"

extern "C"
{
#include	"drvescape.h"
#include	"pvrdispconfig.h"
#include	"pvrextescapes.h"
#include	"memchk.h"
#include	"pvr_bridge.h"
}

#include "gamex.h"

#define ESC_FAILED		-1
#define ESC_SUCCESS		1

#ifdef SUPPORT_CLEARTYPE
extern GetGammaValue(ULONG * pGamma);
extern SetGammaValue(ULONG ulGamma, BOOL bUpdateReg);
#endif

/*
 * function prototypes -------------------------------------------------------
 */

static VIDEO_POWER_STATE PmToVideoPowerState( CEDEVICE_POWER_STATE Dx );
static CEDEVICE_POWER_STATE VideoToPmPowerState( VIDEO_POWER_STATE PowerState );


ULONG	MBX::DrvEscape(
                        SURFOBJ *pso,
                        ULONG    ulEsc,
                        ULONG    ulSizeIn,
                        PVOID    pvIn,
                        ULONG    ulSizeOut,
                        PVOID    pvOut)
{
	ULONG ulRetVal = 0;		// Default to "unsupported"
	PVRSRV_BRIDGE_RETURN *psRet;  /* general return packet */

	////////DPFENTER ((L"->DrvEscape"));

	switch (ulEsc)
	{
	#ifdef SUPPORT_CLEARTYPE
		case DRVESC_GETGAMMAVALUE:
			ulRetVal = GetGammaValue((ULONG *)pvOut);
			break;

		case DRVESC_SETGAMMAVALUE:
			ulRetVal = SetGammaValue(ulSizeIn, *(BOOL *)pvIn);
			break;
	#endif // SUPPORT_CLEARTYPE

	#ifdef ROTATE_ENABLE
		case DRVESC_GETSCREENROTATION:
			*(int *)pvOut = ((BYTE)PhysToLogicalRotEnum(m_iRotate));

			if (m_bDisableDynScrnRotation == FALSE)
			{
				/*
				 * top byte goes to devMode.dmDisplayOrientation
				 * CETestkit uses this field to determine if rotation is available
				 */
				*(int *)pvOut |= ((DMDO_0 | DMDO_90 | DMDO_180 | DMDO_270) << 8);
			}
				
			ulRetVal = DISP_CHANGE_SUCCESSFUL;
			break;

		case DRVESC_SETSCREENROTATION:
			if ((ulSizeIn == DMDO_0) ||
				(ulSizeIn == DMDO_90) ||
				(ulSizeIn == DMDO_180) ||
				(ulSizeIn == DMDO_270) )
			{
				if (m_bDisableDynScrnRotation == FALSE)
				{
					ulRetVal = DynRotate(LogicalToPhysRotEnum(ulSizeIn));
				}
			}
			break;

		case DRVESC_GET_PHYS_ROTATION:
		{
			// Returns the physical rotation of the screen in DMDO_xxx format.
			// This is necessary because for PocketPC DRVESC_GETSCREENROTATION gives the logical rotation.
			//
			*(DWORD*)pvOut = (DWORD)m_iRotate; // DMDO_xxx format
			ulRetVal = ESC_SUCCESS;
			break;
		}

	#endif // ROTATE_ENABLE

		// App is querying to see if a code is supported.
		case QUERYESCSUPPORT:
			{
				ULONG	ulSupportChk;

				if (ulSizeIn == sizeof(ULONG))
				{
					// Code to check is pointed to by InBuffer.
					ulSupportChk = *(ULONG *)pvIn;

					switch (ulSupportChk)
					{
						// PowerVR codes.
						case DRVESC_PDUMP_ON:
						case DRVESC_PDUMP_OFF:
						case DRVESC_DISPLAY_GAMMA:
						case DRVESC_DISPLAY_BRIGHTNESS:
						case DRVESC_DISPLAY_CONTRAST:
						case DRVESC_OVERLAY_GAMMA:
						case DRVESC_OVERLAY_BRIGHTNESS:
						case DRVESC_OVERLAY_CONTRAST:
						case DRVESC_CURSOR_ROTATE:
						case DRVESC_COLOR_COEFFS:

						case DRVESC_RESTOREVIDEOMEM:
						case DRVESC_SAVEVIDEOMEM:
						case DRVESC_QUERYVIDEOMEMUSED:
						case DRVESC_HWVERIFY:
						case DRVESC_BACKLIGHT:
#ifdef LOCAL_MEMORY_SELF_REFRESH
						case DRVESC_LOCAL_MEMORY:
#endif // LOCAL_MEMORY_SELF_REFRESH
						case DRVESC_MEMCHK:

						// power management
						case SETPOWERMANAGEMENT:
						case GETPOWERMANAGEMENT:
						case IOCTL_POWER_CAPABILITIES:
						case IOCTL_POWER_QUERY:
						case IOCTL_POWER_SET:
						case IOCTL_POWER_GET:

						//Resource management
						case DRVESC_RESMAN_THREAD_TERMINATED:

						// PocketPC GameX Escape code
						case GETGXINFO:

						#if defined(GETRAWFRAMEBUFFER) || defined (OSV_PPC)
						case GETRAWFRAMEBUFFER:
						#endif

						// system codes
					#ifdef SUPPORT_CLEARTYPE
						case DRVESC_GETGAMMAVALUE:
						case DRVESC_SETGAMMAVALUE:
					#endif

						case CONTRASTCOMMAND:
#if 0 // bcb: Do these make sense on a UMA system? 
						case GETVFRAMEPHYSICAL:
						case GETVFRAMELEN:
#endif
					#ifdef SUPPORT_M24VA
						case DRVESC_M24VA_ACQUIRE:
						case DRVESC_OVERLAY_ATTRIBUTE:
						case DRVESC_OVERLAY_FLIP:
					#endif


					#ifdef SUPPORT_MARATHON_DEVICE
						case DRVESC_DIRTY:
						case DRVESC_CONFIG_DISPLAYSYSTEM:
						case DRVESC_CREATE_OFFSCREENSURFACE:
						case DRVESC_GET_SURFACEINFO:
						case DRVESC_READREG:
						case DRVESC_FORCE_EXTERNAL_SECONDARY_FULLSCREEN:
						case DRVESC_ACQUIRE_DUALDISPLAY:
						case DRVESC_ACTIVE_RECT:
						case DRVESC_PIXCLK:
						case DRVESC_OUTPUTMASK:
						case DRVESC_DISPLAY_REFRESH:
					#endif

					#ifndef DEBUG
						case DRVESC_GET_EXCEPTION_COUNTS:
					#endif
							ulRetVal = ESC_SUCCESS;
							break;

					#ifdef ROTATE_ENABLE
						case DRVESC_GETSCREENROTATION:
						case DRVESC_SETSCREENROTATION:
						{
							if (m_bDisableDynScrnRotation == FALSE)
							{
								ulRetVal = ESC_SUCCESS;
							}
							break;
						}

						case DRVESC_GET_PHYS_ROTATION:
						{
							ulRetVal = ESC_SUCCESS;
							break;
						}
					#endif//ROTATE_ENABLE

					#ifdef ENABLE_2D_PROFILE
						case DRVESC_2D_PROFILE:
						{
							ulRetVal = ESC_SUCCESS;
							break;
						}

					#endif

						// Pass any unrecognised codes to DispPerf.
						default:
							ulRetVal = DispPerfQueryEsc(ulSupportChk);
					}
				}
				else
				{
					SetLastError (ERROR_INVALID_PARAMETER);
					ulRetVal = ESC_FAILED;
				}
			}
			break;

		case CONTRASTCOMMAND:
			{
			ContrastCmdInputParm* psContrast = (ContrastCmdInputParm*)pvIn;
			int *nContrast;
			if(pvOut)
			{
				nContrast  = (int*)pvOut;
				*nContrast = psContrast->parm;
			}
			else
			{
				nContrast = &psContrast->parm;
			}

			if (ulSizeIn < sizeof(ContrastCmdInputParm))
			{
				ulRetVal = ESC_FAILED;
			}
			else
			{
				ulRetVal = ContrastControl (psContrast->command, (ULONG*) nContrast);
				psContrast->parm=*nContrast;
			}

			break;
		}
#if 0 // bcb: Do these make sense on a UMA system? 
		case GETVFRAMEPHYSICAL:
		{
			if (ulSizeOut < sizeof(DWORD))
			{
				ulRetVal = ESC_FAILED;
			}
			else
			{
				// Get phys address of video memory
				*(DWORD*)pvOut = (DWORD)m_pbyFBPhysBase;
				ulRetVal = ESC_SUCCESS;
			}
			break;
		}

		case GETVFRAMELEN:
		{
			if (ulSizeOut < sizeof(DWORD))
			{
				ulRetVal = ESC_FAILED;
			}
			else
			{
				// Get amount of video memory
				*(DWORD*)pvOut = m_sDevData.psDevInfoKM->sDevLocation.ui32FBMemorySize;

				ulRetVal = ESC_SUCCESS;
			}
			break;
		}
#endif
		// PowerVR codes.
		case DRVESC_PDUMP_ON:
#if PDUMP
			DPFINFO((L"-----------Switching PDUMP on-----------"));
			PDumpStart();
#endif /* PDUMP */
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_PDUMP_OFF:
#if PDUMP
			DPFINFO((L"-----------Switching PDUMP off----------"));
			PDumpStop();
#endif /* PDUMP */
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_MEMCHK:
#if FIXME
			MemChkCheckAllHeaps(TRUE);
#endif
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_HWVERIFY:
		{
			PDRVESC_HWVERIFY_PARAMS psHwVerIn = (PDRVESC_HWVERIFY_PARAMS)pvIn;
			PDRVESC_HWVERIFY_PARAMS psHwVerOut = (PDRVESC_HWVERIFY_PARAMS)pvOut;

			if ( (ulSizeIn != sizeof(DRVESC_HWVERIFY_PARAMS)) || !psHwVerIn)
			{
				SetLastError (ERROR_INVALID_PARAMETER);
				ulRetVal = ESC_FAILED;
			}
			else if ( (psHwVerIn->dwFlags & DRVESC_HWVERIFY_FLAG_GET)
						&& ((ulSizeOut != sizeof(DRVESC_HWVERIFY_PARAMS)) || !psHwVerOut) )
			{
				SetLastError (ERROR_INVALID_PARAMETER);
				ulRetVal = ESC_FAILED;
			}
			else
			{
#if HW_VERIFY
				m_clHwVer.DrvEscapeHWVerify (psHwVerIn, psHwVerOut);
#else
				SetLastError (ERROR_INVALID_PARAMETER);
				ulRetVal = ESC_FAILED;
#endif
			}

			break;
		}

		case DRVESC_DISPLAY_GAMMA:
			if(ulSizeIn == sizeof(PDP_GAMMA))
			{
				m_clDisplay.PDP_Gamma((PPDP_GAMMA)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_DISPLAY_BRIGHTNESS:
			if(ulSizeIn == sizeof(PDP_BRIGHTNESS))
			{
				m_clDisplay.PDP_Brightness((PPDP_BRIGHTNESS)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_DISPLAY_CONTRAST:
			if(ulSizeIn == sizeof(PDP_CONTRAST))
			{
				m_clDisplay.PDP_Contrast((PPDP_CONTRAST)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_OVERLAY_GAMMA:
			if(ulSizeIn == sizeof(PDP_GAMMA))
			{
				m_clDisplay.PDP_OverlayGamma((PPDP_GAMMA)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_OVERLAY_BRIGHTNESS:
			if(ulSizeIn == sizeof(PDP_BRIGHTNESS))
			{
				m_clDisplay.PDP_OverlayBrightness((PPDP_BRIGHTNESS)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_OVERLAY_CONTRAST:
			if(ulSizeIn == sizeof(PDP_CONTRAST))
			{
				m_clDisplay.PDP_OverlayContrast((PPDP_CONTRAST)pvIn, FALSE);
			}
			ulRetVal = ESC_SUCCESS;
			break;

		case DRVESC_COLOR_COEFFS:
		{
			if(ulSizeIn==sizeof(PDP_CSCCoeffs))
			{
				m_clDisplay.PDP_SetColorspaceConversion ((PPDP_CSCCoeffs)pvIn);
			}
			ulRetVal = ESC_SUCCESS;
			break;
		}
#ifdef SUPPORT_MARATHON_DEVICE

		case DRVESC_OUTPUTMASK:
		{
			PDRVESC_OUTPUTMASK_STRUCT psOutputMaskIn;
			PDRVESC_OUTPUTMASK_STRUCT psOutputMaskOut;
			DWORD dwLowPowerMask;
			DWORD dwFullPowerMask;

			ulRetVal = ESC_SUCCESS;
			
			psOutputMaskIn=(PDRVESC_OUTPUTMASK_STRUCT)pvIn;
			psOutputMaskOut=(PDRVESC_OUTPUTMASK_STRUCT)pvOut;
			if(ulSizeIn!=sizeof(*psOutputMaskIn))
			{
				SetLastError (ERROR_INVALID_PARAMETER);		/* no in buffer or too small */
				ulRetVal = ESC_FAILED;
				break;				
			}
			if(psOutputMaskIn->bGet)
			{
				// we should verify that we have an output struct
				if((psOutputMaskOut) && ulSizeOut==sizeof(*psOutputMaskOut))
				{
					m_clDisplay.PDP_OutputMask(&dwLowPowerMask,&dwFullPowerMask,FALSE,TRUE);
					psOutputMaskOut->ui32FullPowerMask=dwFullPowerMask;
					psOutputMaskOut->ui32LowPowerMask=dwLowPowerMask;
				}
				else
				{
					SetLastError (ERROR_INVALID_PARAMETER);		/* no in buffer or too small */
					ulRetVal = ESC_FAILED;
					break;				
				}
			}
			else
			{
				dwFullPowerMask=psOutputMaskIn->ui32FullPowerMask;
				dwLowPowerMask=psOutputMaskIn->ui32LowPowerMask;
				m_clDisplay.PDP_OutputMask(&dwLowPowerMask,&dwFullPowerMask,psOutputMaskIn->bReset,FALSE);						

			}
			break;
		}
		case DRVESC_DISPLAY_REFRESH:
		{
			
			PDRVESC_DISPLAY_REFRESH_STRUCT psRefreshStructIn;
			PDRVESC_DISPLAY_REFRESH_STRUCT psRefreshStructOut;
			BOOL bSingleShot;
			BYTE byUpdateRate;

			ulRetVal = ESC_SUCCESS;

			psRefreshStructIn=(PDRVESC_DISPLAY_REFRESH_STRUCT)pvIn;
			psRefreshStructOut=(PDRVESC_DISPLAY_REFRESH_STRUCT)pvOut;
			if(ulSizeIn!=sizeof(*psRefreshStructIn))
			{
				SetLastError (ERROR_INVALID_PARAMETER);		/* no in buffer or too small */
				ulRetVal = ESC_FAILED;
				break;				
			}
			if(psRefreshStructIn->bGet)
			{
				// we should verify that we have an output struct
				if((psRefreshStructOut) && ulSizeOut==sizeof(*psRefreshStructOut))
				{
					m_clDisplay.PDP_ReducedRefresh(&byUpdateRate,&bSingleShot,TRUE);
					if(bSingleShot)
					{
						psRefreshStructOut->bFullRefresh=IMG_FALSE;
					}
					else
					{
						psRefreshStructOut->bFullRefresh=IMG_TRUE;
					}
					psRefreshStructOut->ui32RefreshDelay=byUpdateRate;

					
				}
				else
				{

⌨️ 快捷键说明

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