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

📄 stb0899_drv.c

📁 DVB-S STB0899 source code
💻 C
📖 第 1 页 / 共 4 页
字号:
	return (SymbolRate  + (SymbolRate * RollOff) / 100);
}

/*****************************************************
--FUNCTION	::	FE_STB0899_InitialCalculations
--ACTION	::	Set Params fields that are never changed during search algorithm   
--PARAMS IN	::	NONE
--PARAMS OUT	::	NONE
--RETURN	::	NONE
--***************************************************/

static void
FE_STB0899_InitialCalculations(FE_STB0899_InternalParams_t *pParams)
{
	int MasterClock;

	/*Read registers (in burst mode)*/
	ChipGetOneRegister(pParams->hDemod, RSTB0899_AGC1CN);
	/*Read AGC1R and AGC2O registers */
	ChipGetRegisters(pParams->hDemod, RSTB0899_AGC1REF, 2);
	
	/*Initial calculations*/
	MasterClock = FE_STB0899_GetMclkFreq(pParams->hDemod, pParams->Quartz);
	pParams->Tagc1 = 0;
	pParams->Tagc2 = 0;
	pParams->MasterClock = MasterClock;
	pParams->Mclk = MasterClock / 65536L;
	pParams->RollOff = FE_STB0899_GetAlpha(pParams->hDemod);

	/*DVBS2 Initial calculations */
	/*Set AGC init value to to the midle*/
	pParams->AgcGain = 8154;
	ChipSetFieldImage(pParams->hDemod, FSTB0899_IF_GAININIT, pParams->AgcGain);
	ChipSetRegisters(pParams->hDemod, RSTB0899_IFAGCCNTRL, 1);
	
	pParams->RrcAlpha = (FE_DVBS2_RRCAlpha_t)ChipGetField(pParams->hDemod, FSTB0899_RRC_ALPHA);
	pParams->AcqMode = CORR_PEAK;
	pParams->FreqRange = 4; /*pSearch->FreqRange*/
	pParams->CenterFreq = 0;
	pParams->mod = DVBS2_PSK8;
	pParams->AveFrameCoarse = 10;
	pParams->AveFramefine = 20;
	pParams->AgcThreshold = 23;
	pParams->AveFrameCoarseAcq = 4;
	pParams->AveFramefineAcq = 6;
	pParams->AveFrameCoarseTrq = 10;
	pParams->AveFramefineTrq = 20;
	pParams->AutoReacq = 1;
	pParams->TracklockSel = 0;
	pParams->Zigzag = 1;
	pParams->StepSize = 2;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SearchTiming
--ACTION	::	Perform an Fs/2 zig zag to found timing
--PARAMS IN	::	NONE
--PARAMS OUT	::	NONE
--RETURN	::	NOTIMING if no valid timing had been found, TIMINGOK otherwise
--***************************************************/

static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchTiming(FE_STB0899_InternalParams_t *pParams)
{
	short int DerotStep,
		DerotFreq = 0,
		DerotLimit,
		NextLoop = 3;
	int 	index = 0;
	
	pParams->State = NOTIMING;
	
	/* timing loop computation & symbol rate optimisation	*/
	DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
	DerotStep = (short int)((pParams->SymbolRate / 2L) / pParams->Mclk);
	
	while((FE_STB0899_CheckTiming(pParams) != TIMINGOK) && NextLoop)
	{
		index++;
		/*Compute the next derotator position for the zig zag*/
		DerotFreq += index*pParams->Direction * DerotStep;	
		
		if(ABS(DerotFreq) > DerotLimit)
			NextLoop--;
		
		if(NextLoop)
		{
			ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
			ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
			/*Set the derotator frequency*/
			ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
		}
		/*Change the zigzag direction*/
		pParams->Direction = -pParams->Direction;	
	}
	
	if(pParams->State == TIMINGOK)
	{
		pParams->Results.SymbolRate = pParams->SymbolRate;
		/*Get the derotator frequency*/
		ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
		pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
	}
	
	return pParams->State;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SearchCarrier
--ACTION	::	Search a QPSK carrier with the derotator
--PARAMS IN	::	
--PARAMS OUT	::	NONE
--RETURN	::	NOCARRIER if no carrier had been found, CARRIEROK otherwise 
--***************************************************/

static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchCarrier(FE_STB0899_InternalParams_t *pParams)
{
	short int DerotFreq = 0,
		LastDerotFreq = 0,
		DerotLimit,
		NextLoop = 3;
	int 	index = 0;
			
	pParams->State = NOCARRIER;	
	
	DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
	DerotFreq = pParams->DerotFreq;
	
	ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 1);
	
	do
	{
		if(FE_STB0899_CheckCarrier(pParams) == NOCARRIER)
		{
			index++;
			LastDerotFreq = DerotFreq;
			/*Compute the next derotator position for the zig zag*/
			DerotFreq += index * pParams->Direction * pParams->DerotStep;

			if(ABS(DerotFreq) > DerotLimit)
				NextLoop--;
				
			if(NextLoop)
			{
				ChipSetField(pParams->hDemod, FSTB0899_CFD_ON, 1);
				ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
				ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
				/*Set the derotator frequency*/ 
				ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
			}
		}
		else
		{
			pParams->Results.SymbolRate = pParams->SymbolRate;
		}
		/*Change the zigzag direction*/
		pParams->Direction = -pParams->Direction;	
	}
	while((pParams->State != CARRIEROK) && NextLoop);
	
	if(pParams->State == CARRIEROK)
	{
		/*Get the derotator frequency*/
		ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
		pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
	}
	else
	{
		pParams->DerotFreq = LastDerotFreq;
	}
	
	return pParams->State;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_SearchData
--ACTION	::	Search a QPSK carrier with the derotator, even if there is a false 			lock 
--PARAMS IN	::	
--PARAMS OUT	::	NONE
--RETURN	::	NOCARRIER if no carrier had been found, CARRIEROK otherwise 
--***************************************************/

static FE_STB0899_SIGNALTYPE_t
FE_STB0899_SearchData(FE_STB0899_InternalParams_t *pParams)
{
	short int DerotFreq,
		DerotStep,
		DerotLimit,
		NextLoop = 3;
	int 	index = 1;
	
	DerotStep = (short int)((pParams->SymbolRate / 4L) / pParams->Mclk);
	DerotLimit = (short int)((pParams->SubRange / 2L) / pParams->Mclk);
	DerotFreq = pParams->DerotFreq;
	
	do
	{
		if((pParams->State != CARRIEROK) || (FE_STB0899_CheckData(pParams) != DATAOK))
		{
			/*Compute the next derotator position for the zig zag*/
			DerotFreq += index * pParams->Direction * DerotStep;
		
			if(ABS(DerotFreq) > DerotLimit)
				NextLoop--;
			
			if(NextLoop)
			{
				ChipSetField(pParams->hDemod, FSTB0899_CFD_ON,1);
			
				ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, MSB(pParams->hTuner->IQ_Wiring * DerotFreq));
				ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, LSB(pParams->hTuner->IQ_Wiring * DerotFreq));
				/*Reset the derotator frequency*/
				ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
				FE_STB0899_CheckCarrier(pParams);
			
				index++;
			}
		}
		pParams->Direction = -pParams->Direction;/*Change the zigzag direction*/
	}
	while((pParams->State != DATAOK) && NextLoop);
	
	if(pParams->State == DATAOK)
	{
		/*Get the derotator frequency*/
		ChipGetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
		pParams->DerotFreq = pParams->hTuner->IQ_Wiring * ((short int) MAKEWORD(ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB), ChipGetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB)));
	}
	
	return pParams->State;
}

/****************************************************
--FUNCTION	::	FE_STB0899_CheckRange
--ACTION	::	Check if the founded frequency is in the correct range
--PARAMS IN	::	pParams->BaseFreq =>
--PARAMS OUT	::	pParams->State	=>Result of the check
--RETURN	::	RANGEOK if check success, OUTOFRANGE otherwise 
--***************************************************/

static FE_STB0899_SIGNALTYPE_t
FE_STB0899_CheckRange(FE_STB0899_InternalParams_t *pParams)
{
	int	RangeOffset,
		TransponderFrequency;

	RangeOffset = pParams->SearchRange/2000;
	TransponderFrequency = pParams->Frequency + (pParams->DerotFreq * pParams->Mclk) / 1000;

	if((TransponderFrequency >= pParams->BaseFreq - RangeOffset)
	&& (TransponderFrequency <= pParams->BaseFreq + RangeOffset))
		pParams->State = RANGEOK;
	else
		pParams->State = OUTOFRANGE;
		
	return pParams->State;
}

/****************************************************
--FUNCTION	::	FirstSubRange
--ACTION	::	Compute the first SubRange of the search 
--PARAMS IN	::	pParams->SearchRange
--PARAMS OUT	::	pParams->SubRange
--RETURN	::	NONE
--***************************************************/

static void
FirstSubRange(FE_STB0899_InternalParams_t *pParams)
{
	int maxsubrange;
	
	maxsubrange = TunerGetBandwidth(pParams->hTuner) - CarrierWidth(pParams->SymbolRate, pParams->RollOff) / 2;
	
	if(maxsubrange > 0)
		pParams->SubRange = MIN(pParams->SearchRange, maxsubrange);
	else
		pParams->SubRange = 0;
	pParams->Frequency = pParams->BaseFreq;
	pParams->TunerOffset = 0L;
	
	pParams->SubDir = 1;
}

/****************************************************
--FUNCTION	::	NextSubRange
--ACTION	::	Compute the next SubRange of the search 
--PARAMS IN	::	Frequency->Start frequency
--			pParams->SearchRange
--PARAMS OUT	::	pParams->SubRange
--RETURN	::	NONE
--***************************************************/

static void
NextSubRange(FE_STB0899_InternalParams_t *pParams)
{
	long OldSubRange;
	
	if(pParams->SubDir > 0)
	{
		OldSubRange = pParams->SubRange;
		pParams->SubRange = MIN((pParams->SearchRange/2) - (pParams->TunerOffset + pParams->SubRange/2), pParams->SubRange);
		if(pParams->SubRange < 0)
			pParams->SubRange = 0;
		pParams->TunerOffset += (OldSubRange + pParams->SubRange) / 2;
	}
	
	pParams->Frequency = pParams->BaseFreq + (pParams->SubDir * pParams->TunerOffset) / 1000;
	pParams->SubDir = -pParams->SubDir;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_Algo
--ACTION	::	Search for Signal, Timing, Carrier and then data at a given Frequency, 
--			in a given range
--PARAMS IN	::	NONE
--PARAMS OUT	::	NONE
--RETURN	::	Type of the founded signal (if any)
--***************************************************/

FE_STB0899_SIGNALTYPE_t
FE_STB0899_Algo(FE_STB0899_InternalParams_t *pParams)
{
	pParams->Frequency = pParams->BaseFreq;
	pParams->Direction = 1;

	FE_STB0899_SetSymbolRate(pParams->hDemod, pParams->MasterClock, pParams->SymbolRate);

	/* Carrier loop optimization versus symbol rate */
	if(pParams->SymbolRate <= 5000000)
		ChipSetField(pParams->hDemod, FSTB0899_ALPHA, 9);
	else
		ChipSetField(pParams->hDemod, FSTB0899_ALPHA, 7);

	if(pParams->SymbolRate <= 2000000)
		ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x17);
	else if(pParams->SymbolRate <= 5000000)
		ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x1C);
	else if(pParams->SymbolRate <= 15000000) 
		ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x22);
	else if(pParams->SymbolRate <= 30000000)
		ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x27);
	else
		ChipSetField(pParams->hDemod, FSTB0899_BETA, 0x29);
	
	/*Initial calculations*/
	/*step of DerotStep/1000 * Fsymbol*/ 
	pParams->DerotStep = pParams->DerotPercent*((S16)((pParams->SymbolRate/1000L)/pParams->Mclk));
	pParams->Ttiming = (S16)(FE_STB0899_TimingTimeConstant(pParams->SymbolRate));
	pParams->Tderot = (S16)(FE_STB0899_DerotTimeConstant(pParams->SymbolRate));
	pParams->Tdata = 500;
	
	ChipSetField(pParams->hDemod,FSTB0899_FRESRS, 1); /*Reset Stream merger*/
	
	FirstSubRange(pParams);
	
	/*Initialisations*/
	ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_MSB, 0);
	ChipSetFieldImage(pParams->hDemod, FSTB0899_CARRIER_FREQUENCY_LSB, 0);
	/*Reset of the derotator frequency*/
	ChipSetRegisters(pParams->hDemod, RSTB0899_CFRM, 2);
	ChipSetField(pParams->hDemod, FSTB0899_TIMING_LOOP_FREQ, 0xf2);
	ChipSetField(pParams->hDemod, FSTB0899_CFD_ON,1);
	
	pParams->DerotFreq = 0;
	pParams->State = NOAGC1;

	/*Move the tuner*/
	TunerSetFrequency(pParams->hTuner, pParams->Frequency);
	pParams->Frequency = TunerGetFrequency(pParams->hTuner);

	if (pParams->hTuner->Chip->ChipError)
	{
		return NOCARRIER;
	}
		
	/*Temporisations*/	
	/*Wait for agc1,agc2 and timing loop*/
	WAIT_N_MS(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming);
	/*Is tuner Locked? (wait 100 ms maxi)*/
	WaitTuner(pParams->hTuner, 100);
		
	pParams->State = AGC1OK;	/* No AGC test actually */
		
	/*There is signal in the band*/
	if(pParams->SymbolRate <= (S32)(TunerGetBandwidth(pParams->hTuner)/2))
		FE_STB0899_SearchTiming(pParams); /*For low rates (SCPC)*/
	else

⌨️ 快捷键说明

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