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

📄 tidtv_tunerlg.c

📁 ti的数字电视芯片 tvp9000的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
//	DATA16 LGDTgetPacketErr(DATA16*)
//		- Gets packet errors on the input singal
//
//	Input : DATA16* data - The number of packet error
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetPacketErr(DATA16* data)
{
	DATA8		  data_p;
	LGDT_Return_t retVal;

	retVal = LGDTgetRegi(0x88, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	*data = data_p << 8;

	retVal = LGDTgetRegi(0x89, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	*data |= data_p;

	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	The Mean-Square error value at the phase tracker output
//------------------------------------------------------//
LGDT_Return_t LGDTgetSNR_VSB(double* eq)
{
	DATA8		 data_p;
//	DATA16		 data;
	int			 data;
	LGDT_Return_t retVal;

//---------- PH Value : 3302 takes PH value as SNR ----------//
	retVal = LGDTgetRegi(0x6E, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
	data_p &= 0x07;
	data = data_p <<16;


	retVal = LGDTgetRegi(0x71, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
	data = data_p << 8;

	retVal = LGDTgetRegi(0x72, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
	data |= data_p;

	if ((data != 0xFFFF) && (data !=0))
	{
		*eq = 10.0 * log10((double)((25.0 * 32.0 * 32.0) / (double)data ));
	}
	else
		*eq = 0;

	if (*eq < 0)
		*eq = 0;				/// return 0, when error occurs

	return LGDT_ERR_NO;
}

LGDT_Return_t LGDTgetSNR_QAM(double* eq)
{
	int			 signalPower = 0;
	DATA8		 data_p;
	DATA16		 data = 0;
	LGDT_Return_t	 retVal;
	LGDT_OperMode_t mode;

	//----- Assgin Ps(Signal Power) based upon the mode -----//
	retVal = LGDTgetOperMode(&mode);
	if (retVal != LGDT_ERR_NO)
		return retVal;

	if (mode == 0x00)
		signalPower = 688128;
	else if (mode == 0x01)
		signalPower = 696320;
	else
		return LGDT_ERR_PARAM;
	//----- End of assigning Ps -----//

	retVal = LGDTgetRegi(0x1A, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
	data = data_p << 8;

	retVal = LGDTgetRegi(0x1B, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
	data |= data_p;

	*eq = 10 * log10((double)(signalPower/data));
	if (*eq < 0)
		*eq = 0;				/// return 0, when error occurs
		
	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	Get SNR Value based upon the working mode
//------------------------------------------------------//
LGDT_Return_t LGDTgetSNR(double* snr)
{
	double		 data;
	DATA8		 data_p;
	LGDT_Return_t retVal;

	retVal = LGDTgetRegi(0x00, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	data_p &= 0x03;
	switch(data_p)
	{
		case LGDT_QAM64:					/// 64QAM, 256QAM Mode
		case LGDT_QAM256:
			retVal = LGDTgetSNR_QAM(&data);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
			*snr = data;
			break;
		default:					/// VSB Mode
			retVal = LGDTgetSNR_VSB(&data);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
			*snr = data;
			break;
	}
	return LGDT_ERR_NO;						/// return snr
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTgetSQI(DATA16* sqi)
//
//	Input : DATA16* sqi - Percentage of SNR
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetSQI(DATA16* sqi)
{
	double				snr;
	LGDT_Return_t	retVal;
	LGDT_OperMode_t	mode;
	
	retVal = LGDTgetOperMode(&mode);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	switch(mode)
	{
		case LGDT_QAM64:					/// 64QAM, 256QAM Mode
		case LGDT_QAM256:
			retVal = LGDTgetSNR_QAM(&snr);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
			break;
		default:					/// VSB Mode
			retVal = LGDTgetSNR_VSB(&snr);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
			break;
	}

	//---------- Scaling the value	-----//
	if (snr > 35)
		snr = 35;	
	*sqi = (int)((snr/35)*100);

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("LGDT_SIGNALStatus() snr=%f, sqi=%d", snr, *sqi);
#endif

	return LGDT_ERR_NO;					/// return stauts
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTgetSignalCondition(LGDT_SIGNAL_CONDITION_t* status)
//		: Get SNR value and the status standard is as below;
//
//		- 64QAM mode
//			LGDT_SIGNAL_NO			:	 ~ 0
//			LGDT_SIGNAL_WEAK		:  0 ~ 14
//			LGDT_SIGNAL_MODERATE	: 14 ~ 22
//			LGDT_SIGNAL_STRONG		: 22 ~ 30
//			LGDT_SIGNAL_VERY_STRONG: 31 ~
//
//		- 256QAM mode
//			LGDT_SIGNAL_NO			:	 ~ 0
//			LGDT_SIGNAL_WEAK		:  0 ~ 21
//			LGDT_SIGNAL_MODERATE	: 21 ~ 28
//			LGDT_SIGNAL_STRONG		: 28 ~ 30
//			LGDT_SIGNAL_VERY_STRONG: 31 ~
//
//		- VSB mode
//			LGDT_SIGNAL_NO			:	 ~ 0
//			LGDT_SIGNAL_WEAK		:  0 ~ 10
//			LGDT_SIGNAL_MODERATE	: 10 ~ 16
//			LGDT_SIGNAL_STRONG		: 16 ~ 24
//			LGDT_SIGNAL_VERY_STRONG: 24 ~
//
//	Input : LGDT_SIGNAL_CONDITION_t* status
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetSignalCondition(LGDT_SIGNAL_CONDITION_t* status)
{
	double			 snr;
	LGDT_Return_t	 retVal;
	LGDT_OperMode_t mode;
	
	retVal = LGDTgetOperMode(&mode);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	*status	= LGDT_SIGNAL_NO;
	switch(mode)
	{
		case LGDT_QAM64:					/// 64QAM Mode
			retVal = LGDTgetSNR_QAM(&snr);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

			if		( (snr > 0 ) && (snr <= 20) ) *status = LGDT_SIGNAL_WEAK;
			else if ( (snr > 20) && (snr <= 27) ) *status = LGDT_SIGNAL_MODERATE;
			else if ( (snr > 27) && (snr <= 30) ) *status = LGDT_SIGNAL_STRONG;
			else if (snr > 31)	*status = LGDT_SIGNAL_VERY_STRONG;
			break;
		case LGDT_QAM256:				/// 256QAM Mode
			retVal = LGDTgetSNR_QAM(&snr);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

			if		( (snr > 0 ) && (snr <= 13) ) *status = LGDT_SIGNAL_WEAK;
			else if ( (snr > 13) && (snr <= 21) ) *status = LGDT_SIGNAL_MODERATE;
			else if ( (snr > 21) && (snr <= 30) ) *status = LGDT_SIGNAL_STRONG;
			else if (snr > 30)	*status = LGDT_SIGNAL_VERY_STRONG;
			break;
		default:					/// VSB Mode
			retVal = LGDTgetSNR_VSB(&snr);
			if (retVal != LGDT_ERR_NO)
				return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

			if		( (snr > 0 ) && (snr <= 9 ) ) *status = LGDT_SIGNAL_WEAK;
			else if ( (snr > 9 ) && (snr <= 15) ) *status = LGDT_SIGNAL_MODERATE;
			else if ( (snr > 15) && (snr <= 24) ) *status = LGDT_SIGNAL_STRONG;
			else if (snr >24)	*status = LGDT_SIGNAL_VERY_STRONG;
			break;
	}

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("LGDT_SIGNALStatus() snr=%f, STATUS=%d", snr, status);
#endif

	return LGDT_ERR_NO;					/// return stauts
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTgetOperMode(LGDTOperMode_t* mode)
//
//	Input : LGDTOperMode_t* mode - Demodulator Operation Mode
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetOperMode(LGDT_OperMode_t* mode)
{
	DATA8		 data_p;
	LGDT_Return_t retVal;
	
	retVal = LGDTgetRegi(0x00, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);

	data_p &= 0x03;
	switch(data_p)
	{
		case LGDT_QAM64:
			*mode = LGDT_QAM64;
			break;
		case LGDT_QAM256:
			*mode = LGDT_QAM256;
			break;
		case LGDT_VSB:
			*mode = LGDT_VSB;
			break;
		default:
			return LGDT_ERR_GET_FUNC;
	}
	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTgetVersion
//	
//	Input	: LGDTVersion_s *pLGDT3302Version
//			(LGDTStandard, LGDTCustom, LGDTUpdate)
//
//	Return	: ERROR CHECK Messages
//------------------------------------------------------//
LGDT_Return_t LGDTgetVersion(LGDT_Version_s *pVersion)
{
	pVersion->Major  = LGDT_VERSION_MAJOR;
	pVersion->Custom = LGDT_VERSION_CUSTOM;
	pVersion->Minor  = LGDT_VERSION_MINOR;
	return LGDT_ERR_NO;
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//	SET Functions
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetRegi(DATA8 addr, DATA8 data)
//		- Sets the register as the data
//
//	Input
//		- DATA8 addr
//		- DATA8 data
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetRegi(DATA8 addr, DATA8 data)
{
	DATA8 retVal =  TiDTV_I2cWriteByte(LG3303_I2C_CHANNEL, 1, LG3303_I2C_DEVICE_ADDR, 1, addr, data, OS_TICKS_PER_SEC / 2);
	
	if (retVal != 0)					
		return LGDT_ERR_I2C;

	return LGDT_ERR_NO;
}
//------------------------------------------------------//
//	LGDT_Return_t LGDTsetMPEGMode(LGDT_MPEGMode_t mode)
//			: TPLGDT_SERIAL
//
//	Input : LGDT_MPEGMode_t mode(LGDT_PARAL or LGDT_SERIAL)
//		
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetMPEGMode(LGDT_MPEGMode_t mode)
{
	DATA8		 data_p;						/// New register value
	DATA8		 temp;
	LGDT_Return_t retVal;
	if ( (mode != LGDT_PARAL) && (mode != LGDT_SERIAL) )
		return (LGDT_Return_t)(LGDT_ERR_PARAM|LGDT_ERR_SET_FUNC);

	retVal = LGDTgetRegi(0x00, &data_p);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

//	printf ("SetMpegMode 0x%X", data);

	temp = mode << 6;
	data_p &= 0xBF;
	data_p |= temp;

	retVal = LGDTsetRegi(0x00, data_p);
	if(retVal != LGDT_ERR_NO)
	{
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	}

	retVal = LGDTsetReset();
	if (retVal != LGDT_ERR_NO)
	{
		return retVal;
	}

	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetMPEGPolarity(LGDTClock_t clktrig, LGDTClock_t validpol)
//
//	Input
//		- LGDTClock_t clktrig : MPEG Clock
//		- LGDTClock_t validpol : PacketSyncPin
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetMPEGPolarity(LGDT_Clock_t clktrig, LGDT_Clock_t validpol)
{
	DATA8		 data;						/// New register value
	DATA8		 temp = 0x00;				/// Previous register value
	LGDT_Return_t retVal;

	if (clktrig == LGDT_CLOCK_HIGH)
		temp |= 0x08;
	if (validpol == LGDT_CLOCK_HIGH)
		temp |= 0x01;

	retVal = LGDTgetRegi(0x87, &data);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	data &= 0xF6;
	data |= temp;

	retVal = LGDTsetRegi(0x87, data);
	if(retVal != LGDT_ERR_NO)
	{
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	}

	retVal = LGDTsetReset();
	if (retVal != LGDT_ERR_NO)
	{
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	}

	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetAGCData()
//
//	Input : void
//		- Definition should be made in drv4usr.h
//			 : AGC_SETUP_ADJ, AGC_SETUP_64QAM, AGC_SETUP_256QAM
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetAGCData()
{
	DATA8			data1;
	DATA8			data2;
	DATA16			data;
	LGDT_Return_t	retVal;
	LGDT_OperMode_t mode;

	retVal = LGDTgetOperMode(&mode);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	switch(mode)
	{
		case LGDT_QAM64:
			data = AGC_SETUP_64QAM;
			break;
		case LGDT_QAM256:
			data = AGC_SETUP_256QAM;
			break;
		case LGDT_VSB:
			data = AGC_SETUP_ADJ;
			break;
		default:				/// Error detecting of getOperModeFormat
			return (LGDT_Return_t)(LGDT_ERR_OTHER|LGDT_ERR_SET_FUNC);
	}

	data1 = (DATA8)data;
	data2 = (DATA8)(data>>8);

	retVal = LGDTsetRegi(0x40, data1);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	retVal = LGDTsetRegi(0x41, data2);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetAGCInput(DATA16 inputRF, DATA16 inputIF)
//
//	Input
//		- DATA16 inputRF
//		- DATA16 inputIF
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetAGCInput(DATA16 inputRF, DATA16 inputIF)
{
	DATA8		 data1;
	DATA8		 data2;
	DATA8		 data3;
	DATA8		 temp;
	LGDT_Return_t retVal;

	temp = inputRF>>8;
	data1 = temp << 4;
	temp = inputIF>>8;
	temp &= 0x0F;
	data1 |= temp;

	data2 = (DATA8)inputRF;
	data3 = (DATA8)inputIF;

	retVal = LGDTsetRegi(0x4E, data1);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	retVal = LGDTsetRegi(0x4F, data2);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	retVal = LGDTsetRegi(0x50, data3);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	
	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetAGCPolarity(LGDTPolarity_t rfpol, LGDTPolarity_t ifpol)
//
//	Inputs 
//		- LGDTPolarity_t rfpol : RF Polarity
//		- LGDTPolarity_t ifpol : IF Polarity
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetAGCPolarity(LGDT_Polarity_t rfpol, LGDT_Polarity_t ifpol)
{
	DATA8		 data;						/// New register value
	DATA8		 temp = 0x00;				/// Previous register value
	LGDT_Return_t retVal;

	if (rfpol == LGDT_INVERTED)
		temp |= 0x20;
	if (ifpol == LGDT_INVERTED)
		temp |= 0x10;

	retVal = LGDTgetRegi(0x4C, &data);
	if (retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	data &= 0xCF;
	data |= temp;

	retVal = LGDTsetRegi(0x4C, data);
	if(retVal != LGDT_ERR_NO)
	{
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	}

	return LGDT_ERR_NO;
}

//------------------------------------------------------//
//	LGDT_Return_t LGDTsetAGCBandwidth(DATA16 rfbw, DATA16 ifbw)
//
//
//	Inputs
//		- DATA16 rfbw : RF Bandwidth
//		- DATA16 ifbw : IF Bandwidth
//	Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetAGCBandwidth(DATA16 rfbw, DATA16 ifbw)
{
	DATA8		 data1;
	DATA8		 data2;
	LGDT_Return_t retVal;

	data2 = (DATA8)rfbw;
	data1 = rfbw >> 8;

	retVal = LGDTsetRegi(0x45, data1);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	retVal = LGDTsetRegi(0x46, data2);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	data2 = (DATA8)ifbw;
	data1 = ifbw >> 8;

	retVal = LGDTsetRegi(0x47, data1);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);

	retVal = LGDTsetRegi(0x48, data2);
	if(retVal != LGDT_ERR_NO)
		return (LGDT_Return_t)(retVal|LGDT_ERR_SET_FUNC);
	
	return LGDT_ERR_NO;
}

⌨️ 快捷键说明

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