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

📄 vdc_tvp5150.c

📁 车载 液晶显示器的主控程序(主要使用芯片为 MYSON MTV512 单片机、RealTek 2323 Scare 芯片、TVP5147(视频解码)。配Sharp 8寸液晶显示器 )。
💻 C
📖 第 1 页 / 共 4 页
字号:
		ucTemp = CAdjustRealValue(_MENU_MU_HUE, stVideoData.Hue, _SLIDER_MAX_HUE, _VHUE_MAX, _VHUE_MID, _VHUE_MIN);
		ucTemp = ucTemp^0x80;
	}
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x0B), &ucTemp);
}

void CAdjustVideoSharpness(void)
{
	BYTE temp;

	/*CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x08), LENGTH(1));*/
	temp = CAdjustRealValue(_MENU_MU_SHARPNESS, stVideoData.VSharpness, _SLIDER_MAX_SHARPNESS,_VSHARPNESS_MAX, _VSHARPNESS_MID, _VSHARPNESS_MIN);
	temp = /*(pData[0] & 0xF3) |*/ ((stVideoData.VSharpness&0x03)<<2);
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x08), &temp);
}

#define Delay_nNOP()		_nop_();_nop_();_nop_();_nop_();_nop_()

void VDCPatchPowerOn(void)
{

	unsigned int n;
	//BYTE m;
	register BYTE send, m;

	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x03, 0);
	CVdcI2CSendByte(0x69);
	CVdcI2CSendStop();
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7f, 0);
	CVdcI2CSendByte(0x00);
	CVdcI2CSendStop();
	
	CTimerDelayXms(5);
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x21, 0);
	CVdcI2CSendByte(0x51);
	CVdcI2CSendStop();
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x22, 0);
	CVdcI2CSendByte(0x50);
	CVdcI2CSendStop();
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x23, 0);
	CVdcI2CSendByte(0xff);
	CVdcI2CSendStop();
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x24, 0);
	CVdcI2CSendByte(0x04);
	CVdcI2CSendStop();		
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7e, 0);
	for (n=0; n<3744; n++) {
		//I2CSendByte(TVP5150A_048011_7);
		send = TVP5150A_048011[n];
		for (m = 0; m < 8; m++)  {
			bI2CSDA= (bit)(send & 0x80);   // Send each bit, MSB first
			Delay_nNOP();
			bI2CSCL= 1;
			Delay_nNOP();
			bI2CSCL    = 0;
			send    = send << 1;
		}
		bI2CSDA    = 1;
		bI2CSCL    = 1;
		Delay_nNOP();
		//Delay_nNOP();
		bI2CSCL    = 0;
		//Delay_nNOP();
	}
	CVdcI2CSendStop();		
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x7f, 0);
	CVdcI2CSendByte(0x00);
	CVdcI2CSendStop();		
	
	CTimerDelayXms(5);
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x21, 0);
	CVdcI2CSendByte(0x00);
	CVdcI2CSendStop();		
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x22, 0);
	CVdcI2CSendByte(0x00);
	CVdcI2CSendStop();		
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x23, 0);
	CVdcI2CSendByte(0xff);
	CVdcI2CSendStop();		
	
	CVdcI2CSendAddr(_VIDEO_DEVICE, 0x24, 0);
	CVdcI2CSendByte(0x04);
	CVdcI2CSendStop();	
	
}

//--------------------------------------------------
// Description  : Video initialize
// Input Value  : None
// Output Value : None
//--------------------------------------------------
void CVideoInitial(void)
{
	//reset whole chip...
	CVIDEO_POWER_ON();		
	
	CTimerDelayXms(5);
	
    bVIDEORESET = _HIGH;
	CTimerDelayXms(5);
	bVIDEORESET = _LOW;		// Active low
	CTimerDelayXms(1);		
	bVIDEORESET = _HIGH;
	CTimerDelayXms(20);

	VDCPatchPowerOn();

	CVdcWrite(tVideoInit_5150);

	
	//x.hu, request to set scaler in CVideoExist()
	SET_VIDEO_TABLE_SET_SCALER();

}

BYTE CVideoGetStatus(void)
{
	BYTE temp, count=0;
	CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x88), LENGTH(1));	//get signal information.
	do {
  		temp = pData[0]& 0x26;
  		// x.hu, 20050718:
  		// With TVP5150AM1, decrease the time may cause unstable to catch signal
  		CTimerDelayXms(5);	// OK
		// if video is difficult to capture, add delay time
		//CTimerDelayXms(5*8);
		CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x88), LENGTH(1));	//get signal information.
		if((pData[0] & 0x26) == temp)
			count++;
		else
			count=0;
	}while(count<3);

	// we don't check color lock status for 5150 to show W/B signal
	temp |= 0x08;
	
	return temp;
}

//--------------------------------------------------
// Description  : Check if color locked
// Input Value  : ucColorStandard --> Color standard
// Output Value : Return _TRUE if color is locked, otherwise _FALSE
//--------------------------------------------------
bit CVideoIsColorLocked(BYTE ucColorStandard)
{
    BYTE temp;
/*
	//set color standard
	temp = (ucColorStandard & 0x0E);
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);
	//CTimerDelayXms(100);		// must longer than 40ms.

	//get lock information
	temp = CVideoGetStatus();
	 
	if((temp & _BIT3) == _BIT3)
		return _TRUE;
	else
		return _FALSE;
*/
	//x.hu, 20050803, update
	
	//set color standard
	temp = (ucColorStandard & 0x0E);
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);
	CTimerDelayXms(5);

	return _TRUE;
}

//--------------------------------------------------
// Description  : Polling to get a locked color standard
// Input Value  : None
// Output Value : Return _TRUE if color locked
//--------------------------------------------------
bit CVideoColorFormatProc(void)
{
	BYTE ucVdcColorReg,count=0;
	
	if(CVideoIsColorLocked(_AUTO_MODE))		//set to auto detection mode and then check color is lock or not.
	{
		/*
		//CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8C), LENGTH(1));
		do {
			CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1));	//get signal information.
	  		temp = pData[0];
	  		CTimerDelayXms(5);
			CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1));	//get signal information.
			if(pData[0] == temp)
				count++;
			else
				count=0;
		}while(count<3);
		*/
		CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8C), LENGTH(1));
		do {
	  		ucVdcColorReg = pData[0];
	  		CTimerDelayXms(5);
	  		//CTimerDelayXms(2);
			CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x8c), LENGTH(1));	//get signal information.
			if(pData[0] == ucVdcColorReg)
				count++;
			else
				count=0;
		}while(count<3);		
		ucVdcColorReg = pData[0];

		//Here we can get color mode information.
		//switch(ucVdcColorReg) {
		switch(ucVdcColorReg&0x0f) {
			case 0x01:			// ntsc-m
			case 0x03:			// PAL-BGHIN
			case 0x05:			// PAL-M
			case 0x07:			// PAL-N
			case 0x09:			// N-4.43
			case 0x0b:			// SECAM
				ucVdcColorReg = (ucVdcColorReg&0x0F)+1;	// convert
				break;
			default:
				ucVdcColorReg = 0x00;
				break;
		}
		//x.hu, write color mode
		CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &ucVdcColorReg);	//set to designate color mode.

		ucModeFound = ucVdcColorReg>>1;		//get current color mode information.

		return _TRUE;
	}
	else
	{
		return _FALSE;
	}
}

/*
//--------------------------------------------------
// Description  : Set to designate mode according to current channel
// Input Value  : ucInputChannel --> choose input channel, like AV or SV channels
// Output Value : None
//--------------------------------------------------
void CVideoModeProc(BYTE ucInputChannel)
{
	BYTE temp;

	if(ucInputChannel == _AV_CHANNEL)
		temp = _AV1_PORT;
	else if(ucInputChannel == _AV2_CHANNEL)
		temp = _AV2_PORT;
	else if(ucInputChannel == _SV_CHANNEL)
		temp = _SV_PORT;
	
	//First, set channel.
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x00), &temp);	
	//CTimerDelayXms(60);		//x.hu, for test
	CTimerDelayXms(1);		
	
	//set color mode to auto for detection.
	temp = _AUTO_MODE;
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x28), &temp);

	//Second, set general setting...
	switch(ucInputChannel)
	{
		case _AV_CHANNEL:
		case _AV2_CHANNEL:
			//Enable YCbCr output and the clock output
			temp = 0x29;
			//CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x03), &temp);
			break;
			
		case _SV_CHANNEL:
			break;
			
		default:

			break;
	}
}
*/

//--------------------------------------------------
// Description  : Check Video Channel if Signal Exist
// Input Value  : ucInputChannel --> choose input channel, like AV or SV channels
// Output Value : Return _TRUE if video signal exist, otherwise _FALSE
//--------------------------------------------------
bit CVideoIsExist(BYTE ucInputChannel)
{
	BYTE ucVdcStatusReg;

	// x.hu, test for no signal video scan
	// CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
	#if (_PCB_TYPE == _PCB_RIGHTECH_A && _PCB_RIGHTECH_A_USE_PV013BA1 == _FALSE)
	// this version use NJM2244 to select video source from V1/V2, and TVP5150AM1 get the signal at A1P1A (0x00)
	if (GET_VIDEO_TABLE_SET_SCALER()) {
		CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
		CLR_VIDEO_TABLE_SET_SCALER();

		//CVideoModeProc(ucInputChannel);
		if (ucInputChannel == _AV_CHANNEL) {
			VideoSelCHAV1();
			CTimerDelayXms(1);
			CVdcWrite(tVideoAV1_5150);
		}
		else if (ucInputChannel == _AV2_CHANNEL){
			VideoSelCHAV2();
			CTimerDelayXms(1);
			CVdcWrite(tVideoAV1_5150);
		}
	}	
	#else
	if (GET_VIDEO_TABLE_SET_SCALER()) {	//200D test
		CScalerCodeW(tVIDEO_TABLE_SET_SCALER);
		CLR_VIDEO_TABLE_SET_SCALER();

		//CVideoModeProc(ucInputChannel);
		if (ucInputChannel == _AV_CHANNEL) {
			CVdcWrite(tVideoAV1_5150);
		}
		else if (ucInputChannel == _AV2_CHANNEL){
			CVdcWrite(tVideoAV2_5150);
		}
	}	
	#endif
	
	CTimerDelayXms(1);		//for signal switch finish.

	ucVdcStatusReg = CVideoGetStatus();
	
	if((ucVdcStatusReg & _BIT5) == _BIT5)		//field rate.
	{
		SET50HZ();
	}
	else
	{
		SET60HZ();
	}
	
	if((ucVdcStatusReg & (_BIT1 | _BIT2)) == (_BIT1 | _BIT2))		//H/V sync lock.
	{
		if(CVideoColorFormatProc())		//if color lock.
		{
			if(CModeMeasureReady())	//Measure H/V sync.
			{
				if(CModeMeasureData())
				{
					stModeInfo.ModeCurr = _VIDEO_EXIST;
					return _TRUE;
				}
				else
				{
					return _FALSE;		//Measure failed.
				}
			}
			else
			{
				return _FALSE;
			}
		}
		else
			return _FALSE;		//color lock failed.
	}
	else
	{
		return _FALSE;		//Sync lock failed.
	}
}

//--------------------------------------------------
// Description  : Check if video signal is changed
// Input Value  : None
// Output Value : Return _TRUE if video signal is changed
//--------------------------------------------------
bit CVideoIsChange(void)
{
    BYTE temp;

	temp = CVideoGetStatus();
#if 0
	// x.hu, add: can't identify no signal to reset
	if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2))
	{
		//return _FALSE;
		//if (ucVideoChangeCnt < _VIDEO_CHANGECNT_MAX) {
		//	ucVideoChangeCnt++;
		//}
		return _TRUE;
	}
		
	if (ucCurrState == _ACTIVE_STATE) {
		if(CHECK50HZ() && ((temp & _BIT5)==0x00))		// 50Hz-->60Hz
		{
			//return _TRUE;
			if (ucVideoChangeCnt) {
				ucVideoChangeCnt--;
				if (ucVideoChangeCnt==0) {
					ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
					return _TRUE;
				}
			}
			else {
				ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
				return _TRUE;			
			}		
		}
		else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5))	// 60Hz-->50Hz
		{
			//return _TRUE;
			if (ucVideoChangeCnt) {
				ucVideoChangeCnt--;
				if (ucVideoChangeCnt==0) {
					ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
					return _TRUE;
				}
			}
			else {
				ucVideoChangeCnt = _VIDEO_CHANGECNT_MAX;
				return _TRUE;
			}

		}
		else
		{
			//return _FALSE;
			if (ucVideoChangeCnt < _VIDEO_CHANGECNT_MAX) {
				ucVideoChangeCnt++;
			}
			return _FALSE;
		}
	}
	else {
		if(CHECK50HZ() && ((temp & _BIT5)==0x00))		// 50Hz-->60Hz
		{
			return _TRUE;
		}
		else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5))	// 60Hz-->50Hz
		{
			return _TRUE;
		}
		else
		{
			return _FALSE;
		}
	}
	#else	//reuse this for:
	// x.hu, test to add the following statement, may be update

	// x.hu, 20050804, update, detect whether the video is changed btween PAL and NTSC
	/*if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2))	// H/V sync state
	{
		return _TRUE;
	}*/
	if ((temp & (_BIT1|_BIT2)) != (_BIT1 | _BIT2))	// H/V sync state
	{
		#if (_CUSTOM_TYPE == _CUSTOM_HAOZHEN)
		SET_VIDEO_PN_ACTION();
		#endif
		return _TRUE;
	}

	// update over
	
	//add over
	
	if(CHECK50HZ() && ((temp & _BIT5)==0x00))		// 50Hz-->60Hz
	{
		return _TRUE;
	}
	else if(CHECK60HZ() && ((temp & _BIT5)==_BIT5))	// 60Hz-->50Hz
	{
		return _TRUE;
	}
	else
	{
		return _FALSE;
	}

	#endif
}

//---------------------------------------
// Description	: power save Video Decoder
// Input Value:	None
// Output Value: None
//---------------------------------------
void CVideoPowerState(BYTE state)
{
	state = state;  
/*	BYTE temp;
	
	CVdcI2cRead(_VIDEO_DEVICE, ADDRESS(0x02), LENGTH(1));
	temp = pData[0]&0xFE;

	temp |= (state&0x01);
	
	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x02), &temp);
	
	CTimerDelayXms(20);
	//CTimerDelayXms(50);
*/
}

//----------------------------------------
// Description : Enable Video Data Output or not
// Input Value:	None
// Output Value:	None
//----------------------------------------
void CVideoDataEnable(BIT bEnable)
{
	BYTE temp;
	if(bEnable){
		temp = 0x09;	//Enable data output and enable data clock, GPCL output enable
	}
	else{
		temp = 0x00;	//Disable data & clock output
	}
   	CVdcI2cWrite(_VIDEO_DEVICE, ADDRESS(0x03), &temp);
	CTimerDelayXms(1);
}

#endif
#endif


⌨️ 快捷键说明

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