📄 ltlcd.c
字号:
// Read LCD GEN CTRL data from LCD data register first.
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
if (ulTemp & LCD_GEN_CTRL__LCD_ON)
{
// LCD is turned on we are going to turn off check if we need
// to apply the patch.
if(hGDORageLCD->ulChipFamily == FAMILY_RAGE_MOBILITY)
{
// DSTN corruption in Rage Mobility
// As per Charles XBUF_SIZE should be set to 0xF before
// toggling the engine ON/OFF and it should be restored
// after it has been transistion. HW Bug. (4 May 99, sah)
// There is a problem in Rage Mobility that
// causes LCD panel to remain blank after
// LCD_ON is set. Originally this requires
// toggling of the LCD_ON to get back the
// display. Later HW found the problem and
// they advised to change the MCLK->XTAL
// to fix this problem.
ucAddress = PLL_GEN_CNTL;
ucTemp = GDOPLLReadByte(hGDO, ucAddress);
ucAddress = PLL_GEN_CNTL;
ucData = 0x70; // Set SCLK = PLLSCLK/8 to lower the MCLK
// wait if GUI engine is active
while((MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX)) & 0x800);
GDOPLLWriteByte(hGDO, ucAddress, ucData, 0x8F);
// Setup the delay
DELAY_MILLISECONDS(1);
// Fix EPR 33802
ulTemp1 = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp1 &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, (ulTemp1 | LCD_INDEX_HfbPitchAddr));
ulTemp1 = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
// Set the XBUF_SIZE to 0xF.
ulTemp1 |= HFB_PITCH_ADDR_XbufSize;
// wait if GUI engine is active
while((MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX)) & 0x800);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp1);
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
ulLCDGenCtrlData = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
// set LCD_ON bit to 0 which turns off the LCD display.
ulLCDGenCtrlData &= (~LCD_GEN_CTRL__LCD_ON);
// Write out LCD GEN CTRL data to LCD data register.
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulLCDGenCtrlData);
ucAddress = PLL_GEN_CNTL;
ucData = ucTemp; // Restore the old pll value
// wait if GUI engine is active
while((MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX)) & 0x800);
GDOPLLWriteByte(hGDO, ucAddress, ucData, 0x8F);
// Set up the delay as per Alex Miller
DELAY_MILLISECONDS(1);
/*
// Restore the original buffer size.
ulTemp1 = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp1 &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, (ulTemp1 | LCD_INDEX_HfbPitchAddr));
ulTemp1 = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
// Zero out the buffer
ulTemp1 &= (~HFB_PITCH_ADDR_XbufSize);
// Restore the original XBUF_SIZE.
ulTemp1 |= (ULONG)((hGDORageLCD->LcdGdoPanelInfo.ucXBufSize) << 8);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp1);
*/
if(hGDORageLCD->LcdGdoPanelInfo.usOffDelay)
{
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usOffDelay);
}
else
{
DELAY_MILLISECONDS(RPROLCDGDO_DEFAULT_LCD_ON_OFF_DELAY);
}
}
else
{
// ulTemp &= (~LCD_GEN_CTRL__LCD_ON);
// MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp);
if(hGDORageLCD->ulChipFamily == FAMILY_RAGE_XL)
{
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
// set LCD_DISPLAY_DIS to 1 (blank lcd)
ulLCDIndex |= LCD_INDEX__LCD_DISPLAY_DIS;
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_LcdMiscCntl;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
}
else
{
// Read the Engine ON bit to check if LCD is ON at boot
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulTemp |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulTemp);
// Read LCD GEN CTRL data from LCD data register first.
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
// Turn off LCD
ulTemp &= (~LCD_GEN_CTRL__LCD_ON);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp);
//EPR 35579 [HM]
// Set up the delay as per Alex Miller
// DELAY_MILLISECONDS(100);
if(hGDORageLCD->LcdGdoPanelInfo.usOffDelay)
{
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usOffDelay);
}
else
{
DELAY_MILLISECONDS(RPROLCDGDO_DEFAULT_LCD_ON_OFF_DELAY);
}
}
}
//EPR 35687 [HM]
//Turn off vertical stretch enable
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulTemp |= LCD_INDEX_VertStretching;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulTemp);
// Read LCD GEN CTRL data from LCD data register first.
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
ulTemp &= (~VERT_STRETCHING_VertStretchEn);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp);
// Since LCD does not have to be ON for detection
// this will have no effect on detection
lpEnableData->bEnabledAtBoot = TRUE;
}
else
{
lpEnableData->bEnabledAtBoot = FALSE;
}
if (hGDORageLCD->ulChipFamily == FAMILY_RAGE_MOBILITY)
LCDDetectionInit(hGDO); // Initialize LCD_INDEX register for LCD detection.
return(TRUE);
}
/******************************Public*Routine******************************\
* VOID LCDDisable(HGDO hGDO)
*
*
* LCDDisable is used by DAL to notify the graphics display object
* that the LCD display is no longer needed.
*
* The graphics display object frees locks, allocated resources,
* and returns the display to the state it was in before the graphics
* display object was loaded.
*
*
\**************************************************************************/
VOID FAR
LCDDisable(
HGDO hGDO
)
{
LPGDO_RAGE_LCD hGDORageLCD;
hGDORageLCD = (LPGDO_RAGE_LCD)hGDO;
DALDEBUG((DALDBG_NORMAL, "ATIRAGE.SYS! GDO-LCD: LCDDisable - Entry"));
// there shouldn't be anything to do here...
}
/******************************Public*Routine******************************\
* VOID FAR LCDBlank(HGDO hGDO, ULONG ulController, BOOL bBlank)
*
* Blank LCD if bBlank is TRUE. Unblank if FALSE
*
\**************************************************************************/
VOID FAR LCDBlank(HGDO hGDO, ULONG ulController, BOOL bBlank)
{
ULONG ulLCDIndex, ulTemp;
LPGDO_RAGE_LCD hGDORageLCD;
hGDORageLCD = (LPGDO_RAGE_LCD)hGDO;
DALDEBUG((DALDBG_NORMAL, "ATIRAGE.SYS! GDO-LCD: LCDBlank - Entry"));
if(bBlank == TRUE)
{
// Registry option to turn off engine on every mode change
if((hGDORageLCD->ulLCDGDORegOptionFlag & RPRO_REG_OPTION_LCDGDO_ENGINEOFFONMODECHANGE) ||
(hGDORageLCD->ulBiosSupportedFeatures & BIOS_SUPPORTS_LCD_ON_OFF_AT_BLANK))
{
LCDSetDisplayOff(hGDO, ulController);
}
else
{
// Follow the default behavior of blanking the LCD
// Wait for the vertical blank before sending 0 data to LCD.
// This to resolve black band corruption on LCD mode set.
// EPR's 039149,039133.
vWaitVertBlank(hGDORageLCD->lpMMR, ulController);
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
// set LCD_DISPLAY_DIS to 1 (blank lcd)
ulLCDIndex |= LCD_INDEX__LCD_DISPLAY_DIS;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
//To fix Hitachi problem, turn off LCD panel first and wait for 200ms
if((hGDORageLCD->ulDriverOptions & PLL_PROBLEM_N_BLANK_DELAY) &&
(hGDORageLCD->ulChipFamily == FAMILY_LT_PRO))
{
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulTemp |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulTemp);
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
ulTemp &= (~LCD_GEN_CTRL__LCD_ON);
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp);
DELAY_MILLISECONDS(200);
}
}
}
else
{
// Registry option to turn off engine on every mode change
if((hGDORageLCD->ulLCDGDORegOptionFlag & RPRO_REG_OPTION_LCDGDO_ENGINEOFFONMODECHANGE) ||
(hGDORageLCD->ulBiosSupportedFeatures & BIOS_SUPPORTS_LCD_ON_OFF_AT_BLANK))
{
// Unblank LCD
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
// set LCD_DISPLAY_DIS to 0 (unblank lcd)
ulLCDIndex &= ~LCD_INDEX__LCD_DISPLAY_DIS;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
// Turn it ON
LCDSetDisplayOn(hGDO, ulController);
}
else
{
// Follow the default behavior of blanking the LCD
//To fix Hitachi problem
if((hGDORageLCD->ulDriverOptions & PLL_PROBLEM_N_BLANK_DELAY) &&
(hGDORageLCD->ulChipFamily == FAMILY_LT_PRO))
{
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulTemp &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulTemp |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulTemp);
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
ulTemp |= LCD_GEN_CTRL__LCD_ON;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp);
//DELAY_MILLISECONDS(100);
}
// Wait for the vertical blank before sending data to LCD.
// This to resolve black band corruption on LCD mode set.
// EPR's 039149,039133.
vWaitVertBlank(hGDORageLCD->lpMMR, ulController);
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
// set LCD_DISPLAY_DIS to 0 (unblank lcd)
ulLCDIndex &= ~LCD_INDEX__LCD_DISPLAY_DIS;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
}
}
}
/******************************Public*Routine******************************\
* VOID LCDSetDisplayOn(HGDO hGDO, ULONG ulcontroller)
*
* LCDSetDisplayON turns on a LCD panel on a specific graphics controller.
*
\**************************************************************************/
VOID FAR
LCDSetDisplayOn(
HGDO hGDO,
ULONG ulController
)
{
UCHAR ucAddress, ucTemp, ucData;
ULONG ulLCDIndex,ulLCDData;
ULONG ulLCDGenCtrlData;
ULONG ulTemp1;
//ULONG ulScratch2_data;
LPGDO_RAGE_LCD hGDORageLCD;
hGDORageLCD = (LPGDO_RAGE_LCD)hGDO;
DALDEBUG((DALDBG_NORMAL, "ATIRAGE.SYS! GDO-LCD: LCDSetDisplayOn - Entry"));
// Moved to RageProUpdateBIOSDisplayInfo function in GCO
if((hGDORageLCD->ulChipFamily == FAMILY_RAGE_MOBILITY) ||
(hGDORageLCD->ulChipFamily == FAMILY_LT_PRO))
{
// Clear the Bit
DDLRegisterAND(hGDORageLCD->hDDL,(ULONG)SCRATCH_REG2, (ULONG)(~SCRATCH_REG2__REQ_LCD));
DDLRegisterAND(hGDORageLCD->hDDL,(ULONG)SCRATCH_REG3, (ULONG)(~SCRATCH_REG3__LCD_ACTIVE));
// Set LCD REQ bit in scratch register 2 if LCD is attached
// also update controller info only if mobility or LT_PRO
if (hGDORageLCD->ulController == PRIMARY_CONTROLLER)
{
DDLRegisterAND(hGDORageLCD->hDDL, (ULONG)SCRATCH_REG2, (ULONG)(~SCRATCH_REG2__CRTC_LCD));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -