📄 sync.c
字号:
// Description : Search VGA sync type
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncSearchSyncTypeVGA(void)
{
#define _SYNCTYPE_CONFIRM_TIMES 2
BYTE synctypeprev, synctypecurr, cnt;
cnt = _SYNCTYPE_CONFIRM_TIMES;
do
{
synctypecurr = CSyncGetSyncTypeStep1VGA();
if(cnt == _SYNCTYPE_CONFIRM_TIMES)
{
synctypeprev = synctypecurr;
continue;
}
if(synctypecurr != synctypeprev)
{
return _NO_SYNC_STATE;
}
}
while(--cnt);
return synctypecurr;
#undef _SYNCTYPE_CONFIRM_TIMES
}
/*
//--------------------------------------------------
// Description : Get VGA sync type (step 1)
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep1VGA(void)
{
BYTE cnt = 0;
CScalerSetByte(_ADC_POWER_CTRL_E8, 0x38);
CScalerSetByte(_VGIP_ODD_CTRL_08, 0x00);
CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);
CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT7 | _BIT3), 0x00);
CScalerSetBit(_SCALE_CTRL_19, ~_BIT7, 0x00);
CScalerSetByte(_SYNC_CTRL_49, 0x06);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT4 | _BIT2), (_BIT4 | _BIT2));
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT1, _BIT1);
do
{
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, 0x00);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, _BIT0);
CScalerSetBit(_STABLE_PERIOD_H_50, ~_BIT4, 0x00);
if(!CTimerPollingEventProc(20, CMiscStableFlagPollingEvent))
{
if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT7))
{
return _NO_SYNC_STATE;
}
else
{
return _NO_SYNC_STATE;
}
}
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
if(!(bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT3))
{
CScalerSetBit(_SYNC_INVERT_48, ~_BIT3, CScalerGetBit(_SYNC_INVERT_48, _BIT3) ^ _BIT3);
cnt++;
}
else
{
break;
}
if(cnt >= 2)
return _NO_SYNC_STATE;
}
while(_TRUE);
CScalerSetBit(_SYNC_SELECT_47, ~(_BIT6 | _BIT5), _BIT5);
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT4, 0x00);
// Vsync counter level 384 crystal clocks
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~(_BIT2 | _BIT1 | _BIT0), 0x03);
CScalerSetByte(_VSYNC_COUNTER_LEVEL_LSB_4D, 0x00);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT6, 0x00);
CScalerSetBit(_DETECT_HSYNC_PERIOD_LSB_4B, ~_BIT7, 0x00);
CTimerDelayXms(40);
if((bit)CScalerGetBit(_STABLE_COUNT_4F, _BIT6))
{
if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT6))
{
return _NO_SYNC_STATE;
}
else
{
CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), (_BIT6 | _BIT5));
return _CS_STATE;
}
}
CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), 0x00);
CAdjustSyncProcessorMeasureStart();
if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
if((bit)CScalerGetBit(_MEAS_VS_PERIOD_H_54, _BIT5))
{
return _NO_SYNC_STATE;
}
else
{
if(CModeMeasureData())
{
CSyncModifyPolarityVGA();
return _SS_STATE;
}
else
{
return _NO_SYNC_STATE;
}
}
}
else
{
return _NO_SYNC_STATE;
}
}
//--------------------------------------------------
// Description : Get VGA sync type (step 2, for Composite sync)
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep2VGA(void)
{
if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
{
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~_BIT6, _BIT6);
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CScalerSetBit(_SYNC_INVERT_48, ~_BIT1, _BIT1);
CTimerDelayXms(40);
return _CS_STATE;
}
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT3, _BIT3);
CScalerRead(_DETECT_HSYNC_PERIOD_MSB_4A, 2, pData, _AUTOINC);
((WORD *)pData)[1] = (pData[0] << 3) | (pData[1] & 0x07);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
CScalerRead(_STABLE_PERIOD_H_50, 2, pData, _AUTOINC);
((WORD *)pData)[2] = ((pData[0] & 0x07) << 8) | pData[1];
if(abs(((WORD *)pData)[1] - ((WORD *)pData)[2]) <= 1)
{
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), 0x00);
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
return _CS_STATE;
}
else
{
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~_BIT6, _BIT6);
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CScalerSetBit(_SYNC_INVERT_48, ~_BIT1, _BIT1);
CTimerDelayXms(40);
return _CS_STATE;
}
}
//--------------------------------------------------
// Description : Modify VGA sync polarity
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CSyncModifyPolarityVGA(void)
{
BYTE polarity;
polarity = CScalerGetBit(_VGIP_SIGINV_06, (_BIT3 | _BIT2));
polarity &= ~(_BIT3 | _BIT2);
if(!(bit)(stModeInfo.Polarity & _BIT0))
{
polarity |= _BIT2;
}
if(!(bit)(stModeInfo.Polarity & _BIT1))
{
polarity |= _BIT3;
}
CScalerSetByte(_VGIP_SIGINV_06, polarity);
}
*/
//version 200D
//--------------------------------------------------
// Description : Get VGA sync type (step 1)
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep1VGA(void)
{
BYTE cnt = 0;
// Enable ADC bandgap and SOG power
CScalerSetByte(_ADC_POWER_CTRL_E8, 0x38);
// Disable video settings
CScalerSetByte(_VGIP_ODD_CTRL_08, 0x00);
CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);
CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT7 | _BIT3), 0x00);
CScalerSetBit(_SCALE_CTRL_19, ~_BIT7, 0x00);
CScalerSetByte(_SYNC_CTRL_49, 0x06);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT4 | _BIT2), (_BIT4 | _BIT2));
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT1, _BIT1);
do
{
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, 0x00);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, _BIT0);
CScalerSetBit(_STABLE_PERIOD_H_50, ~_BIT4, 0x00);
if(!CTimerPollingEventProc(20, CMiscStableFlagPollingEvent))
{
if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT7))
{
return _NO_SYNC_STATE;
}
else
{
return _NO_SYNC_STATE;
}
}
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
if(!(bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT3))
{
CScalerSetBit(_SYNC_INVERT_48, ~_BIT3, CScalerGetBit(_SYNC_INVERT_48, _BIT3) ^ _BIT3);
cnt++;
}
else
{
break;
}
if(cnt >= 2)
return _NO_SYNC_STATE;
}
while(_TRUE);
CScalerSetBit(_SYNC_SELECT_47, ~(_BIT6 | _BIT5), _BIT5);
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT4, 0x00);
// Vsync counter level 384 crystal clocks
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~(_BIT2 | _BIT1 | _BIT0), 0x03);
CScalerSetByte(_VSYNC_COUNTER_LEVEL_LSB_4D, 0x00);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT6, 0x00);
CScalerSetBit(_DETECT_HSYNC_PERIOD_LSB_4B, ~_BIT7, 0x00);
CTimerDelayXms(40);
if((bit)CScalerGetBit(_STABLE_COUNT_4F, _BIT6))
{
if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT6))
{
return _NO_SYNC_STATE;
}
else
{
CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), (_BIT6 | _BIT5));
return CSyncGetSyncTypeStep2VGA();
}
}
CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), 0x00);
// Check if Hsync only
CAdjustSyncProcessorMeasureStart();
if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
if(CModeMeasureData())
{
CSyncModifyPolarityVGA();
return _SS_STATE;
}
else
{
return _NO_SYNC_STATE;
}
}
else
{
return _NO_SYNC_STATE;
}
}
//--------------------------------------------------
// Description : Get VGA sync type (step 2, for Composite sync)
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep2VGA(void)
{
if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
{
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CTimerDelayXms(40);
return _CS_STATE;
}
CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT3, _BIT3);
CScalerRead(_DETECT_HSYNC_PERIOD_MSB_4A, 2, pData, _AUTOINC);
((WORD *)pData)[1] = (pData[0] << 3) | (pData[1] & 0x07);
CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
CScalerRead(_STABLE_PERIOD_H_50, 2, pData, _AUTOINC);
((WORD *)pData)[2] = ((pData[0] & 0x07) << 8) | pData[1];
if(abs(((WORD *)pData)[1] - ((WORD *)pData)[2]) <= 1)
{
return CSyncCheckSOY();
}
else
{
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CTimerDelayXms(40);
return _CS_STATE;
}
}
//--------------------------------------------------
// Description : Check Sync between seration CS and SOY
// Input Value : None
// Output Value : None
//--------------------------------------------------
BYTE CSyncCheckSOY(void)
{
WORD vtotaltemp;
CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
CAdjustSyncProcessorMeasureStart();
if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
if(CModeMeasureData())
{
vtotaltemp = stModeInfo.IVTotal;
}
else
{
return _NO_SYNC_STATE;
}
}
else
{
return _NO_SYNC_STATE;
}
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, 0x00);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), 0x00);
CAdjustSyncProcessorMeasureStart();
if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
if(CModeMeasureData())
{
if(abs(vtotaltemp - stModeInfo.IVTotal) <= 1)
{
return _SOY_STATE;
}
else
{
CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
return _CS_STATE;
}
}
else
{
return _NO_SYNC_STATE;
}
}
else
{
return _NO_SYNC_STATE;
}
}
//--------------------------------------------------
// Description : Modify VGA sync polarity
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CSyncModifyPolarityVGA(void)
{
BYTE polarity;
polarity = CScalerGetBit(_VGIP_SIGINV_06, 0xff);
polarity &= ~(_BIT3 | _BIT2);
if(!(bit)(stModeInfo.Polarity & _BIT0))
{
polarity |= _BIT2;
}
if(!(bit)(stModeInfo.Polarity & _BIT1))
{
polarity |= _BIT3;
}
CScalerSetByte(_VGIP_SIGINV_06, polarity);
}
#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description : Search DVI sync type
// Input Value : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncSearchSyncTypeDVI(void) //Updated by Realtek at 20050617
{
BYTE synctypetemp = _DSS_STATE;
CPowerADCAPLLOff();
if(!CSourceScanInputPortDVI((bit)CScalerGetBit(_POWER_ON_OFF_CTRL_C2, _BIT7)))
return _NO_SYNC_STATE;
if(CAdjustTMDSEqualizer() == _FALSE)
return _NO_SYNC_STATE;
CPowerTMDSOn();
return synctypetemp;
}
#endif // End of #if(_TMDS_SUPPORT == _ON)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -