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

📄 stv0299.c

📁 菲利普pnx1300 dsp 下的stv0299数字卫星高频头的驱动程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
		return FEC_AUTO;

	return fec_tab [index];
}




int stv0299_wait_diseqc_fifo ( int timeout)
{
      int  start = 0;

	while (stv0299_readreg(0x0a) & 1) {
		if ( start > timeout) {
			
			return 1;
		}
	 start++;
    // add delay her   

		};

	return 0;
}



int stv0299_wait_diseqc_idle ( int timeout)
{
    int  start = 0;

	while ((stv0299_readreg(0x0a) & 3) != 2 ) {
		if (start > timeout) {
		return 1;
		}
     start++;
	 //add delay here

	};

	return 0;
}



int stv0299_send_diseqc_msg ( struct dvb_diseqc_master_cmd *m)
{
	UInt8 val;
	int i;

	 
	if (stv0299_wait_diseqc_idle ( 100) )
		return 1;

	val = stv0299_readreg (0x08);

	if (stv0299_writereg (0x08, (val & ~0x7) | 0x6))  /* DiSEqC mode */
		return 2;

	for (i=0; i<m->msg_len; i++) {
		if (stv0299_wait_diseqc_fifo (100) )
			return 3;

		if (stv0299_writereg (0x09, m->msg[i]))
			return 4;
	}

	if (stv0299_wait_diseqc_idle (100))
		return 5;

	return 0;
}



int stv0299_send_diseqc_burst ( fe_sec_mini_cmd_t burst)
{
	UInt8 val;

	 

	if (stv0299_wait_diseqc_idle ( 100) )
		return 1;

	val = stv0299_readreg (0x08);

	if (stv0299_writereg ( 0x08, (val & ~0x7) | 0x2))   /* burst mode */
		return 2;

	if (stv0299_writereg (0x09, burst == SEC_MINI_A ? 0x00 : 0xff))
		return 3;

	if (stv0299_wait_diseqc_idle ( 100) )
		return 4;

	if (stv0299_writereg ( 0x08, val))
		return 5;

	return 0;
}




int stv0299_set_tone ( fe_sec_tone_mode_t tone)
{
	UInt8 val;
	
	if (stv0299_wait_diseqc_idle ( 100) )
		return 1;

	val = stv0299_readreg (0x08);

	switch (tone) {
	case SEC_TONE_ON:
		return stv0299_writereg (0x08, val | 0x3);
	case SEC_TONE_OFF:
		return stv0299_writereg ( 0x08, (val & ~0x3) | 0x02);
	default:
		return 2;
	};
}


int stv0299_set_voltage ( fe_sec_voltage_t voltage)
{
	UInt8 val;

	

	val = stv0299_readreg (0x0c);
	val &= 0x0f;
	val |= 0x40;   /* LNB power on */

	switch (voltage) {
	case SEC_VOLTAGE_13:
		return stv0299_writereg ( 0x0c, val);
	case SEC_VOLTAGE_18:
		return stv0299_writereg (0x0c, val | 0x10);
	default:
		return -EINVAL;
	};
}



int stv0299_set_symbolrate (UInt32 srate)
{
	UInt32 ratio;
	UInt32 tmp;
	UInt8 aclk = 0xb4, bclk = 0x51;

	if (srate > M_CLK)
		srate = M_CLK;
        if (srate < 500000)
		srate = 500000;

	if (srate < 30000000) { aclk = 0xb6; bclk = 0x53; }
	if (srate < 14000000) { aclk = 0xb7; bclk = 0x53; }
	if (srate < 7000000) { aclk = 0xb7; bclk = 0x4f; }
	if (srate < 3000000) { aclk = 0xb7; bclk = 0x4b; }
	if (srate < 1500000) { aclk = 0xb7; bclk = 0x47; }

#define FIN (M_CLK >> 4)

	tmp = srate << 4;
	ratio = tmp / FIN;
        
	tmp = (tmp % FIN) << 8;
	ratio = (ratio << 8) + tmp / FIN;
        
	tmp = (tmp % FIN) << 8;
	ratio = (ratio << 8) + tmp / FIN;
  
	stv0299_writereg (0x13, aclk);
	stv0299_writereg (0x14, bclk);
	stv0299_writereg (0x1f, (UInt8)(ratio >> 16) & 0xff);
	stv0299_writereg (0x20, (UInt8)(ratio >>  8) & 0xff);
	stv0299_writereg (0x21, (UInt8)(ratio      ) & 0xf0);

	// printf("ratio=%d\n",ratio/16);
	return 0;
}



int stv0299_get_symbolrate ()
{
	UInt32 Mclk = M_CLK / 4096L;
	UInt32 srate;
	Int32 offset;
	UInt8 sfr[3];
	UInt8  rtf;

	 
	stv0299_readregs ( 0x1f, sfr, 3);
	stv0299_readregs (0x1a, &rtf, 1);

	srate = (sfr[0] << 8) | sfr[1];
	srate *= Mclk;
	srate /= 16;
	srate += (sfr[2] >> 4) * Mclk / 256;

	offset = (Int32) rtf * (srate / 4096L);
	offset /= 128;

	srate += offset;

	srate += 1000;
	srate /= 2000;
	srate *= 2000;

	return srate;
}



fe_status_t	stv0299_get_status()
{


		fe_status_t status ;
		UInt8 signal = 0xff - stv0299_readreg (0x18);
		UInt8 sync = stv0299_readreg (0x1b);
 
		status = FE_HAS_BEGIN;

		if (signal > 10)
		{
			status |= FE_HAS_SIGNAL;
		//	printf("the status is :HAS_SIGNAL");
		}

		if (sync & 0x80)
		{
			status |= FE_HAS_CARRIER;
		//	printf("  HAS_CARRIER");
		}

		if (sync & 0x10)
		{
			status |= FE_HAS_VITERBI;
		//	printf("  HAS_VITERBI");
		}

		if (sync & 0x08)
		{
			status |= FE_HAS_SYNC;
         //    	printf("  HAS_SYNC");
		}

		if ((sync & 0x98) == 0x98)
		{
			status |= FE_HAS_LOCK;
		//		printf("  HAS_LOCK");
		}
		//printf("\n");

	 return  status;
}
int stv0299_check_status()
{
    int retval,num, j,k;
	fe_status_t   status;
	UInt8 table1[]={0x00,0x79,0x3b,0x60,0x04,0x07,0x8f,0xdf,0xd0,0x50,0xfb,0x4f};
	num=1000;;
	retval=1;
    j=0;k=0;
//	   printf("star check_status\n");
	while (num>1)
	{
     
		delay(20000);
      	status=stv0299_get_status();
	
		if (status & FE_HAS_SIGNAL) 
				{
					
					if (status & FE_HAS_CARRIER) 
					{
						
					     
							if (status & FE_HAS_LOCK) 
							{
							   //printf("FE_HAS_LOCK\n");
								retval=0;
								num=0;
							}
							else
							{ 
								j++;
								if (j>100) 
								{
									stv0299_check_inversion ();
								}
								if (j>200 ) 
								{
									num=0;
								}
		
							}				
		
					}
		
				}
				else
				{
				   	 
					k++;
					if (k>100) {
						//printf("no signal\n");
						num=0;
					}
				}
		
		
		num--;

	}
	if (retval==0) {
	    stv0299_writereg( 0x05, 0xb5);   	/*  enable i2c repeater on stv0299  */
       	iicwriteregs(0xc6,1,&table1[1],1);
        stv0299_writereg(0x05, 0x35);   	/*  disable i2c repeater on stv0299  */ 
	}
	return retval;
    

}


UInt32	stv0299_get_ber()
{
  UInt32 rel;
    rel = (stv0299_readreg (0x1d) << 8)
			       | stv0299_readreg (0x1e);
	 return rel;
}


Int16	stv0299_get_signal_strength()
{
  Int16 rel;
  Int32 signal =  0xffff - ((stv0299_readreg ( 0x18) << 8)
			               | stv0299_readreg ( 0x19));

	 

		signal = signal * 5 / 4;
		rel = (signal > 0xffff) ? 0xffff :
				(signal < 0) ? 0 : (Int16)signal;
		 return rel;
}



Int16	stv0299_get_snr()
{   
	Int16 rel;
	Int32 snr = 0xffff - ((stv0299_readreg ( 0x24) << 8)
			           | stv0299_readreg ( 0x25));
		snr = 3 * (snr - 0xa100);
		rel= (snr > 0xffff) ? 0xffff :
				(snr < 0) ? 0 : (Int16)snr;
	 return rel;

}


int 	stv0299_set_frontend(struct dvb_frontend_parameters *p)
{   
	 int rel;
	
	  stv0299_set_voltage ( p->voltage);
	  rel=stb6000_set_tv_freq	(p);
      rel=stv0299_set_FEC ( p->fec_inner);
      rel=stv0299_set_symbolrate ( p->symbol_rate);
	 
	  stv0299_writereg ( 0x22, 0x00);
	  stv0299_writereg ( 0x23, 0x00);
	  stv0299_readreg ( 0x23);
	  stv0299_writereg ( 0x12, 0xb9); //0xb9

  	  return 0;
}



int 	stv0299_get_frontend(struct dvb_frontend_parameters *p)
{   
	  Int32 derot_freq;
      derot_freq = (Int32)(Int16) ((stv0299_readreg ( 0x22) << 8)
					| stv0299_readreg (0x23));
      	derot_freq *= (M_CLK >> 16);
		derot_freq += 500;
		derot_freq /= 1000;
		p->frequency += derot_freq;
        p->inversion = (stv0299_readreg ( 0x0c) & 1) ?
						INVERSION_OFF : INVERSION_ON;
		p->fec_inner = stv0299_get_fec ();
		p->symbol_rate = stv0299_get_symbolrate ();

       return 0;
}





int 	stv0299_set_sleep( )
{
       	stv0299_writereg (0x0c, 0x00);  /*  LNB power off! */
		stv0299_writereg (0x02, 0x80);
		return 0;
}


int 	stv0299_reset( )
{
       	stv0299_writereg (0x22, 0x00);
		stv0299_writereg (0x23, 0x00);
		stv0299_readreg (0x23);
		stv0299_writereg (0x12, 0xb9);
		return 0;

}

int stv0299_get_regs(struct stv0299_regs_val *p)
{
  	iic_read_regs_a(stv0299_adw,0,(UInt8*)p,0x35);
    return 0;
}


int stv0299_get_info()
{   struct stv0299_regs_val_a regs; 
    int  i;
  	iic_read_regs_a(stv0299_adw,0x16,(UInt8*)(&regs),17);
 
//     printf("   %2x  %2x\n",regs.verror,stv0299_readreg (0x26));
//     printf("   %2x  %2x\n",regs.tl1r, stv0299_readreg (0x17));
//	 printf("   %2x  %2x\n",regs.agc2i1,stv0299_readreg (0x18));
//	 printf("   %2x  %2x\n",regs.agc2i2,stv0299_readreg (0x19));
//	 printf("   %2x  %2x\n",regs.agc2i2,stv0299_readreg (0x19));
//	 printf("   %2x  %2x\n",regs.vstatus,stv0299_readreg (0x1b));
// 
 
     return 0;
}
void prin_info()
{
	UInt32 data;
	UInt8 reg;
	UInt8 regs[11];
	int i;
	
	stv0299_writereg ( 0x05, 0xb5);
	iicReadregs(0xc6,regs,11);
	//for  (i=0;i<11;i++)
	//		printf("  %02x\n",regs[i]);
	
	printf("font lock     %02x\n",regs[0]);

	printf("agc1          %2x\n",  stv0299_readreg ( 0x16) );
 	printf("agc21         %2x\n",  stv0299_readreg ( 0x18 ));
   // data=(stv0299_readreg ( 0x18) << 8)| stv0299_readreg ( 0x19);
//	printf("agc2 indcator %d\n",data);
	printf("time lock     %02d\n", stv0299_readreg (0x17));
	printf("time loop     %02d\n", (Int8)stv0299_readreg (0x1a));
	printf("carr lock     %02x\n", stv0299_readreg (0x1C));
	data=(stv0299_readreg ( 0x22) << 8)| stv0299_readreg ( 0x23);
	printf("CARR FREQENCE %d\n",data);

	data=stv0299_readreg ( 0x1b);

	printf("status       %02x\n",data);
    data=(stv0299_readreg ( 0x24) << 8)| stv0299_readreg ( 0x25);
	printf("noise indcator %d\n",data);
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -