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

📄 mode.c

📁 realtek LCD monitor, TV开发源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
            }
        }
        else
        {
            CScalerSetBit(_MEAS_HS_PERIOD_H_52, ~_BIT5, 0x00);
            modecnt = _MODE_NOSUPPORT;
        }
    }

    CScalerSetBit(_SYNC_SELECT_47, ~_BIT0, 0x00);

    // If no mode found, set to mode 0
    if(modecnt >= _MAX_PRESET_MODE)
    {
        modecnt = 0;
    }

// We don't support input image large than 2048 active pixel or less than 240 active lines.
// added deep color mode limitation
    if(GET_DEEPCOLORMODE())
    {
        CScalerPageSelect(_PAGE2);
        CScalerRead( _P2_TMDS_DPC0_B4 , 1 ,&pData[3] , _NON_AUTOINC);
        CTimerDelayXms(5);

        temp = pData[3] & 0x07;
        if(temp == 0x05)
        {  //30 bit 1920
            if((stModeInfo.IHWidth > 2560) || (stModeInfo.IVHeight < 240))
            {
                modecnt = _MODE_NOSUPPORT;
            }
        }
        else if(temp == 0x06)   //36 bit
        {
            if((stModeInfo.IHWidth > 3072) || (stModeInfo.IVHeight < 240))
            {
                modecnt = _MODE_NOSUPPORT;
            }
        }
        else if(temp == 0x07)     //48 bit
        {
            if((stModeInfo.IHWidth > 4096) || (stModeInfo.IVHeight < 240))
            {
                modecnt = _MODE_NOSUPPORT;
            }
        }
    }
    else
    {
        if((stModeInfo.IHWidth > 2048) || (stModeInfo.IVHeight < 240))
            modecnt = _MODE_NOSUPPORT;
    }

    return modecnt;
}


//--------------------------------------------------
// Description  : Compare mode for DVI
// Input Value  : Mode number
// Output Value : Retrun _TRUE if it's correspondence
//--------------------------------------------------
bit CModeCompareModeDVI(BYTE ucModeCnt)
{
//cyyeh 20080108 fix for deep color mode
    if(stModeInfo.IHWidth != tINPUTMODE_PRESET_TABLE[ucModeCnt].IHWidth)
    {
       if(abs(stModeInfo.IHWidth - tINPUTMODE_PRESET_TABLE[ucModeCnt].IHWidth) <= 3)
            return _TRUE;
       else
            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) || (_HDMI_SUPPORT == _ON)||(_DP_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:
//Anderson 080422 for FRC Support Start
#if(_FRC_SUPPORT == _ON)
            SET_FRCRGBIN();//RGB Input
#endif
            CModeSetupModeVGA();
            break;

#if(_YPBPR_SUPPORT == _ON)

        case _SOURCE_YPBPR:
#if(_FRC_SUPPORT == _ON)
            CLR_FRCRGBIN();//YUV Input
#endif
            CYPbPrSetupMode();
            break;

#endif
//cyyeh//eagleeyes
#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON)||(_DP_SUPPORT == _ON))
        case _SOURCE_DVI:
        case _SOURCE_HDMI:
        case _SOURCE_DP:
#if(_FRC_SUPPORT == _ON)
            if(!CHdmiFormatDetect())//Input source is the HDMI format//Anderson 20080710
                SET_FRCRGBIN();//RGB Input
#endif
            CModeSetupModeDVI();
            break;
#endif

#if(_VIDEO_SUPPORT == _ON)

        case _SOURCE_VIDEO8:
#if(_FRC_SUPPORT == _ON)
            CLR_FRCRGBIN();//YUV Input
#endif
            CVideoDisplaySet();
            break;

#endif
//Anderson 080422 for FRC Support End


    }
}


//--------------------------------------------------
// Description  : Sum Of Difference
// Input Value  : None
// Output Value : None
//--------------------------------------------------
#if(_MODE_COMPARE_BY_SOD == _ON)
// Issac-03-13-Begin
DWORD CModeCheckMaxSOD(void)
{
    if (CAutoMeasurePositionV(_MIN_NOISE_MARGIN) != _ERROR_SUCCESS)         return _FALSE;
    if (CAutoMeasurePositionH(_MIN_NOISE_MARGIN + 0x10) != _ERROR_SUCCESS)  return _FALSE;

    // Set threshold for Clock Search
    CScalerSetByte(_DIFF_THRESHOLD_79, 0x18);

    g_usHEndPos   = g_usHEndPos + 1 - g_usHStartPos;

    if(g_usHEndPos > (stModeInfo.IHWidth + 2))
    {
        ((DWORD *)pData)[0]   = 0;
    }
    else
    {
        BYTE temp;

        ((DWORD *)pData)[0]   = CAutoPhaseSearch(_COLOR_SELECT, _HWAUTO_STEP_16, HWAUTOSTEPNUM(4), HWAUTOSTEPSTART(0), &temp);

        if (0xffffffffL == ((DWORD *)pData)[0])   return 0;
    }

    // SOD is too small to make mode decision
    if (((DWORD *)pData)[0] < ((DWORD)stModeInfo.IHWidth << 10))    ((DWORD *)pData)[0] = 0;

    return ((DWORD *)pData)[0];
}
// Issac-03-13-End

BYTE code CModeSeparateConfuseMode(BYTE *Mode)
{
   BYTE ucMode=stModeInfo.ModeCurr;
   BYTE ucMode_SEL,i;
   BYTE Temp;
   bit bDoSodMode=_FALSE;
   DWORD dwCurr_AOD, dwMax_AOD;
   dwMax_AOD = 0;
   ucNoCheckFS = _TRUE;
   for(i=0; i<4; i++)
   {
     if(stModeInfo.ModeCurr == *(Mode+i))
     {
        bDoSodMode=_TRUE;
        break;
     }
   }
   if(bDoSodMode == _TRUE)
   {
      stModeInfo.ModeCurr=_MODE_NOSIGNAL;
      for(i=0; i<4; i++)
      {
         Temp=*(Mode+i);
         if(Temp!=stModeInfo.ModeCurr)
         {
            stModeInfo.ModeCurr = Temp;
            CModeGetModeTableInfo();
            stModeUserData.Clock = stModeInfo.IHTotal;
            CModeStartUpVGA();
            CAdjustAdcGainOffset();
#if(_NEW_ADC == _FALSE)
            CAdjustAdcClock(stModeUserData.Clock, 0);
            //CAdjustAdcClock(stModeUserData.Clock, 1);
            //CAdjustAdcClock(stModeUserData.Clock, 2);
#else
            CAdjustAdcClock(stModeUserData.Clock);
#endif
            CAdjustADCSetting();

            CAdjustPhase(0);
            dwCurr_AOD = CModeCheckMaxSOD();
            if( dwCurr_AOD>dwMax_AOD )
            {
                dwMax_AOD = dwCurr_AOD;
                ucMode_SEL = stModeInfo.ModeCurr;
            }
         }
         stModeInfo.ModeCurr = ucMode;
         if( dwMax_AOD != 0 )   // sod information are vaild
         {
            ucMode = ucMode_SEL;
         }
       }
    }                         //ARKIN 0525 FOR REDUCE 640X480 MODE SEARCH TIMING
    ucNoCheckFS = _FALSE;
    return(ucMode);
}

// 0523 index3
BYTE code ModeConfuseTable[][4]=
{
    {
        _MODE_1152x720_60HZ,
        _MODE_1152x720_60HZ,
        _MODE_1280x720_60HZ_CVT,
        _MODE_1280x720_60HZ_CVT,
    },
    {
        _MODE_1280x768_60HZ,
        _MODE_1280x768_60HZ,
        _MODE_1366x768_60HZ,
        _MODE_1366x768_60HZ,
    },
    {
        _MODE_1024x768_75HZ,
        _MODE_1024x768_75HZ,
        _MODE_1280x768_75HZ,
        _MODE_1280x768_75HZ,
    },
};

#endif

//--------------------------------------------------
// Description  : Setup VGA mode
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CModeSetupModeVGA(void)
{
    BYTE option = 0;

#if(_MODE_COMPARE_BY_SOD==_TRUE)
    BYTE i;

    //if((GET_INPUTSYNC_TYPE() == _CS_STATE)||(GET_INPUTSYNC_TYPE() == _SOG_STATE))
    {
        for( i=0;i<(sizeof(ModeConfuseTable)/4);i++ )
        {
            option=CModeSeparateConfuseMode(ModeConfuseTable[i]);
            if(option!=stModeInfo.ModeCurr)
            {
                stModeInfo.ModeCurr=option;
                break;
            }
        }
    }
#endif


    //0804 sephinroth start
    //if(stModeInfo.ModeCurr == _MODE_1280x768_60HZ)
    //{
    //    if(stModeInfo.Polarity != _SYNC_HN_VP)  stModeInfo.ModeCurr=_MODE_1366x768_60HZ;
    //}
    //0804 sephinroth end
    // Get information from mode table, such as IHTotal, IHStartPos, IHWidth, IVStartPos, IVHeight.

    // Load mode user data from eeprom
    bUndoFirstAuto=CEepromSearchAndLoadSavedTiming();

    CModeGetModeTableInfo();

#if(_PARTIAL_DISPLAY == _ON)
    if (stModeInfo.ModeCurr == _MODE_720x400_70HZ || stModeInfo.ModeCurr == _MODE_640x350_70HZ) //for 24w dos mode
    {
        CScalerSetBit(_VGIP_SIGINV_11, 0xff, 0x80);
        CScalerSetBit(_VGIP_ODD_CTRL_13, 0xff, 0x10);
    }
#endif
    // Start up settings of VGA mode.
    CModeStartUpVGA();

    // Get scaling option, Capture window setup, Scaling setup, Display setup
    CModeSetupDisplay();

    // Setup color processing
    CModeSetupColorProcess();

    CAdjustAdcGainOffset();
#if(_NEW_ADC == _FALSE)
    // V010 Patch Note (1) : Adjust ADC Clock Modify
    CAdjustAdcClock(stModeUserData.Clock,0);//cyyeh 20080222
#else
    CAdjustAdcClock(stModeUserData.Clock);
#endif
    CAdjustADCSetting();
    CAdjustPhase(stModeUserData.Phase);
    CAdjustHPosition();
    CModeModifyVTotal();
    CAdjustVPosition();

#if(_OSD_TYPE == _BENQ_OSD)
    ucDdcciVPositionRatio=AlignMapToPercent(stModeUserData.VPosition,COsdFxGetVPositionRangeBenq(_MAX),COsdFxGetVPositionRangeBenq(_MIN));
#else
    ucDdcciVPositionRatio=AlignMapToPercent(stModeUserData.VPosition,COsdFxGetVPositionRangeGeneric(_MAX),COsdFxGetVPositionRangeGeneric(_MIN));
#endif

#if(_ADC_OFFSET_ADJUSTING == _ADJUST_BY_HW_OFF_LINE)

    COsdDispShowFactoryModeValue();
#endif
//Anderson 080130 for Field Merge & FRC Support Start
#if(_FRC_SUPPORT == _ON)
    if(!GET_FRCSTATUS())
    {
        CModeSetFIFOForFrameSync();
#else
    {
#endif
        pData[0] = CFrameSyncDo();

        if(pData[0] == 2)
        {
            CModeResetMode();
            return;
        }
    }

//V403 modify
#if((_MEMORY_WORK_TYPE == _OD_ON_FRC_ON) || (_MEMORY_WORK_TYPE == _OD_OFF_FRC_ON))
    else
    {
#if(_FIELD_MERGE_SUPPORT == _ON)
        if(GET_FIELDMERGE_MODE())
            CScalerSetBit(_VGIP_SIGINV_11, ~_BIT4, _BIT4);
#endif
        // Disable video compensation & IVS-to-DVS-delay control by ODD when FRC
        CScalerSetBit(_SCALE_CTRL_32, ~_BIT7, 0);
        CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~_BIT1, 0);
    }
#endif
//Anderson 080130 for Field Merge & FRC Support End

    CDcrSetBoundary();//0902 sephinroth DCR

    CModeSetupEtcs(_FUNCTION_ENABLE);
#if(_NEW_ADC == _FALSE)
    // V010 Patch Note (1) : Adjust ADC Clock Modify
    CAdjustAdcClock(stModeUserData.Clock,1);
    CAdjustAdcClock(stModeUserData.Clock,2);
#endif
}

#if((_TMDS_SUPPORT == _ON) || (_HDMI_SUPPORT == _ON)||(_DP

⌨️ 快捷键说明

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