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

📄 stv0299.c

📁 STV0299 driver,DVB_S QPSK channel demodule
💻 C
📖 第 1 页 / 共 2 页
字号:
		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)
{
	Uint8 ratio3[3];
	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);
	ratio3[0] = aclk;
	ratio3[1] = bclk;
	MULT_IIC_WRITE(EVMDM642_I2C_hI2C, stv0299_adw, 0x13, ratio3, 2);
	ratio3[0] = (UInt8)((ratio >> 16) & 0xff);
	ratio3[1] = (UInt8)((ratio >>  8) & 0xff);
	ratio3[2] = (UInt8)((ratio      ) & 0xf0);
	MULT_IIC_WRITE(EVMDM642_I2C_hI2C, stv0299_adw, 0x1f, ratio3, 3);
//	stv0299_writereg (0x1f, ratioH);
//	stv0299_writereg (0x20, ratioM);
//	stv0299_writereg (0x21, ratioL);
for(tmp=0x13; tmp<=0x21; tmp++)
				ratio = stv0299_readreg(tmp);
	ratio = stv0299_readreg(0x1b);
	// 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=10;
	retval=1;
    j=0;k=0;
//	   printf("star check_status\n");
	while (num>1)
	{
     	TSK_sleep(20);
//		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>8) 
								{
									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(stb6000_adw,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 qpsk_frontend_parameters *p)
{   
//	 int rel;
	 Uint8 data[8]={0,0,};
	
//	  stv0299_set_voltage ( p->voltage);
	  stb6000_set_tv_freq	(p);
      stv0299_set_FEC ( p->fec_inner);
      stv0299_set_symbolrate ( p->symbol_rate);
	 
//	  stv0299_writereg ( 0x22, 0x00);
//	  stv0299_writereg ( 0x23, 0x00);
	stv0299_writeregs ( 0x22, data, 2);
	data[3] = stv0299_readreg ( 0x23);
	  stv0299_writereg ( 0x12, 0xb9); //0xb9

  	  return 0;
}



int 	stv0299_get_frontend(struct qpsk_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;

}


/*
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);
	
}
*/

int stb6000_IIC_read(I2C_Handle hI2C,
              Uint8 devAddress,
              Uint32  subAddress,
              Uint8 *data,
              Uint16  numBytes
              )
{  
//	Uint8 temp;           
    int i;
    int cnt = 0;
    /* make sure handle is valid */
    if(hI2C == INV) {
        return -1;
    }
    
    /* Wait until bus is free */
    while (I2C_bb(hI2C))
    {
    	cnt ++;
    	if(cnt > WHILE_BB_TIMES)
    	{
    		I2C_FSETH(hI2C, I2CSTR, BB, 1);
    		I2C_close(hI2C);
    		hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
    		I2C_config(hI2C, &IIC_ConfigR);
			I2C_outOfReset(hI2C);
    		return 4;
    	}
    }


    /* save old settings */
//    I2C_getConfig(hI2C, &prevIICConfig);

    /* set I2C mode register */
    I2C_RSETH(hI2C, I2CMDR, IIC_ConfigR.i2cmdr);    
    /* set I2C imr register  */
    I2C_RSETH(hI2C, I2CIMR, IIC_ConfigR.i2cimr);
    /* configure the I2C slave address register */
    I2C_RSETH(hI2C, I2CSAR, devAddress);
    
    /* set I2C count register */
    I2C_RSETH(hI2C, I2CCNT, numBytes);
    
    /* write the sub address */
//    I2C_RSETH(hI2C, I2CDXR, subAddress);
    
	EVMDM642_waitusec(1);
	
    /* Generate start condition */
    I2C_start(hI2C);
    
    I2CDELAY(DELAY_TIME);
    
    /* read the data */ 
    for(i = 0; i < numBytes-1; i ++) 
    {
        cnt = 0;
        while(!I2C_rrdy(hI2C))
	    {
	    	cnt ++;
	    	if(cnt > WHILE_BB_TIMES)
	    	{
	    		I2C_FSETH(hI2C, I2CSTR, BB, 1);
	    		I2C_close(hI2C);
	    		hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
	    		I2C_config(hI2C, &IIC_ConfigR);
				I2C_outOfReset(hI2C);
	    		return 5;
	    	}
	    }

        *data ++ = I2C_readByte(hI2C );
//      I2CDELAY(DELAY_TIME);
    }

    /* Generate stop condition */
    I2C_sendStop(hI2C); 
    
//    I2CDELAY(DELAY_TIME*10000);        
/* Need to wait at least 10ms */
//    EVMDM642_waitusec(1000);

    /* Wait until bus is free */
    cnt = 0;
    while (I2C_bb(hI2C))
    {
    	cnt ++;
    	if(cnt > WHILE_BB_TIMES)
    	{
    		I2C_FSETH(hI2C, I2CSTR, BB, 1);
    		I2C_close(hI2C);
    		hI2C = I2C_open(I2C_PORT0, I2C_OPEN_RESET);
    		I2C_config(hI2C, &IIC_ConfigR);
			I2C_outOfReset(hI2C);
    		return 4;
    	}
    }

		
    /* Clear bus busy */
    I2C_FSETH(hI2C, I2CSTR, BB, 1);
    
    I2CDELAY(DELAY_TIME);        
    {
		Uint32 paddr = hI2C->i2cdrrAddr;
		Uint8* ptemp = (unsigned char *)paddr;
		memcpy(data, ptemp, 1);
	}      
    /* now restore the previous I2C settings */
            
    /* set I2C mode register */
//    I2C_RSETH(hI2C, I2CMDR, prevIICConfig.i2cmdr);
    
    /* set I2C imr register  */
//    I2C_RSETH(hI2C, I2CIMR, prevIICConfig.i2cimr);
    
    /* configure the I2C slave address register */
//    I2C_RSETH(hI2C, I2CSAR, prevIICConfig.i2csar);
    
    /* set I2C count register */
//    I2C_RSETH(hI2C, I2CCNT, prevIICConfig.i2ccnt);

//    I2CDELAY(DELAY_TIME);  
    return 0;      
}  

void GetQPSKparams()
{
	MULT_IIC_READ(EVMDM642_I2C_hI2C, stv0299_adr,0x16,(UInt8*)(g_tREG0299Info.m_val),17);
	g_nRFLockStatus = g_tREG0299Info.m_val[5];
	if ( g_nRFLockStatus & 0x08 ) {
		static	Uint32	m_glFactAGC = 0;
		static	Uint32	m_glSetAGCState = 0;
		
		g_nRFLock = LOCK;
	
		if (( m_glFactAGC != 0x0FF ) && ( m_glSetAGCState == 0 )) {
			Uint8	iagc,diff;

			diff = STANDARD_AGC - m_glFactAGC;
			iagc  = g_tREG0299Info.m_val[0];
			iagc += diff;
			g_tREG0299Info.m_val[0] = iagc;
		}
	}
	else{
		g_nRFLock = UNLOCK;
		g_nUnlockTimeout = TIMEOUT_UNLOCK_QPSK;
		QPSK_tuner_init();
	}
}

⌨️ 快捷键说明

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