📄 mode.c
字号:
/**
* CModeSearchModeVGA
* Search mode for VGA from preset mode to user mode
* called only by CModeSearchDisplayMode
* @param <none>
* @return {_TRUE if there is a stable mode;_FALSE if not}
*
*/
//--------------------------------------------------
// Description : Search mode for VGA
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
BYTE CModeSearchModeVGA(void)
{
BYTE modecnt;
SET_MODE_SEARCH_TYPE(_PRESET_MODE_TYPE); ///!set preset mode type
for (modecnt = 0; modecnt < _MAX_PRESET_MODE; modecnt++)
{
if (CModeComparePresetModeVGA(modecnt))
{
if(modecnt!=_MODE_640x400_85HZ && modecnt!=_MODE_720x400_85HZ
&& modecnt!=_MODE_640x400_70HZ && modecnt!=_MODE_720x400_70HZ)
{
return modecnt;
}
}
}
modecnt = CModeSearchAcceptiveModeVGA();
if(modecnt==_MODE_640x400_85HZ || modecnt==_MODE_720x400_85HZ)
{
if((BYTE)(GET_MODESELECT_TYPE())==0)
return _MODE_640x400_85HZ;
else
return _MODE_720x400_85HZ;
}
else if(modecnt==_MODE_640x400_70HZ || modecnt==_MODE_720x400_70HZ)
{
if((BYTE)(GET_MODESELECT_TYPE())==0)
return _MODE_640x400_70HZ;
else
return _MODE_720x400_70HZ;
}
if ((modecnt == _MODE_NOSIGNAL) || (modecnt == _MODE_NOSUPPORT))
return modecnt; ///!the returned number is the index in the preset mode
SET_MODE_SEARCH_TYPE(_USER_MODE_TYPE); ///!set user mode type
modecnt = CModeCheckFIFOModeVGA(modecnt); ///!the returned number is the index in the FIFO mode
return modecnt;
}
/**
* CModeComparePresetModeVGA
* Compare the identified mode with preset VGA mode in preset table
* called only by CModeSearchDisplayMode
* @param <BYTE ucModeCnt> {mode number of preset mode in table}
* @return {_TRUE if the input mode number is correspondence to the input mode,_FALSE if not}
*
*/
//--------------------------------------------------
// 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 & ~_BIT0) | ((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT6) ? 0x00 : _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(abs(stModeInfo.IVTotal - tINPUTMODE_PRESET_TABLE[ucModeCnt].IVTotal) > 4)//v003
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;
}
/**
* CModeSearchAcceptiveModeVGA
* decide an acceptive mode by comparing the identified mode with preset VGA mode in preset table
* do this when the input mode is not the very same preset mode in the table
* @param <none>
* @return {mode number of an acceptive mode in the table}
*
*/
//--------------------------------------------------
// Description : Search an acceptive mode
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
BYTE CModeSearchAcceptiveModeVGA(void)
{
BYTE acceptivemode = _MODE_NOSUPPORT;
//DebugPrintf("\n stModeInfo.IHFreq_H %x",(stModeInfo.IHFreq & 0xff00 )>>8);
//DebugPrintf("\n stModeInfo.IHFreq_L %x",stModeInfo.IHFreq);
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)
{
if((BYTE)(GET_MODESELECT_TYPE())==0)
acceptivemode = _MODE_640x400_70HZ;
else
acceptivemode = _MODE_720x400_70HZ;
}
else
{
if((BYTE)(GET_MODESELECT_TYPE())==0)
acceptivemode = _MODE_640x400_85HZ;
else
acceptivemode = _MODE_720x400_85HZ;
//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 < 660)
acceptivemode = _MODE_1440x900_60HZ;
else if(stModeInfo.IVFreq < 700)
acceptivemode = _MODE_1152x900_66HZ;
else if(stModeInfo.IVFreq < 760)
acceptivemode = _MODE_1440x900_75HZ;
else if(stModeInfo.IVFreq < 790)
acceptivemode = _MODE_1152x900_76HZ;
}
else if (stModeInfo.IVTotal < 1040)
{
if (stModeInfo.IVFreq < 650)
acceptivemode = _MODE_1280x960_60HZ;
else
acceptivemode = _MODE_1280x960_75HZ;
}
else if(stModeInfo.IVTotal < 1087) // 1280x1024 Mode : 1040 <= Vertical Line < 1087
{
if (stModeInfo.IVFreq < 680)
{
acceptivemode = _MODE_1280x1024_60HZ;//Confuse mode between 1280x1024_60HZ and 1680x1050_60HZ_BR
//eric 20070626 mark by constomer
//if((stModeInfo.IHFreq > 630) &&(stModeInfo.IHFreq < 638)) // chroma #3603 RB1280x1024
// acceptivemode =_MODE_NOSUPPORT;
//acceptivemode = _MODE_1680x1050_60HZ_BR;
}
else if (stModeInfo.IVFreq < 720)
acceptivemode = _MODE_1280x1024_70HZ;
else if (stModeInfo.IVFreq < 780)
acceptivemode = _MODE_1280x1024_75HZ;
else
acceptivemode = _MODE_1280x1024_85HZ;
}
else if(stModeInfo.IVTotal < 1110) // 1680x1050 Mode : 1087 <= Vertical Line < 1110
{
if(stModeInfo.IVFreq < 640)
acceptivemode = _MODE_1680x1050_60HZ;
else
acceptivemode = _MODE_1680x1050_75HZ;
//eric 20070626 mark by constomer
//if((stModeInfo.IHFreq > 940) &&(stModeInfo.IHFreq < 948)) // chroma #3584,3558
// acceptivemode = _MODE_NOSUPPORT;
}
else if(stModeInfo.IVTotal < 1200) // 1920x1080 Mode : 1110 <= Vertical Line < 1200
{
acceptivemode = _MODE_1920x1080_60HZ;
//eric 20070626 mark by constomer
//if((stModeInfo.IHFreq > 554) &&(stModeInfo.IHFreq < 562)) // chroma #3559,3585
// acceptivemode = _MODE_NOSUPPORT;
}
else if(stModeInfo.IVTotal < 1300) // 1600x1200 Mode : 1200 <= Vertical Line < 1300
{
if(stModeInfo.IVFreq < 630)
acceptivemode = _MODE_1600x1200_60HZ;//Confuse mode between 1600x1200 and 1920x1200
else if(stModeInfo.IVFreq < 680)
acceptivemode = _MODE_1600x1200_65HZ;
else if(stModeInfo.IVFreq < 720)
acceptivemode = _MODE_1600x1200_70HZ;
else if(stModeInfo.IVFreq < 780)
acceptivemode = _MODE_1600x1200_75HZ;
else
acceptivemode = _MODE_1600x1200_85HZ;
}
return acceptivemode;
}
/**
* CModeCheckFIFOModeVGA
* Check FIFO mode data if there is the same mode already in eeprom
* if not, then save the mode data to the eeprom and return the index of the FIFO data
* @param <BYTE ucModeCnt> {index returned from acceptive mode}
* @return {mode number of an acceptive mode in the table}
*
*/
//--------------------------------------------------
// 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;
}
/**
* CModeCompareFIFOModeVGA
* Compare mode in FIFO memory
* @param <BYTE ucNum> {mode index of the 16 mode}
* @param <BYTE ucModeCnt> {mode number of an acceptive mode in the table}
* @return {_TRUE if Vfreq and Hfreq are in range,_FALSE if not}
*
*/
//--------------------------------------------------
// 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;
}
/**
* CModeSearchModeDVI
* Search mode in the preset table for DVI
* @param <BYTE ucModeCnt> {mode number of the preset table}
* @return {mode number}
*
*/
//--------------------------------------------------
// Description : Search mode for DVI
// Input Value : None
// Output Value : Mode number
//--------------------------------------------------
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
BYTE CModeSearchModeDVI(void)
{
BYTE modecnt = 0;
CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, _BIT0);
CAdjustSyncProcessorMeasureStart();
if (CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
{
CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT6, _BIT6);
CScalerSetBit(_MEAS_HS_VS_HI_SEL_58, ~_BIT0, 0x00);
CScalerRead(_MEAS_HS_PERIOD_H_52, 6, &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] & 0xf0) << 4) | 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;
//DebugPrintf("\n stModeInfo.IHWidth=%x",(BYTE)(stModeInfo.IHWidth>>8));
//DebugPrintf(",%x",(BYTE)(stModeInfo.IHWidth));
//DebugPrintf("\n stModeInfo.IVHeight=%x",(BYTE)(stModeInfo.IVHeight>>8));
//DebugPrintf(",%x",(BYTE)(stModeInfo.IVHeight));
#if(_HDMI_SUPPORT == _ON)
// For width = 2880
if((stModeInfo.IHWidth > 2048))
{
stModeInfo.IHWidth = stModeInfo.IHWidth / 2;
stModeInfo.IHTotal = stModeInfo.IHTotal / 2;
CScalerPageSelect(_PAGE2);
CScalerSetDataPortBit(_P2_HDMI_ADDR_PORT_C9, 0x50, 0xf0, 0x09);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -