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

📄 mst705Ȧ

📁 MST705源代码
💻
📖 第 1 页 / 共 2 页
字号:

#define _DEVVD_C_

#include <math.h>
#include "types.h"
#include "ms_reg.h"
#include "board.h"
#include "global.h"
#include "DEBUG.h"
#include "ms_rwreg.h"
#include "misc.h"
#include "userpref.h"
#include "power.h"
#include "panel.h"
#include "mstar.h"
#include "tv.h"
#include "DevVD.h"
#include "msVD.h"
#include "DEVTuner.h"
#include "adjust.h"
#include "DevVD_User.h"
#include "menu.h"
#include "menuFunc.h"
#include "Maria2_FSC_Lib.h"
#include "Maria2_ACC_Lib.h"
#include "M2_VD_Std_Lib.h"
#include "M9_VD_AGC_Lib.h"

#if(ENABLE_VD_DSP)
#include "Maria2_dsp_lib.h"
#endif

void vdInitVariable(void)
{
    g_ucmsVDCtl = MSVD_CTL_FLAG_DSP_STD
                |MSVD_CTL_FLAG_FSC_DETECT
                //|MSVD_CTL_FLAG_ACC
                |MSVD_CTL_FLAG_COLOR_BURST_HANDLER
                |MSVD_CTL_FLAG_NOISE_HANDLER
                |MSVD_CTL_FLAG_COMB_LINE_BUF
                |MSVD_CTL_FLAG_VSYNC
                |MSVD_CTL_FLAG_COMB_HANDLER
                ;


	g_ucmsVDCtl2 = 0
	            |MSVD_CTL2_FLAG_AGC_MONITOR
	            |MSVD_CTL2_FLAG_AGC_PROCESSOR
            #if(ENABLE_VCR_HANDLER)
                |MSVD_CTL2_FLAG_VCR
            #endif
                |MSVD_CTL2_FLAG_SECAM
                |MSVD_CTL2_FLAG_HSYNC
                |MSVD_CTL2_FLAG_PATCH5
                |MSVD_CTL2_FLAG_PAL_SWITCH
                |MSVD_CTL2_FLAG_AFEC
                ;


    g_ucMSVDDebug = 0;
    g_ucMSVDDebug2 = 0;

    g_VdInfo.wVideoStatus = VD_RESET_ON;
    g_VdInfo.ucVideoSystem = SIG_NONE;
    g_VdInfo.ucVideoStableCounter = 0;
    g_VdInfo.ucVideoPollingCounter = 0;
    g_VdInfo.bVideoDoModeSetting = FALSE;
#ifdef VD_PATCH_002
    g_msVD_Patch002_LastVideoSystem = 0xFF;
#endif

#ifdef VD_PATCH_003
    if( VD_Type < MARIA2_E )
    msVD_Patch_003(0);
#endif

#ifdef VD_PATCH_005
    msVD_Patch_005(100);
#endif
    VD_Vsync_Set656VPosition( DSP_656_F_TGL_1_VAL, 0x09, DSP_656_V_CLR_1_VAL );

    msDSP_Std_Init();
    msVD_FSC_Init();

    msVD_FSC_SetNoiseModeLevel( 12, 13);
    msVD_FSC_SetColorKillNoise( 0xC0, 0xD0 );
    #if 0//(SCALER_TYPE==MARIA9)
    msVD_FSC_SetColorKillLevel( 0x12, 0x10, 0x80, 0x90 );
    #else
    msVD_FSC_SetColorKillLevel( 0x23, 0x18, 0x50, 0x60 );
    #endif
    msVDAcc_Ctl( 1 );
    msVDAcc_Init();


#if RM_EEPROM_TYPE<RM_TYPE_SST512
    g_uwVideoAGC=(WORD)(g_VideoSetting.videoAGC<<8);
    g_ucLastVideoAGC=g_VideoSetting.videoAGC;
    g_ucVideoAGCCount=0;
#else
    g_uwVideoAGC=0x0800;
#endif
    VD_AGC_Init();
    // for dsp 20060311 only, not mature yet
    SetVthreshold(0x20);

    msVDForceSystem( VD_FORCE_AUTO );

#if( ENABLE_SECAM )
    g_dwVDSecamHandler_PreMagThl = 0;
    g_wVDSecamHandler_PreNoiseMag = 0;
#endif

    msVDNoiseHandlerInit();
    g_ucOverScanH = VD_OVER_SCAN_H;
    g_ucOverScanV = VD_OVER_SCAN_V;
    g_ucAFECHnadler_LaseDplSel = 0xff;

#if( ENABLE_SW_DETECT_COLOR_STD )
    if( VD_Type >= MARIA2_E )
    	msVDDetectColorStdInit();
#endif

    msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
    msWriteByte( BK2_43_AGC_CTRL1, 0x14/*0x74*/ );
    msWriteByte( BK2_44_AGC_FINE, 0x40/*0x90*/ );
    msWriteBit( BK2_3F, 1,_BIT3 );
    msWriteBit( BK2_10, 1,_BIT2 );
    msWriteByte( BK0_00_REGBK, REG_BANK_SCALER );

}

void vdMonitorInput(void)
{
    WORD wCurSyncStatus; // video status
    BYTE ucStableCounter;
    BYTE ucNoiseMag;
 	if (!PowerOnFlag)
    return;

#if Enable_Logo_Display
    if(DrawLogoFlag)
	return;
#endif

    if( g_VdInfo.ucVideoPollingCounter )
        return;
    g_VdInfo.ucVideoPollingCounter = 20; // reset counter

     if (g_bInputTimingChangeFlag)
     {
	 	g_VdInfo.wVideoStatus = VD_RESET_ON;
	 	Clr_InputTimingChangeFlag();
     }

     wCurSyncStatus = msVDGetSyncStatus();
     if( (wCurSyncStatus&VD_MODE_DETECT_MASK) != (g_VdInfo.wVideoStatus&VD_MODE_DETECT_MASK) )// Sync change
     {
        //ucNoiseMag = msVDGetCurNoiseMag();
        ucNoiseMag = msDSP_Std_GetNoiseMag();
        if( !SourceChangFlag&&(IsAVInUse()||IsSVideoInUse() ))
        {
                //if( (wCurSyncStatus&(VD_FSC_TYPE|VD_PAL_SWITCH|VD_VSYNC_50HZ)) != (g_VdInfo.wVideoStatus&(VD_FSC_TYPE|VD_PAL_SWITCH|VD_VSYNC_50HZ)) )
                if( ( ((wCurSyncStatus&(VD_FSC_TYPE|VD_PAL_SWITCH)) != (g_VdInfo.wVideoStatus&(VD_FSC_TYPE|VD_PAL_SWITCH)))&&(ucNoiseMag<0x50) )
                  ||( (wCurSyncStatus&(VD_VSYNC_50HZ)) != (g_VdInfo.wVideoStatus&(VD_VSYNC_50HZ)) )
                  ||( (wCurSyncStatus&(VD_HSYNC_LOCKED)) != (g_VdInfo.wVideoStatus&(VD_HSYNC_LOCKED)) )
                  )
                {
                    msSetBlueScreen( _ENABLE, FR_BLACK);
                    g_VdInfo.wVideoStatus |= VD_RESET_ON;

                    if(!(wCurSyncStatus&VD_HSYNC_LOCKED))
                        msVDReset();
                }
        }

        if( (wCurSyncStatus&VD_MODE_DETECT_MASK) == (g_wLastSyncStatus&VD_MODE_DETECT_MASK) )
        {
            if( g_VdInfo.ucVideoStableCounter < 0xff )
                g_VdInfo.ucVideoStableCounter ++;

            if( !(wCurSyncStatus&VD_HSYNC_LOCKED) )
                ucStableCounter = VD_NO_INPUT_STABLE_COUNT;
            else
                ucStableCounter = VD_INPUT_STABLE_COUNT;

            if( g_VdInfo.ucVideoStableCounter >= ucStableCounter )
            {
                //printf( "Video Status: %x\r\n", wCurSyncStatus );
                g_VdInfo.wVideoStatus = wCurSyncStatus; // set flag
                g_VdInfo.bVideoDoModeSetting = TRUE; // set mode flag

                #ifdef VD_PATCH_002
                if(msVD_Patch_002( wCurSyncStatus ))
		{
                        g_VdInfo.wVideoStatus = VD_RESET_ON;
                        g_VdInfo.bVideoDoModeSetting = FALSE;
              }
                #endif
            }
        }
        else // Current status != last status
        {
            g_VdInfo.ucVideoStableCounter = 0;
        }
    }
    else // Current status == current global flag
    {
        g_VdInfo.ucVideoStableCounter = 0;
    }

	if(g_ucSyncMaxStableCounter)
	{
	    if((--g_ucSyncMaxStableCounter)==0)
		{
    		//printMsg("force turn on panel");
    		g_VdInfo.bVideoDoModeSetting = TRUE;
    		//g_VdInfo.wVideoStatus|=~VD_HSYNC_LOCKED;
    		g_VdInfo.ucVideoStableCounter = 0;
		}
	}

    // Current status == system status
    if( (wCurSyncStatus&VD_MODE_DETECT_MASK) == (g_VdInfo.wVideoStatus&VD_MODE_DETECT_MASK) )
    {
        // Polling input and doing something
        if(wCurSyncStatus&VD_HSYNC_LOCKED)//&& IsSrcHasSignal())
        {
            msDetectInterlace(0); // Normal polling interlace
        #if( ENABLE_MONITOR_SIGNAL )
            msMonitorSignal(0); // Normal monitor input signal
        #endif
        }
        // Patch ...
        // if( IsSrcUseInternalVD() ) // Status stable
        {
            #ifdef VD_PATCH_003
            if( VD_Type < MARIA2_E )
            	{
	            if( g_VdInfo.ucVideoSystem == SIG_NTSC )
	                msVD_Patch_003(1);
	            else
	                msVD_Patch_003(0);
            	}
            #endif

            #ifdef VD_PATCH_004
            if(wCurSyncStatus&VD_HSYNC_LOCKED)// && IsSrcHasSignal())
                msVD_Patch_004(_ENABLE);
            else
                msVD_Patch_004(_DISABLE);
            #endif
        }
    }

    // Save current status for next mode detect
    g_wLastSyncStatus = wCurSyncStatus;
}

void vdModeHandler(void)
{
  BYTE DSP10_Value,ucBank;

    if( g_VdInfo.bVideoDoModeSetting )
    {
        WORD wStatus = g_VdInfo.wVideoStatus;

        g_bForceColorEnable=FALSE;
        g_VdInfo.bVideoDoModeSetting = FALSE;
        Clr_SourceChangFlag();
        if( wStatus& VD_HSYNC_LOCKED ) // Has signal
        {
            printMsg("VD sync setup mode !");
            // Check signal type
            if( wStatus&VD_VSYNC_50HZ )
            {
                g_VdInfo.ucVideoSystem = SIG_PAL;
                g_ucSrcModeIndex = MD_720x576_50I;
            }
            else
            {
                g_VdInfo.ucVideoSystem = SIG_NTSC;
                g_ucSrcModeIndex = MD_720x480_60I;
            }

            g_InOutCtl.bInterlace = 1;

            if( IsVideoPortInUse())
            {
                g_VdInfo.ucVideoSystem = msVDGetVideoSystem( wStatus );

                if(g_VdInfo.ucVideoSystem==SIG_PAL_M||g_VdInfo.ucVideoSystem==SIG_PAL_NC)
                {
                    msVD_FSM_Reset(PAL_SWITCH_FORCE_PAL);
                }
                else if(g_VdInfo.ucVideoSystem!=SIG_SECAM)
                {
                    msVD_FSM_Reset(PAL_SWITCH_AUTO);
                }

                msVDSetupMode( wStatus, g_VdInfo.ucVideoSystem );
            }

            msCommSetupMode();

            SetOutputTimingAndWindow(OUTPUT_SIG); // VD mode change: Has signal

            #if( ENABLE_MONITOR_SIGNAL )
            msMonitorSignal(MONITOR_SIGNAL_INIT);
            #endif

            msSetBlueScreen( _DISABLE, FR_BLACK);

            if(IsTVInUse()&&ChannelAFCFlag)
            {
                Clr_AFCDisableFlag();
                Clr_ChannelAFCFlag();
                g_ucAFCTuneCounter=AFCTUNEINITCOUNT;
            }

            msForceChromaDetect(g_VdInfo.ucVideoSystem);

            ResetOsdTimer();//for reset source menu
        }
        else // No signal
        {
            printMsg("VD no sync setup mode !");
            g_VdInfo.ucVideoSystem = SIG_NONE;
            g_InOutCtl.bInterlace = 1;
            g_bForceColorEnable=0;

            msVDReset();

            if( IsVideoPortInUse())
            {
            // For TV snow
                #if( TV_SYSTEM == TV_NTSC )
                msVDSetupMode( VD_FSC_3579, SIG_NTSC );
                #else
                msVDSetupMode( VD_FSC_4433|VD_VSYNC_50HZ, SIG_PAL );
                #endif
            }

            #if TV_ENABLE
            if( IsTVInUse()) // For TV snow screen
            {
                SetOutputTimingAndWindow( OUTPUT_SNOW );
                msSetBlueScreen( _DISABLE, FR_BLACK);
                g_ucSrcModeIndex = MD_TVsnow;
            }
            else // av/sv
            #endif
            {
                msProgWindow( OUTPUT_FREERUN ); // For display window
                msSetBlueScreen( _ENABLE, FR_BLUE);
                g_ucSrcModeIndex = MD_FreeRun;
            }

            #ifdef VD_PATCH_001
            msVD_Patch_001();
            #endif
        }

        msSetScaler();
        if(g_ucMenuPageIndex==RootMenu)
            Set_ShowSourceFlag();

        g_ucSyncMaxStableCounter=0;


		ucBank = msReadByte( BK0_00_REGBK );
		msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
		DSP10_Value=msVDDSPReadByte(DSP_10);
		while(DSP10_Value!=0x85)
		{
			Delay1ms(2);
			msVDDSPWriteByte(DSP_10, 0x85);
			msVDDSPWriteByte(DSP_11, 0x00);
			Delay1ms(1);
			DSP10_Value=msVDDSPReadByte(DSP_10);
		}
		msWriteByte( BK0_00_REGBK, ucBank );
		
        if (PowerOnFlag)
        {
            Power_TurnOnPanel();
            Power_TurnOnGreenLed();
        }
    }
}

BOOL msForceChromaDetect(BYTE ucSignalType)
{
BYTE uctempcolorsys;
BOOL btempcolorforce=TRUE;
#if TV_ENABLE
	if(IsTVInUse())
	{
	uctempcolorsys=((g_TVChSetting.TvCurChannelMisc&ColorSysMask)>>4)%CHROMA_NUMS;
	}
	else
#endif
	{
	uctempcolorsys=g_VideoSetting.VideoColorSys;
	}

	switch(ucSignalType)
	{
	    case SIG_PAL:
			if(uctempcolorsys==CHROMA_PAL||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_SECAM:
			if(uctempcolorsys==CHROMA_SECAM||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_NTSC_443:
			if(uctempcolorsys==CHROMA_NTSC||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_PAL_60:
			if(uctempcolorsys==CHROMA_PAL||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_PAL_M:
			if(uctempcolorsys==CHROMA_PAL||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_PAL_NC:
			if(uctempcolorsys==CHROMA_PAL||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
	    case SIG_NTSC:
	    default:
			if(uctempcolorsys==CHROMA_NTSC||uctempcolorsys==CHROMA_AUTO)
				btempcolorforce=FALSE;
			break;
        	}

	g_bForceColorEnable=btempcolorforce;

	if ( btempcolorforce )
		{
		msVDColorKill(TRUE);
		}
	else
		{
		msVDColorKill(FALSE);
		}
	return btempcolorforce;
}

XDATA BYTE g_ucDetectInterlace_StableCounter;
void msDetectInterlace( BYTE ucFlag )
{
    BYTE ucBank = msReadByte( BK0_00_REGBK);
    bit bInterlace;

    msWriteByte( BK0_00_REGBK, REG_BANK_SCALER );

    // Read scaler report status
    bInterlace = msGetInterlaceBit();

    if( bInterlace != g_bDetectInterlace_LastInterlaceFlag )
        ++ g_ucDetectInterlace_StableCounter;
    else
        g_ucDetectInterlace_StableCounter = 0;

    if( (ucFlag&_BIT0) || (g_ucDetectInterlace_StableCounter>20) )
    {
        g_ucDetectInterlace_StableCounter = 0;
        g_bDetectInterlace_LastInterlaceFlag = bInterlace;

        if( bInterlace )
        {
            msWriteBit( BK0_0E_INTLX, 1, _BIT3 ); // to be checked!!
            msWriteByteMask( BK0_36_VDSUSG, 0x0C, 0x0C );
            //putstr("\r\nInterlace");
        }
        else // Non-interlace
        {
            msWriteBit( BK0_0E_INTLX, 0, _BIT3 );
            msWriteByteMask( BK0_36_VDSUSG, 0x00, 0x0C );
            //putstr("\r\nNon-Interlace");
        }

        msLineBufferDelayCtl( bInterlace ); // For detect interlace
    }
    msWriteByte( BK0_00_REGBK, ucBank );
}


⌨️ 快捷键说明

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