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

📄 stb0899_tuner.c

📁 DVB-S STB0899 source code
💻 C
字号:

#include "linux/string.h"

#include "stb0899_tuner.h"
#include "stb0899_util.h"
#include "stb0899_chip.h"

static u32 STB6K_LOOKUP[11][3] = {
		/* low        high	        osm */
		{950000,	1000000,	0xA},
		{1000000,	1075000,	0xC},
		{1075000,	1200000,	0x0},
		{1200000,	1300000,	0x1},
		{1300000,	1370000,	0x2},
		{1370000,	1470000,	0x4},
		{1470000,	1530000,	0x5},
		{1530000,	1650000,	0x6},
		{1650000,	1800000,	0x8},
		{1800000,	1950000,	0xA},
		{1950000,	2150000,	0xC}
};

TUNER_Handle_t
STTunerInit(TUNER_InitParams_t *hTunerInitParams)
{
	TUNER_Handle_t hTuner = NULL;
    	u32	*DefVal;

    	hTuner = (TUNER_Handle_t)malloc(sizeof(TUNER_InitParams_t));

	memset(hTuner, 0, sizeof(TUNER_InitParams_t));

   	if((hTuner != NULL) && (hTunerInitParams != NULL))
    	{
        	hTuner->NbDefVal	= hTunerInitParams->NbDefVal; 
        	hTuner->DefVal		= hTunerInitParams->DefVal;   
 		hTuner->Reference = 27000000;	/* 20 MHz reference */
    		hTuner->IF = 0; 	/* 0 MHz intermediate frequency */
    		hTuner->IQ_Wiring = TUNER_IQ_NORMAL;   /* No hardware IQ invertion */
	
		/* fill elements of external chip data structure */
		hTunerInitParams->Chip->NbRegs   = STB6100_NBREGS;
		hTunerInitParams->Chip->NbFields = STB6100_NBFIELDS;
		hTunerInitParams->Chip->ChipMode = STCHIP_MODE_NO_R_SUBADR;
		hTunerInitParams->Chip->WrStart  = RSTB6100_VCO;
		hTunerInitParams->Chip->WrSize   = 11;
		hTunerInitParams->Chip->RdStart  = RSTB6100_LD;
		hTunerInitParams->Chip->RdSize   = 12;
 
		if(hTunerInitParams->NbDefVal == STB6100_NBREGS)
		{
			hTuner->Chip = ChipOpen(hTunerInitParams->Chip);

			if(hTuner->Chip != NULL)
			{
				DefVal = hTuner->DefVal;
				/*REGISTER INITIALISATION	*/
	
				/*	LD	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_LD,"LD",0x0000,*DefVal++,STCHIP_ACCESS_R,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_LD,FSTB6100_LD,"LD",0,1,CHIP_UNSIGNED);

				/*	VCO	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_VCO,"VCO",0x0001,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_VCO,FSTB6100_OSCH,"OSCH",7,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_VCO,FSTB6100_OCK,"OCK",5,2,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_VCO,FSTB6100_ODIV,"ODIV",4,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_VCO,FSTB6100_OSM,"OSM",0,4,CHIP_UNSIGNED);

				/*	NI	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_NI,"NI",0x0002,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_NI,FSTB6100_NI,"NI",0,8,CHIP_UNSIGNED);

				/*	NF_LSB	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_NF_LSB,"NF_LSB",0x0003,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_NF_LSB,FSTB6100_NF_LSB,"NF_LSB",0,8,CHIP_UNSIGNED);

				/*	K	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_K,"K",0x0004,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_K,FSTB6100_K,"K",6,2,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_K,FSTB6100_PSD2,"PSD2",2,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_K,FSTB6100_NF_MSB,"NF_MSB",0,2,CHIP_UNSIGNED);

				/*	G	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_G,"G",0x0005,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_G,FSTB6100_GCT,"GCT",5,3,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_G,FSTB6100_G,"G",0,4,CHIP_UNSIGNED);

				/*	F	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_F,"F",0x0006,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_F,FSTB6100_F,"F",0,5,CHIP_UNSIGNED);

				/*	DLB	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_DLB,"DLB",0x0007,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_DLB,FSTB6100_DLB,"DLB",3,3,CHIP_UNSIGNED);

				/*	TEST1	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_TEST1,"TEST1",0x0008,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_TEST1,FSTB6100_TEST1,"TEST1",0,8,CHIP_UNSIGNED);

				/*	TEST2	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_TEST2,"TEST2",0x0009,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_TEST2,FSTB6100_FCCK,"FCCK",6,1,CHIP_UNSIGNED);

				/*	LPEN	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_LPEN,"LPEN",0x000a,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_LPEN,FSTB6100_BEN,"BEN",7,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_LPEN,FSTB6100_OSCP,"OSCP",6,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_LPEN,FSTB6100_SYNP,"SYNP",5,1,CHIP_UNSIGNED);
				ChipAddField(hTuner->Chip,RSTB6100_LPEN,FSTB6100_LPEN,"LPEN",4,1,CHIP_UNSIGNED);

				/*	TEST3	*/
				ChipAddReg(hTuner->Chip,STCHIP_REG_8,RSTB6100_TEST3,"TEST3",0x000b,*DefVal++,STCHIP_ACCESS_WR,STCHIP_NOT_POINTED,0,0);
				ChipAddField(hTuner->Chip,RSTB6100_TEST3,FSTB6100_TEST3,"TEST3",0,8,CHIP_UNSIGNED);
			}
		}	
#if 0
		TunerWrite(hTuner);
#endif
	}
	return hTuner;
}

TUNER_Error_t
TunerSetFrequency(TUNER_Handle_t hTuner, u32 Frequency)
{
	TUNER_Error_t error = TUNER_NO_ERR;
	u32 frequency;
	u32 stepsize;
	u32 nbsteps;
	u32 divider;
	u32 swallow;
	u8 vco,num;

	if(hTuner && !hTuner->Chip->ChipError)
	{		
		ChipSetFieldImage(hTuner->Chip,FSTB6100_ODIV,Frequency <= 1075000);
		if((Frequency<=1075000)||(Frequency>=1326000))
			ChipSetFieldImage(hTuner->Chip,FSTB6100_PSD2,1);
		else
			ChipSetFieldImage(hTuner->Chip,FSTB6100_PSD2,0);			
				
		num=0;
		while(!INRANGE(STB6K_LOOKUP[num][0],Frequency,STB6K_LOOKUP[num][1])&& (num<10)) num++;
		if(Frequency<950000)
			vco = (u8)(STB6K_LOOKUP[0][2]);
		else if(Frequency>2150000)
			vco = (u8)(STB6K_LOOKUP[10][2]);
		else
			vco = (u8)(STB6K_LOOKUP[num][2]);
				
		ChipSetFieldImage(hTuner->Chip,FSTB6100_OSM,vco);
		
		/*Flo=2*Ftuner*(ODIV+1)*/
		frequency=2*Frequency*(ChipGetFieldImage(hTuner->Chip,FSTB6100_ODIV)+1); 
				
		hTuner->Reference/=1000; /*Refrence in Khz*/
		/*flo=Fxtal*(DIV2+1)*(Ni+Nf/2^9)*/  
				
		/*Ni = floor (fVCO / (fXTAL * P))*/
		divider=(frequency/hTuner->Reference)/(ChipGetFieldImage(hTuner->Chip,FSTB6100_PSD2)+1);
				
		/*round ((fVCO / (fXTAL * P) - Ni) * 2^9)*/
		stepsize=frequency-divider*(ChipGetFieldImage(hTuner->Chip,FSTB6100_PSD2)+1)*(hTuner->Reference); /**/
		nbsteps=(stepsize*PowOf2(9))/((ChipGetFieldImage(hTuner->Chip,FSTB6100_PSD2)+1)*(hTuner->Reference));					  
		swallow=nbsteps; 
				
		ChipSetFieldImage(hTuner->Chip,FSTB6100_NI,divider);
		ChipSetFieldImage(hTuner->Chip,FSTB6100_NF_LSB,(swallow&0xFF));
		ChipSetFieldImage(hTuner->Chip,FSTB6100_NF_MSB,(swallow>>8));
		hTuner->Reference*=1000; 
		ChipSetFieldImage(hTuner->Chip,FSTB6100_LPEN,0);/* PLL loop disabled */
		ChipSetFieldImage(hTuner->Chip,FSTB6100_OSCH,1);/* VCO search enabled */
		ChipSetFieldImage(hTuner->Chip,FSTB6100_OCK,0); /* VCO fast search*/
		error = TunerWrite(hTuner);

				
		ChipSetFieldImage(hTuner->Chip,FSTB6100_LPEN,1); /* PLL loop enabled */
		error = TunerWrite(hTuner);
				
		WAIT_N_MS(10);
		ChipSetFieldImage(hTuner->Chip,FSTB6100_OSCH,0); /* VCO search disabled */
		ChipSetFieldImage(hTuner->Chip,FSTB6100_OCK,3);  /* VCO search clock off */
		ChipSetFieldImage(hTuner->Chip,FSTB6100_FCCK,0); /*LPF BW setting clock disabled */
		error = TunerWrite(hTuner);
	}
		
	return error;
}

u32
TunerGetFrequency(TUNER_Handle_t hTuner)
{
	u32 frequency = 0;
	u32 divider = 0;
	u32 swallow;
	u32 psd2;
				
	if(hTuner && !hTuner->Chip->ChipError)	
	{
		TunerRead(hTuner);
		swallow=(ChipGetFieldImage(hTuner->Chip,FSTB6100_NF_MSB)<<8)  /*Nf val*/
				+ChipGetFieldImage(hTuner->Chip,FSTB6100_NF_LSB);
				
		/*Ni = floor (fVCO / (fXTAL * P))*/
		divider=ChipGetFieldImage(hTuner->Chip,FSTB6100_NI); /*NI val*/
		psd2=ChipGetFieldImage(hTuner->Chip,FSTB6100_PSD2);
				
		frequency=(((1+psd2)*(hTuner->Reference/1000)*swallow)/512);
		frequency+=(hTuner->Reference/1000) * (divider)*(1+psd2);
		/*Flo=Fxtal*P*(Ni+Nf/2^9) . P=DIV2+1 */
				
		frequency=frequency/((ChipGetFieldImage(hTuner->Chip,FSTB6100_ODIV)+1)*2);			
	}
	
	return frequency;
}


TUNER_Error_t
TunerSetBandwidth(TUNER_Handle_t hTuner,u32 Bandwidth)
{
	TUNER_Error_t error = TUNER_NO_ERR; 
	u8 val;
	
	if(hTuner)	
	{
		if((Bandwidth/2) > 36000000)   /*F[4:0] BW/2 max =31+5=36 mhz for F=31*/
			val = 31;
		else if((Bandwidth/2) < 5000000) /* BW/2 min = 5Mhz for F=0 */
			val = 0;
		else							 /*if 5 < BW/2 < 36*/
			val = (u8)((Bandwidth/2)/1000000 - 5);
				
		ChipSetFieldImage(hTuner->Chip,FSTB6100_FCCK,(hTuner->Reference/1000000)); /* FCL_Clk=FXTAL/FCL=1Mhz */
		TunerWrite(hTuner);
		ChipSetFieldImage(hTuner->Chip,FSTB6100_F,val);
		error = TunerWrite(hTuner);  
		ChipSetFieldImage(hTuner->Chip,FSTB6100_FCCK,0); /*FCL turned off*/
		TunerWrite(hTuner);		
	}
	
	return error;
}

u32
TunerGetBandwidth(TUNER_Handle_t hTuner)
{
	u32 bandwidth = 0;
	u8 val = 0;
	
	if(hTuner)	
	{
		TunerRead(hTuner);
		val = (u8)ChipGetFieldImage(hTuner->Chip,FSTB6100_F);
	
		bandwidth = (val+5)*2000000;	/* x2 for ZIF tuner BW/2=F+5 Mhz*/
	}
	
	return bandwidth;
}

TUNER_Error_t
TunerSetGain(TUNER_Handle_t hTuner,u32 Gain)
{
	TUNER_Error_t error = TUNER_NO_ERR;
		
	if(hTuner)	
	{
		ChipSetFieldImage(hTuner->Chip,FSTB6100_G,(Gain/2)+7);
		error = TunerWrite(hTuner);	
	}	
	return error;
}

BOOL
TunerGetStatus(TUNER_Handle_t hTuner)
{
	BOOL locked = FALSE;

	if(hTuner)	
	{
		TunerRead(hTuner);
	
		if(!hTuner->Chip->ChipError)
		{
			TunerRead(hTuner);
			locked = ChipGetFieldImage(hTuner->Chip, FSTB6100_LD);
		}
	}

	return locked;
}

TUNER_Error_t
TunerWrite(TUNER_Handle_t hTuner)
{
	TUNER_Error_t error = TUNER_NO_ERR;

	if(hTuner && hTuner->+0 == 8)
	{
		ChipSetRegisters(hTuner->Chip, RSTB6100_VCO, 11);
	}

	return error;
}

TUNER_Error_t
TunerRead(TUNER_Handle_t hTuner)
{
	TUNER_Error_t error = TUNER_NO_ERR;

	if(hTuner && hTuner->+0 == 8)
	{
		ChipGetRegisters(hTuner->Chip, RSTB6100_LD, 12);
	}

	return error;
}

⌨️ 快捷键说明

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