/*++ 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 #include #include #include #include "clmini.h" #include #include #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->hresvres 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()