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

📄 video.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
字号:
//----------------------------------------------------------------------------------------------------
// ID Code      : Video.c No.0001
// Update Note  : 
//
//----------------------------------------------------------------------------------------------------

#define __VIDEO__

#include "..\Header\Include.h"

#if (_VIDEO_SUPPORT == _ON)

//--------------------------------------------------
// Description  : Display video set process
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CVideoDisplaySet(void)
{
/*
    	WORD ustemp;
    	BYTE field, temp;
		//float usclock;

    	field = (BYTE)bVideoType;		//flag 50Hz or 60Hz. Note by zhang_dc

    	//CI2cWrite(_VIDEO_DEVICE, ADDRESS(0x9A), LENGTH(6), tVIDEO_TABLE_FIELD[field]);

    	stModeInfo.IHTotal      = tVIDEO_TABLE_INPUT_INFO[field][0];
    	stModeInfo.IHStartPos   = tVIDEO_TABLE_INPUT_INFO[field][1];
    	stModeInfo.IHWidth      = tVIDEO_TABLE_INPUT_INFO[field][2];
    	stModeInfo.IVStartPos   = tVIDEO_TABLE_INPUT_INFO[field][3];
    	stModeInfo.IVHeight     = tVIDEO_TABLE_INPUT_INFO[field][4];

    	stDisplayInfo.DHWidth   = Panel.DHEndPos - Panel.DHStartPos;
    	stDisplayInfo.DVHeight  = Panel.DVEndPos - Panel.DVStartPos;
    	stDisplayInfo.DHTotal   = Panel.DHTotal;
		
    	ucHStartBias = 100;
    	ucVStartBias = 0;
		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			ucVStartBias = CAdjustIVS2DVSDelay(0x01);	//V scaler up
		}
		else {
			ucVStartBias = CAdjustIVS2DVSDelay(0x05);
		}

    	if(ucVStartBias > stModeInfo.IVStartPos)
        	ucVStartBias = stModeInfo.IVStartPos;

    	//Set Capture Window  
    	ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);

    	CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    	CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
    	CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
    	CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));

    	ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);

    	CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    	CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
    	CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
    	CScalerSetByte(_IPV_ACT_LEN_L_10, LOBYTE(stModeInfo.IVHeight));

    	//Set DH_TOTAL
    	pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
    	pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
    	CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);

    	// Set internal input H sync delay
    	CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);

    	// Set internal input V sync delay
    	CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);

		//Set DClk
		if(field == _VIDEO_50HZ)
			//usclock = ((15.625 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
			//usclock = (((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
			CAdjustDPLL((((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
		else
			//usclock = ((15.734 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
			//usclock = (((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
			CAdjustDPLL((((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);

		//CAdjustDPLL(usclock);

		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			CModeSetScaling(0x01);          // 0x01: V SCALE UP
		}
		else {
			CModeSetScaling(0x05);          // 0x05: ALL SCALE UP
		}

    	// Turn off full-line buffer
    	CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);


		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			CAdjustIVS2DVSDelay(0x01);      // 0x05: V SCALE UP
		}
		else {
			CAdjustIVS2DVSDelay(0x05);      // 0x05: ALL SCALE UP
		}

    	// Enable display timing
if (!GET_VIDEO_PN_ACTION())
    	CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));

        //set to default
		stConBriData.Brightness = _VBRIGHT_DEFAULT;
		stConBriData.Contrast = _VCONTRAST_DEFAULT;
		CEepromLoadColorTempData();
    	CAdjustContrast();
    	CAdjustBrightness();
    	CAdjustBacklight();

		//load VColor value.
    	CEepromLoadBriConData();	
		CEepromLoadVideoData();
		CAdjustVideoContrast();
		CAdjustVideoBright();
		CAdjustVideoSaturation();
		CAdjustVideoHue();
		CAdjustVideoSharpness();
    	CPowerADCAPLLOff();

    	pData[0] = CFrameSyncDo();

    	SET_MODESTABLE();
    	// Change to even/odd field frame sync
    	CScalerSetByte(_IPV_ACT_STA_L_0E, CScalerGetBit(_IPV_ACT_STA_L_0E, 0xff) + 1);
    	CScalerRead(_IV_DV_DELAY_CLK_ODD_41, LENGTH(1), &temp, _NON_AUTOINC);
    	ustemp = (WORD)temp * 16 + 16;
    	ustemp += stModeInfo.IHTotal;
    	CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, (ustemp - 16) / 16);
    	ustemp -= stModeInfo.IHTotal / 2;
    	CScalerSetByte(_IV_DV_DELAY_CLK_EVEN_42, (ustemp - 16) / 16);
    	CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1);

    	CModeSetupEtcs(_FUNCTION_DISABLE);

	#if 0
		// x.hu, 20050803, add
		// start audio after 1s from showing video
		#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
		CTimerDelayXms(600);	// here also delay light on
		#endif
		
		#if (_AUDIO_DEVICE != _AUDIO_NONE)
		CAdjustVolume();
		#endif
		#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
		#if (_FM_MODULATION == _ENABLE)
		CAudio2FM();
		#endif
		#endif
	#endif
	*/
	//version 200D

	    WORD ustemp;
    BYTE field, temp;

    field = (BYTE)bVideoType;

	// saa7114
	//CI2cWrite(_VIDEO_DEVICE, ADDRESS(0x9A), LENGTH(6), tVIDEO_TABLE_FIELD[field]);

    stModeInfo.IHTotal      = tVIDEO_TABLE_INPUT_INFO[field][0];
    stModeInfo.IHStartPos   = tVIDEO_TABLE_INPUT_INFO[field][1];
    stModeInfo.IHWidth      = tVIDEO_TABLE_INPUT_INFO[field][2];
    stModeInfo.IVStartPos   = tVIDEO_TABLE_INPUT_INFO[field][3];
    stModeInfo.IVHeight     = tVIDEO_TABLE_INPUT_INFO[field][4];

    stDisplayInfo.DHWidth   = Panel.DHEndPos - Panel.DHStartPos;
    stDisplayInfo.DVHeight  = Panel.DVEndPos - Panel.DVStartPos;
    stDisplayInfo.DVStartPos = Panel.DVStartPos;
    stDisplayInfo.DHTotal   = Panel.DHTotal;

    ucHStartBias = 100;
    ucVStartBias = 0;
		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			ucVStartBias = CAdjustIVS2DVSDelay(0x01);	//V scaler up
		}
		else {
			ucVStartBias = CAdjustIVS2DVSDelay(0x05);
		}

    if(ucVStartBias > stModeInfo.IVStartPos)
        ucVStartBias = stModeInfo.IVStartPos;

    //Set Capture Window  
    ustemp = stModeInfo.IHStartPos + _CAPTURE_HDELAY - (ucHStartBias + _PROGRAM_HDELAY);

    CScalerSetBit(_IPH_ACT_STA_H_09, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPH_ACT_STA_L_0A, LOBYTE(ustemp));
    CScalerSetBit(_IPH_ACT_WID_H_0B, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IHWidth) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPH_ACT_WID_L_0C, LOBYTE(stModeInfo.IHWidth));

    ustemp = stModeInfo.IVStartPos - (ucVStartBias + _PROGRAM_VDELAY);

    CScalerSetBit(_IPV_ACT_STA_H_0D, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(ustemp) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPV_ACT_STA_L_0E, LOBYTE(ustemp));
    CScalerSetBit(_IPV_ACT_LEN_H_0F, ~(_BIT2 | _BIT1 | _BIT0), HIBYTE(stModeInfo.IVHeight) & (_BIT2 | _BIT1 | _BIT0));
    CScalerSetByte(_IPV_ACT_LEN_L_10, LOBYTE(stModeInfo.IVHeight));

    //Set DH_TOTAL
    pData[0] = (HIBYTE(stDisplayInfo.DHTotal - 4) & 0x0f);
    pData[1] = (LOBYTE(stDisplayInfo.DHTotal - 4));
    CScalerWrite(_DH_TOTAL_H_2A, 2, pData, _AUTOINC);

    // Calculate DV_TOTAL setting for watchdog
    ((WORD *)pData)[2] = (LWORD)stModeInfo.IVTotal * (LWORD)(stDisplayInfo.DVHeight) / stModeInfo.IVHeight + 64;
	pData[0] = (HIBYTE(((WORD *)pData)[2]) & 0x0f);
	pData[1] = (LOBYTE(((WORD *)pData)[2]));
    CScalerWrite(_DV_TOTAL_H_35, 2, pData, _AUTOINC);

    // Set internal input H sync delay
    CAdjustIHSDelay(ucHStartBias + _PROGRAM_HDELAY);

    // Set internal input V sync delay
    CAdjustIVSDelay(ucVStartBias + _PROGRAM_VDELAY);

		//Set DClk
		if(field == _VIDEO_50HZ)
			//usclock = ((15.625 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
			//usclock = (((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
			CAdjustDPLL((((LWORD)15625 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);
		else
			//usclock = ((15.734 * stDisplayInfo.DVHeight) / stModeInfo.IVHeight) * stDisplayInfo.DHTotal;
			//usclock = (((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000;
			CAdjustDPLL((((LWORD)15734 * stDisplayInfo.DVHeight) / (LWORD)stModeInfo.IVHeight) * (LWORD)stDisplayInfo.DHTotal / 1000);

		//CAdjustDPLL(usclock);

		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			CModeSetScaling(0x01);          // 0x01: V SCALE UP
		}
		else {
			CModeSetScaling(0x05);          // 0x05: ALL SCALE UP
		}

    // Turn off full-line buffer
    CScalerSetBit(_SCALE_CTRL_19, ~_BIT4, 0x00);

		//x.hu
		if (stDisplayInfo.DHWidth <= tVIDEO_TABLE_INPUT_INFO[field][2]){
			CAdjustIVS2DVSDelay(0x01);      // 0x05: V SCALE UP
		}
		else {
			CAdjustIVS2DVSDelay(0x05);      // 0x05: ALL SCALE UP
		}

    	// Enable display timing
#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
if (!GET_VIDEO_PN_ACTION())
    CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
#else
    CScalerSetBit(_VDISP_CTRL_28, ~(_BIT5 | _BIT3 | _BIT1 | _BIT0), (_BIT5 | _BIT3 | _BIT1 | _BIT0));
#endif
    CEepromLoadBriConData();
	//x.hu
	//		stConBriData.Brightness = _VBRIGHT_DEFAULT;
		stConBriData.Contrast = _VCONTRAST_DEFAULT;

    CEepromLoadColorTempData();
    CAdjustContrast();
    CAdjustBrightness();
    CAdjustBacklight();

		//x.hu, load VColor value.
    	CEepromLoadBriConData();	
		CEepromLoadVideoData();
		CAdjustVideoContrast();
		CAdjustVideoBright();
		CAdjustVideoSaturation();
		CAdjustVideoHue();
		CAdjustVideoSharpness();
    CPowerADCAPLLOff();

    pData[0] = CFrameSyncDo();

    SET_MODESTABLE();

    // Change to even/odd field frame sync
    CScalerSetByte(_IPV_ACT_STA_L_0E, CScalerGetBit(_IPV_ACT_STA_L_0E, 0xff) + 1);
    CScalerRead(_IV_DV_DELAY_CLK_ODD_41, LENGTH(1), &temp, _NON_AUTOINC);
    ustemp = (WORD)temp * 16 + 16;
    ustemp += stModeInfo.IHTotal;
    CScalerSetByte(_IV_DV_DELAY_CLK_ODD_41, (ustemp - 16) / 16);
    ustemp -= stModeInfo.IHTotal / 2;
    CScalerSetByte(_IV_DV_DELAY_CLK_EVEN_42, (ustemp - 16) / 16);
    CScalerSetBit(_FS_DELAY_FINE_TUNING_43, ~(_BIT1), _BIT1);

    CTimerDelayXms(100);
    CModeSetupEtcs(_FUNCTION_DISABLE);


}

//x.hu, for source change
bit CSourceChange(void)
{
	if (GET_SOURCESTATUS() == 0) {
		return _FALSE;
	}
	else if (!GET_POWERSTATUS()) {
		// don't switch source while power off
		CLR_SOURCESTATUS();
		return _FALSE; 
	}
	else {

		if (GET_FIRST_LOADFONT() == _TRUE) {
			CLR_FIRST_LOADFONT();
			COsdDispFirstTimeLoadFont();
		}

		//#if (_SOURCE_TYPE == _SOURCE_TYPE_2V)
		if ((GET_SOURCESTATUS()-1) != stSystemData.InputSource)//not current source		
		{
			// update input source
			stSystemData.InputSource = GET_SOURCESTATUS()-1;
			// save
			CEepromSaveSystemData();	
			//ucOsdEventMsg = _SAVE_EE_SYSTEMDATA_MSG;

			// clear destination source
			CLR_SOURCESTATUS();	 
			
			//x.hu, if source change, mute is canceled:
			//!!!demo do not cancel mute state after source switch			
			#if (_MUTE_AUTO_DISABLE == _ENABLE)
			if (stAudioData.audioFlag&_BIT7) {
				CAdjustMute();
			}
			#endif
		
			return _TRUE;
		}
		else {
			// current channel:
			
			// if active state, only show hint
			if (1) {//(ucCurrState == _ACTIVE_STATE) {
				ucOsdEventMsg = _SHOW_SOURCE_MSG;
				CTimerReactiveTimerEvent(SEC(4),COsdDispOsdTimerEvent);
				//if no signal, press current channel selected key cause always show blue BG and source hints,
				// untill timeover(5s) after the key is released.
				if (ucCurrState == _NOSIGNAL_STATE || ucCurrState == _NOSUPPORT_STATE) {
					CTimerReactiveTimerEvent(SEC(5), CModePowerSavingEvent);
				}
			}
			// if not active state, source key will lead to reset, then work as search mode
			else {
				CModeResetMode();	
			}
		}
		//#endif
		
		// x.hu, for other source combinations
		// ...

		// clear destination source
		CLR_SOURCESTATUS();	 
		
		return _FALSE;
	}
}


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -