📄 mqext.ccp
字号:
if(ulAction & DSP_MODE_CHANGE) // Display Mode changed
{
bMIUClkLow = FALSE; //HSU
switch(pDmode->DspType)
{
default:
case SIM_TYPE:
// In Symoustance Mode, If LCD off, CRT must be ON.
// (d) ==> (c)
// Turn off both GC1 and GC2 display first
pMQGC->HW_Disable_LCD(GC2);
pMQGC->HW_Disable_CRT(GC1);
// Load the timing parameters for LCD and CRT in GC1
if(ulAction & DSP_LCD_ON)
{
if ( !(ulAction & DSP_CRT_ON) ) //HSU
bMIUClkLow = TRUE; //HSU
pMQGC->HW_LoadLCDTiming(GC1, pDmode->wLCDViewportX, pDmode->wLCDViewportY,RELOAD_TIMING);
pMQGC->HW_Enable_LCD(GC1);
//HSU - begin
pMQGC->HW_Disable_LCD(GC1);
pMQGC->HW_Enable_LCD(GC1);
//HSU - end
}else{
pMQGC->HW_LoadCRTTiming(GC1,pDmode->wCRTViewportX, pDmode->wCRTViewportY,
pDmode->wCRTRefreshRate);
}
if(ulAction & DSP_CRT_ON)
pMQGC->HW_Enable_CRT(GC1);
break;
case QV_SAME_IMG:
// Turn off both GC1 and GC2 display first
pMQGC->HW_Disable_LCD(GC1);
pMQGC->HW_Disable_CRT(GC1);
pMQGC->HW_LoadLCDTiming(GC2, pDmode->wLCDViewportX, pDmode->wLCDViewportY,RELOAD_TIMING);
pMQGC->HW_LoadCRTTiming(GC1,pDmode->wCRTViewportX, pDmode->wCRTViewportY,
pDmode->wCRTRefreshRate);
pMQGC->HW_Enable_LCD(GC2);
pMQGC->HW_Enable_CRT(GC1);
break;
case QV_LG_DTP:
break;
}
}else{
switch(pDmode->DspType)
{
default:
// LCD CRT
//========================
// (a) GC1 GC1
// (b) GC1
// (c) GC1
//========================
// (d) GC2 GC1
//========================
// (e) GC2 GC1
//========================
case SIM_TYPE:
#if 0
if(ulAction & DSP_LCD_VIEWPORT_CHANGE)
pMQGC->HW_LoadLCDTiming(GC1, pDmode->wLCDViewportX, pDmode->wLCDViewportY,NO_RELOAD_TIMING);
if(ulAction & DSP_CRT_OFF)
pMQGC->HW_Disable_CRT(GC1);
else
pMQGC->HW_Enable_CRT(GC1);
if(ulAction & DSP_LCD_OFF)
pMQGC->HW_Disable_LCD(GC1);
else
pMQGC->HW_Enable_LCD(GC1);
#endif
if(ulAction & (DSP_LCD_ON | DSP_LCD_VIEWPORT_CHANGE))
{
if ( !(ulAction & DSP_CRT_ON) ) //HSU
bMIUClkLow = TRUE; //HSU
pMQGC->HW_LoadLCDTiming(GC1, pDmode->wLCDViewportX, pDmode->wLCDViewportY,RELOAD_TIMING);
pMQGC->HW_Enable_LCD(GC1);
//HSU - begin
pMQGC->HW_Disable_LCD(GC1);
pMQGC->HW_Enable_LCD(GC1);
//HSU - end
}else{
pMQGC->HW_Disable_LCD(GC1);
pMQGC->HW_LoadCRTTiming(GC1,pDmode->wCRTViewportX, pDmode->wCRTViewportY,
pDmode->wCRTRefreshRate);
}
if(ulAction & DSP_CRT_ON)
pMQGC->HW_Enable_CRT(GC1);
else
pMQGC->HW_Disable_CRT(GC1);
break;
case QV_SAME_IMG:
if(ulAction & DSP_LCD_VIEWPORT_CHANGE)
{
pMQGC->HW_LoadLCDTiming(GC2, pDmode->wLCDViewportX, pDmode->wLCDViewportY,NO_RELOAD_TIMING);
pMQGC->HW_Enable_LCD(GC2);
}
if(ulAction & (DSP_CRT_VIEWPORT_CHANGE |DSP_CRT_REFRESHRATE_CHANGE))
{
pMQGC->HW_Disable_CRT(GC1);
pMQGC->HW_LoadCRTTiming(GC1,pDmode->wCRTViewportX, pDmode->wCRTViewportY,
pDmode->wCRTRefreshRate);
pMQGC->HW_Enable_CRT(GC1);
}
break;
case QV_LG_DTP:
if(ulAction & DSP_LCD_VIEWPORT_CHANGE)
{
pMQGC->HW_LoadLCDTiming(GC2, pDmode->wLCDViewportX, pDmode->wLCDViewportY,NO_RELOAD_TIMING);
pMQGC->HW_Enable_LCD(GC2);
}
if(ulAction & (DSP_CRT_VIEWPORT_CHANGE | DSP_CRT_REFRESHRATE_CHANGE) )
{
pMQGC->HW_LoadCRTTiming(GC1,pDmode->wCRTViewportX, pDmode->wCRTViewportY,
pDmode->wCRTRefreshRate);
pMQGC->HW_Enable_CRT(GC1);
}
if(ulAction & DSP_ORG_CHANGE)
pMQGC->HW_SET_ORG(pDmode->fQVLGDTP_LCD_First);
break;
}
}
pMQGC->SetCursorData((int)pDmode->DspType);
#endif
return ESC_SUCCESS;
}
// Assumption (default)
// PWM0: contrast control
// PWM1: brightness (backlite) control
//
// if SWAP_PWM01 is set in registry flag
// PWM0: brightness (backlite)
// PWM1: contrast
//
//#ifdef MQ_CPP
BOOL MQGC::OemSetBacklight(int level)
{
#ifdef MQ_CPP
ULONG ulTemp;
ulTemp = fpREAD(PWM_CONTROL);
if (m_nMQFlag & SWAP_PWM01)
ulTemp = ((ulTemp & PWM0_DC_MASK) | (level << 8));
else
ulTemp = ((ulTemp & PWM1_DC_MASK) | ((ULONG)level << 24));
fpREG(PWM_CONTROL, ulTemp);
#endif
return TRUE;
}
BOOL MQGC::OemSetContrast(int level)
{
#ifdef MQ_CPP
ULONG ulTemp;
ulTemp = fpREAD(PWM_CONTROL);
if (m_nMQFlag & SWAP_PWM01)
ulTemp = ((ulTemp & PWM1_DC_MASK) | ((ULONG)level << 24));
else
ulTemp = ((ulTemp & PWM0_DC_MASK) | (level << 8));
fpREG(PWM_CONTROL, ulTemp);
#endif
return TRUE;
}
BOOL MQGC::OemSetupAltWin(void)
{
#ifdef MQ_CPP
ULONG ulTemp;
if (m_nMQFlag & (LARGE_DESKTOP|SAME_IMAGE))
{
ulTemp = gc2READ(GC2_CONTROL);
ulTemp |= AIM_ENABLE;
gc2REG(GC2_CONTROL,ulTemp);
ulTemp = gc1READ(GC1_CONTROL) & GC_DISABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
else
{
ulTemp = gc1READ(GC1_CONTROL);
ulTemp |= AIM_ENABLE;
gc1REG(GC1_CONTROL,ulTemp);
}
#endif
return TRUE;
}
BOOL MQGC::OemDisableAltWin(void)
{
#ifdef MQ_CPP
ULONG ulTemp;
if (m_nMQFlag & (LARGE_DESKTOP|SAME_IMAGE))
{
ulTemp = gc2READ(GC2_CONTROL);
ulTemp &= (~AIM_ENABLE);
gc2REG(GC2_CONTROL,ulTemp);
ulTemp = gc1READ(GC1_CONTROL) | GC_ENABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
else
{
ulTemp = gc1READ(GC1_CONTROL);
ulTemp &= (~AIM_ENABLE);
gc1REG(GC1_CONTROL,ulTemp);
}
#endif
return TRUE;
}
BOOL MQGC::OemEnterGhostMode(ULONG flag)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("--> OemEnterGhostMode\r\n")));
pMQGC->CursorData.ulFlag |= GHOST_MODE_ACTIVE;
return TRUE;
}
BOOL MQGC::OemLeaveGhostMode(void)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("--> OemLeaveGhostMode\r\n")));
pMQGC->CursorData.ulFlag &= (~GHOST_MODE_ACTIVE);
if (usBPP == 0)
{
DEBUGMSG(GPE_ZONE_INIT, (TEXT("RESTORE_PALETTE 8BPP\r\n")));
pMQGC->SetPalette(_rgbIdentity256, 0, 256);
}
return TRUE;
}
#ifdef SUPPORT_DDC
BOOL MQGC::OemGetEDID(PVOID pvOut)
{
BOOL bResult = TRUE;
HKEY hMQRegKey;
ULONG ulStatus;
DWORD Disp;
#ifdef SDB_GPIO
return FALSE;
#endif
ulStatus = RegCreateKeyEx(HKEY_LOCAL_MACHINE, TEXT("Drivers\\Display\\MQ100"), 0, NULL,0, KEY_ALL_ACCESS,NULL,&hMQRegKey,&Disp);
if(ulStatus != ERROR_SUCCESS)
{
return FALSE;
}
if(DDCTest())
{
//***********************************
// EDID Data
//***********************************
if (ERROR_SUCCESS != RegSetValueEx (hMQRegKey, (LPCTSTR)TEXT("EDID"), (DWORD)NULL,
REG_BINARY, (PBYTE)&(EDID_Buffer),sizeof(EDID_DATA)))
{
bResult = FALSE;
}
}else{ // read EDID failed
RegDeleteValue(hMQRegKey, (LPCWSTR)TEXT("EDID"));
bResult = FALSE;
}
RegCloseKey(hMQRegKey);
return bResult;
}
#endif // SUPPORT_DDC
BOOL MQGC::OemEnterPowerSave(int level)
{
if(level == 0)
DEBUGMSG(GPE_ZONE_INIT,(TEXT("OemExitPowerSave!\r\n")));
else
DEBUGMSG(GPE_ZONE_INIT,(TEXT("OemEnterPowerSave!\r\n")));
#ifdef MQ_CPP
// Enter intended state
//
pciREG(PCI_PM_CNTL_STATUS, level);
// make sure it's settled in intended state
//
Sleep(50);
if (level == 0)
InDxState(level);
#endif
return TRUE;
}
void MQGC::HW_SET_ORG(BOOL LCD_First)
{
#ifdef MQ_CPP
ULONG ulTmp;
BOOL bswitch=FALSE;
// Adjust starting address
//
if (pMQGC->CursorData.usCursorOn == AT_00_BY_GC2)
{
if (!LCD_First) // switch to CRT_First
{
pMQGC->CursorData.usCursorOn = AT_00_BY_GC1;
bswitch = TRUE;
}
}else{ // Current CRT first
if (LCD_First)
{
pMQGC->CursorData.usCursorOn = AT_00_BY_GC2;
bswitch = TRUE;
}
}
if(bswitch)
{
ulTmp = m_nIW1StartAddr;
m_nIW1StartAddr = m_nIW2StartAddr;
m_nIW2StartAddr = ulTmp;
gc1REG(IW1_START_ADDR, m_nIW1StartAddr);
gc2REG(IW2_START_ADDR, m_nIW2StartAddr);
}
#endif
if(LCD_First)
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Set LCD First\r\n")));
else
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Set CRT First\r\n")));
}
void MQGC::SetCursorData(int DspType)
{
switch (DspType)
{
case SIM_TYPE:
pMQGC->CursorData.ulFlag &= (~USE_2GCs_MASK);
break;
case QV_SAME_IMG:
pMQGC->CursorData.ulFlag &= (~USE_2GCs_MASK);
pMQGC->CursorData.ulFlag |= SAME_IMAGE;
break;
case QV_LG_DTP:
pMQGC->CursorData.ulFlag &= (~USE_2GCs_MASK);
pMQGC->CursorData.ulFlag |= LARGE_DESKTOP;
break;
}
return;
}
#endif ////////////////////////////////////////////////////////// DDIDUMP
//HW access routines
void MQGC::HW_LoadLCDTiming(WORD GC, WORD wLCDViewportX, WORD wLCDViewportY, USHORT flag)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Load LCD Timing to GC%d: X=%d, Y=%d flag=%d \r\n"),GC, wLCDViewportX,wLCDViewportY,flag));
#ifdef MQ_CPP
if(GC == GC2)
flag |= LCD_BY_GC2;
SetupLCDTiming(wLCDViewportX,wLCDViewportY,60,flag);
#endif
}
void MQGC::HW_LoadCRTTiming(WORD GC, WORD wCRTViewportX, WORD wCRTViewportY, WORD wRefreshRate)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Load CRT Timing to GC%d: X=%d, Y=%d, ref=%d\r\n"),GC,wCRTViewportX,wCRTViewportY,wRefreshRate));
#ifdef MQ_CPP
SetupCRTTiming(wCRTViewportX,wCRTViewportY,wRefreshRate,GC);
#endif
}
void MQGC::HW_Enable_LCD(WORD GC)
{
#ifdef MQ_CPP
ULONG ulTemp, ulFPTemp;
ulFPTemp = fpREAD(FP_CONTROL) & FPI_BY_GCx_MASK;
// Enable GC1 first
//
if (GC == GC1)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Enable LCD output at GC1\r\n")));
ulTemp = gc1READ(GC1_CONTROL);
if(!(ulTemp & GC_ENABLE))
{
ulTemp |= GC_ENABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
ulFPTemp |= FPI_BY_GC1;
}
else
if (GC == GC2)
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Enable LCD output at GC2\r\n")));
ulTemp = gc2READ(GC2_CONTROL);
if(!(ulTemp & GC_ENABLE))
{
ulTemp |= GC_ENABLE;
gc2REG(GC2_CONTROL, ulTemp);
}
ulFPTemp |= FPI_BY_GC2;
}
// Enable FPI next
//
fpREG(FP_CONTROL, ulFPTemp);
// Need to wait until power seq is off
//
PowerSeqOff();
#endif
}
void MQGC::HW_Disable_LCD(WORD GC)
{
#ifdef MQ_CPP
ULONG ulTemp;
// Disable FPI first - enough if at slmul mode ...
//
ulTemp = fpREAD(FP_CONTROL) & FPI_BY_GCx_MASK;
fpREG(FP_CONTROL, ulTemp);
ulTemp = gc1READ(GC1_CRT_CONTROL) & (~CRT_BY_GCxMASK);
if (GC == GC1)
{
// Disable GC1 next
//
if(!(ulTemp == CRT_BY_GC1))
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Disable LCD output at GC1\r\n")));
ulTemp = gc1READ(GC1_CONTROL) & GC_DISABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
}
else
{
// Disable GC2 next
//
if(!(ulTemp == CRT_BY_GC2))
{
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Disable LCD output at GC2\r\n")));
ulTemp = gc2READ(GC2_CONTROL) & GC_DISABLE;
gc2REG(GC2_CONTROL, ulTemp);
}
}
// Need to wait until power seq is off
//
PowerSeqOff();
#endif
}
void MQGC::HW_Enable_CRT(WORD GC)
{
#ifdef MQ_CPP
ULONG ulTemp;
if (GC == GC1)
{
ulTemp = gc1READ(GC1_CONTROL);
if(!(ulTemp & GC_ENABLE))
{
ulTemp |= GC_ENABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
ulTemp = gc1READ(GC1_CRT_CONTROL) & CRT_BY_GCxMASK;
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Read GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
ulTemp |= CRT_BY_GC1;
gc1REG(GC1_CRT_CONTROL, ulTemp);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Write GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
}else{
ulTemp = gc1READ(GC2_CONTROL);
if(!(ulTemp & GC_ENABLE))
{
ulTemp |= GC_ENABLE;
gc2REG(GC2_CONTROL, ulTemp);
}
ulTemp = gc1READ(GC1_CRT_CONTROL) & CRT_BY_GCxMASK;
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Read GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
ulTemp |= CRT_BY_GC2;
gc1REG(GC1_CRT_CONTROL, ulTemp);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Write GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
}
#endif
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Enable CRT output at GC%d\r\n"), GC));
}
void MQGC::HW_Disable_CRT(WORD GC)
{
#ifdef MQ_CPP
ULONG ulTemp;
BOOL bChange = FALSE; //HSU
ulTemp = gc1READ(GC1_CRT_CONTROL);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Read GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
ulTemp &= CRT_BY_GCxMASK; // Disable CRT
gc1REG(GC1_CRT_CONTROL, ulTemp);
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Write GC1_CRT_CONTROL=%08x\r\n"), ulTemp));
ulTemp = fpREAD(FP_CONTROL) & (~FPI_BY_GCx_MASK);
if (GC == GC1)
{
// Disable GC1 next
//
if(!(ulTemp == FPI_BY_GC1))
{
ulTemp = gc1READ(GC1_CONTROL) & GC_DISABLE;
gc1REG(GC1_CONTROL, ulTemp);
}
}
else
if (GC == GC2)
{
// Disable GC2 next
//
if(!(ulTemp == FPI_BY_GC2))
{
ulTemp = gc2READ(GC2_CONTROL) & GC_DISABLE;
gc2REG(GC2_CONTROL, ulTemp);
}
}
#if 0 //def MIPS_NEC
//HSU - begin Turn off corresponding PLL too
if ( bChange )
{
//ulTemp contains whatever GC ctrl that was turned off
//make sure we don't turn off PLL use by GE
ULONG ulPMMisc, ulGE;
ulPMMisc = pmuREAD(PM_MISC);
ulGE = ulPMMisc & GE_BY_MASK;
ulTemp &= GxRCLK_PLL_MASK;
if ( GxRCLK_PLL2 == ulTemp && ulGE != GE_BY_PLL2 )
ulPMMisc &= ~PLL2_ENABLE;
else if ( GxRCLK_PLL3 == ulTemp && ulGE != GE_BY_PLL3 )
ulPMMisc &= ~PLL3_ENABLE;
pmuREG(PM_MISC, ulPMMisc);
}
//HSU - end
#endif //MIPS_NEC
#endif
DEBUGMSG(GPE_ZONE_INIT,(TEXT("Disable CRT output at GC%d\r\n"), GC));
}
//#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -