📄 msvd.c
字号:
{
if( wVideoStatus&VD_VSYNC_50HZ ) // 50Hz
{
switch( wVideoStatus&VD_FSC_TYPE )
{
case VD_FSC_4285: // SECAM
ucSignalType = SIG_SECAM;
putstr("[SECAM]");
break;
case VD_FSC_4433: // 4.43361875MHz, PAL or NTSC443 or PAL(60)
ucSignalType = SIG_PAL;
putstr("[PAL]");
break;
case VD_FSC_3579: // 3.579545MHz, NTSC
case VD_FSC_3575: // 3.57561149MHz,PAL(M)
case VD_FSC_3582: // 3.58205625MHz,PAL(Nc)
default:
ucSignalType = SIG_PAL_NC;
putstr("[PAL-NC]");
break;
}
}
else // 60Hz
{
switch( wVideoStatus&VD_FSC_TYPE )
{
case VD_FSC_4285: // SECAM
putstr("[SECAM60??-->");
case VD_FSC_4433: // 4.43361875MHz, PAL or NTSC443 or PAL(60)
if( wVideoStatus&VD_PAL_SWITCH )
{
ucSignalType = SIG_PAL_60;
putstr("[PAL-60]");
}
else
{
ucSignalType = SIG_NTSC_443;
putstr("[NTSC-443]");
}
break;
case VD_FSC_3579: // 3.579545MHz, NTSC
case VD_FSC_3575: // 3.57561149MHz,PAL(M)
case VD_FSC_3582: // 3.58205625MHz,PAL(Nc)
default:
if( wVideoStatus&VD_PAL_SWITCH )
{
ucSignalType = SIG_PAL_M;
putstr("[PAL-M]");
}
else
{
ucSignalType = SIG_NTSC;
putstr("[NTSC]");
}
break;
}
}
}
return ucSignalType;
}
void msVDColorKill( BOOL bColorKill )
{
msWriteByte( BK0_00_REGBK, REG_BANK2_VD);
if( bColorKill ) // COLOR_OFF
{
printMsg("color kill");
msWriteByteMask( BK2_55_COLOR_OFF, 0xC0, 0xC0 );
msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
msWriteByteMask( BK3_60_IMGCTRL, 0x00, 0x30 ); // Disable Auto Chrom Gain
if( msDSP_Std_GetNoiseMag() < 10 )
msWriteByteMask(BK3_21_COMB2DCFGB, 0x30, 0x70); // Notch mode of Y
else
msWriteByteMask(BK3_21_COMB2DCFGB, 0x20, 0x70); // Notch mode of Y
}
else // COLOR return
{
printMsg("color return");
msWriteByteMask( BK2_55_COLOR_OFF, 0x80, 0xC0 );
msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
msWriteByteMask(BK3_21_COMB2DCFGB, 0x60, 0x70); // Notch mode of Y
msWriteByteMask( BK3_60_IMGCTRL, 0x10, 0x30 ); // Enable HW Auto Chrom Gain
}
msWriteByte( BK0_00_REGBK, REG_BANK_SCALER);
}
void msVDLineLockCtl( BOOL bLock )
{
BYTE ucBank;
ucBank = msReadByte( BK0_00_REGBK );
msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
if( bLock )
{
msVDDSPWriteByte( DSP_20, 0x00 );
msVDDSPWriteByte( DSP_21, 0x80 );
//if( (g_VdInfo.wVideoStatus&VD_FSC_TYPE) != VD_FSC_4XXX ) // NTSC
{
msWriteBit( BK2_23_APLL_TRANGE, 1, _BIT0 ); // 20060103.Daniel
msWriteByte( BK2_26_APL_K1_NORMAL, 0x04 ); // APL_K1: 20060328.CY.Ko
msWriteByte( BK2_27_APL_K2_NORMAL, 0 ); // APL_K2
}
g_bVDCurLineLockStatus = 1;
putstr("\r\nLine Lock");
}
else
{
msVDDSPWriteByte( DSP_20, 0x00 );
msVDDSPWriteByte( DSP_21, 0x00 );
msWriteBit( BK2_23_APLL_TRANGE, 0, _BIT0 ); // 20060103.Daniel
msWriteByte( BK2_26_APL_K1_NORMAL, 0x10 ); // APL_K1: 20060328.CY.Ko
msWriteByte( BK2_27_APL_K2_NORMAL, 0x08 ); // APL_K2
g_bVDCurLineLockStatus = 0;
putstr("\r\nNo Line Lock");
}
msVDCombLineBufferCtl( MSVD_COMB_LINE_BUFFER_CTL_SW );
msWriteByte( BK0_00_REGBK, ucBank );
}
void msVDColorBurstHandler(BYTE ucFlag)
{
bit bCurColorBurstStatus;
if (g_bForceColorEnable)
return;
if( ucFlag&VD_COLOR_BURST_HANDLER_RESET )
{
msVDColorKill(FALSE);
msVDLineLockCtl( _DISABLE );
msDSP_Std_Init(); // ???
msVD_FSC_ResetColorBurstStatus();
bCurColorBurstStatus = 1;
g_bVDColorBurstHandler_LastColorBurstStatus = 1;
g_ucVDColorBurstHandlerStableCounter = 0;
g_wVDColorBurstHandlerTimer = 400;
}
else if( 0 == g_wVDColorBurstHandlerTimer )
{
if( g_VdInfo.ucVideoSystem == SIG_SECAM )
{
return;
}
g_wVDColorBurstHandlerTimer = 20;
bCurColorBurstStatus = msVDGetColorLockBit();
if( bCurColorBurstStatus != g_bVDColorBurstHandler_LastColorBurstStatus )
{
++ g_ucVDColorBurstHandlerStableCounter;
if(g_ucVDColorBurstHandlerStableCounter >= 5)
{
g_ucVDColorBurstHandlerStableCounter = 0;
g_bVDColorBurstHandler_LastColorBurstStatus = bCurColorBurstStatus;
if( bCurColorBurstStatus ) // Has color
{
msVDColorKill(FALSE);
}
else // No color
{
msVDColorKill(TRUE);
}
g_wVDColorBurstHandlerTimer = 100;
}
}
else
{
g_ucVDColorBurstHandlerStableCounter = 0;
}
// Line lock handler
{
bit bForceLineLock = 0;
// Detect if should line lock
if( ( g_bVDColorBurstHandler_LastColorBurstStatus == 0 ) // Color kill
&&( ( msDSP_Std_GetBurstMag() < 0x23 ) ))// No burst pattern
bForceLineLock = 1;
if( bForceLineLock != g_bVDCurLineLockStatus )
{
g_ucMSVDSwitchLineLockCnt ++;
if( g_ucMSVDSwitchLineLockCnt >= 5 )
{
g_ucMSVDSwitchLineLockCnt = 0;
if( bForceLineLock )
{
msVDLineLockCtl(_ENABLE); // Switch to line lock
//putstr("\r\nLine lock");
}
else
{
msVDLineLockCtl(_DISABLE); // Switch to no line lock
//putstr("\r\nNo Line lock");
}
}
}
else
{
g_ucMSVDSwitchLineLockCnt = 0;
}
}
}
//else
//msVD_FSC_Detect();
}
code StuVideoSystemInfo tVideoSystemInfo[SIG_NUMS] =
{
{ MSVD_HTOTAL_NTSC, MSVD_HACTIVE_NTSC },// SIG_NTSC, // M
{ MSVD_HTOTAL_PAL, MSVD_HACTIVE_PAL },// SIG_PAL, // B/G, D/K, I, H, N
{ MSVD_HTOTAL_SECAM, MSVD_HACTIVE_SECAM },// SIG_SECAM,
{ MSVD_HTOTAL_NTSC_443, MSVD_HACTIVE_NTSC_443 },// SIG_NTSC_443,
{ MSVD_HTOTAL_PAL_60, MSVD_HACTIVE_PAL_60 },// SIG_PAL_60,
{ MSVD_HTOTAL_PAL_M, MSVD_HACTIVE_PAL_M },// SIG_PAL_M,
{ MSVD_HTOTAL_PAL_NC, MSVD_HACTIVE_PAL_NC },// SIG_PAL_NC,
};
void msVDSetupMode( WORD wStatus, BYTE ucSignalType)
{
BYTE ucBank;
ucBank = msReadByte( BK0_00_REGBK);
msVDColorBurstHandler( VD_COLOR_BURST_HANDLER_RESET );
//if( g_ucmsVDCtl&MSVD_CTL_FLAG_NOISE_HANDLER )
msVDNoiseHandlerReset();
#if(ENABLE_VCR_HANDLER)
if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_VCR )
msVDVCRHandlerReset();
#endif
//if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_AGC_PROCESSOR )
{
if( wStatus&VD_HSYNC_LOCKED )
VD_AGC_SetFscThreshold(wStatus&VD_VSYNC_50HZ);
}
#if( ENABLE_HSYNC_HANDLER )
//if( g_ucmsVDCtl2&MSVD_CTL2_FLAG_HSYNC )
{
msVDHSyncHandlerReset();
}
#endif
// Setup VD H total and DE width
{
WORD wHTotal;
WORD wHActive;
if( wStatus&VD_HSYNC_LOCKED )
{
wHTotal = tVideoSystemInfo[ucSignalType]._wHTotal;
wHActive = tVideoSystemInfo[ucSignalType]._wHActive;
}
else
{
if( wStatus&VD_VSYNC_50HZ )
{
wHTotal = tVideoSystemInfo[SIG_PAL]._wHTotal;
wHActive = tVideoSystemInfo[SIG_PAL]._wHActive;
}
else
{
wHTotal = tVideoSystemInfo[SIG_NTSC]._wHTotal;
wHActive = tVideoSystemInfo[SIG_NTSC]._wHActive;
}
}
wHActive += 24;
msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
if( wHActive > 1024 )
msWriteByte( BK2_7B_656_HDEW, 0 ); // 656_HDEW
else
{
#if(PANEL_ANALOG_TCON)
msWriteByte( BK2_7B_656_HDEW, ((((wHActive)-4)/4)+0x20) ); // 656_HDEW
#else
msWriteByte( BK2_7B_656_HDEW, (((wHActive)-4)/4)); // 656_HDEW
#endif
}
#if(PANEL_TYPE==PanelPVI030_AT)
msWriteByte( BK2_9D_DPL_NSPL_HIGH, _656_PLL_VALUE ); // bit3~10
msWriteByte( BK2_9E_DPL_NSPL_LOW, (wHTotal&7)<<5 ); // bit0~2
#else
wHTotal -= 1;
msWriteByte( BK2_9D_DPL_NSPL_HIGH, (wHTotal/8) ); // bit3~10
msWriteByte( BK2_9E_DPL_NSPL_LOW, (wHTotal&7)<<5 ); // bit0~2
#endif
}
msWriteByte( BK0_00_REGBK, REG_BANK2_VD );
msWriteByte( BK0_00_REGBK, REG_BANK3_COMB );
// if( wStatus&VD_VSYNC_50HZ ) // 50 Hz
// {
// msWriteByteMask(BK3_40, 0x03, 0x03); // Force 625 lines
// }
// else // 60 Hz
// {
// msWriteByteMask(BK3_40, 0x02, 0x03); // Force 525 lines
// }
if( VD_Type == MARIA2_D )
{
if( ucSignalType == SIG_SECAM )
msWriteByte( BK3_6F_MAX_CRMA, 0x0F );
else
msWriteByte( BK3_6F_MAX_CRMA, 0x04 );
}
if( IsCVBSInUse())
{
if( ucSignalType == SIG_NTSC_443 )
{
msWriteByteMask(BK3_48_BSTLVL_TH, 0x20, 0x30); // Pipe delay
msWriteByteMask(BK3_21_COMB2DCFGB, 0x03, 0x07); // Notch mode of C
}
else
{
msWriteByteMask(BK3_48_BSTLVL_TH, 0x00, 0x30); // Pipe delay off
msWriteByteMask(BK3_21_COMB2DCFGB, 0x07, 0x07); // Notch mode of C
}
msWriteByte( BK3_62, 0xA0 );
msWriteByte( BK3_2F, 0x00 );
}
else if( IsSVideoInUse())// SV
{
if( SIG_NTSC_443 == ucSignalType || SIG_NTSC == ucSignalType )
msWriteByteMask(BK3_48_BSTLVL_TH, 0x20, 0x30); // Pipe delay
else
msWriteByteMask(BK3_48_BSTLVL_TH, 0x00, 0x30); // Pipe delay off
msWriteByte( BK3_62, 0x5F ); //20060222
msWriteByte( BK3_2F, 0x00 );
}
SetChromaMode();
msVDCombLineBufferCtl( MSVD_COMB_LINE_BUFFER_CTL_HW_AUTO );
msWriteByte( BK0_00_REGBK, ucBank );
}
void msCommSetupMode()
{
msFieldDetectCtl();
// Setup interlace relative register
msDetectInterlace(1); // For setup mode
if( IsCVBSInUse())
{
#if TV_ENABLE
if( IsTVInUse() )
msLPFCtl(LPF_CTL_TV_STRONG);
else
#endif
msLPFCtl(LPF_CTL_TV_NORMAL);
}
}
#if( ENABLE_SECAM )
XDATA BYTE g_ucMSVDSecamCtl;
void msVDSecamColorCtl( BOOL bColorOn )
{
BYTE ucData = 0x0C;
BYTE ucBank;
ucBank=msReadByte(BK0_00_REGBK);
if( bColorOn )
ucData = 0x00;
msWriteByte( BK0_00_REGBK, REG_BANK3_COMB);
msWriteByteMask( BK3_C5, ucData, 0x0C);
msWriteByte(BK0_00_REGBK, ucBank);
}
void msVDSecamHandler(void)
{
BYTE ucBank;
if( g_ucVDSecamHandlerTimer )
return;
g_ucVDSecamHandlerTimer = 20;
ucBank = msReadByte( BK0_00_REGBK);
//if( VD_Type < MARIA2_E ) //junjian 061205 for SECAM to NTSC
{
WORD wVdStatus;
wVdStatus = msVDGetSyncStatus();
if(wVdStatus&VD_VSYNC_50HZ) //junjian 061205 for SECAM to NTSC
{
msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
msWriteByte(BK2_19_MVDET_EN, 0xC2);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
else
{
msWriteByte(BK0_00_REGBK, REG_BANK2_VD);
msWriteByte(BK2_19_MVDET_EN, 0xC0);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
}
if(wVdStatus&VD_HSYNC_LOCKED)
{
msVDSecamColorCtl(_ENABLE);
}
else
{
msVDSecamColorCtl(_DISABLE);
}
}
// Adjust Secam detect threoshold by burst mag
// BurstMag>>4 = 6, 0B0A09 = 002160
{
BYTE ucBurstMag;
DWORD dwData;
BYTE ucNoiseMag;
BYTE ucBurstPhsErr;
BYTE ucSecamBurstPhsErr;
ucBurstMag = msDSP_Std_GetBurstMag()>>4;
dwData = ((DWORD)0x2160*(DWORD)ucBurstMag)/6;
dwData = (dwData>>3)+ (g_dwVDSecamHandler_PreMagThl-(g_dwVDSecamHandler_PreMagThl>>3));
ucBurstPhsErr = msDSP_Std_GetPhaseError();
ucSecamBurstPhsErr = msDSP_Std_GetSecamPhaseError();
ucNoiseMag = msDSP_Std_GetNoiseMag()>>1;
g_wVDSecamHandler_PreNoiseMag = ucNoiseMag;
if ((g_VdInfo.ucVideoSystem == SIG_PAL) && (ucNoiseMag >= 0x10))
{
if (ucSecamBurstPhsErr <= 0x5B)
g_ucVDSecamThdCnt ++ ;
else if (ucSecamBurstPhsErr >= 0x60)
g_ucVDSecamThdCnt -= 8 ;
if (g_ucVDSecamThdCnt > 128) // negative
g_ucVDSecamThdCnt = 0 ;
else if (g_ucVDSecamThdCnt > 48)
g_ucVDSecamThdCnt = 48 ;
}
else
g_ucVDSecamThdCnt = 0 ;
if( g_VdInfo.ucVideoSystem == SIG_SECAM )
{
if( ucNoiseMag < 3 )
{
if( dwData < 0x000590 )
dwData = 0x000590;
}
else if( ucNoiseMag < 10 )
{
if( dwData < 0x0010B0 )
dwData = 0x0010B0;
}
else if( (ucBurstMag<5 )||(ucNoiseMag >= 0x10) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -