📄 msvd.c
字号:
}
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 + -