📄 lg_yizhi_tuner.c
字号:
buffer = buffer&0xf7;
TDA10021_iWrI2c(0x1c,buffer);
/* reset the demod*/
buffer = TDA10021_iRdI2c(0x00);
buffer= buffer&0xfe;
TDA10021_iWrI2c(0x00,buffer);
Q10021AlgoDelay(80000, uSR);
*pGain=bGainFound;
}
}
/* set the AGC time constant */
buffer = TDA10021_iRdI2c(0x02);
buffer = buffer|0x03;
TDA10021_iWrI2c(0x02,buffer);
Q10021AlgoDelay(200000, uSR);
Q10021AlgoDelay(200000, uSR);
Q10021AlgoDelay(200000, uSR);
Q10021AlgoDelay(200000, uSR);
/* read the synchro registers // test if carlock*/
bSyncReg = TDA10021_iRdI2c(0x11);
//MXT_printf("\n***********00000 TDA10021 OX11= 0X%X ***********",(int)bSyncReg);
if (!(bSyncReg & 0x02))
return 3;
/*test if frame synchro*/
if ((bSyncReg & 0x04) && (!(bSyncReg & 0x40)))
{ /* oK case*/
if (uSR > 3000000)
TDA10021_iWrI2c(0x04,0x02);
else
TDA10021_iWrI2c(0x04,0x0a);
return 0;
}
/* test if auto spectral inv*/
else if(1)
{
/* test the other spectral inversion*/
buffer = TDA10021_iRdI2c(0x00);
buffer1=buffer&0x20;
if(buffer1==0x20) //inviq=1
buffer=buffer&0xdf;
else //inviq=0
buffer=buffer|0x20;
TDA10021_iWrI2c(0x00,buffer);
Q10021AlgoDelay(60000, uSR); //30000
bSyncReg = TDA10021_iRdI2c(0x11);
//MXT_printf("\n*********** 222TDA10021 OX11= 0X%X ***********",(int)bSyncReg);
/* test if frame sync and DVB*/
if ((bSyncReg & 0x04) && !(bSyncReg & 0x40))
{ /* oK case*/
if (uSR > 3000000)
TDA10021_iWrI2c(0x04,0x02);
else
TDA10021_iWrI2c(0x04,0x0a);
return 0;
}
}
return 4;
}
unsigned char Q10021AlgoGain(unsigned long uSR, unsigned char bGain)
{
unsigned char buffer;
long lRCentralCoef, lICentralCoef; unsigned char pReadCoef[2];
do
{ /* read the real part of the central coef of the equalizer*/
pReadCoef[0] = TDA10021_iRdI2c(0x50);
pReadCoef[1] = TDA10021_iRdI2c(0x51);
lRCentralCoef = (unsigned long)(pReadCoef[0] << 3 | pReadCoef[1] >> 5);
if (lRCentralCoef & 0x400) lRCentralCoef |= 0xFFFFF800;
/* lRCentralCoef^2*/
lRCentralCoef *= lRCentralCoef;
//MXT_printf("\n*********** TDA10021 lRCentralCoef= %d ***********",(int)lRCentralCoef);
/* read the imaginary part of the central coef of the equalizer*/
pReadCoef[0] = TDA10021_iRdI2c(0x90);
pReadCoef[1] = TDA10021_iRdI2c(0x91);
lICentralCoef = (unsigned long)(pReadCoef[0] << 3 | pReadCoef[1] >> 5);
if (lICentralCoef & 0x400) lICentralCoef |= 0xFFFFF800;
/* lICentralCoef^2*/
lICentralCoef *= lICentralCoef;
//MXT_printf("\n*********** TDA10021 lICentralCoef= %d ***********",(int)lICentralCoef);
/* test the module*/
if ((lRCentralCoef + lICentralCoef) >490000)
{ /* no scanning so use all agin - test if gain max is reached*/
if (bGain < 5) { /* try next gain*/
bGain++;
if (bGain==1)
{
buffer = TDA10021_iRdI2c(0x0e);
buffer = buffer|0x20;
buffer = buffer&0x3f;
TDA10021_iWrI2c(0x0e,buffer);
}
if (bGain==0)
{
buffer = TDA10021_iRdI2c(0x0e);
TDA10021_iWrI2c(0x0e,buffer&0x1f);
}
if (bGain==2)
{
buffer = TDA10021_iRdI2c(0x0e);
buffer = buffer&0x6f;
buffer = buffer|0x40;
TDA10021_iWrI2c(0x0e,buffer);
}
if (bGain==3)
{
buffer = TDA10021_iRdI2c(0x0e);
buffer = buffer&0x7f;
buffer = buffer|0x60;
TDA10021_iWrI2c(0x0e,buffer);
}
if (bGain==4)
{
buffer = TDA10021_iRdI2c(0x0e);
buffer = buffer|0x80;
buffer = buffer&0x9f;
TDA10021_iWrI2c(0x0e,buffer);
}
if (bGain==5)
{
buffer = TDA10021_iRdI2c(0x0e);
buffer = buffer|0xa0;
buffer = buffer&0xbf;
TDA10021_iWrI2c(0x0e,buffer);
}
/* wait for synchro*/
Q10021AlgoDelay(10000, uSR);
}
else return 6;/*err*/
}
else return bGain; /* if ok*/
}while(1);
}
void Q10021AlgoDelay(unsigned long uNbSymbol, unsigned long uSR)
{
uNbSymbol *= 1000; uNbSymbol += uSR/2; uNbSymbol /= uSR;
Sleep((unsigned short)uNbSymbol); /*msec*/
}
int FE_GetLK (void)//void QLockStatus()
{
unsigned char uncor,buffer,buffer1;
#if 0
int test0;
int carrier_lock;
int frame_lock;
int frontend_lock;
int dataout_lock;
//uncor=(unsigned char)(RegGetOneRegister(0x13)&0x7f);
uncor = TDA10021_iRdI2c(0x13);
uncor=uncor&0x7f;
// Sleep(10);
bSyncReg = TDA10021_iRdI2c(0x11);
if(bSyncReg & 0x02) carrier_lock=1; else carrier_lock=0;
if(bSyncReg & 0x03) frame_lock=1; else frame_lock=0;
if(bSyncReg & 0x04) frontend_lock=1; else frontend_lock=0;
if(uncor==0) dataout_lock=1; else dataout_lock=0;
if(uncor)
{
//ChipWriteMasked(0x10, 0x20,(unsigned char)(0<<5));
//ChipWriteMasked(0x10, 0x20,(unsigned char)(1<<5));
buffer = TDA10021_iRdI2c(0x10);
buffer = buffer&0xdf;
TDA10021_iWrI2c(0x10,buffer);
buffer = TDA10021_iRdI2c(0x10);
buffer = buffer|0x20;
TDA10021_iWrI2c(0x10,buffer);
}
Sleep(10);
#endif
buffer = TDA10021_iRdI2c(0x11);
// MXT_printf("\n*********** final TDA10021 OX11= 0X%X ***********",(int)buffer);
if((buffer&0x0e)==0x0e)
{
//MXT_printf("\n******** GLOBALLOCK=1 *************");
GLOBALLOCK = 1;
}
else
{
//MXT_printf("\n******* GLOBALLOCK=0 *************");
GLOBALLOCK = 0;
}
// buffer = TDA10021_iRdI2c(0x17);
// MXT_printf("\n******** FINAL AGC_TUNER=%d********",buffer);
// buffer = TDA10021_iRdI2c(0x2f);
// MXT_printf("\n******** FINAL AGC_IF=%d********",buffer);
return(GLOBALLOCK);
}
int Berprocess(unsigned char* berReturn)
{
unsigned long puBer, Ber_value1; // O: BER
unsigned long puBerBuf[3], uBerDepth;
unsigned short bershow;
// read the BER value
puBerBuf[0] = TDA10021_iRdI2c(0x14); //LSB
puBerBuf[1] = TDA10021_iRdI2c(0x15);
puBerBuf[2] = TDA10021_iRdI2c(0x16);
puBer = puBerBuf[2]<<16 | puBerBuf[1]<<8 | puBerBuf[0];
// read the BER depth
uBerDepth = TDA10021_iRdI2c(0x10); //RSCONF
//MXT_printf("\n*********** uBerDepth value =0x%x *********** ",(int)uBerDepth);
// apply a correction of 4/5 for 10e5
switch(uBerDepth & 0xc0)
{
case 0x00: // 1,00E+05
puBer *= 1000;
puBer *= 4;
puBer /= 5;
break;
case 0x40: // 1,00E+06
puBer *= 100;
break;
case 0x80: // 1,00E+07
puBer *= 10;
break;
case 0xc0: // 1,00E+08
break;
}
//MXT_printf("\n*********** puBer value =%d *********** ",(int)puBer);
Ber_value1=puBer;
Esum=8;
if(Ber_value1>=1000000)
{
ber_value = Ber_value1/1000000 ;
Esum=2;
}
else if (Ber_value1>=100000)
{
ber_value = Ber_value1 /100000;
Esum=3;
}
else if (Ber_value1>=10000)
{
ber_value = Ber_value1 /10000;
Esum=4;
}
else if (Ber_value1>=1000)
{
ber_value = Ber_value1 /1000;
Esum=5;
}
else if (Ber_value1>=100)
{
ber_value = Ber_value1 /100;
Esum=6;
}
else if (Ber_value1>=10)
{
ber_value = Ber_value1 /10;
Esum=7;
}
// MXT_printf("\n*********** ber_value value =%d *********** ",(int)ber_value);
// MXT_printf("\n*********** Esum value =%d *********** ",(int)Esum);
bershow = (unsigned short)( (8-Esum)*16+ ber_value*3.3) ;
if(bershow>255)
bershow=255;
berReturn[0] = ber_value;
berReturn[1] = Esum;
if(FE_GetLK())
berReturn[2] = 255-bershow;
else
{
berReturn[0] = 1;
berReturn[1] = 0;
berReturn[2] = 0;
}
berReturn[2] = 99-berReturn[2]*99/255;
//MXT_printf("\n*********** return puBer value =%d *********** ",(int)berReturn[2]);
return 0;
}
void Powerprocess(unsigned char *powerReturn)
{
unsigned long powervalue;
unsigned char buffer;
buffer = TDA10021_iRdI2c(0X17); //AGC_RF
MXT_printf("\n***********signal power TDA10021_AGC TUNER=%d***********",buffer);
if (buffer<=10) buffer=buffer+96;
else if((buffer>10)&(buffer<=45)) buffer =buffer+47;
else if((buffer>45)&(buffer<=61)) buffer=buffer+35;
else if((buffer>61)&(buffer<=77)) buffer =buffer+15;
else if((buffer>77)&(buffer<=97)) buffer =buffer-8;
else if((buffer>97)&(buffer<=117)) buffer =buffer-30;
else if((buffer>117)&(buffer<=133)) buffer =buffer-55;
else if((buffer>133)&(buffer<=147)) buffer =buffer-75;
else if((buffer>147)&(buffer<=159)) buffer =buffer-95;
else if((buffer>159)&(buffer<=169)) buffer =buffer-110;
else if((buffer>169)&(buffer<=180)) buffer =buffer-127;
else if((buffer>180)&(buffer<=203)) buffer=buffer-150;
else if((buffer>203)&(buffer<=240)) buffer =buffer-185;
else if(buffer>240) buffer =buffer-235;
powerReturn[0] = buffer;
buffer = TDA10021_iRdI2c(0X17); //AGC_RF
if(buffer>205) powerReturn[1] = 2;
else if (buffer<45) powerReturn[1] = 99;
else if ((buffer>=45)&(buffer<=205))
{
powerReturn[1]=(unsigned char)(0.64*(buffer-45));
powerReturn[1]=100-powerReturn[1];
}
if(powerReturn[1]<0) powerReturn[1]=0;
if (powerReturn[1]>99) powerReturn[1]=99;
// MXT_printf("\n*********** powerReturn[1] value =%d *********** ",powerReturn[1]);
}
void Snrprocess(unsigned char *snrReturn)
{
float fSNR, fMSE;
unsigned long uCounter, uMSE;
unsigned short Snrshow;
fMSE = (float)0;
for (uCounter = 0; uCounter < 10; uCounter++)
{
// average value of the MSE on 10 values
uMSE = TDA10021_iRdI2c(0x18);
fMSE += (float)uMSE;
}
fMSE /= (float)uCounter;
// calculate the SNR regarding to the modulation
switch (_Qammode)
{
case 0: //16Qam
fSNR = (float)((195.0/(0.32*fMSE + 1.38)) + 10.0);
break;
case 1: //32Qam
fSNR = (float)((215.0/(0.40*fMSE + 5.0)) + 13.5);
break;
case 2: //64Qam
fSNR = (float)((210.0/(0.40*fMSE + 5.0)) + 12.5); //max 56.5db min 14db
break;
case 3: //128Qam
fSNR = (float)((185.0/(0.38*fMSE + 4.0)) + 13.8);
break;
case 4: //256Qam
fSNR = (float)((180.0/(1.00*fMSE + 0.4)) + 20.3);
break;
default:
fSNR = 0;
break ;
}
//MXT_printf("\n*********** SNR value =%d *********** ",(int)fSNR);
if(FE_GetLK() == 0)
fSNR = 0;
if ( fSNR < 15 ) //MIN 14dB
Snrshow = 0 ;
else if ( fSNR >= 55 )
Snrshow = 99;
else
Snrshow = (unsigned short)((fSNR-15)*2);
if (Snrshow>99) Snrshow=99;
snrReturn[0] = fSNR;
snrReturn[1] = Snrshow;
//MXT_printf("\n##################### Snr=%d,Snrshow=%d ",Snr,Snrshow);
//return (unsigned char)(Snrshow) ;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -