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

📄 mode.c

📁 RTD2662板卡源代码
💻 C
📖 第 1 页 / 共 5 页
字号:

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