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

📄 stb0899_drv.c

📁 DVB-S STB0899 source code
💻 C
📖 第 1 页 / 共 4 页
字号:
		FE_STB0899_CheckTiming(pParams); /*For high rates (MCPC)*/

	if(pParams->State == TIMINGOK)
	{
		if(FE_STB0899_SearchCarrier(pParams) == CARRIEROK)	
		{
			/*Check for data*/
			if(FE_STB0899_SearchData(pParams) == DATAOK)
			{
				if(FE_STB0899_CheckRange(pParams) == RANGEOK)
				{
					pParams->Results.Frequency = pParams->Frequency + (pParams->DerotFreq * (pParams->Mclk) / 1000);
					pParams->Results.PunctureRate = (FE_STB0899_Rate_t)ChipGetField(pParams->hDemod, FSTB0899_VIT_CURPUN);
				}
			}
		}
	}
	if(pParams->State != RANGEOK)
		NextSubRange(pParams);
	
	ChipSetField(pParams->hDemod, FSTB0899_FRESRS, 0); /*release Stream merger reset*/
	ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 0); /*Disable Carrier detector*/
	
	ChipGetRegisters(pParams->hDemod, RSTB0899_EQUAI1, 10);

	pParams->Results.SignalType = pParams->State;
	
	/*if locked and range is ok set Kdiv value*/
	if(pParams->State == RANGEOK)
	{
		switch(pParams->Results.PunctureRate)
		{
			case 13:		/*1/2*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER, 0x1a/*36*/);
			break;
			
			case 18:		/*2/3*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER, 44/*0x27*/);
			break;
			
			case 21:		/*3/4*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,/*0x34*/60);
			break;
			
			case 24:		/*5/6*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,75/*0x4f*/);
			break;
			
			case 25:		/*6/7*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,/*0x5c*/80);
			break;
			
			case 26:		/*7/8*/
				ChipSetField(pParams->hDemod, FSTB0899_KDIVIDER,94/*0x6a*/);
			break;	
		}
	}
	return	pParams->State;
}

FE_DVBS2_State
FE_STB0899_DVBS2Algo(FE_STB0899_InternalParams_t *pParams)
{
	FE_STB0899_DVBS2_InitParams_t initParams;
	FE_DVBS2_ReacquireParams_t racqParams;
	FE_DVBS2_ModCod_t modCode;
	
	S32 offsetfreq,searchTime,pilots;
	
	/*Init Params Initialization*/
	initParams.RRCAlpha = pParams->RrcAlpha;
	initParams.ModeMode = pParams->mod;
	initParams.SymbolRate = pParams->DVBS2SymbolRate;
	initParams.MasterClock = pParams->MasterClock;
	initParams.CarrierFrequency = 0;
	initParams.AveFrameCoarse = pParams->AveFrameCoarse;
	initParams.AveFramefine = pParams->AveFramefine;
	initParams.AgcThreshold = pParams->AgcThreshold;
	
	/*Reacquire Params initialization*/
	racqParams.AcqMode = pParams->AcqMode;
	racqParams.SymbolRate = pParams->DVBS2SymbolRate;
	racqParams.MasterClock = pParams->MasterClock;
	racqParams.FreqRange = pParams->SearchRange / 1000000/*pParams->FreqRange*/;
	racqParams.CenterFreq = pParams->CenterFreq;
	racqParams.AveFrameCoarseAcq = pParams->AveFrameCoarseAcq;
	racqParams.AveFramefineAcq = pParams->AveFramefineAcq;
	racqParams.AveFrameCoarseTrq = pParams->AveFrameCoarseTrq;
	racqParams.AveFramefineTrq = pParams->AveFramefineTrq;
	racqParams.AutoReacq = pParams->AutoReacq;
	racqParams.TracklockSel = pParams->TracklockSel;
	racqParams.Zigzag = pParams->Zigzag;
	racqParams.StepSize = pParams->StepSize;
	
	if(pParams->DVBS2SymbolRate <= 2000000)
		searchTime = 5000;
	else if(pParams->DVBS2SymbolRate <= 5000000)
		searchTime = 2500;
	else if(pParams->DVBS2SymbolRate <= 10000000)
		searchTime = 1500;
	else if  (pParams->DVBS2SymbolRate <= 15000000)
		searchTime = 700;
	else if  (pParams->DVBS2SymbolRate <= 20000000)
		searchTime = 500;
	else if  (pParams->DVBS2SymbolRate <= 25000000)
		searchTime = 200;
	else
		searchTime = 150;

	/*move tuner*/
	TunerSetFrequency(pParams->hTuner, pParams->Frequency);	
	pParams->Frequency = TunerGetFrequency(pParams->hTuner);
	/*Temporisations*/
	WaitTuner(pParams->hTuner, 100);	 /*Is tuner Locked?(wait 100 ms maxi)*/ 

	/*Set IF AGC to Acquire value*/
	ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_LOOPGAIN, 4);
	ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
	
	ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGC_DUMPPER, 0);
	ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL2, 1);

	/*Initialisations*/
	FE_DVBS2_InitialCalculations(pParams->hDemod, &initParams);
	
	/*IQ swap setting*/
	if((pParams->SpectralInv == FE_IQ_AUTO) || (pParams->SpectralInv == FE_IQ_NORMAL))
	{
		/* I,Q Spectrum Set to Normal*/ 
		ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 0);
		ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
	}
	else
	{
		/* I,Q Spectrum Inverted*/ 
		ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 1);
		ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
	}
		
	FE_DVBS2_Reacquire(pParams->hDemod, &racqParams);
	/*Wait for UWP,CSM and DATA LOCK searchTime ms max*/
	pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, searchTime);
	
	if(pParams->DVBS2State != FE_DVBS2_DATAOK)
	{
		if(pParams->SpectralInv == FE_IQ_AUTO)
		{
			/* I,Q Spectrum Invertion*/ 
			ChipSetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT, 1);
			ChipSetRegisters(pParams->hDemod, RSTB0899_DMDCNTRL2, 1);
			/* start acquistion process  */
			FE_DVBS2_Reacquire(pParams->hDemod, &racqParams);
			/*Whait for UWP,CSM and data LOCK 200ms max*/
			pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, searchTime);
			if(pParams->DVBS2State == FE_DVBS2_DATAOK)
				pParams->SpectralInv = FE_IQ_SWAPPED;
		}
	}
	/*Set IF AGC to tracking value*/
	ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_LOOPGAIN, 3);
	ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
	
	ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGC_DUMPPER, 7);
	ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL2, 1);

	if(pParams->DVBS2State == FE_DVBS2_DATAOK)
	{
		modCode = (FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(pParams->hDemod);
		pilots=ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) & 0x01;

		if((((10*pParams->MasterClock) / (pParams->DVBS2SymbolRate/10)) <= 400) && (INRANGE(FE_QPSK_12, modCode, FE_QPSK_910)) && (pilots == 1))
		{
			FE_DVBS2_CSMInitialize(pParams->hDemod, pilots, modCode, pParams->DVBS2SymbolRate, pParams->MasterClock);
			/*Wait for UWP,CSM and data LOCK 20ms max*/
			pParams->Results.DVBS2SignalType = pParams->DVBS2State = FE_DVBS2_GetState(pParams->hDemod, 20);
		}

		/*if locked store signal parameters*/
		offsetfreq = ChipGetField(pParams->hDemod, FSTB0899_CRL_FREQUENCY);
		offsetfreq = offsetfreq / (PowOf2(30) / 1000);
		offsetfreq *= (pParams->MasterClock / 1000000);
		if(ChipGetFieldImage(pParams->hDemod, FSTB0899_SPECTRUM_INVERT))
			offsetfreq *= -1;
		
		pParams->Results.Frequency = TunerGetFrequency(pParams->hTuner) - offsetfreq;
  		pParams->Results.DVBS2SymbolRate = FE_DVBS2_GetSymbolRate(pParams->hDemod, pParams->MasterClock);
		pParams->Results.ModCode = (FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(pParams->hDemod);
		pParams->Results.Pilots = (BOOL)ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) & 0x01;
		pParams->Results.FrameLength = (FE_DVBS2_FRAME)((ChipGetFieldImage(pParams->hDemod, FSTB0899_UWP_DECODED_MODCODE) >> 1) & 0x01);
		
		/*Set AGC init value to to the founded AGC level*/
		pParams->AgcGain = ChipGetField(pParams->hDemod, FSTB0899_IF_AGCGAIN);
		ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_GAININIT, pParams->AgcGain);
		ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);

		/*if QPSK 1/2 ,QPSK 3/5 or QPSK 2/3 set IF AGC reference to 16 otherwise 32*/
		if(pParams->Results.ModCode <= FE_QPSK_23)
		{
			ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_AGCREF, 16);
			ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
		}
		else
		{
			ChipSetFieldImage(pParams->hDemod,FSTB0899_IF_AGCREF,32);
			ChipSetRegisters(pParams->hDemod,RSTB0899_IFAGCCNTRL,1);
		}
	}
	return	pParams->DVBS2State;
}

/*Symbol Rate in Hz,Mclk in Hz */

static void
FE_STB0899_SetIterScal(STCHIP_Handle_t hChip, u32 MasterClock, u32 SymbolRate)
{
	S32 iTerScal;
	
	iTerScal = 17 * (MasterClock / 1000);
	iTerScal += 410000;
	iTerScal /= (SymbolRate / 1000000);
	iTerScal /= 1000;
	
	if(iTerScal > 150)
		iTerScal = 150;
	
	ChipSetField(hChip, FSTB0899_ITERATION_SCALE, iTerScal);
}

/*****************************************************
--FUNCTION	::	FE_STB0899_Init
--ACTION	::	Initialisation of the STB0899 chip
--PARAMS IN	::	pInit==>pointer to stb0899_state structure
--PARAMS OUT	::	NONE
--RETURN	::	Handle to STB0899
--***************************************************/

FE_STB0899_Handle_t
FE_STB0899_Init(FE_STB0899_InitParams_t *pInit)
{
	FE_STB0899_InternalParams_t *pParams = NULL;

	/* Internal params structure allocation */
	pParams = (FE_STB0899_InternalParams_t *)malloc(sizeof(FE_STB0899_InternalParams_t));

	if(pParams != NULL)
	{
		/* Chip initialisation */
		pParams->hDemod = STB0899_Init(pInit->STB0899Init);
		
		if(pInit->TunerInit->Chip->Repeater)
			pInit->TunerInit->Chip->RepeaterHost = pParams->hDemod;
		pParams->hTuner = STTunerInit(pInit->TunerInit);
#if 0
		pParams->hLnb = LNBP21_Init(pInit->LnbInit);
#endif		
		if((pParams->hDemod != NULL) && (!pParams->hDemod->ChipError))
		{
			FE_STB0899_SetStandard(pParams->hDemod, (STB0899_STANDARD)pInit->Standard);

			pParams->Quartz = 27000000;
				
			switch(pInit->Clock)
			{
				case FE_PARALLEL_CLOCK:	
				/*TS_CLK = MCLK , if parallel TS disable output fifo */	
					ChipSetField(pParams->hDemod, FSTB0899_OUTRS_PS, 0x00);
					ChipSetOneRegister(pParams->hDemod, RSTB0899_TSOUT, 0x7f);
				break;
				
				case FE_SERIAL_MASTER_CLOCK:
				/*TS_CLK = MCLK if serial  TS do not disable output fifo , set TS_clk ratio to 1 */
					ChipSetField(pParams->hDemod, FSTB0899_OUTRS_PS, 0x01);
					ChipSetOneRegister(pParams->hDemod, RSTB0899_TSOUT, 0x23);
				break;
				
				default:
				break;
			}

			switch(pInit->Parity)
			{
				case FE_PARITY_ON:
					ChipSetField(pParams->hDemod, FSTB0899_CLK_POL, 0x00);
				break;
				
				case FE_PARITY_OFF: 
					ChipSetField(pParams->hDemod, FSTB0899_CLK_POL, 0x01);
				break;
				
				default:
				break;
			}
			FE_STB0899_InitialCalculations(pParams);
		}
		else
		{
			free(pParams);
			pParams = NULL;
		}
	}
	return  (FE_STB0899_Handle_t) pParams;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SetMclk
--ACTION	::	Set demod Master Clock  
--PARAMS IN	::	Handle==>Front End Handle
		::	Mclk : demod master clock
		::	ExtClk external Quartz
--PARAMS OUT	::	NONE.
--RETURN	::	Error (if any)
--***************************************************/

FE_STB0899_Error_t
FE_STB0899_SetMclk(FE_STB0899_Handle_t Handle, u32 Mclk, u32 ExtClk)
{
	FE_STB0899_Error_t st_error = FE_NO_ERROR;
	FE_STB0899_InternalParams_t * pParams = (FE_STB0899_InternalParams_t *)Handle;

	u32 mDiv;
	if(pParams == NULL)
		st_error = FE_INVALID_HANDLE;
	else
	{
		mDiv = ((6 * Mclk) / ExtClk) - 1;
		ChipSetField(pParams->hDemod, FSTB0899_MDIV, mDiv); 
		pParams->MasterClock = FE_STB0899_GetMclkFreq(pParams->hDemod, pParams->Quartz);
	}
	return(FE_NO_ERROR);
}

FE_STB0899_Error_t
FE_STB0899_Search(FE_STB0899_Handle_t Handle, FE_STB0899_SearchParams_t *pSearch, FE_STB0899_SearchResult_t *pResult)
{
	FE_STB0899_Error_t st_error = FE_NO_ERROR;
	FE_STB0899_InternalParams_t *pParams;

	if(Handle != 0)
	{
		pParams = (FE_STB0899_InternalParams_t *) Handle;
		FE_STB0899_SetInternalError(FE_IERR_NO, FE_LOC_NOWHERE, &pParams->Inl_Error);
		pParams->Standard = pSearch->Standard;
		if((INRANGE(1000000, pSearch->SymbolRate, 45000000)) && (INRANGE(1000000, pSearch->SearchRange, 50000000)))
		{
			FE_STB0899_SetStandard(pParams->hDemod, (STB0899_STANDARD)pSearch->Standard);
			
			/*Set tuner Gain */
			if(pSearch->SymbolRate > 15000000)
				TunerSetGain(pParams->hTuner, 8);
			else if(pSearch->SymbolRate > 5000000)
				TunerSetGain(pParams->hTuner,12);
			else
				TunerSetGain(pParams->hTuner,14);

			/*For Low Symbol Rate (<=5Mbs) set Mclk to 45MHz, else use 108MHz*/
			if(pSearch->SymbolRate <= 5000000)
			{
				FE_STB0899_SetMclk(Handle, 45000000, pParams->Quartz);
			}
			else
			{
				FE_STB0899_SetMclk(Handle, 108000000, pParams->Quartz);
			}
		
			switch(pSearch->Standard)
			{
				case FE_DVBS1_STANDARD:
				case FE_DSS_STANDARD:
					/* Fill pParams structure with search parameters */
					pParams->BaseFreq = pSearch->Frequency;
					pParams->SymbolRate = pSearch->SymbolRate;
					pParams->SearchRange = pSearch->SearchRange;
					pParams->DerotPercent = 10;
					TunerSetBandwidth(pParams->hTuner, (13 * (CarrierWidth(pParams->SymbolRate, pParams->RollOff) + 10000000)) / 10);
					pParams->TunerBW = TunerGetBandwidth(pParams->hTuner);
					/*Set DVB-S1 AGC*/
					ChipSetOneRegister(pParams->hDemod, RSTB0899_AGCRFCFG, 0x11);
					/* Run the search algorithm */
					if((FE_STB0899_Algo(pParams) == RANGEOK) && (pParams->hDemod->ChipError == CHIPERR_NO_ERROR))
					{
						pResult->Locked = TRUE;
						/* update results */
						pResult->Frequency =pParams->Results.Frequency;
						pResult->SymbolRate = pParams->Results.SymbolRate;
						pResult->Rate = pParams->Results.PunctureRate;
					}
					else
					{

⌨️ 快捷键说明

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