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

📄 lg_yizhi_tuner.c

📁 LG数字一体化高频头TDMK-G5XXD驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                  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 + -