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

📄 tuner.c

📁 STV0299 Minituner driver, for ST chipset
💻 C
📖 第 1 页 / 共 5 页
字号:
					ChipAddField(hTuner,RSTB6100_LPEN,FSTB6100_LPEN,"LPEN",4,1,CHIP_UNSIGNED);

					/*	TEST3	*/
					ChipAddReg(hTuner,RSTB6100_TEST3,"TEST3",0x000b,*DefVal++,STCHIP_ACCESS_WR);
					ChipAddField(hTuner,RSTB6100_TEST3,FSTB6100_TEST3,"TEST3",0,8,CHIP_UNSIGNED);
				}
			break;  
			
			case TUNER_IX2476:
				/* 						*/
    			hTunerParams->Reference = 4000000;			/* 4 MHz reference */
    			hTunerParams->IF = 0; 						/* 0 MHz intermediate frequency */
    			hTunerParams->IQ_Wiring = TUNER_IQ_INVERT;  /* hardware IQ invertion */
    			
			    /* fill elements of external chip data structure */
			    ChipInfo.NbRegs   = IX2476_NBREGS;
			    ChipInfo.NbFields = IX2476_NBFIELDS;
			    ChipInfo.ChipMode = STCHIP_MODE_NOSUBADR;
			    ChipInfo.WrStart  = RIX2476_NHIGH;
			    ChipInfo.WrSize   = 4;     
			    ChipInfo.RdStart  = RIX2476_STATUS;     
			    ChipInfo.RdSize   = 1;     
 
			    hTuner = ChipOpen(&ChipInfo);

		        if(hTuner != NULL)
				{
					DefVal = DefIX2476Val;
					
					/*	REGISTER INITIALISATION	*/
					/*	NHIGH	*/
					ChipAddReg(hTuner,RIX2476_NHIGH,"NHIGH",0x0001,*DefVal++,STCHIP_ACCESS_W);
					ChipAddField(hTuner,RIX2476_NHIGH,FIX2476_BG,"BG",5,2,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_NHIGH,FIX2476_N_MSB,"N_MSB",0,5,CHIP_UNSIGNED);

					/*	NLOW_SDIV	*/
					ChipAddReg(hTuner,RIX2476_NLOW_SDIV,"NLOW_SDIV",0x0002,*DefVal++,STCHIP_ACCESS_W);
					ChipAddField(hTuner,RIX2476_NLOW_SDIV,FIX2476_N_LSB,"N_LSB",5,3,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_NLOW_SDIV,FIX2476_A,"A",0,5,CHIP_UNSIGNED);

					/*	CP_LPF_R	*/
					ChipAddReg(hTuner,RIX2476_CP_LPF_R,"CP_LPF_R",0x0003,*DefVal++,STCHIP_ACCESS_W);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_CP,"CP",5,2,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_PD5,"PD5",4,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_PD4,"PD4",3,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_TM,"TM",2,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_RTS,"RTS",1,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_CP_LPF_R,FIX2476_REF,"REF",0,1,CHIP_UNSIGNED);

					/*	VCO_LPF	*/
					ChipAddReg(hTuner,RIX2476_VCO_LPF,"VCO_LPF",0x0004,*DefVal++,STCHIP_ACCESS_W);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_VCO,"VCO",5,3,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PSC,"PSC",4,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PD3,"PD3",3,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_PD2,"PD2",2,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_DIV,"DIV",1,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_VCO_LPF,FIX2476_P0,"P0",0,1,CHIP_UNSIGNED);

					/*	STATUS	*/
					ChipAddReg(hTuner,RIX2476_STATUS,"STATUS",0x0005,*DefVal++,STCHIP_ACCESS_R);
					ChipAddField(hTuner,RIX2476_STATUS,FIX2476_PWR,"PWR",7,1,CHIP_UNSIGNED);
					ChipAddField(hTuner,RIX2476_STATUS,FIX2476_FL,"FL",6,1,CHIP_UNSIGNED);
				}
			break;
			
			default:
			break;
		}
		
		#if defined(CHIP_STAPI) || defined(NO_GUI)
			TunerWrite(hTuner);
		#endif
	}
	
	return hTuner;
}

TUNER_Error_t TunerSetFrequency(STCHIP_Handle_t hTuner,U32 Frequency)
{
	TUNER_Error_t error = TUNER_NO_ERR;
	TUNER_Params_t hTunerParams = NULL;
	U32 frequency;
	U32 stepsize;
	U32 nbsteps;
	U32 divider;
	U32 swallow;
	U8 vco,u8,index;
	
	hTunerParams =  (TUNER_Params_t) hTuner->pData;
	
	if(hTuner && hTunerParams && !hTuner->Error)	
	{
		switch(hTunerParams->Model)
		{
			case TUNER_VG0011:
				u8=0;
				
				if(Frequency>=950000)
					while(!INRANGE(TUNERSAT_LOOKUP[u8][0],Frequency,TUNERSAT_LOOKUP[u8][1]) && (u8<4)) u8++;
					
				ChipSetFieldImage(hTuner,FTUNERSAT_DIV4SEL,TUNERSAT_LOOKUP[u8][2]);
				ChipSetFieldImage(hTuner,FTUNERSAT_RDIV,TUNERSAT_LOOKUP[u8][3]);
				ChipSetFieldImage(hTuner,FTUNERSAT_PRESC32ON,TUNERSAT_LOOKUP[u8][4]);
				
				divider = Frequency/1000;
				ChipSetFieldImage(hTuner,FTUNERSAT_N_MSB,(divider>>8) & 0x0F); 
				ChipSetFieldImage(hTuner,FTUNERSAT_N_LSB,divider & 0xFF);
				ChipSetRegisters(hTuner,RTUNERSAT_TUNING_LSB,3);
				
				ChipSetField(hTuner,FTUNERSAT_CALVCOSTRT,1);
			break;
			
			case TUNER_HZ1184:
				ChipSetFieldImage(hTuner,FHZ1184_PD1,Frequency < 1450000);
				
				frequency = Frequency + hTunerParams->IF;
				stepsize = 2*(hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FHZ1184_R))));
				nbsteps = (frequency * 100) / (stepsize / 10);
				divider = nbsteps / 32;
				swallow = nbsteps % 32;
			
				ChipSetFieldImage(hTuner,FHZ1184_N_HSB,((divider >> 10) & 0x03));
				ChipSetFieldImage(hTuner,FHZ1184_N_MSB,((divider >> 3) & 0x7F));
				ChipSetFieldImage(hTuner,FHZ1184_N_LSB,(divider & 0x07));
				ChipSetFieldImage(hTuner,FHZ1184_A,swallow);
				error = TunerWrite(hTuner);
			break;
			
			case TUNER_MAX2116:
				frequency =  Frequency + hTunerParams->IF;  
				stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FMAX2116_R)+1));
				
				divider = (frequency * 100) / (stepsize / 10);
				
				ChipSetFieldImage(hTuner,FMAX2116_N_MSB,(divider >> 8) & 0x7F); 
				ChipSetFieldImage(hTuner,FMAX2116_N_LSB,divider & 0xFF);
				
				u8=0;
				
				while(!INRANGE(MAX2116_LOOKUP[u8][0],Frequency,MAX2116_LOOKUP[u8][1]) && (u8<9)) u8++;
				
				ChipSetFieldImage(hTuner,FMAX2116_DIV2,MAX2116_LOOKUP[u8][3]);
				vco = MAX2116_LOOKUP[u8][2];
				ChipSetFieldImage(hTuner,FMAX2116_VCO,vco);
				
				error = TunerWrite(hTuner);
				WAIT_N_MS(1);
				
				index = 0;
				
				while((!TunerGetStatus(hTuner)) && (index < 4))
				{
					u8 = ChipGetFieldImage(hTuner,FMAX2116_ADC);   
					
					if(u8 == 0)
					{
						if(vco == 0)
						{
							vco = 7;
							ChipSetFieldImage(hTuner,FMAX2116_DIV2,0);
						}
						else
						{
							vco--;
						}
					}
					else if(u8 == 7)
					{
						if(vco == 7)
						{
							vco = 0;
							ChipSetFieldImage(hTuner,FMAX2116_DIV2,1);
						}
						else
						{
							vco++;
						}
					}
					
					ChipSetFieldImage(hTuner,FMAX2116_VCO,vco);  
					error = TunerWrite(hTuner);
					WAIT_N_MS(1);
					index++;
				}
				
			break;
			
			case TUNER_SU1200:
				if(Frequency >= 2000000)
					ChipSetFieldImage(hTuner,FSU1200_C,0x03);
				else if(Frequency >= 1500000)
					ChipSetFieldImage(hTuner,FSU1200_C,0x02); 
				else
					ChipSetFieldImage(hTuner,FSU1200_C,0x01);
				
				frequency = Frequency + hTunerParams->IF;
				stepsize = hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FSU1200_R) + 1));
				nbsteps = (frequency * 100) / (stepsize / 10);
				
				ChipSetFieldImage(hTuner,FSU1200_N_HSB,((nbsteps >> 15) & 0x03));
				ChipSetFieldImage(hTuner,FSU1200_N_MSB,((nbsteps >> 8) & 0x7F));
				ChipSetFieldImage(hTuner,FSU1200_N_LSB,(nbsteps & 0x00FF));
				error = TunerWrite(hTuner);
			break;
			
			case TUNER_TBMU301:
				frequency = Frequency + hTunerParams->IF;
				stepsize = hTunerParams->Reference/(PowOf2(ChipGetFieldImage(hTuner,FTBMU301_R) + 1));
				nbsteps = (frequency * 100) / (stepsize / 10);
				
				ChipSetFieldImage(hTuner,FTBMU301_N_HSB,((nbsteps >> 15) & 0x03));
				ChipSetFieldImage(hTuner,FTBMU301_N_MSB,((nbsteps >> 8) & 0x7F));
				ChipSetFieldImage(hTuner,FTBMU301_N_LSB,(nbsteps & 0x00FF));
				error = TunerWrite(hTuner);
			break;
			
			case TUNER_IX2410:

				frequency =  Frequency + hTunerParams->IF;  
				stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FIX2410_R)+2));
				
				nbsteps = (frequency * 100) / (stepsize / 10); 
				swallow = nbsteps % 32;
				divider = nbsteps / 32;
				
				ChipSetFieldImage(hTuner,FIX2410_N_MSB,(divider >> 3) & 0x7F); 
				ChipSetFieldImage(hTuner,FIX2410_N_LSB,divider & 0x07);
				ChipSetFieldImage(hTuner,FIX2410_SDIV, swallow);
				
				u8=0;
				
				while(!INRANGE(IX2410_LOOKUP[u8][0],Frequency,IX2410_LOOKUP[u8][1]) && (u8<10)) u8++;
				
				ChipSetFieldImage(hTuner,FIX2410_DIV,IX2410_LOOKUP[u8][3]);
				vco = IX2410_LOOKUP[u8][2];
				ChipSetFieldImage(hTuner,FIX2410_VCO,vco);
				
				/*
				error = Tuner299_Write(hTuner);
				WAIT_N_MS(1);
				*/
				
				ChipSetFieldImage(hTuner, FIX2410_TM, 0);
				ChipSetRegisters(hTuner,RIX2410_NHIGH,4);
				WAIT_N_MS(1);

                ChipSetFieldImage(hTuner, FIX2410_TM, 1);
				ChipSetRegisters(hTuner,RIX2410_NHIGH,4);
				WAIT_N_MS(6);
				
				TunerGetStatus(hTuner);
				
			break;
			
			case TUNER_STB6000:
				ChipSetFieldImage(hTuner,FSTB6000_ODIV,Frequency <= 1075000);	/* this switch frequency should be in line with vco table */
				
				u8=0;
				
				while(!INRANGE(STB6K_LOOKUP[u8][0],Frequency,STB6K_LOOKUP[u8][1]) && (u8<10)) u8++;
				ChipSetFieldImage(hTuner,FSTB6000_OSM,STB6K_LOOKUP[u8][2]);
				
				//frequency = Frequency + hTunerParams->IF;      
				frequency = Frequency<<(ChipGetFieldImage(hTuner,FSTB6000_ODIV)+1);
				stepsize =  2*(hTunerParams->Reference / ChipGetFieldImage(hTuner,FSTB6000_R)); /* 2 x Fr / R */
				nbsteps = (frequency * 100) / (stepsize / 10);
				divider = nbsteps / 16; /* 32 */
				swallow = nbsteps % 16; /* 32 */
			
				ChipSetFieldImage(hTuner,FSTB6000_N_MSB,(divider>>1) & 0xFF); 
				ChipSetFieldImage(hTuner,FSTB6000_N_LSB,divider & 0x01);
				ChipSetFieldImage(hTuner,FSTB6000_A,swallow);
				ChipSetFieldImage(hTuner,FSTB6000_LPEN,0);	/* PLL loop disabled */
				ChipSetFieldImage(hTuner,FSTB6000_OSCH,1);	/* VCO search enabled */
				ChipSetFieldImage(hTuner,FSTB6000_OCK,1);	/* VCO search clock off */ 
				error = TunerWrite(hTuner);
				ChipSetFieldImage(hTuner,FSTB6000_LPEN,1);	/* PLL loop enabled */
				error = TunerWrite(hTuner);
				WAIT_N_MS(20);
				ChipSetFieldImage(hTuner,FSTB6000_OSCH,0);	/* VCO search disabled */
				ChipSetFieldImage(hTuner,FSTB6000_OCK,3);	/* VCO search clock off */ 
				error = TunerWrite(hTuner);
			break;
			
			case TUNER_STB6100:
				ChipSetFieldImage(hTuner,FSTB6100_ODIV,Frequency <= 1075000);
				ChipSetFieldImage(hTuner,FSTB6100_PSD2,!INRANGE (1076000,Frequency,1325000));
				
			  	u8=0;
				while(!INRANGE(STB6K_LOOKUP[u8][0],Frequency,STB6K_LOOKUP[u8][1])&& (u8<10)) u8++;
				vco=STB6K_LOOKUP[u8][2];
				ChipSetFieldImage(hTuner,FSTB6100_OSM,vco);

				frequency=2*Frequency*(ChipGetFieldImage(hTuner,FSTB6100_ODIV)+1); /*Flo=2*Ftuner*(ODIV+1)*/
				

				hTunerParams->Reference/=1000; /*Refrence in Khz*/
				/*flo=Fxtal*(DIV2+1)*(Ni+Nf/2^9)*/  
				
				/*Ni = floor (fVCO / (fXTAL * P))*/
				divider=(frequency/hTunerParams->Reference)/(ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1);
				
				/*round ((fVCO / (fXTAL * P) - Ni) * 2^9)*/
				stepsize=frequency-divider*(ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1)*(hTunerParams->Reference); /**/
				nbsteps=(stepsize*PowOf2(9))/((ChipGetFieldImage(hTuner,FSTB6100_PSD2)+1)*(hTunerParams->Reference));					  
				swallow=nbsteps; 
				
				ChipSetFieldImage(hTuner,FSTB6100_NI,divider);
				ChipSetFieldImage(hTuner,FSTB6100_NF_LSB,(swallow&0xFF));
				ChipSetFieldImage(hTuner,FSTB6100_NF_MSB,(swallow>>8));
				hTunerParams->Reference*=1000; 
				ChipSetFieldImage(hTuner,FSTB6100_LPEN,0);	/* PLL loop disabled */
				ChipSetFieldImage(hTuner,FSTB6100_OSCH,1);	/* VCO search enabled */
				ChipSetFieldImage(hTuner,FSTB6100_OCK,1);	/* VCO search clock off */
				error = TunerWrite(hTuner);
				
				ChipSetFieldImage(hTuner,FSTB6100_LPEN,1);	/* PLL loop enabled */
				error = TunerWrite(hTuner);
				
				WAIT_N_MS(20);
				ChipSetFieldImage(hTuner,FSTB6100_OSCH,0);	/* VCO search disabled */
				ChipSetFieldImage(hTuner,FSTB6100_OCK,3);		/* VCO search clock off */
				ChipSetFieldImage(hTuner,FSTB6100_FCCK,0);	/*LPF BW setting clock disabled */
				error = TunerWrite(hTuner);

			break;	
			
			case TUNER_IX2476:

				frequency =  Frequency + hTunerParams->IF;  
				stepsize = hTunerParams->Reference / (PowOf2(ChipGetFieldImage(hTuner,FIX2476_REF)+2));
				
				nbsteps = (frequency * 100) / (stepsize / 10); 
				swallow = nbsteps % 32;
				divider = nbsteps / 32;
				
				ChipSetFieldImage(hTuner,FIX2476_N_MSB,(divider >> 3) & 0x1F); 
				ChipSetFieldImage(hTuner,FIX2476_N_LSB,divider & 0x07);
				ChipSetFieldImage(hTuner,FIX2476_A, swallow);
				
				u8=0;
				
				while(!INRANGE(IX2476_LOOKUP[u8][0],Frequency,IX2476_LOOKUP[u8][1]) && (u8<10)) u8++;
				
				ChipSetFieldImage(hTuner,FIX2476_DIV,IX2476_LOOKUP[u8][3]);
				vco = IX2476_LOOKUP[u8][2];
				ChipSetFieldImage(hTuner,FIX2476_VCO,vco);
				
				ChipSetFieldImage(hTuner, FIX2476_TM, 0);
				ChipSetRegisters(hTuner,RIX2476_NHIGH,4);
				WAIT_N_MS(1);

⌨️ 快捷键说明

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