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

📄 sync.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 2 页
字号:
// Description  : Search VGA sync type
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncSearchSyncTypeVGA(void)
{
#define _SYNCTYPE_CONFIRM_TIMES   2

    BYTE synctypeprev, synctypecurr, cnt;

    cnt = _SYNCTYPE_CONFIRM_TIMES;
    do
    {
        synctypecurr = CSyncGetSyncTypeStep1VGA();

        if(cnt == _SYNCTYPE_CONFIRM_TIMES)
        {
            synctypeprev = synctypecurr;
            continue;
        }

        if(synctypecurr != synctypeprev)
        {
            return _NO_SYNC_STATE;
        }

    }
    while(--cnt);

    return synctypecurr;

#undef _SYNCTYPE_CONFIRM_TIMES
}

/*
//--------------------------------------------------
// Description  : Get VGA sync type (step 1)
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep1VGA(void)
{
    BYTE cnt = 0;

    CScalerSetByte(_ADC_POWER_CTRL_E8, 0x38);
    CScalerSetByte(_VGIP_ODD_CTRL_08, 0x00);
    CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);
    CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT7 | _BIT3), 0x00);
    CScalerSetBit(_SCALE_CTRL_19, ~_BIT7, 0x00);

    CScalerSetByte(_SYNC_CTRL_49, 0x06);
    CScalerSetBit(_SYNC_INVERT_48, ~(_BIT4 | _BIT2), (_BIT4 | _BIT2));
    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT1, _BIT1);
    do
    {
        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, 0x00);
        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, _BIT0);
        CScalerSetBit(_STABLE_PERIOD_H_50, ~_BIT4, 0x00);

        if(!CTimerPollingEventProc(20, CMiscStableFlagPollingEvent))
        {
            if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT7))
            {
                return _NO_SYNC_STATE;
            }
            else
            {
                return _NO_SYNC_STATE;
            }
        }

        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);

        if(!(bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT3))
        {
            CScalerSetBit(_SYNC_INVERT_48, ~_BIT3, CScalerGetBit(_SYNC_INVERT_48, _BIT3) ^ _BIT3);
            cnt++;
        }
        else
        {
            break;
        }

        if(cnt >= 2)
            return _NO_SYNC_STATE;
    }
    while(_TRUE);

    CScalerSetBit(_SYNC_SELECT_47, ~(_BIT6 | _BIT5), _BIT5);

    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT4, 0x00);

    // Vsync counter level 384 crystal clocks
    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~(_BIT2 | _BIT1 | _BIT0), 0x03);
    CScalerSetByte(_VSYNC_COUNTER_LEVEL_LSB_4D, 0x00);

    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT6, 0x00);

    CScalerSetBit(_DETECT_HSYNC_PERIOD_LSB_4B, ~_BIT7, 0x00);

    CTimerDelayXms(40);

    if((bit)CScalerGetBit(_STABLE_COUNT_4F, _BIT6))
    {
        if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT6))
        {
            return _NO_SYNC_STATE;
        }
        else
        {
            CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), (_BIT6 | _BIT5));
            return _CS_STATE;
        }
    }

    CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), 0x00);

    CAdjustSyncProcessorMeasureStart();

    if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
    {
        if((bit)CScalerGetBit(_MEAS_VS_PERIOD_H_54, _BIT5))
        {
            return _NO_SYNC_STATE;
        }
        else
        {
            if(CModeMeasureData())
            {
                CSyncModifyPolarityVGA();
                return _SS_STATE;
            }
            else
            {
                return _NO_SYNC_STATE;
            }
        }
    }
    else
    {
        return _NO_SYNC_STATE;
    }
}

//--------------------------------------------------
// Description  : Get VGA sync type (step 2, for Composite sync)
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep2VGA(void)
{
    if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
    {
        CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);

        CScalerSetBit(_SYNC_INVERT_48, ~_BIT6, _BIT6);
        CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
        CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
        CScalerSetBit(_SYNC_INVERT_48, ~_BIT1, _BIT1);

        CTimerDelayXms(40);

        return _CS_STATE;
    }

    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT3, _BIT3);
    CScalerRead(_DETECT_HSYNC_PERIOD_MSB_4A, 2, pData, _AUTOINC);
    ((WORD *)pData)[1] = (pData[0] << 3) | (pData[1] & 0x07);

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

    if(abs(((WORD *)pData)[1] - ((WORD *)pData)[2]) <= 1)
    {
        CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), 0x00);
        CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
        CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
        return _CS_STATE;
    }
    else
    {
        CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);

        CScalerSetBit(_SYNC_INVERT_48, ~_BIT6, _BIT6);
        CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
        CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
        CScalerSetBit(_SYNC_INVERT_48, ~_BIT1, _BIT1);

        CTimerDelayXms(40);

        return _CS_STATE;
    }
}

//--------------------------------------------------
// Description  : Modify VGA sync polarity
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CSyncModifyPolarityVGA(void)
{
    BYTE polarity;

    polarity = CScalerGetBit(_VGIP_SIGINV_06, (_BIT3 | _BIT2));

    polarity &= ~(_BIT3 | _BIT2);

    if(!(bit)(stModeInfo.Polarity & _BIT0))
    {
        polarity |= _BIT2;
    }

    if(!(bit)(stModeInfo.Polarity & _BIT1))
    {
        polarity |= _BIT3;
    }

    CScalerSetByte(_VGIP_SIGINV_06, polarity);
}
*/
//version 200D
//--------------------------------------------------
// Description  : Get VGA sync type (step 1)
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep1VGA(void)
{
    BYTE cnt = 0;

    // Enable ADC bandgap and SOG power
    CScalerSetByte(_ADC_POWER_CTRL_E8, 0x38);

    // Disable video settings
    CScalerSetByte(_VGIP_ODD_CTRL_08, 0x00);
    CScalerSetByte(_YUV2RGB_CTRL_89, 0x00);
    CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT7 | _BIT3), 0x00);
    CScalerSetBit(_SCALE_CTRL_19, ~_BIT7, 0x00);

    CScalerSetByte(_SYNC_CTRL_49, 0x06);
    CScalerSetBit(_SYNC_INVERT_48, ~(_BIT4 | _BIT2), (_BIT4 | _BIT2));
    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT1, _BIT1);
    do
    {
        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, 0x00);
        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT0, _BIT0);
        CScalerSetBit(_STABLE_PERIOD_H_50, ~_BIT4, 0x00);

        if(!CTimerPollingEventProc(20, CMiscStableFlagPollingEvent))
        {
            if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT7))
            {
                return _NO_SYNC_STATE;
            }
            else
            {
                return _NO_SYNC_STATE;
            }
        }

        CScalerSetBit(_STABLE_COUNT_4F, ~_BIT4, _BIT4);

        if(!(bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT3))
        {
            CScalerSetBit(_SYNC_INVERT_48, ~_BIT3, CScalerGetBit(_SYNC_INVERT_48, _BIT3) ^ _BIT3);
            cnt++;
        }
        else
        {
            break;
        }

        if(cnt >= 2)
            return _NO_SYNC_STATE;
    }
    while(_TRUE);

    CScalerSetBit(_SYNC_SELECT_47, ~(_BIT6 | _BIT5), _BIT5);

    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT4, 0x00);

    // Vsync counter level 384 crystal clocks
    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~(_BIT2 | _BIT1 | _BIT0), 0x03);
    CScalerSetByte(_VSYNC_COUNTER_LEVEL_LSB_4D, 0x00);

    CScalerSetBit(_STABLE_COUNT_4F, ~_BIT6, 0x00);

    CScalerSetBit(_DETECT_HSYNC_PERIOD_LSB_4B, ~_BIT7, 0x00);

    CTimerDelayXms(40);

    if((bit)CScalerGetBit(_STABLE_COUNT_4F, _BIT6))
    {
        if((bit)CScalerGetBit(_STABLE_PERIOD_H_50, _BIT6))
        {
            return _NO_SYNC_STATE;
        }
        else
        {
            CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), (_BIT6 | _BIT5));

            return CSyncGetSyncTypeStep2VGA();
        }
    }

    CScalerSetBit(_SYNC_CTRL_49, ~(_BIT6 | _BIT5), 0x00);

    // Check if Hsync only
    CAdjustSyncProcessorMeasureStart();
    if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
    {
        if(CModeMeasureData())
        {
            CSyncModifyPolarityVGA();
            return _SS_STATE;
        }
        else
        {
            return _NO_SYNC_STATE;
        }
    }
    else
    {
        return _NO_SYNC_STATE;
    }
}

//--------------------------------------------------
// Description  : Get VGA sync type (step 2, for Composite sync)
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncGetSyncTypeStep2VGA(void)
{
    if((bit)CScalerGetBit(_DETECT_HSYNC_PERIOD_LSB_4B, _BIT7))
    {
        CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
        CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
        CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
        CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);

        CTimerDelayXms(40);

        return _CS_STATE;
    }

    CScalerSetBit(_VSYNC_COUNTER_LEVEL_MSB_4C, ~_BIT3, _BIT3);
    CScalerRead(_DETECT_HSYNC_PERIOD_MSB_4A, 2, pData, _AUTOINC);
    ((WORD *)pData)[1] = (pData[0] << 3) | (pData[1] & 0x07);

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

    if(abs(((WORD *)pData)[1] - ((WORD *)pData)[2]) <= 1)
    {
        return CSyncCheckSOY();
    }
    else
    {
        CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
        CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
        CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
        CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);

        CTimerDelayXms(40);

        return _CS_STATE;
    }
}

//--------------------------------------------------
// Description  : Check Sync between seration CS and SOY
// Input Value  : None
// Output Value : None
//--------------------------------------------------
BYTE CSyncCheckSOY(void)
{
    WORD vtotaltemp;

    CScalerSetBit(_SYNC_CTRL_49, ~_BIT2, _BIT2);
    CScalerSetBit(_CLAMP_CTRL1_5D, ~_BIT6, 0x00);
    CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
    CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));

    CAdjustSyncProcessorMeasureStart();
    if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
    {
        if(CModeMeasureData())
        {
            vtotaltemp = stModeInfo.IVTotal;
        }
        else
        {
            return _NO_SYNC_STATE;
        }
    }
    else
    {
        return _NO_SYNC_STATE;
    }

    CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, 0x00);
    CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), 0x00);

    CAdjustSyncProcessorMeasureStart();
    if(CTimerPollingEventProc(60, CMiscModeMeasurePollingEvent))
    {
        if(CModeMeasureData())
        {
            if(abs(vtotaltemp - stModeInfo.IVTotal) <= 1)
            {
                return _SOY_STATE;
            }
            else
            {
                CScalerSetBit(_SYNC_SELECT_47, ~_BIT6, _BIT6);
                CScalerSetBit(_SYNC_INVERT_48, ~(_BIT6 | _BIT1), (_BIT6 | _BIT1));
                return _CS_STATE;
            }
        }
        else
        {
            return _NO_SYNC_STATE;
        }
    }
    else
    {
        return _NO_SYNC_STATE;
    }
}

//--------------------------------------------------
// Description  : Modify VGA sync polarity
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CSyncModifyPolarityVGA(void)
{
    BYTE polarity;

    polarity = CScalerGetBit(_VGIP_SIGINV_06, 0xff);

    polarity &= ~(_BIT3 | _BIT2);

    if(!(bit)(stModeInfo.Polarity & _BIT0))
    {
        polarity |= _BIT2;
    }

    if(!(bit)(stModeInfo.Polarity & _BIT1))
    {
        polarity |= _BIT3;
    }

    CScalerSetByte(_VGIP_SIGINV_06, polarity);
}

#if(_TMDS_SUPPORT == _ON)
//--------------------------------------------------
// Description  : Search DVI sync type
// Input Value  : None
// Output Value : Return sync type
//--------------------------------------------------
BYTE CSyncSearchSyncTypeDVI(void)	//Updated by Realtek at 20050617
{
    BYTE synctypetemp = _DSS_STATE;

    CPowerADCAPLLOff();

    if(!CSourceScanInputPortDVI((bit)CScalerGetBit(_POWER_ON_OFF_CTRL_C2, _BIT7)))
        return _NO_SYNC_STATE;

    if(CAdjustTMDSEqualizer() == _FALSE)
        return _NO_SYNC_STATE;

    CPowerTMDSOn();

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

⌨️ 快捷键说明

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