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