📄 tidtv_tunerlg.c
字号:
/*******************************************************************************
* @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 + -