⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 devvd.c

📁 Maria2 CarTV 20060707 Tony
💻 C
📖 第 1 页 / 共 2 页
字号:
    {
        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 + -