📄 ltlcd.c
字号:
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);
if(hGDORageLCD->LcdGdoPanelInfo.usOffDelay)
{
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usOffDelay);
}
else
{
DELAY_MILLISECONDS(RPROLCDGDO_DEFAULT_LCD_ON_OFF_DELAY);
}
//Fix EPR 33018. Restore the XBUF_SIZE in LCDSetDisplayOn
}
else
{
// 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);
// We need this delay here for certain panels.
if(hGDORageLCD->LcdGdoPanelInfo.usOffDelay)
{
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usOffDelay);
}
else
{
DELAY_MILLISECONDS(RPROLCDGDO_DEFAULT_LCD_ON_OFF_DELAY);
}
}
}
// Since LCD is OFF let us attach the engine to the primary
// in case BIOS need to access it.
ulTemp = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
// Attach LCD to primary controller
ulTemp &= ~LCD_INDEX_LcdSrcSel;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulTemp);
} // end LCDSetDisplayOff
/******************************Public*Routine******************************\
*VOID LCDSetDPMS(HW_DISPLAY_OBJ hGDO, ULONG ulstate)
*
*
* LCDSetDPMS is used to set the display power management state.
*
* ulstate specifies the display power management state, as one of
* DPMS_ACTIVE, DPMS_STANDBY, DPMS_SUSPEND, and DPMS_OFF.
* However, LCD panel only supports two modes, on and off, for DPMS.
*
* The settings are:
* DPMS_ACTIVE : Everything on.
* DPMS_STANDBY: Everything off.
* DPMS_SUSPEND: Everything off.
* DPMS_OFF : Everything off.
*
\**************************************************************************/
VOID FAR
LCDSetDPMS(
HGDO hGDO,
ULONG ulState
)
{
UCHAR ucAddress, ucTemp, ucData;
ULONG ulLCDGenCtrlData;
ULONG ulLCDIndex;
ULONG ulLCDData;
ULONG ulTemp1; // ulXBufSize;
LPGDO_RAGE_LCD hGDORageLCD;
hGDORageLCD = (LPGDO_RAGE_LCD)hGDO;
DALDEBUG((DALDBG_NORMAL, "ATIRAGE.SYS! GDO-LCD: LCDSetDPMS - Entry"));
// For DPMS, LCD panel only supports two modes, on and off.
// Off mode includes standby and suspend.
switch(ulState)
{
case(POWERSTATE_ON):
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
// Read LCD GEN CTRL data from LCD data register first.
ulLCDGenCtrlData = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
if(!(ulLCDGenCtrlData & LCD_GEN_CTRL__LCD_ON))
{
// LCD is turned off.
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)
/*
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);
// Save the original value.
ulXBufSize = ulTemp1 & HFB_PITCH_ADDR_XbufSize;
// Set the XBUF_SIZE to 0xF.
ulTemp1 |= HFB_PITCH_ADDR_XbufSize;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp1);
*/
// Fix EPR 33802
// 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.
// Fix EPR 33018
ulTemp1 |= (ULONG)((hGDORageLCD->LcdGdoPanelInfo.ucXBufSize) << 8) ;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp1);
// 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
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 1 which turns on 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);
// Set up the delay as per Alex Miller
// DELAY_MILLISECONDS(100);
ucAddress = PLL_GEN_CNTL;
ucData = ucTemp; // Restore the old value
// wait if GUI engine is active
while((MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX)) & 0x800);
GDOPLLWriteByte(hGDO, ucAddress, ucData, 0x8F);
DELAY_MILLISECONDS(1);
}
else
{
// We need this delay here for certain panels.
// DELAY_MILLISECONDS(100);
// Above dealy was removed when we implemented BIOS back light
// and Off delay was implemented.
// set LCD_ON bit to 1 which turns on 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);
}
}
// Turn on backlight voltage(VB) in panel digital power control
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_PowerManagement;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
ulLCDData = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
if((hGDORageLCD->LcdGdoPanelInfo.usBackLightDelay) &&
(!(ulLCDData & POWER_MANAGEMENT__BLON)))
{
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usBackLightDelay);
}
ulLCDData |= POWER_MANAGEMENT__BLON;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulLCDData);
break;
case(POWERSTATE_STANDBY):
case(POWERSTATE_SUSPEND):
case(POWERSTATE_OFF):
// if back light delay is defined in registry or BIOS
// turn off the back light before LCD_ON bit is reset.
if(hGDORageLCD->LcdGdoPanelInfo.usBackLightDelay)
{
// Turn off backlight voltage(VB) in panel power control
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_PowerManagement;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
ulLCDData = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
ulLCDData &= ~POWER_MANAGEMENT__BLON;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulLCDData);
// Wait for back light delay before turn off the LCD_ON bit
DELAY_MILLISECONDS(hGDORageLCD->LcdGdoPanelInfo.usBackLightDelay);
}
// Set LCD_DATA register to index 1( LCD_GEN_CTRL).
ulLCDIndex = MMREADULONG(hGDORageLCD->lpMMR, LCD_INDEX);
ulLCDIndex &= (~LCD_INDEX__LCD_REG_INDEX_MASK);
ulLCDIndex |= LCD_INDEX_lcdGenCtrlReg;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_INDEX, ulLCDIndex);
// Read LCD GEN CTRL data from LCD data register first.
ulLCDGenCtrlData = MMREADULONG(hGDORageLCD->lpMMR, LCD_DATA);
if(ulLCDGenCtrlData & 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)
/*
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);
// Save the original value.
ulXBufSize = ulTemp1 & HFB_PITCH_ADDR_XbufSize;
// Set the XBUF_SIZE to 0xF.
ulTemp1 |= HFB_PITCH_ADDR_XbufSize;
MMWRITEULONG(hGDORageLCD->lpMMR, LCD_DATA, ulTemp1);
*/
// 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -