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

📄 msvd.c

📁 MST726驱动TFT屏程序,源代码!很好的资料
💻 C
📖 第 1 页 / 共 4 页
字号:
    {
        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 + -