📄 tidtv_tunerlg.c
字号:
retVal = LGDTsetRegi(0x0D, 0x40);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x0E, 0x87);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x0F, 0x8E);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x10, 0x01);
if (retVal != LGDT_ERR_NO)
return retVal;
/*--- Mis-print?
retVal = LGDTsetRegi(0x10, 0x8E);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x11, 0x01);
if (retVal != LGDT_ERR_NO)
return retVal;
*/
///---------- 2) AGC ----------//
/// 2)-2. the front-end design use RF AGC(tuner) loop
retVal = LGDTsetRegi(0x47, 0x88);/// REFD[11:0]
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4C, 0x14);
if (retVal != LGDT_ERR_NO)
return retVal;
///---------- 3) nSFTRST ----------//
retVal = LGDTsetReset();
if (retVal != LGDT_ERR_NO)
return retVal;
return LGDT_ERR_NO;
}
LGDT_Return_t LGDTinit64QAM(void) //3303
{
LGDT_Return_t retVal;
// DATA8 data1;
// DATA8 data2;
///---------- 1) OPERMODE[1:0] ----------//
retVal = LGDTsetRegi(0x00, 0x00);
if (retVal != LGDT_ERR_NO)
return retVal;
///---------- 2) AGC ----------//
retVal = LGDTsetRegi(0x51, 0x63); /// LOCKDTEN
if (retVal != LGDT_ERR_NO)
return retVal;
/*
/// 2)-2. the front-end design doesn't use RF AGC(tuner) loop
retVal = LGDTgetRegi(0x52, &data1); /// IFACC
if (retVal != LGDT_ERR_NO)
return retVal;
data1 &= 0x0F;
retVal = LGDTgetRegi(0x42, &data2);
if (retVal != LGDT_ERR_NO)
return retVal;
data2 &= 0xF0;
data1 |= data2;
retVal = LGDTsetRegi(0x42, data1);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTgetRegi(0x54, &data1);
if (retVal != LGDT_ERR_NO)
return retVal;
data1 -= 1;
retVal = LGDTsetRegi(0x44, data1);
if (retVal != LGDT_ERR_NO)
return retVal;
*/
retVal = LGDTsetRegi(0x47, 0x66); /// IFBW
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x48, 0x66);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4D, 0x1A); /// NSSEL
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4C, 0x14); /// RFPOL
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x49, 0x08); /// IAGCBW
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4A, 0x9B);
if (retVal != LGDT_ERR_NO)
return retVal;
///---------- 3) nSFTRST ----------//
retVal = LGDTsetReset();
if (retVal != LGDT_ERR_NO)
return retVal;
return LGDT_ERR_NO;
}
LGDT_Return_t LGDTinit256QAM(void) //3303
{
LGDT_Return_t retVal;
// DATA8 data1;
// DATA8 data2;
///---------- 1) OPERMODE[1:0] ----------//
retVal = LGDTsetRegi(0x00, 0x01);
if (retVal != LGDT_ERR_NO)
return retVal;
///---------- 2) AGC ----------//
retVal = LGDTsetRegi(0x51, 0x63); /// LOCKDTEN
if (retVal != LGDT_ERR_NO)
return retVal;
/*
/// 2)-2. the front-end design doesn't use RF AGC(tuner) loop
retVal = LGDTgetRegi(0x52, &data1); /// IFACC
if (retVal != LGDT_ERR_NO)
return retVal;
data1 &= 0x0F;
retVal = LGDTgetRegi(0x42, &data2);
if (retVal != LGDT_ERR_NO)
return retVal;
data2 &= 0xF0;
data1 |= data2;
retVal = LGDTsetRegi(0x42, data1);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTgetRegi(0x54, &data1);
if (retVal != LGDT_ERR_NO)
return retVal;
data1 -= 1;
retVal = LGDTsetRegi(0x44, data1);
if (retVal != LGDT_ERR_NO)
return retVal;
*/
retVal = LGDTsetRegi(0x47, 0x66); /// IFBW
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x48, 0x66);
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4D, 0x1A); /// NSSEL
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4C, 0x14); /// RFPOL
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x49, 0x08); /// IAGCBW
if (retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTsetRegi(0x4A, 0x9B);
if (retVal != LGDT_ERR_NO)
return retVal;
///---------- 3) nSFTRST ----------//
retVal = LGDTsetReset();
if (retVal != LGDT_ERR_NO)
return retVal;
return LGDT_ERR_NO;
}
LGDT_Return_t LGDTinitMode(LGDT_OperMode_t mode)
{
LGDT_Return_t retVal;
switch(mode)
{
case LGDT_QAM64:
retVal = LGDTinit64QAM();
if (retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_INIT);
break;
case LGDT_QAM256:
retVal = LGDTinit256QAM();
if (retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_INIT);
break;
case LGDT_VSB:
retVal = LGDTinitVSB();
if (retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_INIT);
break;
default:
return (LGDT_Return_t)(LGDT_ERR_PARAM|LGDT_ERR_INIT);
// break;
}
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTInit3303(LGDTOperMode_t mode)
// - Call initialize function based on the mode argument
// and checks the status
//
// Input : LGDTOperMode_t mode
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTinit3303(LGDT_OperMode_t mode)
{
LGDT_Return_t retVal;
LGDT_OperMode_t flag;
m_Count1 = 0; /// used in CheckStatus()
m_Count2 = 0; /// used in CheckStatus()
m_Count3 = 0; /// used in CheckStatus()
retVal = LGDTinitMode(mode);
if(retVal != LGDT_ERR_NO)
return retVal;
retVal = LGDTgetOperMode(&flag);
if(retVal != LGDT_ERR_NO)
return retVal;
if (flag != mode)
return LGDT_ERR_INIT;
return LGDT_ERR_NO;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// GET Functions
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//------------------------------------------------------//
// Carrier Recovery Lock
// CLOCKVSB : bit #7 @ 0x1C
// CLOCKQAM : bit #2~0 @ 0x1C
//------------------------------------------------------//
LGDT_Return_t LGDTisLockCR(char *flag)
{
DATA8 data_p;
DATA8 data;
LGDT_OperMode_t mode;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x1C, &data_p);
if (retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
retVal = LGDTgetOperMode(&mode);
if(retVal != LGDT_ERR_NO)
return retVal;
if (mode == LGDT_VSB)
{
data = data_p & 0x80;
if (data == 0x80) *flag = 1;
else *flag = 0;
}
else
{
data = data_p & 0x02;
if (data == 0x02) *flag = 1;
else *flag = 0;
}
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// Sync Lock
// nSyncLoc : bit #1 @ 0x38
//------------------------------------------------------//
LGDT_Return_t LGDTisLockSync(char* flag)
{
DATA8 data_p;
DATA8 data;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x38, &data_p);
if (retVal != LGDT_ERR_NO)
return retVal;
data = data_p & 0x20;
if (data == 0x20)
*flag = 1;
else
*flag = 0;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// Timing Recovery Lock
// TRLOCK : bit #2~0 @ 0x36
//------------------------------------------------------//
LGDT_Return_t LGDTisLockTR(char* flag)
{
DATA8 data_p;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x36, &data_p);
if (retVal != LGDT_ERR_NO)
return retVal;
data_p &= 0x07;
if (data_p != 0x00)
*flag = 1;
else
*flag = 0;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// Viterbi Lock
// VDLOCK : bit #3 @ 0x8A
//------------------------------------------------------//
LGDT_Return_t LGDTisLockViterbi(char* flag)
{
DATA8 data_p;
DATA8 data;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x8A, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
data = data_p & 0x08;
if (data == 0x08)
*flag = 1;
else
*flag = 0;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// FEC Frame Lock
// FRAMELCK : bit #2 @ 0x8A
//------------------------------------------------------//
LGDT_Return_t LGDTisLockFEC(char* flag)
{
DATA8 data_p;
DATA8 data;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x8A, &data_p);
if (retVal != LGDT_ERR_NO)
return retVal;
data = data_p & 0x04;
if (data == 0x04)
*flag = 1;
else
*flag = 0;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// MPEG Lock
// MPEGLOCK : bit #0 @ 0x8A
//------------------------------------------------------//
LGDT_Return_t LGDTisLockMPEG(char* flag)
{
DATA8 data_p;
DATA8 data;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x8A, &data_p);
if (retVal != LGDT_ERR_NO)
return retVal;
data = data_p & 0x01;
if (data == 0x01)
*flag = 1;
else
*flag = 0;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTisNTSC(char* flag)
//
// Input : char* flag
// - TRUE : Comb filter is on, when NTSC detected
// - FALSE : Comb filter is off, when ATSC detected
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTisNTSC(char* flag)
{
DATA8 data_p;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x6A, &data_p);
if (retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
data_p &= 0x01;
if (data_p == 0x01)
*flag = 0;
else
*flag = 1;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTgetRegi(DATA8 addr, DATA8* data)
// - Gets a register based on the addr and returns data
//
// Input
// - DATA8 addr
// - DATA8* data
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetRegi(DATA8 addr, DATA8* data)
{
DATA8 data_p;
LGDT_Return_t retVal;
retVal = (LGDT_Return_t) TiDTV_I2cRead(LG3303_I2C_CHANNEL, 1, LG3303_I2C_DEVICE_ADDR, 1, addr, 1, &data_p, OS_TICKS_PER_SEC / 2);
if (retVal != 0)
return LGDT_ERR_I2C;
#ifdef DEBUGGING_FOR_LGE_SIC
// printf("\nLGDTgetRegi() read=%d", data_p);
#endif
*data = data_p;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTgetFreqOffset(DATA16*)
// FQOFFSET : 23 bits @ 0x17~0x19
// - shows frequency offset
//
// Input : DATA16*
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetFreqOffset(DATA16* offset)
{
DATA8 data_p;
LGDT_Return_t retVal;
long total = 0;
double SamplingRate= 25*(10^6); //# Sampling Rate = 25 * 10^6 #//
const double PI = 3.14;
retVal = LGDTgetRegi(0x17, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
total = data_p << 16;
retVal = LGDTgetRegi(0x18, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
total |= data_p << 8;
retVal = LGDTgetRegi(0x19, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
total = data_p;
*offset = (int)(total * pow(2,-27) * SamplingRate * (1/2*PI) * (1/24));
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTgetIFAcc(DATA16*)
// - shows IF ACC value
//
// Input : DATA16*
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetIFAcc(DATA16* acc)
{
DATA8 data_p;
DATA16 data;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x52, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
data_p &= 0x0F;
data = data_p << 8;
retVal = LGDTgetRegi(0x54, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
data |= data_p;
*acc = data;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTgetDCValue(DATA16*)
// - shows DC Value
//
// Input : DATA16*
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetDCValue(DATA16* data)
{
DATA8 data_p;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x35, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
*data = data_p;
return LGDT_ERR_NO;
}
//------------------------------------------------------//
// LGDT_Return_t LGDTgetIntMode(DATA8*, DATA8*)
// - shows Step and Increase of the interleaving
//
// Input
// - DATA8* : I value - Step
// - DATA8* : J value - Increase
// Return : LGDT_Return_t
//------------------------------------------------------//
LGDT_Return_t LGDTgetIntMode(DATA8* i, DATA8* j)
{
DATA8 data_p;
LGDT_Return_t retVal;
retVal = LGDTgetRegi(0x8A, &data_p);
if(retVal != LGDT_ERR_NO)
return (LGDT_Return_t)(retVal|LGDT_ERR_GET_FUNC);
switch(data_p)
{
case 0x00 : *i = 128; *j = 1; break;
case 0x01 : *i = 128; *j = 1; break;
case 0x02 : *i = 128; *j = 2; break;
case 0x03 : *i = 64; *j = 2; break;
case 0x04 : *i = 128; *j = 3; break;
case 0x05 : *i = 32; *j = 4; break;
case 0x06 : *i = 128; *j = 4; break;
case 0x07 : *i = 16; *j = 8; break;
case 0x08 : *i = 128; *j = 5; break;
case 0x09 : *i = 8; *j = 16; break;
case 0x0A : *i = 128; *j = 6; break;
case 0x0B : *i = 4; *j = 32; break; /// Reserved
case 0x0C : *i = 128; *j = 7; break;
case 0x0D : *i = 2; *j = 64; break; /// Reserved
case 0x0E : *i = 128; *j = 8; break;
case 0x0F : *i = 1; *j =128; break; /// Reserved
}
return LGDT_ERR_NO;
}
//------------------------------------------------------//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -