|
|
/*++
Copyright (c) 1996-1997 Microsoft Corporation. Copyright (c) 1996-1997 Cirrus Logic, Inc.,
Module Name:
CLPANEL.C
Abstract:
This routine accesses panning scrolling information from the following NT 4.0 laptop.
Environment:
Kernel mode only
Notes: * * myf28 :02-03-97 : Fixed NT3.51 PDR#8357, mode 3, 12, panning scrolling bug, * and move 4 routine from modeset.c to clpanel.c * myf29 :02-12-97 : Support Gamma correction graphic/video LUT for 755x * myf30 :02-10-97 : Fixed NT3.51, 6x4 LCD boot set 256 coloe, test 64K mode * myf31 :03-12-97 : XGA DSTN panel can't support 24bpp mode for 7556 * myf32 :03-11-97 : check expension on, disable HW cursor fot 755x * myf33 :03-21-97 : check TV on, disable HW video & HW cursor, PDR #9006 * --*/
//---------------------------------------------------------------------------
// HEADER FILES
//---------------------------------------------------------------------------
//#include <ntddk.h>
#include <dderror.h>
#include <devioctl.h>
#include <miniport.h>
#include "clmini.h"
#include <ntddvdeo.h>
#include <video.h>
#include "cirrus.h"
// crus
#define DSTN (Dual_LCD | STN_LCD)
#define DSTN10 (DSTN | panel10x7)
#define DSTN8 (DSTN | panel8x6)
#define DSTN6 (DSTN | panel)
#define PanelType (panel | panel8x6 | panel10x7)
#define ScreenType (DSTN | PanelType)
SHORT Panning_flag = 0; //myf1, begin
//#define PANNING_SCROLL
#ifdef PANNING_SCROLL
extern RESTABLE ResolutionTable[]; extern PANNMODE PanningMode; extern USHORT ViewPoint_Mode;
PANNMODE PanningMode = {1024, 768, 1024, 8, -1 };
#endif
extern UCHAR HWcur, HWicon0, HWicon1, HWicon2, HWicon3; //myf11
//---------------------------------------------------------------------------
// FUNCTION PROTOTYPE
//---------------------------------------------------------------------------
//myf28 VP_STATUS
ULONG SetLaptopMode( PHW_DEVICE_EXTENSION HwDeviceExtension, PVIDEOMODE pRequestedMode, // VIDEOMODE* RequestedMode,
ULONG RequestedModeNum );
VOID //myf11
AccessHWiconcursor( PHW_DEVICE_EXTENSION HwDeviceExtension, SHORT Access_flag );
ULONG GetPanelFlags( //myf17
PHW_DEVICE_EXTENSION HwDeviceExtension );
// LCD Support
USHORT CheckLCDSupportMode( PHW_DEVICE_EXTENSION HwDeviceExtension, ULONG i );
#if defined(ALLOC_PRAGMA)
#pragma alloc_text(PAGE,SetLaptopMode)
#pragma alloc_text(PAGE,AccessHWiconcursor) //myf11, crus
#pragma alloc_text(PAGE,GetPanelFlags) //myf17
#pragma alloc_text(PAGE,CheckLCDSupportMode)
#endif
//myf28 VP_STATUS
ULONG SetLaptopMode( PHW_DEVICE_EXTENSION HwDeviceExtension, PVIDEOMODE pRequestedMode, // VIDEOMODE* RequestedMode,
ULONG RequestedModeNum )
/*++
Routine Description:
This routine sets the laptop mode.
Arguments:
HwDeviceExtension - Pointer to the miniport driver's device extension.
Mode - Pointer to the structure containing the information about the font to be set.
ModeSize - Length of the input buffer supplied by the user.
Return Value:
ERROR_INSUFFICIENT_BUFFER if the input buffer was not large enough for the input data.
ERROR_INVALID_PARAMETER if the mode number is invalid.
NO_ERROR if the operation completed successfully.
--*/
{ // PVIDEOMODE pRequestedMode;
VP_STATUS status; VIDEO_X86_BIOS_ARGUMENTS biosArguments; USHORT Int10ModeNumber; // ULONG RequestedModeNum;
UCHAR originalGRIndex, tempB ; UCHAR SEQIndex ; SHORT i; //myf1
VideoDebugPrint((1, "Miniport - SetLaptopMode\n")); //myfr
// pRequestedMode = (PVIDEOMODE) RequestedMode;
// Set SR14 bit 2 to lock panel, Panel will not be turned on if setting
// this bit. For laptop products only.
//
VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
if ((HwDeviceExtension->ChipType == CL756x) || (HwDeviceExtension->ChipType & CL755x) || (HwDeviceExtension->ChipType == CL6245) || (HwDeviceExtension->ChipType & CL754x)) { //myf33: check TV on, disable HW video & HW cursor, PDR #9006
biosArguments.Eax = 0x12FF; biosArguments.Ebx = 0xB0; // set/get TV Output
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if ((biosArguments.Eax & 0x0003) && (biosArguments.Ebx & 0x0100)) { HwDeviceExtension->CursorEnable = FALSE; HwDeviceExtension->VideoPointerEnabled = FALSE; //disable HW Cursor
} //myf33: check TV on, disable HW video & HW cursor, PDR #9006
biosArguments.Eax = pRequestedMode->BiosModes.BiosModeCL542x; biosArguments.Eax |= 0x1200; biosArguments.Eax &= 0xFF7F; //myf1
biosArguments.Ebx = 0xA0; // query video mode availability
status = VideoPortInt10 (HwDeviceExtension, &biosArguments);
#ifdef PANNING_SCROLL
if (PanningMode.flag == -1) { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0; } #endif //PAANNING_SCROLL
//crus
// bit0=1:video mode support
if ((HwDeviceExtension->ChipType == CL6245) && !(biosArguments.Eax & 0x0100)) { return ERROR_INVALID_PARAMETER; }
// fix CL6245 bug -- In 640x480x256C mode, with DSTN panel,
// 512K bytes memory is not enought
else if ((HwDeviceExtension->ChipType == CL6245) && (biosArguments.Eax & 0x0500) && (pRequestedMode->BiosModes.BiosModeCL542x == 0x5F) && //myf28 (pRequestedMode->DisplayType & DSTN))
(HwDeviceExtension->DisplayType & DSTN)) //myf28
{ return ERROR_INVALID_PARAMETER; }
//myf27: 1-9-97 fixed connect XGA panel, set 64K color mode for 754x, begin
else if ((HwDeviceExtension->ChipType & CL754x) && (biosArguments.Eax & 0x0400) && //myf27 (!(HwDeviceExtension->DisplayType & Jump_type)) && //myf27
((pRequestedMode->BiosModes.BiosModeCL542x == 0x64) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x65) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x74)) && //myf28 (pRequestedMode->DisplayType & (TFT_LCD | panel10x7)) )
((HwDeviceExtension->DisplayType & (TFT_LCD | panel10x7)) == (TFT_LCD | panel10x7)) )//myf28
{ return ERROR_INVALID_PARAMETER; } else if ((HwDeviceExtension->ChipType & CL754x) && ((pRequestedMode->BiosModes.BiosModeCL542x == 0x64) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x65) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x74)) && (biosArguments.Eax & 0x0400) && //myf27 (!(HwDeviceExtension->DisplayType & Jump_type)) && //myf27
//myf28 ((pRequestedMode->DisplayType & DSTN8) ||
//myf28 (pRequestedMode->DisplayType & DSTN10)) )
(((HwDeviceExtension->DisplayType & DSTN8) ==DSTN8) || //myf28
((HwDeviceExtension->DisplayType & DSTN10)==DSTN10))) //myf28
{ return ERROR_INVALID_PARAMETER; } //myf28 begin
else if ((pRequestedMode->BiosModes.BiosModeCL542x == 0x03) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x12)) { goto PANNING_OVER; } //myf31:3-12-97, XGA DSTN panel can't support 24bpp mode for 7556
else if ((HwDeviceExtension->ChipType & CL755x) && ((pRequestedMode->BiosModes.BiosModeCL542x == 0x71) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x78) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x79) || (pRequestedMode->BiosModes.BiosModeCL542x == 0x77)) && (biosArguments.Eax & 0x0400) && ((HwDeviceExtension->DisplayType & DSTN10)==DSTN10)) { return ERROR_INVALID_PARAMETER; } //myf31 end
//myf28 end
//myf27: 1-9-97 fixed connect DSTN panel, set 64K color mode for 754x, end
//
// bit3=1:panel support, bit2=1:panel enable,
// bit1=1:crt enable(in AH)
//
//panel turn on, mode not support (1)
else if ((biosArguments.Eax & 0x0400) && (HwDeviceExtension->ChipType != CL6245) && !(biosArguments.Eax & 0x0800)) { #ifndef PANNING_SCROLL //myf1
return ERROR_INVALID_PARAMETER; #else
//myf1, begin
biosArguments.Eax = 0x1280; biosArguments.Ebx = 0x9C; // Inquire panel information
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if ((biosArguments.Eax & 0x0002) && //Dual-Scan STN
(biosArguments.Ebx > 640) && //myf19
(pRequestedMode->bitsPerPlane > 8) && (HwDeviceExtension->ChipType & CL754x)) { pRequestedMode = &ModesVGA[DefaultMode]; //myf19
pRequestedMode->Frequency = 60; return ERROR_INVALID_PARAMETER; } else { i = 0; while ((ResolutionTable[i].Hres != 0) && (ResolutionTable[i].Vres != 0)) { if ((biosArguments.Ebx == ResolutionTable[i].Hres) && (biosArguments.Ecx == ResolutionTable[i].Vres) && (pRequestedMode->bitsPerPlane == ResolutionTable[i].BitsPerPlane) && (ResolutionTable[i].ModesVgaStart != NULL)) { if ((PanningMode.bpp != pRequestedMode->bitsPerPlane) && (Panning_flag == 1)) { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0; //myf30 begin
PanningMode.flag = 1; Panning_flag = 1; pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; //myf30 end
} else if ((Panning_flag == 1) && (PanningMode.bpp == pRequestedMode->bitsPerPlane)) { #if 1 //myf18 add
PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; #endif
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } else { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; Panning_flag = 1;
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } break; } i ++; } }
#endif
//myf1, end
} //panel turn off, mode not support (2)
else if (!(biosArguments.Eax & 0x0800) && (HwDeviceExtension->ChipType != CL6245) && !(biosArguments.Eax & 0x0400)) { //myf1, begin
#ifdef PANNING_SCROLL
PanningMode.flag = 0; Panning_flag = 0; #if 0
biosArguments.Eax = 0x1280; biosArguments.Ebx = 0x9C; // Inquire panel information
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if ((biosArguments.Eax & 0x0002) && //Dual-Scan STN
(biosArguments.Ebx > 640) && //myf19
(pRequestedMode->bitsPerPlane > 8) && (HwDeviceExtension->ChipType & CL754x)) { pRequestedMode = &ModesVGA[DefaultMode]; //myf19
pRequestedMode->Frequency = 60; return ERROR_INVALID_PARAMETER; } else { i = 0; while ((ResolutionTable[i].Hres != 0) && (ResolutionTable[i].Vres != 0)) { if ((biosArguments.Ebx == ResolutionTable[i].Hres) && (biosArguments.Ecx == ResolutionTable[i].Vres) && (pRequestedMode->bitsPerPlane == ResolutionTable[i].BitsPerPlane) && (ResolutionTable[i].ModesVgaStart != NULL)) { if ((PanningMode.bpp != pRequestedMode->bitsPerPlane) && (Panning_flag == 1)) { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0; } else if ((Panning_flag == 1) && (PanningMode.bpp == pRequestedMode->bitsPerPlane)) { pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } else { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; Panning_flag = 1;
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } break; } i ++; } }
#endif //0
#else
//myf1, end
//
// Lock turn on panel
//
SEQIndex = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x14); tempB = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT) | 0x04; VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,tempB); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, SEQIndex);
#endif //myf1, ifdef PANNING_SCROLL
}
//myf1, begin
//panel turn on, mode support (3)
else if ((biosArguments.Eax & 0x0800) && (HwDeviceExtension->ChipType != CL6245) && (biosArguments.Eax & 0x0400)) { #ifdef PANNING_SCROLL
biosArguments.Eax = 0x1280; biosArguments.Ebx = 0x9C; // Inquire panel information
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if ((biosArguments.Eax & 0x0002) && //Dual-Scan STN
(biosArguments.Ebx > 640) && //myf19
(pRequestedMode->bitsPerPlane > 8) && (HwDeviceExtension->ChipType & CL754x)) { pRequestedMode = &ModesVGA[DefaultMode]; //myf19
pRequestedMode->Frequency = 60; return ERROR_INVALID_PARAMETER; } //myf26, begin
else if ((pRequestedMode->hres == 640) && (pRequestedMode->vres == 480) && (pRequestedMode->bitsPerPlane == 1) && ((HwDeviceExtension->ChipType & CL754x) || (HwDeviceExtension->ChipType & CL755x) || //myf32
(HwDeviceExtension->ChipType == CL756x))) { pRequestedMode->Frequency = 60; PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0;
pRequestedMode = &ModesVGA[ResolutionTable[0].ModesVgaStart]; RequestedModeNum = ResolutionTable[0].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[0].Mode; } //myf26, end
else { i = 0; while ((ResolutionTable[i].Hres != 0) && (ResolutionTable[i].Vres != 0)) { if ((biosArguments.Ebx == ResolutionTable[i].Hres) && (biosArguments.Ecx == ResolutionTable[i].Vres) && (pRequestedMode->bitsPerPlane == ResolutionTable[i].BitsPerPlane) && (ResolutionTable[i].ModesVgaStart != NULL)) { if ((pRequestedMode->hres < biosArguments.Ebx) && (pRequestedMode->vres < biosArguments.Eax)) { #if 1 //myf18 add
PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; #endif//myf18
Panning_flag = 0; PanningMode.flag = 0; } else if ((PanningMode.bpp != pRequestedMode->bitsPerPlane) && (Panning_flag == 1)) { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0; } else if ((Panning_flag == 1) && (PanningMode.bpp == pRequestedMode->bitsPerPlane)) { if ((pRequestedMode->hres<ResolutionTable[i].Hres)|| (pRequestedMode->vres <ResolutionTable[i].Vres)) { while ((ResolutionTable[i].Hres != pRequestedMode->hres) && (ResolutionTable[i].Vres != pRequestedMode->vres)) { if ((pRequestedMode->bitsPerPlane == ResolutionTable[i].BitsPerPlane) && (ResolutionTable[i].Hres == pRequestedMode->hres) && (ResolutionTable[i].Vres == pRequestedMode->vres)) { #if 1 //myf18 add
PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; #endif
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; break; } i ++; } } else { #if 1 //myf18 add
PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; #endif
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } } else { PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 1; Panning_flag = 1;
pRequestedMode = &ModesVGA[ResolutionTable[i].ModesVgaStart]; RequestedModeNum = ResolutionTable[i].ModesVgaStart; //myf12
pRequestedMode->Frequency = 60; ViewPoint_Mode = ResolutionTable[i].Mode; } break; } i ++; } }
#endif
//myf1, end
}
//myf1, begin
//panel turn off, mode support (4)
else if ((biosArguments.Eax & 0x0800) && (HwDeviceExtension->ChipType != CL6245) && !(biosArguments.Eax & 0x0400)) { #ifdef PANNING_SCROLL
#if 1
//myf18 if (PanningMode.flag == -1)
{ PanningMode.hres = pRequestedMode->hres; PanningMode.vres = pRequestedMode->vres; PanningMode.wbytes = pRequestedMode->wbytes; PanningMode.bpp = pRequestedMode->bitsPerPlane; PanningMode.flag = 0; Panning_flag = 0; } #endif
#else
//myf18
//
// UnLock turn on panel
//
SEQIndex = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x14); tempB = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT) & 0xFB; VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT,tempB); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, SEQIndex); //myf18 end
#endif
} //myf1, end
//myf4: patch Viking BIOS bug, PDR #4287, begin
/*
else if ((biosArguments.Eax & 0x0800) && !(biosArguments.Eax & 0x0400) && (HwDeviceExtension->ChipType & CL754x)) { //by self check panel if or not supported
//myf16, begin
biosArguments.Eax = 0x1280; biosArguments.Ebx = 0x9C; // query panel information
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if (status == NO_ERROR) { if ( (((biosArguments.Ebx & 0x0000FFFF) == 640) && (pRequestedMode->vres > 480)) || //6x4 VGA
(((biosArguments.Ebx & 0x0000FFFF) == 800) && (pRequestedMode->vres > 600)) || //8x6 SVGA
(((biosArguments.Ebx & 0x0000FFFF) == 1024) && (pRequestedMode->vres > 768)) ) //10x7 XGA
{
//myf16, end
SEQIndex = VideoPortReadPortUchar(HwDeviceExtension->IOAddress+ SEQ_ADDRESS_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x14); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT) | 0x04)); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, SEQIndex); } } } */ //myf4: patch Viking BIOS bug, PDR #4287, end
}
#ifdef PANNING_SCROLL
VideoDebugPrint((1, "Info on Panning Mode:\n" "\tResolution: %dx%dx%d (%d bytes) -- %x\n", PanningMode.hres, PanningMode.vres, PanningMode.bpp, PanningMode.wbytes, ViewPoint_Mode )); #endif
//
// Set the Vertical Monitor type, if BIOS supports it
//
if ((pRequestedMode->MonTypeAX) && ((HwDeviceExtension->ChipType & CL754x) || (HwDeviceExtension->ChipType == CL756x) || (HwDeviceExtension->ChipType == CL6245) || (HwDeviceExtension->ChipType & CL755x)) ) {
//
// Re-write this part.
//
biosArguments.Eax = 0x1200; biosArguments.Ebx = 0x9A; status = VideoPortInt10(HwDeviceExtension, &biosArguments);
if (status != NO_ERROR) { return status; } else { biosArguments.Eax = ((biosArguments.Ecx >> 4) & 0x000F);
//myf5 : 9-01-96, PDR #4365 keep all default refresh rate, begin
biosArguments.Eax |= (biosArguments.Ebx >> 8) & 0x0030; //VGA
biosArguments.Ebx = 0x00A4; biosArguments.Ebx |= (biosArguments.Ecx & 0xFF00); //XGA, SVGA
biosArguments.Ecx = (biosArguments.Ecx & 0x000E) << 11; //12x10
//myf5 : 9-01-96, PDR #4365, end
if (pRequestedMode->vres == 480) { biosArguments.Eax |= 0x1200; biosArguments.Eax &= 0xFFCF; //myf5: 09-01-96
if (pRequestedMode->Frequency == 85) //myf0
biosArguments.Eax |= 0x30; //myf0
else if (pRequestedMode->Frequency == 75) biosArguments.Eax |= 0x20; else if (pRequestedMode->Frequency == 72) biosArguments.Eax |= 0x10; } else if (pRequestedMode->vres == 600) { biosArguments.Eax |= 0x1200; biosArguments.Ebx &= 0xF0FF; //myf5: 09-01-96
if (pRequestedMode->Frequency == 85) //myf0
biosArguments.Ebx |= 0x0400; //myf0
else if (pRequestedMode->Frequency == 75) biosArguments.Ebx |= 0x0300; else if (pRequestedMode->Frequency == 72) biosArguments.Ebx |= 0x0200; else if (pRequestedMode->Frequency == 60) biosArguments.Ebx |= 0x0100; } else if (pRequestedMode->vres == 768) { biosArguments.Eax |= 0x1200; biosArguments.Ebx &= 0x0FFF; //myf5: 09-01-96
if (pRequestedMode->Frequency == 85) //myf0
biosArguments.Ebx |= 0x5000; //myf0
else if (pRequestedMode->Frequency == 75) biosArguments.Ebx |= 0x4000; else if (pRequestedMode->Frequency == 72) biosArguments.Ebx |= 0x3000; else if (pRequestedMode->Frequency == 70) biosArguments.Ebx |= 0x2000; else if (pRequestedMode->Frequency == 60) biosArguments.Ebx |= 0x1000; } else if (pRequestedMode->vres == 1024) { biosArguments.Eax |= 0x1200; biosArguments.Ecx &= 0x0FFF; //myf5: 09-01-96
if (pRequestedMode->Frequency == 45) biosArguments.Ecx |= 0x0000; else if (pRequestedMode->Frequency == 60) //myf0
biosArguments.Ecx |= 0x1000; //myf0
else if (pRequestedMode->Frequency == 72) //myf0
biosArguments.Ecx |= 0x2000; //myf0
else if (pRequestedMode->Frequency == 75) //myf0
biosArguments.Ecx |= 0x3000; //myf0
else if (pRequestedMode->Frequency == 85) //myf0
biosArguments.Ecx |= 0x4000; //myf0
} status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if (status != NO_ERROR) { return status; } } }
HwDeviceExtension->bCurrentMode = RequestedModeNum; //myf12
//VideoDebugPrint((0, "SetMode Info :\n"
// "\tMode : %x, CurrentModeNum : %x, ( %d)\n",
// Int10ModeNumber,
// RequestedModeNum,
// RequestedModeNum));
PANNING_OVER:
return NO_ERROR; //return(pRequestedMode);
} //end SetLaptopMode()
//myf11 : begin
VOID AccessHWiconcursor( // PVOID HwDeviceExtension,
PHW_DEVICE_EXTENSION HwDeviceExtension, SHORT Access_flag )
/*++
Routine Description:
This routine determines disable/enable HW icon & HW cursor
Arguments:
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
Access_flag - equal 0: Disable, equal 1: Enable.
Return Value:
none
--*/
{ UCHAR savSEQidx;
savSEQidx = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT); if (Access_flag) //Enable hw icon/cursor
{ VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x12); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, HWcur);
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2A); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, HWicon0);
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2B); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, HWicon1);
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2C); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, HWicon2);
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2D); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, HWicon3); } else //Disable HW cursor, icons
{ VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x12); HWcur = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (UCHAR)(HWcur & 0xFE));
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2A); HWicon0 = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (UCHAR)(HWicon0 & 0xFE));
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2B); HWicon1 = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (UCHAR)(HWicon1 & 0xFE));
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2C); HWicon2 = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (UCHAR)(HWicon2 & 0xFE));
VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, 0x2D); HWicon3 = VideoPortReadPortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT); VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_DATA_PORT, (UCHAR)(HWicon3 & 0xFE));
} VideoPortWritePortUchar(HwDeviceExtension->IOAddress + SEQ_ADDRESS_PORT, savSEQidx);
} // end AccessHWiconcursor()
//myf11 : end
//crus begin
//myf10, begin
ULONG GetPanelFlags ( PHW_DEVICE_EXTENSION HwDeviceExtension ) { ULONG ChipType = HwDeviceExtension->ChipType; ULONG ulFlags = 0; UCHAR savSEQidx, Panel_Type =0, LCD; ULONG ulCRTCAddress, ulCRTCData; //myf16, begin
VP_STATUS status; VIDEO_X86_BIOS_ARGUMENTS biosArguments;
VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
biosArguments.Eax = 0x1280; biosArguments.Ebx = 0x9C; // query panel information
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if (status == NO_ERROR) { if ((biosArguments.Eax & 0x00000002) == 2) Panel_Type = (UCHAR)1; //DSTN panel
if (((biosArguments.Ebx & 0x0000FFFF) == 640) && ((biosArguments.Ecx & 0x0000FFFF) == 480)) ulFlags |= CAPS_VGA_PANEL; else if (((biosArguments.Ebx & 0x0000FFFF) == 800) && ((biosArguments.Ecx & 0x0000FFFF) == 600)) ulFlags |= CAPS_SVGA_PANEL; else if (((biosArguments.Ebx & 0x0000FFFF) == 1024) && ((biosArguments.Ecx & 0x0000FFFF) == 768)) ulFlags |= CAPS_XGA_PANEL; }
//myf33: check TV on, disable HW video & HW cursor, PDR #9006
biosArguments.Eax = 0x12FF; biosArguments.Ebx = 0xB0; // set/get TV Output
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if ((biosArguments.Eax & 0x0003) && (biosArguments.Ebx & 0x0100)) { ulFlags |= CAPS_TV_ON; ulFlags |= CAPS_SW_POINTER; } else ulFlags &= ~CAPS_TV_ON;
//myf33: check TV on, disable HW video & HW cursor, PDR #9006
#if 0
if (VideoPortReadPortUchar(HwDeviceExtension->IOAddress + MISC_OUTPUT_REG_READ_PORT) & 0x01) { ulCRTCAddress = CRTC_ADDRESS_PORT_COLOR; ulCRTCData = CRTC_DATA_PORT_COLOR; } else { ulCRTCAddress = CRTC_ADDRESS_PORT_MONO; ulCRTCData = CRTC_DATA_PORT_MONO; }
savSEQidx = VideoPortReadPortUchar(ulCRTCAddress);
if ((ChipType & CL754x)) //7548/7543/7541
{ VideoPortWritePortUchar(ulCRTCAddress, 0x20); LCD = VideoPortReadPortUchar(ulCRTCData) & 0x20; } else if (ChipType & CL755x) //7555
{ VideoPortWritePortUchar(ulCRTCAddress, 0x80); LCD = VideoPortReadPortUchar(ulCRTCData) & 0x01; } VideoPortWritePortUchar(ulCRTCAddress, savSEQidx); #endif
if (((ChipType & CL754x) || (ChipType & CL755x)) && (Panel_Type == 1)) //myf20
{ ulFlags |= CAPS_DSTN_PANEL; } //myf16, end
//ms1016, begin
// if (HwDeviceExtension->DisplayType & (STN_LCD | TFT_LCD))
// {
// ulFlags |= CAPS_DSTN_PANEL;
// }
//ms1016, end
if ((Panning_flag) && ((ChipType & CL754x) || (ChipType & CL755x))) { ulFlags |= CAPS_PANNING; //myf15
}
return(ulFlags); } //myf10, end
USHORT CheckLCDSupportMode( PHW_DEVICE_EXTENSION HwDeviceExtension, ULONG i )
/*++
Routine Description: Determines if LCD support the modes.
Arguments: HwDeviceExtension - Pointer to the miniport driver's device extension.
Return Value: None.
--*/ { VP_STATUS status; VIDEO_X86_BIOS_ARGUMENTS biosArguments;
// DbgBreakPoint();
// biosArguments.Eax = 0x1202;
// biosArguments.Ebx = 0x92; // set LCD & CRT turn on
// status = VideoPortInt10 (HwDeviceExtension, &biosArguments);
// VideoDebugPrint((1, "LCD & CRT all Turn ON\n"));
// crus
#ifdef INT10_MODE_SET
VideoPortZeroMemory(&biosArguments, sizeof(VIDEO_X86_BIOS_ARGUMENTS));
biosArguments.Eax = 0x1200 | ModesVGA[i].BiosModes.BiosModeCL542x; biosArguments.Ebx = 0xA0; // query video mode availability
status = VideoPortInt10 (HwDeviceExtension, &biosArguments); if (status == NO_ERROR) { // crus
if ((biosArguments.Eax & 0x00000800) && //bit3=1:support
(HwDeviceExtension->ChipType != CL6245)) return TRUE ; // crus
else if ((biosArguments.Eax & 0x00000100) && //bit0=1:video support
(HwDeviceExtension->ChipType == CL6245)) return TRUE ; // end crus
else { return FALSE ; } } else return FALSE ; // crus
#endif
} // end CheckLCDSupportMode()
|