📄 msvd.c
字号:
}
else // 60 Hz
{
// ucTmp = wVDStatus&VD_FSC_TYPE;
// if( (ucTmp == VD_FSC_3579)
// ||(ucTmp == VD_FSC_3575)
// ||(ucTmp == VD_FSC_3582)
// ||(ucTmp == VD_FSC_4433)
// )
{
#if 1 // HW detect PAL/NTSC
ucTmp = msVDSpecialRead( 0x00, BK2_03 );
if( ucTmp&_BIT5 )
wVDStatus |= VD_PAL_SWITCH;
#elif 0 // Force PAL
wVDStatus |= VD_PAL_SWITCH;
#else // Force NTSC
#endif
}
}
}
else
{
if( (g_ucMSVDForceSystem == VD_FORCE_PAL)||(g_ucMSVDForceSystem == VD_FORCE_PAL_358) )
{
wVDStatus |= VD_PAL_SWITCH;
}
}
// if( ucTmp&_BIT6 )
// wVDStatus |= VD_MACROVISION;
}
msWriteByte( BK0_00_REGBK, ucBank );
return wVDStatus;
}
//////////////////////////////////////////////////////
// Std 50/60 Vtotal FSC HTotal Color
//-----------------------------------------
// NTSC 60 525 358 910
// PAL-M 60 525 358 909 PAL-Switch
// NTSC-443 60 525 443 1127
// PAL-60 60 525 443 1127 PAL-Switch
// xxx 50 625 358
// PAL-Nc 50 625 358 917 PAL-Switch
// xxx 50 625 443
// PAL 50 625 443 1135 PAL-Switch
// SECAM 50 625 428 1097
///////////////////////////////////////////////////////
BYTE msVDGetVideoSystem( WORD wVideoStatus )
{
BYTE ucSignalType = SIG_NONE;
putstr("\r\n");
if( wVideoStatus&VD_HSYNC_LOCKED )
{
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)
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)
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( 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, 0xC0 );
}
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -