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

📄 msvd.c

📁 Maria2 CarTV 20060707 Tony
💻 C
📖 第 1 页 / 共 4 页
字号:
    }
    else if( g_ucNoiseDebounce == 0 )
    {
        bNoisy_Det = 0;
    }

    if( bLastNoisyStatus != bNoisy_Det )
    {
        if( bNoisy_Det ) // Noise mode
        {
            putstr("\r\nNoise mode");
            msVDDSPWriteByte( DSP_84, msVDDSPReadByte(DSP_84)|(_BIT1) ); // Noise mode
            msWriteByteMask( BK2_38_VSTROBE_LIMIT, 0x07, 0x07 );
            msWriteByteMask( BK2_97_EDGES_CLEAN_TH, 0x80, 0xC0 ); // [7:6]='10' (slice input IIR8)
            msWriteByte( BK2_73_INI_CTRL2, 0xF0 ); // V-Slice=6/8,H-Slice=6/8
            msWriteByte( BK2_79_656_HDES1, 0x16 );
            msWriteByte( BK2_7A, 0xA0 ); // HDES

            if( g_VdInfo.ucVideoSystem != SIG_SECAM )
            {
                msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
                msWriteByteMask( BK3_6F_MAX_CRMA, 0x03, 0x03 ); // Cb/Cr low pass mode
            }
        }
        else // Clean mode
        {
            putstr("\r\nClean mode");
            msVDDSPWriteByte( DSP_84, msVDDSPReadByte(DSP_84)&(~_BIT1) ); // Clean mode
            msWriteByteMask( BK2_38_VSTROBE_LIMIT, 0x03, 0x07 );
            msWriteByteMask( BK2_97_EDGES_CLEAN_TH, 0x00, 0xC0 ); // [7:6] = '00' (slice input CCTRAP)
            msWriteByte( BK2_73_INI_CTRL2, 0x10 ); // V-Slice=2/8,H-Slice=4/8
            msWriteByte( BK2_79_656_HDES1, 0x18 );
            msWriteByte( BK2_7A, 0x20 ); // HDES

            if( g_VdInfo.ucVideoSystem != SIG_SECAM )
            {
                msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
                msWriteByteMask( BK3_6F_MAX_CRMA, 0x00, 0x03 ); // Cb/Cr low pass mode
            }
        }
        bLastNoisyStatus = bNoisy_Det;
    }

    msWriteByte( BK0_00_REGBK, ucBank );
}

///////////////////////////////////////////////////////////////////////////////////////////////////
void msVDCombHandler(void)
{
    BYTE ucBank;
    WORD wHTotalDiff;

//    if( g_ucMsVDCombHandler_Timer )
//        return;

//    g_ucMsVDCombHandler_Timer = 100;

    ucBank = msReadByte( BK0_00_REGBK);

    msWriteByte( BK0_00_REGBK, REG_BANK2_VD);

    wHTotalDiff = abs( msVDDSPRead2Bytes( 0x3C ) - tVideoSystemStdHTotal[g_VdInfo.ucVideoSystem] );

    msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
    if( (msReadByte( BK3_10_COMBCFGA)&3) == 2 ) // Current is 2D
    {
        if( wHTotalDiff >= 6 )
            msWriteByteMask(BK3_10_COMBCFGA, 0x01, 0x07); // Switch to 1D
    }
    else // Current is 1D
    {
        if( wHTotalDiff <= 4 )
            msWriteByteMask(BK3_10_COMBCFGA, 0x02, 0x07); // Switch to 2D
    }

    if( g_ucmsVDCtl&MSVD_CTL_FLAG_COMB_LINE_BUF ) // For debug
        msVDCombLineBufferCtl( MSVD_COMB_LINE_BUFFER_CTL_SW );

    msWriteByte( BK0_00_REGBK, ucBank );
}



#if(ENABLE_VCR_HANDLER)
BYTE msVDGetVCRFoundCounter(void)
{
    return msVDSpecialRead( 0x2B, 0x01 )>>4;
}
#endif

#if(ENABLE_VCR_HANDLER)
XDATA BOOL g_bVDVCRHandler_VCRMode;
XDATA WORD g_wVDVCRHandler_Grade;

void msVDVCRHandlerReset(void)
{
    g_bVDVCRHandler_VCRMode = 0;
    g_wVDVCRHandler_Grade = 0;
}

void msVDVCRHandler(void)
{
    //BYTE ucBank;
    bit bCurVCRMode = 0;
    BYTE ucVCRCnt;

    //if( g_ucVDVCRHandler_Timer )
    //    return;

    //g_ucVDVCRHandler_Timer = 10;


    //ucBank = msReadByte( BK0_00 );
    //msWriteByte( BK0_00, REG_BANK2_VD );

    ucVCRCnt = msVDGetVCRFoundCounter();

    /*
    if( g_ucMSVDDebug2&MSVD_CTL2_FLAG_VCR )
    {
        if( ucVCRCnt == 0x0F )
            printf("[%x]",ucVCRCnt);
        else
            printf(" %x ",ucVCRCnt);
    }
    */

    if( g_bVDVCRHandler_VCRMode )
    {
        if( ucVCRCnt == 0x0F )
        {
            if( g_wVDVCRHandler_Grade < 150 )
                g_wVDVCRHandler_Grade ++;
        }
        else if( ucVCRCnt == 0x0D )
            g_wVDVCRHandler_Grade -= 2;
        else if( ucVCRCnt < 0x0D )
            g_wVDVCRHandler_Grade -= 10;

        if( g_wVDVCRHandler_Grade <= 10 )
        {
            g_bVDVCRHandler_VCRMode = 0;
            putstr("\r\nNot VCR mode");
        }
    }
    else
    {
        if( ucVCRCnt == 0x0F )
            g_wVDVCRHandler_Grade += 2;
        else if( ucVCRCnt <= 0x0E )
            g_wVDVCRHandler_Grade = 0;

        if( g_wVDVCRHandler_Grade >= 150 )
        {
            g_bVDVCRHandler_VCRMode = 1;
            putstr("\r\nVCR mode");
        }
    }

    //msWriteByte( BK0_00, ucBank );
}
#endif

void Fsm_ResetHandle(void)
{
        if(g_VdInfo.wVideoStatus&VD_HSYNC_LOCKED&&g_bVDColorBurstHandler_LastColorBurstStatus&&g_VdInfo.ucVideoSystem!=SIG_SECAM)
        {
    	    if(msDSP_Std_GetPhaseError()>0x60&&msDSP_Std_GetNoiseMag()<0x20)
    	    {
        	    ++g_ucPhaseErrorDetectCounter;
                if(g_ucPhaseErrorDetectCounter>5)
                    {
                        g_ucPhaseErrorDetectCounter=0;
                        msVD_FSM_Reset();
                    }
    	    }
            else
            {
                g_ucPhaseErrorDetectCounter=0;
            }
        }
        else
        {
            g_ucPhaseErrorDetectCounter=0;
        }
}


//#define VD_FORCE_AUTO       0
//#define VD_FORCE_PAL        1   // 443 50Hz
//#define VD_FORCE_NTSC_443   2   // 443 60Hz
//#define VD_FORCE_PAL_358    3   // 358 ( 60Hz -> PAL_M, 50Hz -> PAL_NC )
//#define VD_FORCE_NTSC       4   // 358 60Hz
//#define VD_FORCE_SECAM      5   // 428 50Hz

void msVDForceSystem( BYTE ucSystem )
{
    g_ucMSVDForceSystem = ucSystem;
}

#if( ENABLE_HSYNC_HANDLER )
void msVDHSyncHandlerReset(void)
{
    BYTE ucBank;

    ucBank = msReadByte( BK0_00_REGBK);
    msWriteByte( BK0_00_REGBK, REG_BANK2_VD );

    msWriteBit( BK2_4E_BK_WINDOW1, 0, _BIT7 ); // Use defalut Back-Porch window center position

    msWriteByte( BK0_00_REGBK, ucBank );
}
void msVDHSyncHandler(void)
{
    BYTE ucBank;

    if( g_ucVDHSyncHandler_Timer )
        return;

    g_ucVDHSyncHandler_Timer = 0xFF;


    ucBank = msReadByte( BK0_00_REGBK);
    msWriteByte( BK0_00_REGBK, REG_BANK2_VD );

    if( (g_VdInfo.ucVideoSystem == SIG_NTSC) && (msVDDSPReadByte( DSP_3A ) > 85) )
    {
        if( !(msReadByte( BK2_4E_BK_WINDOW1)&_BIT7) )
        {
            msWriteBit( BK2_4E_BK_WINDOW1, 1, _BIT7 );
            msWriteByte( BK2_4F_BK_WINDOW2, 0x76 ); // Right shift Back-Porch window center position
        }
    }
    else
    {
        if( (msReadByte( BK2_4E_BK_WINDOW1)&_BIT7) )
        {
            msWriteBit( BK2_4E_BK_WINDOW1, 0, _BIT7 ); // Use defalut Back-Porch window center position        }
        }
    }

    msWriteByte( BK0_00_REGBK, ucBank );
}
#endif

#if( ENABLE_PAL_SWITCH_HANDLER )
#define PAL_SWITCH_AUTO         0
#define PAL_SWITCH_FORCE_PAL    1
#define PAL_SWITCH_FORCE_NTSC   2

void msVDPalSwitchCtl( BYTE ucCtl )
{
    BYTE ucBank;

    if(VD_Type==MARIA2_B)
        return;

    ucBank = msReadByte( BK0_00_REGBK);
    msWriteByte( BK0_00_REGBK, REG_BANK2_VD );

    if( ucCtl == PAL_SWITCH_AUTO )
    {
        msWriteByteMask(BK2_21_APLL_CTRL2, 0x00, 0x06); // Auto detect PAL/NTSC
    }
    else if( ucCtl == PAL_SWITCH_FORCE_PAL )
    {
        msWriteByteMask(BK2_21_APLL_CTRL2, 0x06, 0x06); // Force PAL
    }
    else if( ucCtl == PAL_SWITCH_FORCE_NTSC )
    {
        msWriteByteMask(BK2_21_APLL_CTRL2, 0x04, 0x06); // Force NTSC
    }

    msWriteByte( BK0_00_REGBK, ucBank );
}

void msVDPalSwitchHandlerReset(void)
{
    msVDPalSwitchCtl( PAL_SWITCH_AUTO );
    g_ucPalSwitchHandler_Timer = 250;
}

void msVDPalSwitchHandler(void)
{
    WORD wStatus;

    if( g_ucPalSwitchHandler_Timer )
        return;

    g_ucPalSwitchHandler_Timer = 100;

    wStatus = msVDGetSyncStatus();

    if((wStatus&VD_HSYNC_LOCKED)   // Has signal
      &&((wStatus&VD_MODE_DETECT_MASK) == (g_VdInfo.wVideoStatus&VD_MODE_DETECT_MASK))
      &&(msDSP_Std_GetNoiseMag() > 0x20)) // Clean signal
        {
            if( wStatus&VD_VSYNC_50HZ ) // SECAM/PAL/PAL_NC
                msVDPalSwitchCtl( PAL_SWITCH_FORCE_PAL ); // Force PAL
            else // 60Hz
                msVDPalSwitchCtl( PAL_SWITCH_AUTO );
        }
    else
        {
            msVDPalSwitchCtl( PAL_SWITCH_AUTO );
            g_ucPalSwitchHandler_Timer = 255;
        }
}
#endif

typedef enum _DplSel
{
    DPL_SEL_FAST,
    DPL_SEL_NORMAL,
    DPL_SEL_NORMAL2,
    DPL_SEL_NOISY,
    DPL_SEL_VCR,
    DPL_SEL_SYNC_50,
    DPL_SEL_SYNC_20,
    DPL_SEL_NO_COLOR,
    DPL_SEL_NUMS
} EnuDplSel;


code BYTE tDplCoef[DPL_SEL_NUMS][2] =
{   //   K1      K2
    {   0x30,   0x65    },  // DPL_SEL_FAST,
    {   0x2B,   0x40    },  // DPL_SEL_NORMAL,
    {   0x2B,   0x40    },  // DPL_SEL_NORMAL2, noise > 0x10
    {   0x2B,   0x40    },  // DPL_SEL_NOISY,
    {   0x34,   0x2C    },  // DPL_SEL_VCR,
    {   0x1A,   0x35    },  // DPL_SEL_SYNC_50,
    {   0x10,   0x10    },  // DPL_SEL_SYNC_20
    {   0x01,   0x02    },  // DPL_SEL_NO_COLOR
};

void msVDAFECHandler(void)
{
    BYTE ucBank;
    BYTE ucDplSel = DPL_SEL_NORMAL;

//    if( g_ucAFECHnadler_Timer )
//        return;
//    g_ucAFECHnadler_Timer = 50;

    ucBank = msReadByte( BK0_00_REGBK );

	if( VD_AGC_GetSyncMag() < 130 ) // 50%
	{
	    if( VD_AGC_GetSyncMag() < 50 ) // 20%
			ucDplSel = DPL_SEL_SYNC_20;
          else
			ucDplSel = DPL_SEL_SYNC_50;
	}
	else
	{
	       WORD wCurSyncStatus = msVDGetSyncStatus();
              if( (wCurSyncStatus&VD_MODE_DETECT_MASK) != (g_VdInfo.wVideoStatus&VD_MODE_DETECT_MASK) )// Sync change
              {
                ucDplSel = DPL_SEL_FAST;
              }
		else if( bNoisy_Det )
		{
    		ucDplSel = DPL_SEL_NOISY;
		}
    #if( ENABLE_VCR_HANDLER )
		else if( g_bVDVCRHandler_VCRMode )
		{
    		ucDplSel = DPL_SEL_VCR;
		}
    #endif
		else
		{
		    if( g_ucAFECHnadler_LaseDplSel == DPL_SEL_NORMAL2 )
		    {
                if( msDSP_Std_GetNoiseMag() < 0x0D )
                    ucDplSel = DPL_SEL_NORMAL;
		    }
		    else
		    {
                if( msDSP_Std_GetNoiseMag() >= 0x10 )
                    ucDplSel = DPL_SEL_NORMAL2;
                else
                    ucDplSel = DPL_SEL_NORMAL;
		    }
		}
	}

	msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
	msWriteByte( BK2_A0_DPL_K1_FORCE, tDplCoef[ucDplSel][0]|_BIT7 );
    msWriteByte( BK2_A1_DPL_K2_FORCE, tDplCoef[ucDplSel][1] );

    msWriteByte( BK0_00_REGBK, ucBank );
}


void msVideoAGCHandle(void)
{
    BYTE TempAGCValue;
    BYTE TempNoiseValue=msDSP_Std_GetNoiseMag();

    if(TempNoiseValue>=10)
      return;

    TempAGCValue =(VD_AGC_GetCurGain()>>8);

    if(TempAGCValue==g_VideoSetting.videoAGC)
        {
            g_ucLastVideoAGC=g_VideoSetting.videoAGC;
            g_ucVideoAGCCount=0;
        }
    else
        {
            if(TempAGCValue==g_ucLastVideoAGC)
                g_ucVideoAGCCount++;
            else
                {
                    g_ucLastVideoAGC=TempAGCValue;
                    g_ucVideoAGCCount=0;
                }
        }

    if(g_ucVideoAGCCount>50)
        {
            g_ucVideoAGCCount=0;
            if((TempAGCValue>=5)&&(TempAGCValue<=12))
                {
                    g_VideoSetting.videoAGC=TempAGCValue;
                    SaveVideoSetting();
                }
        }
}

⌨️ 快捷键说明

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