📄 mode.c
字号:
}
}
//--------------------------------------------------
// Description : Setup VGA mode
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetupModeVGA(void)
{
BYTE option = 0;
// Get information from mode table, such as IHTotal, IHStartPos, IHWidth, IVStartPos, IVHeight.
CModeGetModeTableInfo();
// Start up settings of VGA mode.
CModeStartUpVGA();
// Get scaling option, Capture window setup, Scaling setup, Display setup
CModeSetupDisplay();
// Load mode user data from eeprom
CEepromLoadModeData(stModeInfo.ModeCurr);
// Setup color processing
CModeSetupColorProcess();
CAdjustBacklight();
CAdjustAdcGainOffset();
CAdjustAdcClock(stModeUserData.Clock);
CAdjustPhase(stModeUserData.Phase);
CAdjustHPosition();
CModeModifyVTotal();
CAdjustVPosition();
pData[0] = CFrameSyncDo();
if(pData[0] == 2) //fail. note by zhang_dc
{
CModeResetMode();
return;
}
CModeSetupEtcs(_FUNCTION_ENABLE);
}
#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description : Setup mode DVI
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetupModeDVI(void)
{
BYTE option = 0;
// Do initial settings of DVI mode.
CModeStartUpDVI();
// Get scaling option, Capture window setup, Scaling setup, Display setup
CModeSetupDisplay();
// Setup color processing
CModeSetupColorProcess();
CAdjustBacklight();
pData[0] = CFrameSyncDo();
if(pData[0] == 2)
{
CModeResetMode();
return;
}
CAdjustTMDSCRCCheck();
CModeSetupEtcs(_FUNCTION_DISABLE);
}
#endif // End of #if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description : Setup display
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetupDisplay(void)
{
BYTE option = 0;
// Get scaling option
option = CModeGetScaleSetting();
// Capture window setup
CModeSetCaptureWindow(option);
// Scaling setup
CModeSetScaling(option);
// Display setup
CModeSetDisplay(option);
}
//--------------------------------------------------
// Description : Setup contrast and brightness
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetupColorProcess(void)
{
CEepromLoadBriConData();
CEepromLoadColorTempData();
CAdjustBrightness();
CAdjustContrast();
}
//--------------------------------------------------
// Description : Setup other setings for display
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeSetupEtcs(BYTE ucPar)
{
CMiscEnableDoubleBuffer();
if((bit)CScalerGetBit(_VDISP_CTRL_28, _BIT3)) //if frame sync mode enable. note by zhang_dc
CScalerSetBit(_VDISP_CTRL_28, ~_BIT5, 0x00);
CAdjustDigitalFilter(_PHASE_ACCESS_PORT, _PHASE_THD_0, _DIV_VALUE_2, ucPar);
CAdjustDigitalFilter(_YPBPR_ACCESS_PORT, _YPBPR_ENABLE, _DIV_VALUE_0, ucPar);
CAdjustDigitalFilter(_MISMATCH_ACCESS_PORT, _MISMATCH_THD_0, _DIV_VALUE_0, ucPar);
CMiscClearStatusRegister();
}
//--------------------------------------------------
// Description : Get mode information from mode table
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeGetModeTableInfo(void) //for VGA only. Add by zhang_dc
{
BYTE modetemp;
if(GET_MODE_SEARCH_TYPE() == _PRESET_MODE_TYPE)
{
modetemp = stModeInfo.ModeCurr;
}
else if(GET_MODE_SEARCH_TYPE() == _USER_MODE_TYPE)
{
CEepromLoadUserFIFOModeData((stModeInfo.ModeCurr / 4), pData);
modetemp = pData[(stModeInfo.ModeCurr % 4) * 4];
}
stModeInfo.IHTotal = tINPUTMODE_PRESET_TABLE[modetemp].IHTotal;
stModeInfo.IHStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IHStartPos;
stModeInfo.IHWidth = tINPUTMODE_PRESET_TABLE[modetemp].IHWidth;
stModeInfo.IVStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IVStartPos;
stModeInfo.IVHeight = tINPUTMODE_PRESET_TABLE[modetemp].IVHeight;
// Test
stModeUserCenterData.CenterClock = stModeInfo.IHTotal;
stModeUserCenterData.CenterHPos = stModeInfo.IHStartPos;
stModeUserCenterData.CenterVPos = stModeInfo.IVStartPos;
}
//--------------------------------------------------
// Description : Startup settings for VGA
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeStartUpVGA(void)
{
WORD pixelclock;
CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT0), _BIT0); //set input pixel format to Embedded ADC mode and sampling input pixels. note by zhang_dc
// Calculate pixel clock rate (round to MHz)
pixelclock = (((LWORD)stModeInfo.IHFreq * (LWORD)stModeInfo.IHTotal) * 2 / (1000 * 10));
pixelclock = (pixelclock >> 1) + (pixelclock & 0x01);
// To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT1), 0x00); //set Input Data Capture mode to 'from analog input'. note by zhang_dc
// ADC differential mode and Set ADC bandwidth to reduce high frequency noise
if(pixelclock < 34)
CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), _BIT2); //select differential ADC input. note by zhang_dc
else if(pixelclock < 68)
CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT0)); // 150M bandwidth. note by zhang_dc
else
CScalerSetBit(_ADC_RGB_CTRL_DC, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1)); // 300M bandwidth. note by zhang_dc
// Fine-tune R/G/B delay and enable the ADC frame-modulation
CScalerSetBit(_ADC_RED_CTRL_DD, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_RED & 0x07));
CScalerSetBit(_ADC_GRN_CTRL_DE, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_GREEN & 0x07));
CScalerSetBit(_ADC_BLU_CTRL_DF, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_BLUE & 0x07));
CScalerSetByte(_ADC_RED_CTRL_DD, 0x40);
CScalerSetByte(_ADC_GRN_CTRL_DE, 0x40);
CScalerSetByte(_ADC_BLU_CTRL_DF, 0x40);
CScalerSetByte(_ADC_VBIAS1_ED, 0x0d);
CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);
// HSYNC positive/negtive tracking
CScalerSetBit(_PLL_DIV_CTRL_98, ~_BIT6, 0x00);
}
#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description : Startup settings for DVI
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeStartUpDVI(void)//Update by Realtek at 20050617
{
CScalerSetBit(_VGIP_HV_DELAY_13, 0x0f, 0x00);
CScalerSetBit(_VGIP_CTRL_05, ~(_BIT3 | _BIT2 | _BIT0), (_BIT2 | _BIT0));
CTimerWaitForEvent(_EVENT_IVS);
pData[0] = HIBYTE(stModeInfo.IHTotal - 2);
pData[1] = 0x02;
pData[2] = LOBYTE(stModeInfo.IHTotal - 2);
pData[3] = HIBYTE(stModeInfo.IVTotal - 2);
pData[4] = 0x02;
pData[5] = LOBYTE(stModeInfo.IVTotal - 2);
pData[6] = 0x00;
pData[7] = 0x00;
pData[8] = 0x00;
pData[9] = 0x00;
pData[10] = 0x03;
pData[11] = 0x00;
pData[12] = 0x00;
pData[13] = 0x81;
CScalerWrite(_H_BOUNDARY_H_70, 14, pData, _AUTOINC);
if(CTimerPollingEventProc(255, CMiscAutoMeasurePollingEvent))
{
CScalerRead(_V_START_END_H_7E, 6, pData, _AUTOINC);
// IDEN horizontal Start
stModeInfo.IHStartPos = ((((WORD)pData[3] & 0xf0) << 4) | (WORD)pData[4]) - ((CScalerGetBit(_POWER_ON_OFF_CTRL_C2, _BIT7) == _BIT7) ? 16 : 18);
// IDEN vertical Start
stModeInfo.IVStartPos = (((WORD)pData[0] & 0xf0) << 4) | (WORD)pData[1];
}
else
{
CScalerSetByte(_AUTO_ADJ_CTRL1_7D, 0x00);
CModeResetMode();
}
}
#endif // End of #if(_TMDS_SUPPORT == _ON)
/*
//--------------------------------------------------
// Description : Get scaling information
// Input Value : None
// Output Value : Scaling information
//--------------------------------------------------
BYTE CModeGetScaleSetting(void)
{
BYTE option = 0;
#if(_DISP_INFO_BY_MODE == _ON)
stDisplayInfo = tDISPLAY_PRESET_TABLE[stModeInfo.ModeCurr];
#else
stDisplayInfo.DHWidth = Panel.DHWidth;
stDisplayInfo.DVHeight = Panel.DVHeight;
stDisplayInfo.DHTotal = Panel.DHTotal;
#endif
// This F/W do not support V scale-up(or bypass) and H scale-down simultaneously
if((stDisplayInfo.DVHeight >= stModeInfo.IVHeight) && (stDisplayInfo.DHWidth < stModeInfo.IHWidth))
{
stModeInfo.IHWidth = stDisplayInfo.DHWidth;
}
if(stModeInfo.IVHeight < stDisplayInfo.DVHeight) option |= _BIT0; // bit 0 : V scale-up
if(stModeInfo.IVHeight > stDisplayInfo.DVHeight) option |= _BIT1; // bit 1 : V scale-down
if(stModeInfo.IHWidth < stDisplayInfo.DHWidth) option |= _BIT2; // bit 2 : H scale-up
if(stModeInfo.IHWidth > stDisplayInfo.DHWidth) option |= _BIT3; // bit 3 : H scale-down
return option;
}
*/
//version 200D
BYTE CModeGetScaleSetting(void)
{
BYTE option = 0;
#if(_DISP_INFO_BY_MODE == _ON)
stDisplayInfo = tDISPLAY_PRESET_TABLE[stModeInfo.ModeCurr];
stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
// Modify Display Vertical Start Position
stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
if(stDisplayInfo.DVStartPos < 6)
stDisplayInfo.DVStartPos = 6;
// Modify OSD Reference Position
CScalerSetByte(_OSD_REFERENCE_DEN_1E, stDisplayInfo.DVStartPos - 4);
#else
/////////////////////////////////////////////////////////////////////////////////////
if (GET_INPUTPORT_TYPE(stSystemData.InputSource) == _DSUB_A0_PORT ||\
GET_INPUTPORT_TYPE(stSystemData.InputSource) == _DSUB_A1_PORT)
{
#if (_PANEL_TYPE == _PANEL_LQ104V1DG51 || _PANEL_TYPE==_PANEL_JIALUHUA)
if ( stModeInfo.ModeCurr == _MODE_640x480_60HZ || stModeInfo.ModeCurr == _MODE_640x480_72HZ)
{
stDisplayInfo.DHWidth = Panel.DHWidth;
stDisplayInfo.DVHeight = Panel.DVHeight - 22;
stDisplayInfo.DHTotal = Panel.DHTotal;
}
else
{
stDisplayInfo.DHWidth = Panel.DHWidth;
stDisplayInfo.DVHeight = Panel.DVHeight ;
stDisplayInfo.DHTotal = Panel.DHTotal;
}
#else
stDisplayInfo.DHWidth = Panel.DHWidth;
stDisplayInfo.DVHeight = Panel.DVHeight ;
stDisplayInfo.DHTotal = Panel.DHTotal;
#endif
}
else
{
stDisplayInfo.DHWidth = Panel.DHWidth;
stDisplayInfo.DVHeight = Panel.DVHeight ;
stDisplayInfo.DHTotal = Panel.DHTotal;
}
//////////////////////////////////////////////////////////////////////////////////////////
#if (_PANEL_TYPE == _PANEL_LQ104V1DG51 || _PANEL_TYPE==_PANEL_JIALUHUA)
if ( stModeInfo.ModeCurr == _MODE_640x480_60HZ || stModeInfo.ModeCurr == _MODE_640x480_72HZ)
{
stDisplayInfo.DVStartPos = 30;//34;
}
else
{
stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
if(stDisplayInfo.DVStartPos < 6)
stDisplayInfo.DVStartPos = 6;
}
#else
// Modify Display Vertical Start Position
stDisplayInfo.DVStartPos = (LWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
if(stDisplayInfo.DVStartPos < 6)
stDisplayInfo.DVStartPos = 6;
#endif
// Modify OSD Reference Position
CScalerSetByte(_OSD_REFERENCE_DEN_1E, stDisplayInfo.DVStartPos - 4);
#endif
// This F/W do not support V scale-up(or bypass) and H scale-down simultaneously
if((stDisplayInfo.DVHeight >= stModeInfo.IVHeight) && (stDisplayInfo.DHWidth < stModeInfo.IHWidth))
{
stModeInfo.IHWidth = stDisplayInfo.DHWidth;
}
if(stModeInfo.IVHeight < stDisplayInfo.DVHeight) option |= _BIT0; // bit 0 : V scale-up
if(stModeInfo.IVHeight > stDisplayInfo.DVHeight) option |= _BIT1; // bit 1 : V scale-down
if(stModeInfo.IHWidth < stDisplayInfo.DHWidth) option |= _BIT2; // bit 2 : H scale-up
if(stModeInfo.IHWidth > stDisplayInfo.DHWidth) option |= _BIT3; // bit 3 : H scale-down
return option;
}
//--------------------------------------------------
// Description : Set capture window
// Input Value : Scaling information
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -