📄 cspslcdcclass.cpp
字号:
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Copyright (C) 2005-2006, Freescale Semiconductor, Inc. All Rights Reserved.
// THIS SOURCE CODE, AND ITS USE AND DISTRIBUTION, IS SUBJECT TO THE TERMS
// AND CONDITIONS OF THE APPLICABLE LICENSE AGREEMENT
//---------------------------------------------------------------------------
//------------------------------------------------------------------------------
//
// File: CSPSlcdcClass.cpp
// Implementation of class CSPSlcdc.
//
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// INCLUDE FILES
//------------------------------------------------------------------------------
#include <windows.h>
#include <winddi.h>
#include <ceddk.h>
#include <gpe.h>
#include <emul.h>
#include <Winreg.h>
#include <Pwingdi.h>
#include <pm.h>
#include "csp.h"
#include "slcdc.h"
#include "CSPSlcdcClass.h"
//------------------------------------------------------------------------------
// GLOBAL OR STATIC VARIABLES
//------------------------------------------------------------------------------
static GPE *gGPE = (GPE *) NULL;
static DHPDEV (*pOldDrvEnablePDEV)(
DEVMODEW *pdm,
LPWSTR pwszLogAddress,
ULONG cPat,
HSURF *phsurfPatterns,
ULONG cjCaps,
ULONG *pdevcaps,
ULONG cjDevInfo,
DEVINFO *pdi,
HDEV hdev,
LPWSTR pwszDeviceName,
HANDLE hDriver );
//------------------------------------------------------------------------------
// FUNCTION PROTOTYPES
//------------------------------------------------------------------------------
// This prototype is missing from the GPE headers
BOOL APIENTRY GPEEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
PENGCALLBACKS engineCallbacks);
//------------------------------------------------------------------------------
// Smart LCDC driver entry point
//------------------------------------------------------------------------------
DHPDEV CSPSlcdcDrvEnablePDEV (DEVMODEW *pdm, LPWSTR pwszLogAddress, ULONG cPat,
HSURF *phsurfPatterns, ULONG cjCaps, ULONG *pdevcaps, ULONG cjDevInfo, DEVINFO *pdi,
HDEV hdev, LPWSTR pwszDeviceName, HANDLE hDriver)
{
DHPDEV pDev;
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("++CSPSlcdcDrvEnablePDEV\r\n")));
// Pallete is not supported
((GDIINFO *)pdevcaps)->flRaster &= ~(RC_PALETTE);
// Return the Old driver function
pDev = (*pOldDrvEnablePDEV) (pdm, pwszLogAddress, cPat, phsurfPatterns, cjCaps, pdevcaps,
cjDevInfo, pdi, hdev, pwszDeviceName, hDriver);
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("--CSPSlcdcDrvEnablePDEV\r\n")));
return (pDev);
}
//------------------------------------------------------------------------------
//
// FUNCTION: DrvEnableDriver
//
// DESCRIPTION: This function is the initial driver entry point exported
// by the driver DLL for devices that link directly to GWES
//
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
BOOL APIENTRY DrvEnableDriver(ULONG engineVersion, ULONG cj, DRVENABLEDATA *data,
PENGCALLBACKS engineCallbacks)
{
BOOL result = FALSE;
// Enable GPE
if(!GPEEnableDriver(engineVersion, cj, data, engineCallbacks))
{
DEBUGMSG(GPE_ZONE_ERROR, (TEXT("DrvEnableDriver:GPEEnableDriver failed 0x%x\r\n"), GetLastError()));
goto cleanup;
}
// Keep MS's EnablePDev function
pOldDrvEnablePDEV = data->DrvEnablePDEV;
// Set enable function pointer
data->DrvEnablePDEV = CSPSlcdcDrvEnablePDEV;
result = TRUE;
cleanup:
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("--DrvEnableDriver\r\n")));
return (result);
}
//------------------------------------------------------------------------------
//
// FUNCTION: DrvGetMasks
//
// DESCRIPTION:
//
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
ULONG *APIENTRY DrvGetMasks(DHPDEV dhpdev)
{
return BSPGetSLCDCBitMasks();
}
//------------------------------------------------------------------------------
//
// FUNCTION: GetGPE
//
// DESCRIPTION: Main entry point for a GPE-compliant driver.
//
// PARAMETERS:
//
// RETURNS:
// GPE class pointer
//
//------------------------------------------------------------------------------
GPE *GetGPE(void)
{
// Only instanciate GPE once
if (gGPE == NULL)
{
gGPE = new CSPSlcdcClass;
}
return (gGPE);
}
//------------------------------------------------------------------------------
//
// FUNCTION: RegisterDDHALAPI
//
// DESCRIPTION:
//
// PARAMETERS:
//
// RETURNS:
//
//------------------------------------------------------------------------------
void RegisterDDHALAPI(void)
{
return; // no DDHAL support
}
//------------------------------------------------------------------------------
// CSP GPE Class Constructor
//------------------------------------------------------------------------------
CSPSlcdcClass::CSPSlcdcClass(void)
{
PHYSICAL_ADDRESS phyAddr;
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("++CSPSlcdcClass::CSPSlcdcClass\r\n")));
// Map the SLCDC registers space for user access
phyAddr.QuadPart = CSP_BASE_REG_PA_SLCDC;
slcdc = (CSP_SLCDC_REGS *)MmMapIoSpace(phyAddr, sizeof(CSP_SLCDC_REGS), FALSE);
if(!slcdc)
{
DEBUGMSG(GPE_ZONE_ERROR, (TEXT("CSPSlcdcCalss: MmMapIoSpace failed!\r\n")));
}
BSPSlcdcClassInit();
mode = BspGetMode();
video_mem = BspGetVideoMem();
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("--CSPSlcdcClass::CSPSlcdcClass\r\n")));
}
//------------------------------------------------------------------------------
// CSP GPE Class Destructor
//------------------------------------------------------------------------------
CSPSlcdcClass::~CSPSlcdcClass(void)
{
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("++CSPSlcdcClass::~CSPSlcdcClass\r\n")));
BSPSlcdcClassDeInit();
// Free mapped SLCDC module space
if (slcdc != NULL)
{
MmUnmapIoSpace ((PVOID) slcdc, sizeof(CSP_SLCDC_REGS));
slcdc = NULL;
}
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("--CSPSlcdcClass::~CSPSlcdcClass\r\n")));
}
//------------------------------------------------------------------------------
// The following methods implement the default functions, the derived-class
// can override it if the device supports them
// CSP GPE Class method returns the default number of display modes
// supported by the driver.
//------------------------------------------------------------------------------
int CSPSlcdcClass::NumModes(void)
{
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("++CSPSlcdcClass::NumModes\r\n")));
DEBUGMSG(GPE_ZONE_ENTER, (TEXT("--CSPSlcdcClass::NumModes\r\n")));
// Only one mode supported by default
int modenumber;
modenumber = BspNumModes();
return (modenumber);
}
//------------------------------------------------------------------------------
// CSP GPE Class SetMode method to enable the device driver based on the
// Graphics Primitive Engine (GPE) and to request a specific mode for
// the display.
//------------------------------------------------------------------------------
SCODE CSPSlcdcClass::SetMode(int modeId, HPALETTE *pPalette)
{
SCODE result = S_OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -