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

📄 tidtv_tunerlg.c

📁 ti的数字电视芯片 tvp9000的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*******************************************************************************
*	@ModuleName	::	TiDTV_TunerLG.c
*	
*	@Copyright	::	Copyright 2005- Texas Instruments, Inc.
*	
*	@Description::	TI DTV Tuner control module for LG VSB/QAM Demom TDVS-H061P
*	
*	@History	::
*---------------------------------------
*	05-18-2005	W.Shi	Created
*******************************************************************************/

#include	<stdio.h>
#include	<string.h>
#include	"ucos_ii.h"

#include	"TvpArch.h"
#include	"TvpDefs.h"
#include	"Tvp9000.h"
#include	"TvpError.h"
#include	"TvpInt.h"
#include	"TvpHdm.h"
#include	"TvpInt926.h"
#include	"TvpUarts.h"
#include	"TvpEbi.h"
#include	"TvpTpp.h"
#include	"TvpIrrf.h"
#include	"TvpGpio.h"
#include	"TvpVideo.h"
#include	"TvpAudio.h"
#include	"TvpEncoder.h"
#include	"TvpI2c.h"
#include	"TvpTimer.h"
#include	"TvpSdTables.h"
#include	"TvpSdram.h"
#include	"TvpSystem.h"

#include	"TiDTV_DataType.h"
#include	"TiDTV_SysCtrl.h"
#include	"TVP9K_I2C_Def.h"
#include	"TiDTV_Timer.h"

#include	"TiDTV_Tuner.h"

#define	TDVS_H061P_I2C_CHANNEL		TVP_I2C_1
#define	TDVS_H061P_I2C_DEVICE_ADDR	0xC2

static const UINT16 TvChanFreq[68] = {
	57, 63, 69, 79, 85,177,183,189,195,201,	//# channel  2-11	#//
   207,213,473,479,485,491,497,503,509,515,	//# channel 12-21	#//
   521,527,533,539,545,551,557,563,569,575,	//# channel 22-31	#//
   581,587,593,599,605,611,617,623,629,635,	//# channel 32-41	#//
   641,647,653,659,665,671,677,683,689,695,	//# channel 42-51	#//
   701,707,713,719,725,731,737,743,749,755,	//# channel 52-61	#//
   761,767,773,779,785,791,797,803,			//# channel 62-69	#//
};

/*******************************************************************************
*	@RoutineName:: TiDTV_SetTunerPhyChan
*
*	@Description:: Set TV Physical Channel
*
*	@Input		::
*		int TvChannel	: TV Channel [2-69]
*
*	@Output		:: none
*
*	@Return		::
*		int		: OK/NG
*******************************************************************************/
#define	AGC_POINT			2	// was 4
#define	TUNER_TEST_MODE		3

int TiDTV_SetTunerPhyChan(int TvChannel)
{
	UCHAR  WorkUCHAR[4];
	USHORT Freq, value;
	
	if (TvChannel < TI_DTV_MIN_PHY_CHANNEL_NO || TvChannel > TI_DTV_MAX_PHY_CHANNEL_NO)
		return TI_DTV_E_NG;
	
	Freq = TvChanFreq[TvChannel - TI_DTV_MIN_PHY_CHANNEL_NO];
	value = (Freq + 44) * 16;
	WorkUCHAR[3] = value & 0x00ff;			// divider Byte 2
	WorkUCHAR[2] = (value & 0x7f00) >> 8;	// divider Byte 1
	
	if (Freq < 176)
		WorkUCHAR[1] = 0x01;	// Low band
	else if (Freq < 452)
		WorkUCHAR[1] = 0x02;	// Middle band
	else
		WorkUCHAR[1] = 0x04;	// High band
	
	WorkUCHAR[0] = 0x8e;
	
	TiDTV_I2cWrite(TDVS_H061P_I2C_CHANNEL, 1, TDVS_H061P_I2C_DEVICE_ADDR, 4, WorkUCHAR, OS_TICKS_PER_SEC);
	
	WorkUCHAR[0] = (TUNER_TEST_MODE << 3) | 0x86;
//	WorkUCHAR[1] = (AGC_POINT + 8) << 4;
	WorkUCHAR[1] = (AGC_POINT + 0) << 4;
	TiDTV_I2cWrite(TDVS_H061P_I2C_CHANNEL, 1, TDVS_H061P_I2C_DEVICE_ADDR, 2, WorkUCHAR, OS_TICKS_PER_SEC);
	
	return TI_DTV_E_OK;
}

/*******************************************************************************
*	@RoutineName:: TiDTV_GetTunerPllStatus
*
*	@Description:: Get Tuner PLL status
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		::
*		int		: 0 = Not locked yet, 1 = Locked
*******************************************************************************/
int TiDTV_GetTunerPllStatus(void)
{
	UCHAR TunerStatus;
	
	TiDTV_I2cRead(TDVS_H061P_I2C_CHANNEL, 1, TDVS_H061P_I2C_DEVICE_ADDR, 0, 0, 1, &TunerStatus, OS_TICKS_PER_SEC / 2);
	
	return (TunerStatus & 0x40);
}

/*******************************************************************************
*	@RoutineName:: TiDTV_InitTuner
*
*	@Description:: Initialize the Tuner
*
*	@Input		:: none
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
void TiDTV_InitTuner(void)
{
	TvpTppFEConfig TppFeConfig;
	
//----------------------------------------------------------
#ifdef	TVP9K_EVM	// for TI TVP9000 EVM
#if	0
	// Configure TPP Front End: for Alps Tuner EVM
	TppFeConfig.serial = 1;
	TppFeConfig.dclk_active_edge = 1;
	TppFeConfig.pacval_polarity = 1;
	TppFeConfig.bytestrt_polarity = 1;
	TppFeConfig.derror_polarity = 1;
	TppFeConfig.serial_lsb_first = 0;
	TppFeConfig.serial_bitsel = 0;
	TppFeConfig.framer_enable = 1;
	TppFeConfig.parser_ctrl = 0;
#else
	// Configure TPP Front End: for TS equipment (SENCORE/Tektronics)
	TppFeConfig.serial = 0;
	TppFeConfig.dclk_active_edge = 1;
	TppFeConfig.pacval_polarity = 1;
	TppFeConfig.bytestrt_polarity = 1;
	TppFeConfig.derror_polarity = 1;
	TppFeConfig.serial_lsb_first = 0;
	TppFeConfig.serial_bitsel = 0;
	TppFeConfig.framer_enable = 1;
	TppFeConfig.parser_ctrl = 0;
#endif
	
	TiDTV_SysCtrl.TotalNumPhyChanDTV = 1;	// skip Auto TV Channel scan
	TiDTV_SysCtrl.CurPhyChanDTV = 7;
	TiDTV_ChangeDtvRfChan(TiDTV_SysCtrl.CurPhyChanDTV, 0);
//----------------------------------------------------------
#else
	// Configure TPP Front End: for TI TVP9000 RefDesign Board
	TppFeConfig.serial = 1;
	TppFeConfig.dclk_active_edge = 1;
	TppFeConfig.pacval_polarity = 1;
	TppFeConfig.bytestrt_polarity = 1;
	TppFeConfig.derror_polarity = 0;
	TppFeConfig.serial_lsb_first = 0;
	TppFeConfig.serial_bitsel = 0;
	TppFeConfig.framer_enable = 1;
	TppFeConfig.parser_ctrl = 0;
#endif	/* TVP9K_EVM */
//----------------------------------------------------------
	
	tvpTppInputConfig(&TppFeConfig);
	
	LGDTinitVSB();
	LGDTsetRegi(0x87, 0xFF);		// ##### VSB Decoder for what ???
	LGDTsetMPEGPolarity(LGDT_CLOCK_HIGH, LGDT_CLOCK_HIGH);
	LGDTsetMPEGMode(LGDT_SERIAL);

#ifdef	_DEBUG
{
	LGDT_OperMode_t mode;
	
	LGDTgetOperMode(&mode);
}
#endif	/* _DEBUG */
}

/*******************************************************************************
*	@RoutineName:: TiDTV_SetDtvRfChan
*
*	@Description:: Set DTV RF Channel
*
*	@Input		::
*		int RfChanNo	: TV Channel [2-69]
*		int Retry		: number of Retries
*
*	@Output		:: none
*
*	@Return		:: none
*******************************************************************************/
void TiDTV_SetDtvRfChan(int RfChanNo, int Retry)
{
	TI_DTV_CHAN_STATUS *pTvChanStatus = TiDTV_SysCtrl.ChanStatus + RfChanNo - TI_DTV_MIN_PHY_CHANNEL_NO;
	int  i;
	
	if (Retry == 0) {
		// just set the TV PHY Channel
		LGDTsetTuner(RfChanNo);
		return;
	}
	
	for (i = 0; i < Retry; i++) {
		LGDTsetTuner(RfChanNo);
		
		// wait for a while
		TiDTV_SetSoftTimer(TI_DTV_SOFT_TIMER1, 350);
		TiDTV_WaitSoftTimer(TI_DTV_SOFT_TIMER1);
		
	#if	0
		// check if NTSC Video (Analog Channel)
		LGDTisNTSC(&NtscStatus);
		if (NtscStatus != 0) {
			pTvChanStatus->Bits.Locked = 1;	// Locked/Not-locked flag
			pTvChanStatus->Bits.Analog = 1;	// DTV (=0) /Analog TV (=1) channel flag
			TiDTV_SysCtrl.TotalNumPhyChanATV++;	// Total number of Locked Physical Channels (A-TV)
			break;		// locked			
		}
	#endif
		
		if (LGDTcheckStatusVSB() == 0) {
			pTvChanStatus->Bits.Locked = 1;	// Locked/Not-locked flag
			pTvChanStatus->Bits.Analog = 0;	// DTV (=0) /Analog TV (=1) channel flag
			break;		// locked
		}
		
		// wait for a while
		TiDTV_SetSoftTimer(TI_DTV_SOFT_TIMER1, 10);
		TiDTV_WaitSoftTimer(TI_DTV_SOFT_TIMER1);
	}
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//    LG SystemIC 3303 VSB/QAM Demodulator Driver APIs
//    Filename : LGSIC3303API.cpp
//
//    DSA Gr., System IC Div., LG Electronics Inc.,
//    Programmed by Jung, Phil Young(pyjung@lge.com)
//
//    Written on September 2004
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#define	LG3303_I2C_CHANNEL			TVP_I2C_1
#define LG3303_I2C_DEVICE_ADDR		0xB2	// Open = 0x1C, Pull-Down = 0xB2

#define LGDT_VERSION_MAJOR		0x3303	// CHIP NAME
#define LGDT_VERSION_CUSTOM		0x0411	// 2004 November
#define LGDT_VERSION_MINOR		0x0200	// ver. 2.0

int m_Count1;	// used in the CheckStatus()
int m_Count2;	// used in the CheckStatus()
int m_Count3;	// used in the CheckStatus()

LGDT_Return_t  LGDTinitVSB(void);
LGDT_Return_t  LGDTinit64QAM(void);
LGDT_Return_t  LGDTinit256QAM(void);

//------------------------------------------------------//
// LGDT_Return_t LGDTReset(void)
//       - Reset LGSIC 3302S demodulator
//
// Input : void
// Return   : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTsetReset(void)
{
   LGDT_Return_t retVal;

   retVal = LGDTsetRegi(0x02, 0x00);
   if (retVal != LGDT_ERR_NO)
      return (LGDT_Return_t)(retVal|LGDT_ERR_INIT);

   retVal = LGDTsetRegi(0x02, 0x01);
   if (retVal != LGDT_ERR_NO)
      return (LGDT_Return_t)(retVal|LGDT_ERR_INIT);

   m_Count1 = 0;
   m_Count2 = 0;
   m_Count3 = 0;

   return LGDT_ERR_NO;
}

LGDT_Return_t LGDTsetTuner(int channel)
{
   LGDT_Return_t retVal;

   //+++++ Call the Tuner setup function, which defined in Tuner.cpp +++++//
   retVal = (LGDT_Return_t) TiDTV_SetTunerPhyChan(channel);
   if (retVal != LGDT_ERR_NO)
      return (LGDT_Return_t)(retVal|LGDT_ERR_TUNER);

   //+++++ Core Reset : This is integral to reset the demod after the tuner setting +++++//
   retVal = LGDTsetReset();
   if (retVal != LGDT_ERR_NO)
      return retVal;

   return LGDT_ERR_NO;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//
//		LG SystemIC 3303 VSB/QAM Demodulator Driver APIs
//		Filename : LGSIC3303API.cpp
//
//		DSA Gr., System IC Div., LG Electronics Inc.,
//		Programmed by Jung, Phil Young(pyjung@lge.com)
//
//		Written on September 2004
//
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#define DEBUGGING_FOR_LGE_SIC
#undef DEBUGGING_FOR_LGE_SIC

#define LGDT_VERSION_MAJOR		0x3303		// CHIP NAME
#define LGDT_VERSION_CUSTOM		0x0411		// 2004 November
#define LGDT_VERSION_MINOR		0x0200		// ver. 2.0

int m_Count1;		/// used in the CheckStatus()
int m_Count2;		/// used in the CheckStatus()
int m_Count3;		/// used in the CheckStatus()

LGDT_Return_t	LGDTinitVSB(void);
LGDT_Return_t	LGDTinit64QAM(void);
LGDT_Return_t	LGDTinit256QAM(void);

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//	Self-Refresh Functions
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


//------------------------------------------------------//
//	LGDT_Return_t LGDTCheckStatus(void)
//		: Checks Demod status and call appropriate functinons
//
//	Input : void
//	Return : LGDT_Return_t
//
//	Global Variables used in this function 
//		int m_Count1
//		int m_Count2
//		int m_Count3
//
//------------------------------------------------------//
LGDT_Return_t LGDTcheckStatusVSB()
{
	DATA8	data_p;

	//+++++ count1	+++++//
	LGDTgetRegi(0x1C, &data_p);
	data_p &= 0x80;
	if (data_p != 0x80)				/// detect CLOCKVSB failed
	{
		m_Count1++;

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("\n Count1=%d", m_Count1);
#endif
		
		if (m_Count1 > 2)
		{
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		return LGDT_ERR_UNLOCK;
	}
	m_Count1 = 0;

	//+++++ count2	+++++//
	LGDTgetRegi(0x38, &data_p);
	data_p &= 0x02;
	if (data_p != 0x00)				/// detect nSyncLock failed
	{
		m_Count2++;

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("\n Count2=%d", m_Count2);
#endif

		if (m_Count2 > 5)
		{			
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		return LGDT_ERR_UNLOCK;
	}
	m_Count2 = 0;

	//+++++ Comb Filter On/Off Checks	+++++//
	LGDTgetRegi(0x6A, &data_p);
	data_p &= 0x01;
	if (data_p == 0x00)				/// Check Comb == 0n  - 0 : NTSC signal detected.
	{			

#ifdef DEBUGGING_FOR_LGE_SIC
		printf("\n Check Status - VSB mode Locking OK!");
#endif

		return LGDT_ERR_NO;
	}

	//+++++ count3	+++++//
	LGDTgetRegi(0x05, &data_p);	/// FSNRBAD & FFECERR
	data_p &= 0x20;		// Bit #5
	data_p &= 0x04;		// Bit #2
	if (data_p == 0x24)
	{
		m_Count3++;

#ifdef DEBUGGING_FOR_LGE_SIC
		printf("\n Count3=%d", m_Count3);
#endif

		if (m_Count3 > 5)
		{
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		else
		{
			LGDTsetRegi(0x04, 0xFF);
			LGDTsetRegi(0x04, 0x00);
		}
		return LGDT_ERR_UNLOCK;
	}
	m_Count3 = 0;

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("\n Check Status - VSB mode Locking OK!");
#endif

	return LGDT_ERR_NO;
}

LGDT_Return_t LGDTcheckStatusQAM()
{
	DATA8	data_p;
	DATA8	data2_p;

	LGDTgetRegi(0x36, &data_p);			//+++ TR LOCK	+++//
	LGDTgetRegi(0x1C, &data2_p);		//+++ CR Lock	+++//
	data_p &= 0x07;
	data2_p &= 0x07;
	if ( (data_p == 0) || (data2_p == 0))
	{
		m_Count1++;

#ifdef DEBUGGING_FOR_LGE_SIC
		printf("\n Count1=%d", m_Count1);
#endif

		if (m_Count1 > 1)
		{
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		return LGDT_ERR_UNLOCK;
	}
	m_Count1 = 0;

	LGDTgetRegi(0x05, &data_p);
	data_p &= 0x20;		// Bit #5
	if (data_p == 0x20)
	{
		m_Count2++;

#ifdef DEBUGGING_FOR_LGE_SIC
		printf("\n Count2=%d", m_Count2);
#endif

		if (m_Count2 > 8)
		{
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		else
		{
			LGDTsetRegi(0x04, 0xFF);
			LGDTsetRegi(0x04, 0x00);
		}
		return LGDT_ERR_UNLOCK;
	}
	m_Count2 = 0;

	LGDTgetRegi(0x8A, &data_p);
	data_p &= 0x0F;
	if (data_p != 0x0F)				/// 
	{
		m_Count3++;

#ifdef DEBUGGING_FOR_LGE_SIC
		printf("\n Count3=%d", m_Count3);
#endif

		if (m_Count3 > 4)
		{
			LGDTsetReset();
			m_Count1 = 0;
			m_Count2 = 0;
			m_Count3 = 0;
		}
		return LGDT_ERR_UNLOCK;
	}

	m_Count1 = 0;
	m_Count2 = 0;
	m_Count3 = 0;

#ifdef DEBUGGING_FOR_LGE_SIC
	printf("\n Check Status - QAM mode Locking OK!");
#endif

	return LGDT_ERR_NO;
}

LGDT_Return_t LGDTcheckStatus()
{
	DATA8		  data_p;
	LGDT_Return_t		retVal;

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

	if ((data_p & 0x03) == 0x03)
		return LGDTcheckStatusVSB();
	else
		return LGDTcheckStatusQAM();
}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//	INIT Functions
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

LGDT_Return_t LGDTinitVSB(void)		//3303
{
	LGDT_Return_t retVal;

	retVal = LGDTsetRegi(0x00, 0x03);// No description in the Datasheet, Is this automatically changed to 0x03 ??
	if (retVal != LGDT_ERR_NO)
		return retVal;

	///----------	1) NCOCTF[23:0]	----------//

⌨️ 快捷键说明

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