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

📄 ltlcd.c

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