📄 devvd.c
字号:
{
g_ucDetectInterlace_StableCounter = 0;
g_bDetectInterlace_LastInterlaceFlag = bInterlace;
if( bInterlace )
{
msWriteBit( BK0_0E_INTLX, 1, _BIT3 ); // to be checked!!
msWriteByteMask( BK0_36_VDSUSG, 0x0C, 0x0C );
//putstr("\r\nInterlace");
}
else // Non-interlace
{
msWriteBit( BK0_0E_INTLX, 0, _BIT3 );
msWriteByteMask( BK0_36_VDSUSG, 0x00, 0x0C );
//putstr("\r\nNon-Interlace");
}
msLineBufferDelayCtl( bInterlace ); // For detect interlace
}
msWriteByte( BK0_00_REGBK, ucBank );
}
BOOL msGetInterlaceBit(void)
{
BOOL bInterlace = 0;
BYTE ucBank = msReadByte( BK0_00_REGBK);
msWriteByte( BK0_00_REGBK, REG_BANK_SCALER );
if( msReadByte( BK0_EF_STATUS2)&_BIT3 )
bInterlace = 1;
msWriteByte( BK0_00_REGBK, ucBank );
return bInterlace;
}
void msFieldDetectCtl(void)
{
BYTE ucBank;
ucBank = msReadByte( BK0_00_REGBK);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER );
#if VGA_ENABLE
if( IsVGAInUse()) // VGA
{
/*
if(StandardModeFlag&bInterlaceMode)
msWriteByte(BK0_E4_ISOVRD, 0x03);
else
*/
msWriteByte(BK0_E4_ISOVRD, 0x00);
msWriteByte(BK0_E5_MDCTRL, 0x00);
}
else
#endif
{
msWriteByte(BK0_E4_ISOVRD, 0x03);
#if (ENABLE_VD_DSP)
msWriteByte(BK0_E5_MDCTRL, 0x04); // 20051114
#elif(ENABLE_SW_FILED)
msWriteByte(BK0_E5_MDCTRL, 0x04); // 20060116
#else
msWriteByte(BK0_E5_MDCTRL, 0x00);
#endif
}
msWriteByte( BK0_00_REGBK, ucBank );
}
void msLPFCtl( BYTE ucLPFParaIdx )
{
BYTE ucBank;
BYTE code tLPFPara[][5] = {
//{ 0x7F, 0x03, 0x3C, 0x05, 0x1A }, // VD 443
//{ 0x7E, 0x04, 0x3C, 0x04, 0x1C }, // VD 358
//{ 0x7F, 0x03, 0x3B, 0x06, 0x1A }, // PC, YPbPr
{ 0x42, 0x01, 0x3C, 0x07, 0x14 }, // TV, Strong
//{ 0x3F, 0x03, 0x3C, 0x05, 0x1A }, // TV, Normal
{ 0x7F, 0x04, 0x3C, 0x04, 0x1A }, // AV
};
BYTE i;
ucBank = msReadByte( BK0_00_REGBK);
msWriteByte( BK0_00_REGBK, 1 );
if( ucLPFParaIdx == LPF_CTL_TURN_OFF )
msWriteBit(BK1_55_LPF_CTL, 0, _BIT6);
else
{
for( i = 0; i < 5; ++ i )
msWriteByte( BK1_50_LPF_TAP1+i, tLPFPara[ucLPFParaIdx][i]);
if( ucLPFParaIdx == LPF_CTL_TV_STRONG)
msWriteBit(BK1_55_LPF_CTL, 1, _BIT6);
else
msWriteBit(BK1_55_LPF_CTL, 0, _BIT6);
}
msWriteByte( BK0_00_REGBK, ucBank );
}
BYTE code tFreeRunColor[][2] =
{ // BK0_5C, BK0_5D
{ 0x00 , 0x00, }, // FREE_RUN_COLOR_BLACK
{ 0xFE|_BIT0, 0xFF, }, // FREE_RUN_COLOR_WHITE
{ 0x3E|_BIT0, 0x00, }, // FREE_RUN_COLOR_BLUE
};
void msSetBlueScreen( BOOL bEnable, BYTE ucColor )
{
BYTE ucBank;
ucBank=msReadByte(BK0_00_REGBK);
msWriteByte(BK0_00_REGBK, REG_BANK_SCALER);
if( bEnable )
{
//msFPLLCtl( FPLL_STOP );
msWriteBit(BK0_02_ISELECT, _ENABLE, _BIT7);
msSetupFreeRunMode(DEFAULT_OUTPUT_V_FREQ);
// Set screen color
msWriteByte( BK0_5C_FRAME_COLOR_1, tFreeRunColor[ucColor][0] );
msWriteByte( BK0_5D_FRAME_COLOR_2, tFreeRunColor[ucColor][1] );
}
else // Disable blue screen
{
#if VGA_ENABLE
if( IsVGAInUse() ) // PC/YPbPr
{
msWriteBit(BK0_5E_PATTERN, 1, _BIT1); // Let screen black
msWriteBit(BK0_02_ISELECT, _DISABLE, _BIT7); // Disable freerun
Delay1ms(300);
msWriteBit(BK0_5E_PATTERN, 0, _BIT1); // Disable screen black
}
else
#endif
msWriteBit(BK0_02_ISELECT, _DISABLE, _BIT7); // Disable freerun
}
msWriteByte(BK0_00_REGBK, ucBank);
}
#if( ENABLE_MONITOR_SIGNAL )
XDATA BYTE g_ucMonitorSignal_ChangeCounter;
void msMonitorSignal(BYTE ucFlag)
{
XDATA WORD wInHP;
XDATA WORD wInVT;
XDATA DWORD dwInHF;
bit bHSyncChange = 0;
bit bVTotalChange = 0;
if( ucFlag&MONITOR_SIGNAL_INIT )
{
g_ucMonitorSignal_ChangeCounter = 0;
return;
}
if( g_wMonitorSignal_Timer )
return;
g_wMonitorSignal_Timer = 100;
wInHP = msGetVideoHPeriod(0);
if( wInHP == 0 ) // H invalid
return;
wInVT = msVDGetVTotal();
if( abs(g_InOutCtl.inHPeriod - wInHP)>=20 ) // Nelson Modify 2006-05-15
{
bHSyncChange = 1;
bVTotalChange = 1;
}
else if( ( abs(g_InOutCtl.inVTotal - wInVT)>=50)) // Nelson Modify 2006-05-15
{
bVTotalChange = 1;
}
if( bHSyncChange || bVTotalChange )
{
++ g_ucMonitorSignal_ChangeCounter;
if( g_ucMonitorSignal_ChangeCounter >= 10 )
{
g_ucMonitorSignal_ChangeCounter = 0;
}
else
{
bHSyncChange = 0;
bVTotalChange = 0;
}
}
else
{
g_ucMonitorSignal_ChangeCounter = 0;
}
if( bHSyncChange || bVTotalChange )
{
if( bHSyncChange )
{
g_InOutCtl.inHPeriod = wInHP;
g_InOutCtl.inHFreq = dwInHF;
}
g_InOutCtl.inVTotal = wInVT;
msProgWindow(OUTPUT_FREERUN);
SetOutputClock(OUTPUT_FREERUN);
}
}
#endif
#if TV_ENABLE
BOOL msVDGetSyncStable( BYTE ucStableCount, WORD wMaxTime )
{
WORD wCurrentStatus;
BYTE ucStatusCount = 0;
do
{
VD_DSP();
wCurrentStatus = msVDGetSyncStatus(); //& (VD_HSYNC_LOCKED | VD_COLOR_LOCKED )//| VD_INTERLACED | VD_VSYNC_50HZ | VD_RESET_ON ); // check status
if( wCurrentStatus & VD_HSYNC_LOCKED ) // check stable
{
ucStatusCount ++;
if( ucStatusCount >= ucStableCount ) // stable counter
{
g_VdInfo.wVideoStatus=wCurrentStatus;
return TRUE;
}
}
Delay1ms(1);
}while( wMaxTime -- ); // while
return FALSE;
}
#endif
#if 0
void PrintVDStatus(WORD wStatus)
{
/*
WORD wTmp;
BYTE ucStatus2;
putstr("\r\n===============================");
printf("\r\nScaler_HPeriod=%d", msGetHorizontalPeriod() );
wTmp = msCalculateHFreqX10(msGetHorizontalPeriod());
printf("\r\nScaler_Freq=%d", wTmp/10);
printf(".%dKHz", wTmp%10);
printf("\r\nScaler_VTotal=%d", msGetVerticalTotal() );
wTmp = msCalculateVFreqX10(wTmp, msGetVerticalTotal())*2;
printf("\r\nScaler_VFreq=%d", wTmp/10 );
printf(".%dHz", wTmp%10 );
ucStatus2 = msVDCheckScalerStatus( CHECK_V_TOTAL|CHECK_V_FREQ );
if( ucStatus2&VD_H_PERIOD_INVALID ) putstr("\r\nVD_H_PERIOD_INVALID");
if( ucStatus2&VD_H_FREQ_INVALID ) putstr("\r\nVD_H_FREQ_INVALID");
if( ucStatus2&VD_V_TOTAL_INVALID ) putstr("\r\nVD_V_TOTAL_INVALID");
if( ucStatus2&VD_V_FREQ_INVALID ) putstr("\r\nVD_V_FREQ_INVALID");
*/
printf("msDSP_Std_GetNoiseMag====%x", msDSP_Std_GetNoiseMag());
printf("msDSP_Std_GetBurstMag====%x", msDSP_Std_GetBurstMag());
printf("msDSP_Std_GetPhaseError====%x", msDSP_Std_GetPhaseError());
printMsg("-----------------------------");
printf("g_bEnableVDColorBurst====%x", g_bEnableVDColorBurst);
printf( "\r\nVD_VTotal=%d", msVDGetVTotal() );
printf( "\r\nSync ctl state=%x", msVDSpecialRead( 0x00, BK2_01 )&0xF0 );
printf("\r\nVD status=%x", wStatus );
if( wStatus&VD_HSYNC_LOCKED )
putstr("\r\nVD_HSYNC_LOCKED");
if( wStatus&VD_INTERLACED )
putstr("\r\nVD_INTERLACED");
if( wStatus&VD_VSYNC_50HZ )
putstr("\r\nVD_VSYNC_50HZ");
if( msVDGetColorLockBit() )
putstr("\r\nSW VD color lock");
if( wStatus&VD_COLOR_LOCKED )
putstr("\r\nVD_COLOR_LOCKED");
//if( wStatus&VD_PAL_SWITCH )
if( msVDSpecialRead( 0x00, BK2_03 )&_BIT5 )
putstr("\r\nVD_PAL_SWITCH");
// switch( wStatus&VD_COLOUR_STD )
// {
// case VD_CSTD_NONE: putstr("\r\nVD_CSTD_NONE"); break;
// case VD_CSTD_NTSC: putstr("\r\nVD_CSTD_NTSC"); break;
// case VD_CSTD_PAL: putstr("\r\nVD_CSTD_PAL"); break;
// case VD_CSTD_SECAM: putstr("\r\nVD_CSTD_SECAM");break;
// }
switch( wStatus&VD_FSC_TYPE )
{
case VD_FSC_4433: putstr("\r\nVD_FSC_4433"); break;
case VD_FSC_3579: putstr("\r\nVD_FSC_3579"); break;
case VD_FSC_3575: putstr("\r\nVD_FSC_3575"); break;
case VD_FSC_3582: putstr("\r\nVD_FSC_3582"); break;
case VD_FSC_4285: putstr("\r\nVD_FSC_4285"); break;
}
//if( wStatus&VD_MACROVISION ) putstr("\r\nVD_MACROVISION");
putstr("\r\n");
msVDGetVideoSystem( wStatus );
// Read status from comb
{
BYTE ucTmp;
BYTE ucBank = msReadByte( BK0_00_REGBK);
msWriteByte( BK0_00_REGBK, 3 );
putstr("\r\n===== COMB status =====");
ucTmp = msReadByte( BK3_72_COMB_STSC);
if( ucTmp&_BIT7 ) putstr("\r\n525 lines");
if( ucTmp&_BIT6 ) putstr("\r\n625 lines");
if( ucTmp&_BIT5 ) putstr("\r\n3.58MHz");
if( ucTmp&_BIT4 ) putstr("\r\n4.43MHz");
if( ucTmp&_BIT3 ) putstr("\r\nNo input");
switch(ucTmp&7)
{
case 0: putstr("\r\nNTSC(M)"); break;
case 1: putstr("\r\nNTSC(443)"); break;
case 2: putstr("\r\nPAL(M)"); break;
case 3: putstr("\r\nPAL(B,D,G,H,I,N)"); break;
case 4: putstr("\r\nPAL(Nc)"); break;
case 5: putstr("\r\nPAL(60)"); break;
case 6: putstr("\r\nInput without Burst"); break;
case 7: putstr("\r\nUnknown"); break;
}
putstr("\r\n=======================");
msWriteByte( BK0_00_REGBK, ucBank );
}
}
#endif
#if 0
void SetColorSystem(StuChannelData ChannelData)
{
BYTE temp;
temp = ((ChannelData.ucChannelMisc&ColorSysMask)>>4)%CS_COLORSYS_NUMS;
msWriteByte(BK0_00_REGBK,REG_BANK3_COMB);
switch(temp)
{
case CS_NTSC:
msWriteByteMask(BK3_1C_CTRLSWCH, 0x01, 0x03);
break;
case CS_PAL:
msWriteByteMask(BK3_1C_CTRLSWCH, 0x02, 0x03);
break;
case CS_AUTO:
default:
msWriteByteMask(BK3_1C_CTRLSWCH, 0x03, 0x03);
break;
}
msWriteByte(BK0_00_REGBK,REG_BANK_SCALER);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -