📄 devvd.c
字号:
#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 + -