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

📄 devvd.c

📁 主要用于液晶电视解码,内置51单片机,全部代码用C编写,编译环境为KEILC
💻 C
📖 第 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 "M2_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 );
	msVD_FSC_SetColorKillLevel( 0x23, 0x18, 0x50, 0x60 );

	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();
    VD_AGC_SetStartGain(g_uwVideoAGC);
    VD_AGC_SetNoSyncGain(g_uwVideoAGC);
    VD_AGC_SetMaxGain(0x2f00);

    // 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
}


#if TV_ENABLE
void ResetupMode(void)
{

    g_VdInfo.wVideoStatus = msVDGetSyncStatus();

    if( g_VdInfo.wVideoStatus&VD_VSYNC_50HZ ) // 50Hz
        {
        g_VdInfo.ucVideoSystem = SIG_PAL;
        g_ucSrcModeIndex = MD_720x576_50I;
        }
    else // 60Hz
        {
        g_VdInfo.ucVideoSystem = SIG_NTSC;
        g_ucSrcModeIndex = MD_720x480_60I;
        }

    g_InOutCtl.bInterlace = 1;

// Check signal type
    if( IsVideoPortInUse())
        {
        g_VdInfo.ucVideoSystem = msVDGetVideoSystem( g_VdInfo.wVideoStatus );
        msVDSetupMode( g_VdInfo.wVideoStatus, g_VdInfo.ucVideoSystem );
        }

    SetOutputTimingAndWindow( OUTPUT_SIG ); // TV auto scan: has signal
}
#endif


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;
        printMsg("VD setup mode");

        g_bForceColorEnable=FALSE;
        g_VdInfo.bVideoDoModeSetting = FALSE;
	 Clr_SourceChangFlag();		//junjian 061205 for SECAM to NTSC
        if( wStatus& VD_HSYNC_LOCKED ) // Has signal
        {
            // 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
	    {
	            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();
	msCheckBK0_57_Value(1);

    	if(g_ucMenuPageIndex==RootMenu)
    		Set_ShowSourceFlag();

    	g_ucSyncMaxStableCounter=0;

        ucBank = msReadByte( BK0_00_REGBK );
        msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
        DSP10_Value=msVDDSPReadByte( 0x10 );
      while(DSP10_Value!=0x85)
        {
            Delay1ms(2);
            msVDDSPWriteByte(DSP_10, 0x85);
            msVDDSPWriteByte(DSP_11, 0x00);
            Delay1ms(1);
            DSP10_Value=msVDDSPReadByte( 0x10 );
        }
        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;

⌨️ 快捷键说明

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