|
|
/******************************************************************************\
* * $Workfile: ESCAPE.C $ * * Cirrus Logic Escapes. * * Copyright (c) 1996-1997 Microsoft Corporation. * Copyright (c) 1993-1997 Cirrus Logic, Inc., * * $Log: V:/CirrusLogic/CL5446/NT40/Archive/Display/ESCAPE.C_v $ * * Rev 1.0 24 Jun 1996 16:21:18 frido * Initial revision. * * myf17 11-04-96 Added special escape code must be use 11/5/96 later NTCTRL, * and added Matterhorn LF Device ID==0x4C * myf18 11-04-96 Fixed PDR #7075, * myf19 11-06-96 Fixed Vinking can't work problem, because DEVICEID = 0x30 * is different from data book (CR27=0x2C) * chu01 12-16-96 Enable color correction. * pat01 :11-22-96 : Fix panning-scrolling bugs. * (1) Screen messes up when switch to simulscan(with panning) * (2) Software cursor problem in panning scrolling mode * pat07 : : Take care of disappering hardware cursor during simulscan * myf29 02-12-97 Support 755x gamma collection. * chu02 02-13-97 More thorough checking for color correction. * jl01 02-24-97 Implement Feature Connector's functions. * \******************************************************************************/
#include "precomp.h"
//
// chu01
//
#ifdef GAMMACORRECT
#include "string.h"
#include "stdio.h"
extern PGAMMA_VALUE GammaFactor ; extern PGAMMA_VALUE ContrastFactor ;
#endif // GAMMACORRECT
extern
/******************************Public*Routine******************************\
* DrvEscape * * Processes the private ESCAPE's for this driver * \**************************************************************************/
ULONG DrvEscape( SURFOBJ *pso, ULONG iEsc, ULONG cjIn, VOID *pvIn, ULONG cjOut, VOID *pvOut) { ULONG returnLength; PPDEV ppdev = (PPDEV) pso->dhpdev; DHPDEV dhpdev = (DHPDEV) pso->dhpdev; //myf17
ULONG ulMode; //myf17
BYTE* pjPorts; //myf17
VIDEO_MODE_INFORMATION VideoModeInfo; //myf17
SHORT i; //myf17
unsigned char savePaletteR[256]; //pat01
unsigned char savePaletteG[256]; //pat01
unsigned char savePaletteB[256]; //pat01
unsigned char R,G,B; //pat01
unsigned char palettecounter; //pat01
LONG savex, savey ; //pat07
UCHAR TempByte; //jl01
//
// chu01
//
#ifdef GAMMACORRECT
PVIDEO_CLUT pScreenClut ; BYTE ajClutSpace[MAX_CLUT_SIZE] ; PALETTEENTRY* ppalSrc ; PALETTEENTRY* ppalDest ; PALETTEENTRY* ppalEnd ; UCHAR GammaRed, GammaGreen, GammaBlue, Brightness ; ULONG ulReturnedDataLength ; UCHAR tempB ; ULONG *Signature ; BOOL status; //myf29
UCHAR* pvLUT; //myf29
#endif // GAMMACORRECT
DISPDBG((2, "---- DrvEscape"));
DISPDBG((4, "cjIn = %d, cjOut = %d, pvIn = 0x%lx, pvOut = 0x%lx", cjIn, cjOut, pvIn, pvOut));
pjPorts = ppdev->pjPorts; DISPDBG((2, "CIRRUS:DrvEscape: entered DrvEscape\n")); if (iEsc == QUERYESCSUPPORT) { if ( ((*(ULONG *)pvIn) == CIRRUS_PRIVATE_ESCAPE) || //myf17 begin
((*(ULONG *)pvIn) == CLESCAPE_CRT_CONNECTION) || ((*(ULONG *)pvIn) == CLESCAPE_SET_VGA_OUTPUT) || ((*(ULONG *)pvIn) == CLESCAPE_GET_VGA_OUTPUT) || ((*(ULONG *)pvIn) == CLESCAPE_GET_PANEL_SIZE) || ((*(ULONG *)pvIn) == CLESCAPE_PANEL_MODE)) { //myf17 end
return TRUE; }
//
// chu01
//
#ifdef GAMMACORRECT
else if ((*(USHORT *)pvIn) == CLESCAPE_GET_CHIPID) { return TRUE; } #endif // GAMMACORRECT
else { return FALSE; } } else if (iEsc == CIRRUS_PRIVATE_ESCAPE) { if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_PRIVATE_BIOS_CALL, pvIn, cjIn, pvIn, cjIn, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed private BIOS call.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: private BIOS call GOOD.\n")); // copy the result to the output buffer
*(VIDEO_X86_BIOS_ARGUMENTS *)pvOut = *(VIDEO_X86_BIOS_ARGUMENTS *)pvIn;
//myf33 begin for TV on bug
if (((*(ULONG *)pvIn & 0x120F) != 0x1200) && ((*( ((ULONG *)pvIn)+1) & 0x01B0) == 0x01B0)) { // bAssertModeHardware((PDEV *) dhpdev, TRUE);
DWORD ReturnedDataLength; ULONG ulReturn; VIDEO_MODE_INFORMATION VideoModeInfo;
IOCONTROL(ppdev->hDriver, IOCTL_VIDEO_QUERY_CURRENT_MODE, NULL, 0, &VideoModeInfo, sizeof(VideoModeInfo), &ReturnedDataLength); #ifdef PANNING_SCROLL
if ((ppdev->ulChipID == 0x38) || (ppdev->ulChipID == 0x2C) || (ppdev->ulChipID == 0x30) || (ppdev->ulChipID == 0x34) || (ppdev->ulChipID == 0x40) || (ppdev->ulChipID == 0x4C)) { CirrusLaptopViewPoint(ppdev, &VideoModeInfo); } #endif
} //myf33 end
return TRUE; } } else if (iEsc == CLESCAPE_CRT_CONNECTION) //myf17
{
*(ULONG *)pvOut = (ULONG)0x1200; *( ((ULONG *)pvOut)+1) = 0xA1; if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_CRT_CONNECTION, pvOut, cjOut, pvOut, cjOut, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed CRT CONNECTION.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: CRT CONNECTION GOOD.\n")); return TRUE; } } else if (iEsc == CLESCAPE_GET_VGA_OUTPUT) //myf17
{
*(ULONG *)pvOut = (ULONG)0x1200; *( ((ULONG *)pvOut)+1) = 0x9A; if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_GET_VGA_OUTPUT, pvOut, cjOut, pvOut, cjOut, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed GET VGA OUTPUT.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: GET VGA OUTPUT GOOD.\n")); return TRUE; } } else if (iEsc == CLESCAPE_GET_PANEL_SIZE) //myf17
{
*(ULONG *)pvOut = (ULONG)0x1280; *( ((ULONG *)pvOut)+1) = 0x9C; if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_CRT_CONNECTION, pvOut, cjOut, pvOut, cjOut, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed CRT CONNECTION.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: CRT CONNECTION GOOD.\n")); return TRUE; } } else if (iEsc == CLESCAPE_PANEL_MODE) //myf17
{
*(ULONG *)pvOut = *(ULONG *)pvIn; *(ULONG *)pvOut |= (ULONG)0x1200; *( ((ULONG *)pvOut)+1) = 0xA0; if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_PANEL_MODE, pvOut, cjOut, pvOut, cjOut, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed PANEL MODE.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: PANEL MODE GOOD.\n")); return TRUE; } } else if (iEsc == CLESCAPE_SET_VGA_OUTPUT) { //pat01, begin
#ifdef PANNING_SCROLL
#if (_WIN32_WINNT < 0x0400) // #pat1
if ((ppdev->ulChipID == CL7541_ID) || (ppdev->ulChipID == CL7543_ID) || (ppdev->ulChipID == CL7542_ID) || (ppdev->ulChipID == CL7548_ID) || (ppdev->ulChipID == CL7555_ID) || (ppdev->ulChipID == CL7556_ID)) { palettecounter = 255; // Save DAC values
while (palettecounter --) { CP_OUT_BYTE(ppdev->pjPorts, DAC_PEL_READ_ADDR, palettecounter); savePaletteR[palettecounter] = CP_IN_BYTE(ppdev->pjPorts, DAC_PEL_DATA); savePaletteG[palettecounter] = CP_IN_BYTE(ppdev->pjPorts, DAC_PEL_DATA); savePaletteB[palettecounter] = CP_IN_BYTE(ppdev->pjPorts, DAC_PEL_DATA); }// while
// preserver icons + previous bitmaps
bAssertModeOffscreenHeap(ppdev,FALSE); }
#endif
#endif
//pat01, end
*(ULONG *)pvOut = *(ULONG *)pvIn; *(ULONG *)pvOut |= (ULONG)0x1200; *( ((ULONG *)pvOut)+1) = 0x92; if (!IOCONTROL(ppdev->hDriver, IOCTL_CIRRUS_SET_VGA_OUTPUT, pvOut, cjOut, pvOut, cjOut, &returnLength)) { DISPDBG((2, "CIRRUS:DrvEscape: failed SET VGA OUTPUT.\n")); return FALSE; } else { DISPDBG((2, "CIRRUS:DrvEscape: SET VGA OUTPUT GOOD.\n"));
//#pat01 <start>
#if (_WIN32_WINNT < 0x0400) // #pat01
#ifdef PANNING_SCROLL
// check cursor status
if ((ppdev->ulChipID == CL7541_ID) || (ppdev->ulChipID == CL7543_ID) || (ppdev->ulChipID == CL7542_ID) || (ppdev->ulChipID == CL7548_ID) || (ppdev->ulChipID == CL7555_ID) || (ppdev->ulChipID == CL7556_ID)) { if (ppdev->flCaps & CAPS_SW_POINTER) { bAssertModeHardware(ppdev, TRUE); vAssertModeText(ppdev, TRUE); vAssertModeBrushCache(ppdev,TRUE); // bEnablePointer(ppdev); // pat07
ppdev->flCaps |= CAPS_SW_POINTER; // reset to HW. why???
} else { // #pat07 start
CP_OUT_BYTE(pjPorts, SR_INDEX,0x10); savex = CP_IN_BYTE(pjPorts, SR_DATA); CP_OUT_BYTE(pjPorts, SR_INDEX,0x11); savey = CP_IN_BYTE(pjPorts, SR_DATA); //pat07 end
bAssertModeHardware(ppdev, TRUE); //pat07 vAssertModePointer(ppdev,TRUE);
vAssertModeText(ppdev, TRUE); vAssertModeBrushCache(ppdev,TRUE); bEnablePointer(ppdev); //pat07 begin
CP_OUT_BYTE(pjPorts, SR_INDEX,0x10); CP_OUT_BYTE(pjPorts, SR_DATA, savex); CP_OUT_BYTE(pjPorts, SR_INDEX,0x11); CP_OUT_BYTE(pjPorts, SR_DATA, savey); CP_PTR_ENABLE(ppdev, pjPorts); // #pat07 end
}
palettecounter = 255;
// Restore DAC values
while (palettecounter-- ) {
CP_OUT_BYTE(ppdev->pjPorts, DAC_PEL_WRITE_ADDR, palettecounter); CP_OUT_BYTE(ppdev->pjPorts, DAC_PEL_DATA, savePaletteR[palettecounter]); CP_OUT_BYTE(ppdev->pjPorts, DAC_PEL_DATA, savePaletteG[palettecounter]); CP_OUT_BYTE(ppdev->pjPorts, DAC_PEL_DATA, savePaletteB[palettecounter]);
}// while
}
#endif
#else //NT 4.0 code
//ppp begin
palettecounter = 255; while (palettecounter--) { CP_OUT_BYTE(ppdev->pjPorts,DAC_PEL_READ_ADDR,palettecounter); savePaletteR[palettecounter] = CP_IN_BYTE(ppdev->pjPorts,DAC_PEL_DATA); savePaletteG[palettecounter] = CP_IN_BYTE(ppdev->pjPorts,DAC_PEL_DATA); savePaletteB[palettecounter] = CP_IN_BYTE(ppdev->pjPorts,DAC_PEL_DATA); }
bAssertModeHardware((PDEV *) dhpdev, TRUE);
palettecounter = 255; while (palettecounter--) { CP_OUT_BYTE(ppdev->pjPorts,DAC_PEL_WRITE_ADDR,palettecounter); CP_OUT_BYTE(ppdev->pjPorts,DAC_PEL_DATA, savePaletteR[palettecounter]); CP_OUT_BYTE(ppdev->pjPorts,DAC_PEL_DATA, savePaletteG[palettecounter]); CP_OUT_BYTE(ppdev->pjPorts,DAC_PEL_DATA, savePaletteB[palettecounter]); } bEnablePointer(ppdev);
//ppp end
#endif
//pat01, end
return TRUE;
} }
//
// chu01
//
#ifdef GAMMACORRECT
else if (iEsc == CLESCAPE_GAMMA_CORRECT) // 9000
{ if (!(ppdev->flCaps & CAPS_GAMMA_CORRECT)) return ;
Signature = *((ULONG *)pvIn+0) ; GammaFactor = *((ULONG *)pvIn+1) ; ContrastFactor = *((ULONG *)pvIn+2) ;
//
// Is signature "CRUS" ?
//
if (Signature != 0x53555243) return TRUE ;
// Fill in pScreenClut header info:
pScreenClut = (PVIDEO_CLUT) ajClutSpace; pScreenClut->NumEntries = 256; pScreenClut->FirstEntry = 0;
ppalSrc = ppdev->pCurrentPalette; ppalDest = (PALETTEENTRY*) pScreenClut->LookupTable; ppalEnd = &ppalDest[256];
for (; ppalDest < ppalEnd; ppalSrc++, ppalDest++) { ppalDest->peRed = ppalSrc->peRed ; ppalDest->peGreen = ppalSrc->peGreen ; ppalDest->peBlue = ppalSrc->peBlue ; ppalDest->peFlags = 0 ; }
//myf29 begin
CP_OUT_BYTE(ppdev->pjPorts, CRTC_INDEX, 0x27) ; tempB = CP_IN_BYTE(ppdev->pjPorts, CRTC_DATA) ; if (tempB == 0xBC) status = bEnableGammaCorrect(ppdev) ; else if ((tempB == 0x40) || (tempB == 0x4C)) status = bEnableGamma755x(ppdev); //myf29 end
CalculateGamma(ppdev, pScreenClut, 256) ;
// Set palette registers:
if (!IOCONTROL(ppdev->hDriver, IOCTL_VIDEO_SET_COLOR_REGISTERS, pScreenClut, MAX_CLUT_SIZE, NULL, 0, &ulReturnedDataLength)) { DISPDBG((2, "Failed bEnablePalette")); return FALSE ; } return TRUE ; } else if (iEsc == CLESCAPE_GET_CHIPID) // 9001
{
//
// Return chip ID, graphics and video info
//
CP_OUT_BYTE(ppdev->pjPorts, CRTC_INDEX, 0x27) ; tempB = CP_IN_BYTE(ppdev->pjPorts, CRTC_DATA) ; if (tempB == 0xBC) //myf29
*(DWORD *)pvOut = ((DWORD)tempB) | 0x00000100 ; //for Graphic LUT
else if ((tempB == 0x40) || (tempB == 0x4C)) //myf29
*(DWORD *)pvOut = ((DWORD)tempB) | 0x00010100; //myf29 Video LUT
else //myf29
*(DWORD *)pvOut = ((DWORD)tempB); //myf29 non gamma
return TRUE ; }
//myf29 :02-12-97 add 7555 gamma correction begin
else if (iEsc == CLESCAPE_WRITE_VIDEOLUT) // 9010
{ if (!(ppdev->flCaps & CAPS_GAMMA_CORRECT)) return ;
pvLUT = (ULONG *)pvIn+0;
pScreenClut = (PVIDEO_CLUT) ajClutSpace; pScreenClut->NumEntries = 256; pScreenClut->FirstEntry = 0;
ppalDest = (PALETTEENTRY*) pScreenClut->LookupTable; ppalEnd = &ppalDest[256];
for (; ppalDest < ppalEnd; ppalDest++) { ppalDest->peRed = *pvLUT++; ppalDest->peGreen = *pvLUT++; ppalDest->peBlue = *pvLUT++; ppalDest->peFlags = 0 ; }
CP_OUT_BYTE(ppdev->pjPorts, CRTC_INDEX, 0x27) ; tempB = CP_IN_BYTE(ppdev->pjPorts, CRTC_DATA) ; if ((tempB == 0x40) || (tempB == 0x4C)) status = bEnableGammaVideo755x(ppdev); // if (!status)
// {
// DISPDBG((2, "Failed bEnableGAmmaVodeoCorrect"));
// return FALSE ;
// }
// Set palette registers:
if (!IOCONTROL(ppdev->hDriver, IOCTL_VIDEO_SET_COLOR_REGISTERS, pScreenClut, MAX_CLUT_SIZE, NULL, 0, &ulReturnedDataLength)) { //restore register
CP_OUT_BYTE(ppdev->pjPorts, CRTC_INDEX, 0x3F) ; tempB = CP_IN_BYTE(ppdev->pjPorts, CRTC_DATA) ; CP_OUT_BYTE(ppdev->pjPorts, CRTC_DATA, (tempB & 0xEF)) ;
DISPDBG((2, "Failed bEnablePalette")); return FALSE ; }
//restore register
CP_OUT_BYTE(ppdev->pjPorts, CRTC_INDEX, 0x3F) ; tempB = CP_IN_BYTE(ppdev->pjPorts, CRTC_DATA) ; CP_OUT_BYTE(ppdev->pjPorts, CRTC_DATA, (tempB & 0xEF)) ;
return TRUE ; } //myf29 :02-12-97 add 7555 gamma correction end
#endif // GAMMACORRECT
#if 1 // jl01 Implement Feature Connector's functions.
else if (iEsc == CLESCAPE_FC_Cap) // 9002
{ if ((ppdev->ulChipID == 0xAC) || (ppdev->ulChipID == 0xB8)) return TRUE; return FALSE; } else if (iEsc == CLESCAPE_FC_Status) // 9003
{ if (ppdev->ulChipID == 0xAC) // 5436
{ CP_OUT_BYTE(ppdev->pjPorts, SR_INDEX, 0x08); TempByte = CP_IN_BYTE(ppdev->pjPorts, SR_DATA); if ((TempByte & 0x20) == 0) return TRUE; else return FALSE; } else if (ppdev->ulChipID == 0xB8) // 5446
{ CP_OUT_BYTE(ppdev->pjPorts, INDEX_REG, 0x17); TempByte = CP_IN_BYTE(ppdev->pjPorts, DATA_REG); if ((TempByte & 0x08) == 0) return TRUE; else return FALSE; } else return FALSE; } else if (iEsc == CLESCAPE_FC_SetOrReset) // 9004
{ if (ppdev->ulChipID == 0xAC) // 5436
{ CP_OUT_BYTE(ppdev->pjPorts, SR_INDEX, 0x08); TempByte = CP_IN_BYTE(ppdev->pjPorts, SR_DATA); if (*(UCHAR *)pvIn) TempByte &= ~0x20; else TempByte |= 0x20; CP_OUT_BYTE(ppdev->pjPorts, SR_DATA, TempByte); } else if (ppdev->ulChipID == 0xB8) // 5446
{ CP_OUT_BYTE(ppdev->pjPorts, INDEX_REG, 0x17); TempByte = CP_IN_BYTE(ppdev->pjPorts, DATA_REG); if (*(UCHAR *)pvIn) TempByte &= ~0x08; else TempByte |= 0x08; CP_OUT_BYTE(ppdev->pjPorts, DATA_REG, TempByte); } else return TRUE; } #endif // jl01 Implement Feature Connector's functions.
else if (iEsc == CLESCAPE_IsItCLChips) // 9005
{ return TRUE; } else return 0xffffffff;
/* we should never be here */ return FALSE; }
|