⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mode.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 5 页
字号:

        	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 + -