📄 mode.c
字号:
case _SOURCE_VIDEO8: //Need add search Video mode funtion here. by zhang_dc
break;
}
return modetemp;
}
//--------------------------------------------------
// Description : Search mode for VGA
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
BYTE CModeSearchModeVGA(void)
{
BYTE modecnt;
SET_MODE_SEARCH_TYPE(_PRESET_MODE_TYPE); //first, search preset mode area. note by zhang_dc
for(modecnt=0;modecnt<_MAX_PRESET_MODE;modecnt++)
{
if(CModeComparePresetModeVGA(modecnt)) //if found. note by zhang_dc
{
return modecnt;
}
}
modecnt = CModeSearchAcceptiveModeVGA(); //if preset not found, search acceptive area. note by zhang_dc
if((modecnt == _MODE_NOSIGNAL) || (modecnt == _MODE_NOSUPPORT))
return modecnt;
SET_MODE_SEARCH_TYPE(_USER_MODE_TYPE);
modecnt = CModeCheckFIFOModeVGA(modecnt); //search user area.note by zhang_dc
return modecnt;
}
//--------------------------------------------------
// Description : Compare preset VGA mode
// Input Value : Mode number
// Output Value : Return _TRUE if the input mode number is correspondence
//--------------------------------------------------
bit CModeComparePresetModeVGA(BYTE ucModeCnt)
{
BYTE polarity, polaritytemp;
polarity = stModeInfo.Polarity; //get previous polarity information. note by zhang_dc
if((bit)CScalerGetBit(_SYNC_INVERT_48, _BIT3))
polarity = (polarity ^ _BIT0);
if(abs(stModeInfo.IVFreq - tINPUTMODE_PRESET_TABLE[ucModeCnt].IVFreq) > tINPUTMODE_PRESET_TABLE[ucModeCnt].IVFreqTolerance)
{
return _FALSE;
}
if(abs(stModeInfo.IHFreq - tINPUTMODE_PRESET_TABLE[ucModeCnt].IHFreq) > tINPUTMODE_PRESET_TABLE[ucModeCnt].IHFreqTolerance)
{
return _FALSE;
}
if((bit)(polarity & _BIT0))
{
if((bit)(polarity & _BIT1))
polaritytemp = _SYNC_HP_VP;
else
polaritytemp = _SYNC_HP_VN;
}
else
{
if((bit)(polarity & _BIT1))
polaritytemp = _SYNC_HN_VP;
else
polaritytemp = _SYNC_HN_VN;
}
if((polaritytemp & tINPUTMODE_PRESET_TABLE[ucModeCnt].PolarityFlag) == 0x00)
return _FALSE;
return _TRUE;
}
//--------------------------------------------------
// Description : Search an acceptive mode
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
BYTE CModeSearchAcceptiveModeVGA(void)
{
BYTE acceptivemode = _MODE_NOSUPPORT;
if(stModeInfo.IVTotal < 420)
{
}
else if(stModeInfo.IVTotal < 488) // 720x400 Mode : Vertical Line < 488
{
if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_720x400_70HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_720x400_70HZ;
else
acceptivemode = _MODE_720x400_85HZ;
}
else if(stModeInfo.IVTotal < 610) // 640x480 Mode : 488 <= Vertical Line < 610
{
if(stModeInfo.IVFreq < 640)
acceptivemode = _MODE_640x480_60HZ;
else if(stModeInfo.IVFreq < 690)
acceptivemode = _MODE_640x480_66HZ;
else if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_640x480_72HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_640x480_75HZ;
else
acceptivemode = _MODE_640x480_85HZ;
}
else if(stModeInfo.IVTotal < 660) // 800x600 Mode : 610 <= Vertical Line < 660
{
if(stModeInfo.IVFreq < 580)
acceptivemode = _MODE_800x600_56HZ;
else if(stModeInfo.IVFreq < 660)
acceptivemode = _MODE_800x600_60HZ;
else if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_800x600_72HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_800x600_75HZ;
else
acceptivemode = _MODE_800x600_85HZ;
}
else if(stModeInfo.IVTotal < 732) // 832x624 Mode : 660 <= Vertical Line < 732
{
if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_800x600_72HZ;
else
acceptivemode = _MODE_832x624_75HZ;
}
else if(stModeInfo.IVTotal < 780) // 1280x720 Mode : 732 <= Vertical Line < 780
{
if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_1280x720_60HZ;
else
acceptivemode = _MODE_1280x720_75HZ;
}
else if(stModeInfo.IVTotal < 881) // 1024x768 Mode : 780 <= Vertical Line < 881
{
if(stModeInfo.IVFreq < 650)
//acceptivemode = _MODE_1024x768_60HZ;
acceptivemode = _MODE_1280x768_60HZ;
else if(stModeInfo.IVFreq < 730)
acceptivemode = _MODE_1024x768_70HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_1024x768_75HZ;
else
acceptivemode = _MODE_1024x768_85HZ;
}
else if(stModeInfo.IVTotal < 932) // 1152x864/870 Mode : 881 <= Vertical Line < 932
{
if((stModeInfo.IHFreq > 679) && (stModeInfo.IHFreq < 697))
{
acceptivemode = _MODE_1152x870_75HZ;
}
else
{
if(stModeInfo.IVFreq < 650)
acceptivemode = _MODE_1152x864_60HZ;
else if(stModeInfo.IVFreq < 740)
acceptivemode = _MODE_1152x864_70HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_1152x864_75HZ;
else
acceptivemode = _MODE_1152x864_85HZ;
}
}
else if(stModeInfo.IVTotal < 975)
{
if(stModeInfo.IVFreq < 680)
acceptivemode = _MODE_1152x900_66HZ;
}
else if(stModeInfo.IVTotal < 1040)
{
if(stModeInfo.IVFreq < 650)
acceptivemode = _MODE_1280x960_60HZ;
else
acceptivemode = _MODE_1280x960_75HZ;
}
else if(stModeInfo.IVTotal < 1100) // 1280x1024 Mode :
{
if(stModeInfo.IVFreq < 680)
acceptivemode = _MODE_1280x1024_60HZ;
else if(stModeInfo.IVFreq < 720)
acceptivemode = _MODE_1280x1024_70HZ;
else if(stModeInfo.IVFreq < 780)
acceptivemode = _MODE_1280x1024_75HZ;
else
acceptivemode = _MODE_1280x1024_85HZ;
}
return acceptivemode;
}
//--------------------------------------------------
// Description : Check FIFO mode for VGA
// Input Value : Mode number
// Output Value : FIFO mode number
//--------------------------------------------------
BYTE CModeCheckFIFOModeVGA(BYTE ucModeCnt)
{
BYTE cnt0, cnt1;
StructModeUserFIFODataType stFIFOModeTemp;
for(cnt0=0;cnt0<4;cnt0++)
{
CEepromLoadUserFIFOModeData(cnt0, pData);
for(cnt1=0;cnt1<4;cnt1++)
{
if(CModeCompareFIFOModeVGA(cnt1, ucModeCnt) == _TRUE)
{
return (cnt0 * 4 + cnt1);
}
}
}
if(stSystemData.UserFIFOMode >= 15)
stSystemData.UserFIFOMode = 0;
else
stSystemData.UserFIFOMode++;
stFIFOModeTemp.ModeNum = ucModeCnt;
stFIFOModeTemp.IHFreq = stModeInfo.IHFreq;
stFIFOModeTemp.IVFreq = stModeInfo.IVFreq;
CEepromSaveUserFIFOModeData(stFIFOModeTemp);
stModeUserData.FirstAuto = 0;
stModeUserData.HPosition = tINPUTMODE_PRESET_TABLE[ucModeCnt].IHStartPos;
stModeUserData.VPosition = tINPUTMODE_PRESET_TABLE[ucModeCnt].IVStartPos;
stModeUserData.Clock = tINPUTMODE_PRESET_TABLE[ucModeCnt].IHTotal;
stModeUserData.Phase = 0;
CEepromSaveModeData(stSystemData.UserFIFOMode);
CEepromSaveSystemData();
return stSystemData.UserFIFOMode;
}
//--------------------------------------------------
// Description : Compare mode in FIFO memory
// Input Value : Mode number and FIFO mode number
// Output Value : _TRUE if both are correspondence
//--------------------------------------------------
bit CModeCompareFIFOModeVGA(BYTE ucNum, BYTE ucModeCnt)
{
StructModeUserFIFODataType stFIFOModeTemp;
stFIFOModeTemp.ModeNum = (pData[ucNum * 4]);
stFIFOModeTemp.IHFreq = ((WORD)(pData[ucNum * 4 + 1] & 0x0f) << 8) | pData[ucNum * 4 + 2];
stFIFOModeTemp.IVFreq = ((WORD)(pData[ucNum * 4 + 1] & 0xf0) << 4) | pData[ucNum * 4 + 3];
if(stFIFOModeTemp.ModeNum != ucModeCnt)
return _FALSE;
if(abs(stModeInfo.IVFreq - stFIFOModeTemp.IVFreq) > tINPUTMODE_PRESET_TABLE[ucModeCnt].IVFreqTolerance)
return _FALSE;
if(abs(stModeInfo.IHFreq - stFIFOModeTemp.IHFreq) > tINPUTMODE_PRESET_TABLE[ucModeCnt].IHFreqTolerance)
return _FALSE;
return _TRUE;
}
#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description : Search mode for DVI
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
BYTE CModeSearchModeDVI(void)
{
BYTE modecnt = 0;
CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, _BIT0); //Set HSYNC/VSYNC measurement mode to digital. note by zhang_dc
CAdjustSyncProcessorMeasureStart();
if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT6, _BIT6); //pop up result. note by zhang_dc
CScalerRead(_MEAS_HS_PERIOD_H_52, 7, &pData[8], _AUTOINC);
((WORD *)pData)[0] = ((WORD)(pData[8] & 0x1f) << 8) | pData[9];
((WORD *)pData)[1] = ((WORD)(pData[10] & 0x1f) << 8) | pData[11];
((WORD *)pData)[2] = ((WORD)(pData[12] & 0x0f) << 8) | pData[13];
if((((WORD *)pData)[0] >= 0x0fff) || (((WORD *)pData)[1] >= 0x0fff) || (((WORD *)pData)[0] == 0) || (((WORD *)pData)[1] == 0) || (bit)(pData[10] & _BIT5))
{
modecnt = _MODE_NOSUPPORT;
}
else
{
// Save IH_TOTAL
stModeInfo.IHTotal = ((WORD *)pData)[0] + 1;
// Save input data enable width and height
stModeInfo.IVHeight = ((WORD *)pData)[1] + 1;
stModeInfo.IHWidth = ((WORD *)pData)[2] + 1;
for(modecnt=0;modecnt<_MAX_PRESET_MODE;modecnt++)
{
if(CModeCompareModeDVI(modecnt))
{
break;
}
}
}
}
else
{
CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT5, 0x00); //disable measurement. note by zhang_dc
modecnt = _MODE_NOSUPPORT;
}
CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, 0x00);
// We don't support input image less than 350 active lines
if(stModeInfo.IVHeight < 350)
modecnt = _MODE_NOSUPPORT;
// If no mode found, set to mode 0
if(modecnt >= _MAX_PRESET_MODE)
modecnt = 0;
return modecnt;
}
//--------------------------------------------------
// Description : Compare mode for DVI
// Input Value : Mode number
// Output Value : Retrun _TRUE if it's correspondence
//--------------------------------------------------
bit CModeCompareModeDVI(BYTE ucModeCnt)
{
if(stModeInfo.IHWidth != tINPUTMODE_PRESET_TABLE[ucModeCnt].IHWidth)
return _FALSE;
if(stModeInfo.IVHeight != tINPUTMODE_PRESET_TABLE[ucModeCnt].IVHeight)
return _FALSE;
if(abs(stModeInfo.IVFreq - tINPUTMODE_PRESET_TABLE[ucModeCnt].IVFreq) > tINPUTMODE_PRESET_TABLE[ucModeCnt].IVFreqTolerance)
return _FALSE;
return _TRUE;
}
#endif // End of #if(_TMDS_SUPPORT == _ON)
//----------------------------------------------------------------------------------------------------
// Mode Display Functions
//----------------------------------------------------------------------------------------------------
//--------------------------------------------------
// Description : Display active mode process
// Input Value : None
// Output Value : None
//--------------------------------------------------
void CModeDisplayActiveMode(void)
{
switch(GET_INPUTSOURCE_TYPE())
{
case _SOURCE_VGA:
CModeSetupModeVGA();
break;
#if(_YPBPR_SUPPORT == _ON)
case _SOURCE_YPBPR:
CYPbPrSetupMode();
break;
#endif
#if(_TMDS_SUPPORT == _ON)
case _SOURCE_DVI:
CModeSetupModeDVI();
break;
#endif
#if(_VIDEO_SUPPORT == _ON)
case _SOURCE_VIDEO8:
CVideoDisplaySet();
break;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -