source.c

来自「很难得的最好的rtd3523系列原厂源码LCD驱动开发」· C语言 代码 · 共 656 行 · 第 1/2 页

C
656
字号
			else if(CSourceScanInputPortDVI(_DE_ONLY_ON))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			#endif
			else
				CLR_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			break;

		case _DVI_I_A0_PORT:
			if(CSourceScanInputPortDVI(_DE_ONLY_OFF))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			#if(_DVI_DE_ONLY_SUPPORT == _ON)
			else if(CSourceScanInputPortDVI(_DE_ONLY_ON))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			#endif
			else if(CSourceScanInputPortVGA(_ANALOG_SOURCE_0))
			{
				if((bit)CScalerGetBit(_SYNC_SELECT_47, _BIT4))
					SET_INPUT_HS_SELECTION(stSystemData.InputSource);
				else
					CLR_INPUT_HS_SELECTION(stSystemData.InputSource);
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			}
			else
				CLR_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			break;

		case _DVI_I_A1_PORT:
			if(CSourceScanInputPortDVI(_DE_ONLY_OFF))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			#if(_DVI_DE_ONLY_SUPPORT == _ON)
			else if(CSourceScanInputPortDVI(_DE_ONLY_ON))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			#endif
			else if(CSourceScanInputPortVGA(_ANALOG_SOURCE_1))
			{
				if((bit)CScalerGetBit(_SYNC_SELECT_47, _BIT4))
					SET_INPUT_HS_SELECTION(stSystemData.InputSource);
				else
					CLR_INPUT_HS_SELECTION(stSystemData.InputSource);
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			}
			else
				CLR_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			break;
			#endif

		#if (_VIDEO_SUPPORT == _ON)
		
		case _VIDEO_AV_PORT:
		case _VIDEO_AV2_PORT:
		case _VIDEO_SV_PORT:
			if (GET_INPUTPORT_TYPE(stSystemData.InputSource) == _VIDEO_AV_PORT)
				channel = _AV_CHANNEL;
			else if (GET_INPUTPORT_TYPE(stSystemData.InputSource) == _VIDEO_AV2_PORT)
				channel = _AV2_CHANNEL;
			else if (GET_INPUTPORT_TYPE(stSystemData.InputSource) == _VIDEO_SV_PORT)
				channel = _SV_CHANNEL;
			
			CVideoPowerState(_VIDEO_NORMAL);
			CVideoDataEnable(_ENABLE);
			if(CVideoIsExist(channel))
				SET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			else
				CLR_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource);
			break;
		#endif	// end of #if (_VIDEO_SUPPORT == _ON)
		}
	#endif	//end of #if (_SOURCE_AUTOCHANGE_ENABLE == _TRUE)
}

/*
//--------------------------------------------------
// Description  : Scan VGA input port to obtain if the signal is available
// Input Value  : Select analog source 0 or 1
// Output Value : Return _TRUE if the signal is available
//--------------------------------------------------
bit CSourceScanInputPortVGA(BYTE ucAnalogSource)
{
    BYTE cnt, synctypetemp = _NO_SYNC_STATE;

    CScalerSetBit(_SYNC_SELECT_47, ~_BIT4, 0x00);

    if(ucAnalogSource == _ANALOG_SOURCE_0)
    {
        CScalerSetBit(_SYNC_SELECT_47, ~(_BIT3 | _BIT2), 0x00);
        CScalerSetBit(_ADC_RGB_CTRL_DC, ~_BIT3, 0x00);
    }
    else if(ucAnalogSource == _ANALOG_SOURCE_1)
    {
        CScalerSetBit(_SYNC_SELECT_47, ~(_BIT3 | _BIT2), (_BIT3 | _BIT2));
        CScalerSetBit(_ADC_RGB_CTRL_DC, ~_BIT3, _BIT3);
    }

    for(cnt=0;cnt<2;cnt++)
    {
        synctypetemp    = CSyncGetSyncTypeStep1VGA();

        if(synctypetemp == _CS_STATE && ((bit)CScalerGetBit(_SYNC_SELECT_47, _BIT4)))
        {
            if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
                CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);

            CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, 0x00);
            CAdjustSyncProcessorMeasureStart();

            if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
            {
                if(CModeMeasureData())
                {
                    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
                    CScalerRead(_STABLE_PERIOD_H_50, 2, pData, _AUTOINC);
                    ((WORD *)pData)[1] = ((pData[0] & 0x07) << 8) | pData[1];

                    if(((stModeInfo.IHSyncPulseCount * 7 / stModeInfo.IHCount) != 0) 
                        || (stModeInfo.IHSyncPulseCount < 4)
                        || (abs(stModeInfo.IHCount - ((WORD *)pData)[1]) > 4))
                    {
                        return _FALSE;
                    }
                }
                else
                {
                    return _FALSE;
                }
            }
            else
            {
                return _FALSE;
            }
        }

        if(synctypetemp != _NO_SYNC_STATE)
        {
            return _TRUE;
        }

        CScalerSetBit(_SYNC_SELECT_47, ~_BIT4, CScalerGetBit(_SYNC_SELECT_47, _BIT4) ^ _BIT4);
    }

    return _FALSE;
}
*/

//version 200D
//--------------------------------------------------
// Description  : Scan VGA input port to obtain if the signal is available
// Input Value  : Select analog source 0 or 1
// Output Value : Return _TRUE if the signal is available
//--------------------------------------------------
bit CSourceScanInputPortVGA(BYTE ucAnalogSource)
{
    BYTE cnt, synctypetemp = _NO_SYNC_STATE;

    CScalerSetBit(_SYNC_SELECT_47, ~_BIT4, 0x00);

    if(ucAnalogSource == _ANALOG_SOURCE_0)
    {
        CScalerSetBit(_SYNC_SELECT_47, ~(_BIT3 | _BIT2), 0x00);
        CScalerSetBit(_ADC_RGB_CTRL_DC, ~_BIT3, 0x00);
    }
    else if(ucAnalogSource == _ANALOG_SOURCE_1)
    {
        CScalerSetBit(_SYNC_SELECT_47, ~(_BIT3 | _BIT2), (_BIT3 | _BIT2));
        CScalerSetBit(_ADC_RGB_CTRL_DC, ~_BIT3, _BIT3);
    }

    for(cnt=0;cnt<2;cnt++)
    {
        synctypetemp    = CSyncGetSyncTypeStep1VGA();

        if(((synctypetemp == _CS_STATE) || (synctypetemp == _SOY_STATE)) && ((bit)CScalerGetBit(_SYNC_SELECT_47, _BIT4)))
        {
            if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
                CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);

            CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, 0x00);
            CAdjustSyncProcessorMeasureStart();

            if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
            {
                if(CModeMeasureData())
                {
                    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);
                    CScalerRead(_STABLE_PERIOD_H_50, 2, pData, _AUTOINC);
                    ((WORD *)pData)[1] = ((pData[0] & 0x07) << 8) | pData[1];

                    if(((stModeInfo.IHSyncPulseCount * 7 / stModeInfo.IHCount) != 0) 
                        || (stModeInfo.IHSyncPulseCount < 4)
                        || (abs(stModeInfo.IHCount - ((WORD *)pData)[1]) > 4))
                    {
                        return _FALSE;
                    }
                }
                else
                {
                    return _FALSE;
                }
            }
            else
            {
                return _FALSE;
            }
        }

        if(synctypetemp != _NO_SYNC_STATE)
        {
            return _TRUE;
        }

        CScalerSetBit(_SYNC_SELECT_47, ~_BIT4, CScalerGetBit(_SYNC_SELECT_47, _BIT4) ^ _BIT4);
    }

    return _FALSE;
}


#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description  : Scan DVI input port to obtain if the signal is available
// Input Value  : _DE_ONLY_OFF or _DE_ONLY_ON
// Output Value : Return _TRUE if the signal is available
//--------------------------------------------------
bit CSourceScanInputPortDVI(BYTE ucPar)	//Update by Realtek at 20050617
{
    BYTE cnt0, cnt1;

    if(ucPar == _DE_ONLY_ON)
        CScalerSetBit(_POWER_ON_OFF_CTRL_C2, ~_BIT7, _BIT7);
    else
        CScalerSetBit(_POWER_ON_OFF_CTRL_C2, ~_BIT7, 0x00);

    CScalerRead(_UP_DOWN_CTRL1_D2, 1, pData, _NON_AUTOINC);
    pData[0] &= 0x0f;

    if((pData[0] == 0x0e) | (pData[0] == 0x08) | (pData[0] == 0x06) | (pData[0] == 0x01))
        CScalerSetByte(_RGB_PLL_SETTING_C9, 0x24);
    else if((pData[0] == 0x04) | (pData[0] == 0x03))
        CScalerSetByte(_RGB_PLL_SETTING_C9, 0x2b);
    else
        CScalerSetByte(_RGB_PLL_SETTING_C9, 0x24);

    CScalerSetBit(_TMDS_MEAS_RESULT0_BD, ~(_BIT2 | _BIT1), 0x00);
    CScalerSetBit(_ANALOG_COMMON_CTRL2_C6, 0x9f, 0x70);
    for(cnt0=0;cnt0<2;cnt0++)
    {
        for(cnt1=0;cnt1<2;cnt1++)
        {
            CScalerSetByte(_TMDS_CTRL_BF, 0x00);
            CTimerDelayXms(25);

            CScalerRead(_TMDS_CTRL_BF, 1, pData, _NON_AUTOINC);
            if((pData[0] & 0xf8) == 0xf8)
            {
                CScalerRead(_UP_DOWN_CTRL1_D2, 1, pData, _NON_AUTOINC);
                pData[0] &= 0x0f;

                if((pData[0] == 0x0e) | (pData[0] == 0x08) | (pData[0] == 0x06) | (pData[0] == 0x04) | (pData[0] == 0x03))
                    return _TRUE;
            }

            CScalerSetBit(_TMDS_MEAS_RESULT0_BD, ~(_BIT2 | _BIT1), _BIT1);
        }

        CScalerSetBit(_ANALOG_COMMON_CTRL2_C6, 0x9f, 0x10);
        CScalerSetBit(_TMDS_MEAS_RESULT0_BD, ~(_BIT2 | _BIT1), 0x00);
    }

    return _FALSE;
}
#endif  // End of #if(_TMDS_SUPPORT == _ON)

//--------------------------------------------------
// Description  : Set active input port
// Input Value  : ucSelect  --> Active port which we want to use
// Output Value : None
//--------------------------------------------------
void CSourceSwitchInputPort(BYTE ucSelect)
{
    BYTE cnt;

    for(cnt=_INPUT_PORT_0;cnt<_INPUT_PORT_MAX;cnt++)
    {
        if(cnt == ucSelect)
            SET_INPUTPORT_SELECT(cnt);
        else
            CLR_INPUTPORT_SELECT(cnt);
    }
}

//--------------------------------------------------
// Description  : Select the active input port or we can do auto-source-selection to decide the active port
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CSourceSelectInputPort(void)
{
	#if (_SOURCE_AUTOCHANGE_ENABLE == _TRUE)
    BYTE cnt;
    if(GET_INPUTSIGNAL_AVAILABLE(stSystemData.InputSource))
    {
        CSourceSwitchInputPort(stSystemData.InputSource);
        return;
    }

    if(GET_SOURCE_AUTOCHANGE() == _TRUE)
    {
        for(cnt=_INPUT_PORT_0;cnt<_INPUT_PORT_MAX;cnt++)
        {
            if(GET_INPUTSIGNAL_AVAILABLE(cnt))
            {
                CSourceSwitchInputPort(cnt);
                return;
            }
        }
    }

    CSourceSwitchInputPort(_INPUT_PORT_MAX);
	#else
	if (stSystemData.InputSource >= _INPUT_PORT_MAX) {
		stSystemData.InputSource = _INPUT_PORT_0;
		CEepromSaveSystemData();
	}	
	
	CSourceSwitchInputPort(stSystemData.InputSource);
   #endif
}

⌨️ 快捷键说明

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