⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ltlcd.c

📁 此代码为WCE5.0下显示器的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -