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

📄 mode.c

📁 RTD2662板卡源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	
	CMiscEnableDoubleBuffer();
	                 /*
	if((_GET_INPUT_SOURCE() != _SOURCE_DVI && _GET_INPUT_SOURCE() != _SOURCE_HDMI)
   || ((_GET_INPUT_SOURCE() == _SOURCE_DVI || _GET_INPUT_SOURCE() == _SOURCE_HDMI) && !CHdmiFormatDetect()))
	{	
		if ((bit) CScalerGetBit(_VDISP_CTRL_28, _BIT3))
			CScalerSetBit(_VDISP_CTRL_28, ~_BIT5, 0x00);		
	}                      */
	CAdjustDigitalFilter(_PHASE_ACCESS_PORT, _PHASE_THD_0, _DIV_VALUE_2, ucPar);
   	CAdjustDigitalFilter(_YPBPR_ACCESS_PORT, _YPBPR_ENABLE, _DIV_VALUE_0, ucPar);
	CAdjustDigitalFilter(_NEG_SMEAR_ACCESS_PORT, _SMEAR_RING_THD_4, _DIV_VALUE_1, ucPar); //KEN 2005/09/23
	CAdjustDigitalFilter(_MISMATCH_ACCESS_PORT, _MISMATCH_THD_0, _DIV_VALUE_0, ucPar);
	CMiscClearStatusRegister();
}

/**
* CModeGetModeTableInfo
* Get mode information from mode table
* Display active mode process
* @param <none>
* @return {none}
*
*/
//--------------------------------------------------
// Description  : Get mode information from mode table
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeGetModeTableInfo(void)
{
	BYTE modetemp;
	
#if 0//eric 0706
    if(GET_MODE_SEARCH_TYPE() == _PRESET_MODE_TYPE)
    {
        modetemp = stModeInfo.ModeCurr;
    }
    else if(GET_MODE_SEARCH_TYPE() == _USER_MODE_TYPE)
    {
        CEepromLoadUserFIFOModeData((stModeInfo.ModeCurr / 4), pData);
		
        modetemp = pData[(stModeInfo.ModeCurr % 4) * 4];
    }
#else
	if(stModeInfo.ModeCurr==_MODE_640x400_85HZ || stModeInfo.ModeCurr==_MODE_720x400_85HZ)
		modetemp = stModeInfo.ModeCurr;
	else
	{
		if (GET_MODE_SEARCH_TYPE() == _PRESET_MODE_TYPE) 
		{
			modetemp = stModeInfo.ModeCurr;
		}
		else if (GET_MODE_SEARCH_TYPE() == _USER_MODE_TYPE) 
		{
			CEepromLoadUserFIFOModeData((stModeInfo.ModeCurr / 4), pData);	///!decide current mode in which block of FIFO mode
			modetemp = pData[(stModeInfo.ModeCurr % 4) * 4];					///!decide the mode number of the mode we want
		}
	}
#endif
	stModeInfo.IHTotal = tINPUTMODE_PRESET_TABLE[modetemp].IHTotal;
	stModeInfo.IHStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IHStartPos;
	stModeInfo.IHWidth = tINPUTMODE_PRESET_TABLE[modetemp].IHWidth;
	stModeInfo.IVStartPos = tINPUTMODE_PRESET_TABLE[modetemp].IVStartPos;
	stModeInfo.IVHeight = tINPUTMODE_PRESET_TABLE[modetemp].IVHeight;
	CEepromLoadCenterModeData(stModeInfo.ModeCurr);
	// Test
	//stModeUserCenterData.CenterClock = stModeInfo.IHTotal;
	//stModeUserCenterData.CenterHPos = stModeInfo.IHStartPos;
	//stModeUserCenterData.CenterVPos = stModeInfo.IVStartPos;
}

/**
* CModeStartUpVGA
* Startup settings for VGA
* calculate pixelclock and set the ADC port
* called by CModeSetupModeVGA and CYPbPrSetupMode
* @param <none>
* @return {none}
*
*/
//--------------------------------------------------
// Description  : Startup settings for VGA
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeStartUpVGA(void)
{
	WORD pixelclock;
	
    CScalerPageSelect(_PAGE2);
    CScalerSetBit(_P2_POWER_ON_OFF_CTRL_A7, ~(_BIT4 | _BIT3 | _BIT2 | _BIT1 | _BIT0), 0x00);
    CScalerSetBit(_P2_TMDS_OUTPUT_CTRL_A6, ~(_BIT7 | _BIT6 | _BIT5 | _BIT4 | _BIT3), 0x00);
    CScalerSetBit(_P2_Z0_CALIBRATION_CTRL_AC, ~_BIT6, 0x00);
	
	// To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
	CScalerSetBit(_VGIP_CTRL_10, ~(_BIT3 | _BIT2 | _BIT1 | _BIT0), _BIT0);
	
	// Calculate pixel clock rate (round to MHz)
	pixelclock  = (((DWORD)stModeInfo.IHFreq * (DWORD)stModeInfo.IHTotal) * 2 / (1000 * 10));
	pixelclock  = (pixelclock >> 1) + (pixelclock & 0x01);
	
	//cyc_delete    // To imporve the FIFO efficiency only when input data rate is slow, and display data rate is high.
	//cyc_delete    CScalerSetBit(_VGIP_CTRL_10, ~(_BIT3 | _BIT2 | _BIT1), 0x00);
	
    // ADC differential mode and Set ADC bandwidth to reduce high frequency noise
    CScalerPageSelect(_PAGE0);
    if(pixelclock < 38)
        CScalerSetBit(_P0_ADC_RBG_CTRL_CE, ~(_BIT2 | _BIT1 | _BIT0), _BIT2);                    //75MHz
    else if(pixelclock < 68)
        CScalerSetBit(_P0_ADC_RBG_CTRL_CE, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT0));          //150MHz
    else if(pixelclock < 160)
        CScalerSetBit(_P0_ADC_RBG_CTRL_CE, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1));          //300MHz
    else
        CScalerSetBit(_P0_ADC_RBG_CTRL_CE, ~(_BIT2 | _BIT1 | _BIT0), (_BIT2 | _BIT1 | _BIT0));  //500MHz
	
    CScalerPageSelect(_PAGE1);
    // Phase interpolation control load modified.   Marvin 0812
    if(pixelclock < 50)
        CScalerSetBit(_P1_PLL_PHASE_INTERPOLATION_B5, ~(_BIT7 | _BIT6), 0x00);
    else
        CScalerSetBit(_P1_PLL_PHASE_INTERPOLATION_B5, ~(_BIT7 | _BIT6), _BIT6);
	
    // Fine-tune R/G/B delay and enable the ADC frame-modulation
    CScalerPageSelect(_PAGE0);
	CScalerSetBit(_P0_ADC_RED_CTL_CF, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_RED & 0x07));
	CScalerSetBit(_P0_ADC_GREEN_CTL_D0, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_GREEN & 0x07));
	CScalerSetBit(_P0_ADC_BLUE_CTL_D1, ~(_BIT2 | _BIT1 | _BIT0), (_ADC_FINE_TUNE_DELAY_BLUE & 0x07));
	
	if(_GET_INPUT_SOURCE() == _SOURCE_YPBPR)
		CScalerSetBit(_P0_ADC_CLAMP_CTRL1_D5,~(_BIT0 | _BIT1 | _BIT2 |_BIT3 | _BIT4 |_BIT5 ),
		((_ADC1_INPUT_SWAP_RG << 2) | _ADC1_INPUT_SWAP_RG |(_ADC1_INPUT_SWAP_GB <<4)| (_ADC1_INPUT_SWAP_GB<<2)));	
	else //VGA	
		CScalerSetByte(_P0_ADC_CLAMP_CTRL1_D5, 0x00);
	//CScalerSetByte(_P0_ADC_CLAMP_CTRL1_D5, 0x00);
    CScalerSetByte(_YUV2RGB_CTRL_9C, 0x00);
	
    // HSYNC positive/negtive tracking
    CScalerPageSelect(_PAGE1);
    CScalerSetBit(_P1_PLL_DIV_CTRL_A0, ~_BIT7, 0x00);

}

/**
* CModeStartUpDVI
* Startup settings for DVI
* @param <none>
* @return {none}
*
*/
//--------------------------------------------------
// Description  : Startup settings for DVI
// Input Value  : None
// Output Value : None
//--------------------------------------------------
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
void CModeStartUpDVI(void)
{
	CScalerSetBit(_VGIP_HV_DELAY_1E, 0x0f, 0x00);
	
	CScalerSetBit(_VGIP_CTRL_10, ~(_BIT3 | _BIT2 | _BIT0), (_BIT2 | _BIT0));
	
	CTimerWaitForEvent(_EVENT_IVS);
	
	pData[0] = HIBYTE(stModeInfo.IHTotal - 2);
	pData[1] = 0x02;
	pData[2] = LOBYTE(stModeInfo.IHTotal - 2);
	pData[3] = HIBYTE(stModeInfo.IVTotal - 2);
	pData[4] = 0x02;
	pData[5] = LOBYTE(stModeInfo.IVTotal - 2);
	pData[6] = 0x00;
	pData[7] = 0x00;
	pData[8] = 0x00;
	pData[9] = 0x00;
	pData[10] = 0x03;
	pData[11] = 0x00;
	pData[12] = 0x00;
	pData[13] = 0x81;
	CScalerWrite(_H_BOUNDARY_H_70, 14, pData, _AUTOINC);
	
	if (CTimerPollingEventProc(255, CMiscAutoMeasurePollingEvent)) 
	{
		CScalerRead(_V_START_END_H_7E, 6, pData, _AUTOINC);
		
		// IDEN horizontal Start
		CScalerPageSelect(_PAGE2);
		stModeInfo.IHStartPos = ((((WORD) pData[3] & 0xf0) << 4) | (WORD) pData[4]) - ((CScalerGetBit(_P2_POWER_ON_OFF_CTRL_A7, _BIT7) == _BIT7) ? 16 - 14 : 18 - 14);
		
		// IDEN vertical Start
		stModeInfo.IVStartPos = (((WORD) pData[0] & 0xf0) << 4) | (WORD) pData[1];
	}
	else 
	{
		CScalerSetByte(_AUTO_ADJ_CTRL1_7D, 0x00);
		CModeResetMode();
	}
}
#endif  // End of #if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))



//--------------------------------------------------

void CCheckHDMIMode(void)
{
    ucHDMIMode = _HM_OTHER;


	// Decide V overscan
	if (stModeInfo.IVHeight == (480/2))
	{            
		ucHDMIMode = _HM_480I;
	}
	else if (stModeInfo.IVHeight == (576/2))
	{            
		ucHDMIMode = _HM_576I;
	}
	else if (stModeInfo.IVHeight == (480))
	{
		if(stModeInfo.IHWidth == 640)
		{
	    	ucHDMIMode = _HM_OTHER;
		}
		else
		{            	
			ucHDMIMode = _HM_480P;
		}
	}
	else if (stModeInfo.IVHeight == (576))
	{            
	    ucHDMIMode = _HM_576P;
	}
	else if (stModeInfo.IVHeight == (720))
	{            
		ucHDMIMode = _HM_720P;
	}
	else if (stModeInfo.IVHeight == (1080/2))
	{
		ucHDMIMode = _HM_1080I;
	}
	else if (stModeInfo.IVHeight == (1080))
	{            
		ucHDMIMode = _HM_1080P;
	}
	else
	{
		ucHDMIMode = _HM_OTHER;
	}

	// Decide H overscan
	if (stModeInfo.IHWidth == (960))
	{
		ucHDMIMode = _HM_1080P;
	}
	else if (stModeInfo.IHWidth == (1280))
	{
		if(stModeInfo.IVHeight == 1024 || stModeInfo.IVHeight == 768)
		{
	    	ucHDMIMode = _HM_OTHER;
		}

	}
	else if (stModeInfo.IHWidth == (1440))
	{

		if(stModeInfo.IVHeight == 900 || stModeInfo.IVHeight == 1050)
		{
	    	ucHDMIMode = _HM_OTHER;
		}
	}
	else if (stModeInfo.IHWidth == (1920))
	{
		if(stModeInfo.IVHeight == 1200)
		{
	    	ucHDMIMode = _HM_OTHER;
		}
	}
}
   

//--------------------------------------------------
// Description  : Get scaling information
// Input Value  : None
// Output Value : Scaling information
//--------------------------------------------------
BYTE CModeGetScaleSetting(void)
{
	BYTE 	option = 0;
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
	BYTE	OverScan_HWidth,OverScan_VHeight;
#endif
	
#if(_DISP_INFO_BY_MODE == _ON)
	
	BYTE modetemp;
	
	if(GET_MODE_SEARCH_TYPE() == _PRESET_MODE_TYPE)
	{
		modetemp = stModeInfo.ModeCurr;
	}
	else if(GET_MODE_SEARCH_TYPE() == _USER_MODE_TYPE)
	{
		CEepromLoadUserFIFOModeData((stModeInfo.ModeCurr / 4), pData);
		
		modetemp = pData[(stModeInfo.ModeCurr % 4) * 4];
	}
	
	stDisplayInfo = tDISPLAY_PRESET_TABLE[modetemp];
	//stDisplayInfo.DVStartPos = (DWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
	//stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
	
	// Modify Display Vertical Start Position
	//stDisplayInfo.DVStartPos = (DWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
	//stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
	
	stDisplayInfo.DVStartPos = Panel[ucPanelSelect]->DVStartPos; 
	if (stDisplayInfo.DVStartPos < 6)
		stDisplayInfo.DVStartPos = 6;
	
#else//(_DISP_INFO_BY_MODE == _ON)
	stDisplayInfo.DHWidth 	= CCalcPanelWdith();//Panel[ucPanelSelect]->DHWidth;
	//stDisplayInfo.DHWidth = Panel[ucPanelSelect]->DHWidth;
	stDisplayInfo.DVHeight = Panel[ucPanelSelect]->DVHeight;
	stDisplayInfo.DHTotal = Panel[ucPanelSelect]->DHTotal;
	
	// Modify Display Vertical Start Position	//CFrameSyncModifyDVStartPos
	
	//stDisplayInfo.DVStartPos = (DWORD)35 * 2 * stDisplayInfo.DVHeight / stModeInfo.IVHeight / 10;
	//stDisplayInfo.DVStartPos = ((stDisplayInfo.DVStartPos >> 1) + (stDisplayInfo.DVStartPos & 0x01));
	stDisplayInfo.DVStartPos = Panel[ucPanelSelect]->DVStartPos;   //Ming-Yen
	
	if (stDisplayInfo.DVStartPos < 6)
		stDisplayInfo.DVStartPos = 6;
	
	
#endif
	
	
	
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON))
	if((_GET_INPUT_SOURCE() ==_SOURCE_DVI || _GET_INPUT_SOURCE() ==_SOURCE_HDMI) && CHdmiFormatDetect())//HDMI only	
	{
		//Overscan Area refer by Polaroid.
		HDMI_H_Width = stModeInfo.IHWidth;
		HDMI_V_Height = stModeInfo.IVHeight;

		CCheckHDMIMode();
		
#if(_HDMI_OVERSCAN_PERCENT==_OVERSCAN_PERCENT_93_75)
		
		CScalerPageSelect(_PAGE2);
		CScalerGetDataPortByte(_P2_HDMI_PSAP_CD, 0x07, 1, pData, _NON_AUTOINC);
		if(pData[0] == 20)
        {//1920x1080ix50Hz
			OverScan_HWidth = (BYTE)(stModeInfo.IHWidth/32);	//Horizontal: 96.87%
			OverScan_VHeight= (BYTE)(stModeInfo.IVHeight/32);	//Vertical: 96.87%   
		}	
		else
        {
			OverScan_HWidth = (BYTE)(stModeInfo.IHWidth/16);	//Horizontal: 93.75%
			OverScan_VHeight= (BYTE)(stModeInfo.IVHeight/16);	//Vertical: 93.75%   //forster modified 061102 for HDMI 576P @ 1280x1024 panel frame sync problem
		}			
#elif(_HDMI_OVERSCAN_PERCENT==_OVERSCAN_PERCENT_95_00)
		OverScan_HWidth = (BYTE)(stModeInfo.IHWidth/20);		//Horizontal: 95.00%
		OverScan_VHeight= (BYTE)(stModeInfo.IVHeight/20);		//Vertical: 95.00%
#else
		OverScan_HWidth = 0;															//Horizontal: 100.00%
		OverScan_VHeight= 0;															//Vertical: 100.00%
#endif
		stModeInfo.IHWidth = stModeInfo.IHWidth - OverScan_HWidth; 
		if(stModeInfo.IHWidth % 8)
			stModeInfo.IHWidth = ((stModeInfo.IHWidth + 4) >> 3) << 3;
		stModeInfo.IHStartPos = stModeInfo.IHStartPos + OverScan_HWidth/2;
		stModeInfo.IVHeight = stModeInfo.IVHeight - OverScan_VHeight;
		stModeInfo.IVStartPos = stModeInfo.IVStartPos + OverScan_VHeight/2;
	}
#endif
	
	if (stModeInfo.IVHeight < stDisplayInfo.DVHeight)
		option |= _BIT0;	// bit 0 : V scale-up
	if (stModeInfo.IVHeight > stDisplayInfo.DVHeight)
		option |= _BIT1;	// bit 1 : V scale-down
	if (stModeInfo.IHWidth < stDisplayInfo.DHWidth)
		option |= _BIT2;	// bit 2 : H scale-up
	if (stModeInfo.IHWidth > stDisplayInfo.DHWidth)
		option |= _BIT3;	// bit 3 : H scale-down
	
	return option;
}

//--------------------------------------------------
// Description  : Set capture window
// Input Value  : Scaling information
// Output Value : None
//--------------------------------------------------
void CModeSetCaptureWindow(BYTE ucOption)
{
	WORD ustemp;
    if(_GET_INPUT_SOURCE() == _SOURCE_VGA)
        ucHStartBias = 100;
    else if((_GET_INPUT_SOURCE() == _SOURCE_DVI) || (_GET_INPUT_SOURCE() == _SOURCE_HDMI))
        ucHStartBias = 50;
    else
        ucHStartBias = 100;
	
	ucVStartBias = 0;
	ucVStartBias = CAdjustIVS2DVSDelay(ucOption);
	
	if (ucVStartBias > stModeInfo.IVStartPos)
		ucVStartBias = stModeInfo.IVStartPos;
	
	// Set capture window
    ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);
	
    CScalerSetBit(_IPH_ACT_STA_H_14, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
	CScalerSetByte(_IPH_ACT_STA_L_15, LOBYTE(ustemp));
    CScalerSetBit(_IPH_ACT_WID_H_16, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
	CScalerSetByte(_IPH_ACT_WID_L_17, LOBYTE(stModeInfo.IHWidth));
	
	ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -