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

📄 stb0899_drv.c

📁 DVB-S STB0899 source code
💻 C
📖 第 1 页 / 共 4 页
字号:
						pResult->Locked = FALSE;
					
						switch(pParams->Inl_Error.Type)
						{
							case FE_IERR_I2C:
								st_error = FE_I2C_ERROR;
							break;
				
							case FE_IERR_NO:
							default:
								st_error = FE_SEARCH_FAILED;
							break;
						}
					}
				break;
				
				case FE_DVBS2_STANDARD:
					/* Fill pParams structure with search parameters */
					pParams->Frequency = pSearch->Frequency;
					pParams->BaseFreq = pSearch->Frequency;
					pParams->DVBS2SymbolRate = pSearch->SymbolRate;
					pParams->SpectralInv = pSearch->IQ_Inversion;
			
					pParams->SearchRange = pSearch->SearchRange;
					TunerSetBandwidth(pParams->hTuner, (13 * (FE_DVBS2_CarrierWidth(pParams->DVBS2SymbolRate,pParams->RrcAlpha) + 10000000)) / 10);
					pParams->TunerBW = TunerGetBandwidth(pParams->hTuner);

					/*Set DVB-S2 AGC*/
					ChipSetOneRegister(pParams->hDemod, RSTB0899_AGCRFCFG, 0x1c);
					
					/*Set IterScale =f(MCLK,SYMB,MODULATION*/
					FE_STB0899_SetIterScal(pParams->hDemod, pParams->MasterClock, pParams->DVBS2SymbolRate);
					
					/* Run the DVBS2  search algorithm */
					if((FE_STB0899_DVBS2Algo(pParams) == FE_DVBS2_DATAOK) && (pParams->hDemod->ChipError == CHIPERR_NO_ERROR))
					{
						pResult->Locked = TRUE;
						/* update results */
						pResult->Frequency =pParams->Results.Frequency;
						pResult->SymbolRate = pParams->Results.DVBS2SymbolRate;
						pResult->ModCode = pParams->Results.ModCode;
						pResult->Pilots = pParams->Results.Pilots;
						pResult->FrameLength = pParams->Results.FrameLength;
					}
					else
					{
						pResult->Locked = FALSE;
				
						switch(pParams->Inl_Error.Type)
						{
							case FE_IERR_I2C:
								st_error = FE_I2C_ERROR;
							break;
				
							case FE_IERR_NO:
							default:
								st_error = FE_SEARCH_FAILED;
							break;
						}
					}
				break;
				
				default:
					st_error = FE_BAD_PARAMETER;
				break;
			}
		}
		else
			st_error = FE_BAD_PARAMETER;
	}
	else
		st_error=FE_INVALID_HANDLE;
	
	return st_error;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_GetRFLevel
--ACTION	::	Return power of the signal
--PARAMS IN	::	NONE	
--PARAMS OUT	::	NONE
--RETURN	::	Power of the signal (dBm), 0 if no signal 
--***************************************************/

u16
FE_STB0899_GetRFLevel(STCHIP_Handle_t hChip,FE_STB0899_LOOKUP_t *lookup,STB0899_STANDARD Standard)
{
	u8 Imin, Imax, i;
	S16 agcGain = 0,rfLevel = 0;
	
	if((lookup != NULL) && lookup->size)
	{
		switch(Standard)
		{
			case FE_DVBS1_STANDARD:
			case FE_DSS_STANDARD:
				agcGain = ChipGetField(hChip,FSTB0899_AGCIQ_VALUE);
			break;
			
			case FE_DVBS2_STANDARD:
				agcGain = ChipGetField(hChip,FSTB0899_IF_AGCGAIN);
			break;
		}
		Imin = 0;
		Imax = lookup->size-1;
		
		if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[Imax].regval))
		{
			while((Imax-Imin)>1)
			{
				i=(Imax+Imin)/2;
				
				if(INRANGE(lookup->table[Imin].regval,agcGain,lookup->table[i].regval))
					Imax = i;
				else
					Imin = i;
			}
			rfLevel =(((S32)agcGain - lookup->table[Imin].regval) * (lookup->table[Imax].realval - lookup->table[Imin].realval) / (lookup->table[Imax].regval - lookup->table[Imin].regval)) + lookup->table[Imin].realval + 100;
		}
		else
			rfLevel = -100+100;
	}
	return (u16)rfLevel;
}

/*****************************************************
--FUNCTION	::	CarrierGetQuality
--ACTION	::	Return the carrier to noise of the current carrier
--PARAMS IN	::	NONE	
--PARAMS OUT	::	NONE
--RETURN	::	C/N of the carrier, 0 if no carrier 
--***************************************************/

u16
CarrierGetQuality(STCHIP_Handle_t hChip, FE_STB0899_LOOKUP_t *lookup, STB0899_STANDARD Standard)
{
	u16 regval, Imin, Imax, i;
	u16 c_n = 0, quant, val2;

	switch(Standard)
	{
		case FE_DVBS1_STANDARD:
		case FE_DSS_STANDARD:
			if(ChipGetField(hChip,FSTB0899_CARRIER_FOUND))
			{
				if((lookup != NULL) && lookup->size)
				{
					ChipGetRegisters(hChip, RSTB0899_NIRM, 2);
					ChipGetRegisters(hChip, RSTB0899_NIRL, 2);

					regval = MAKEWORD(ChipGetFieldImage(hChip, FSTB0899_NOISE_IND_MSB), ChipGetFieldImage(hChip, FSTB0899_NOISE_IND_LSB));
	
					Imin = 0;
					Imax = lookup->size-1;

					if(INRANGE(lookup->table[Imin].regval, regval, lookup->table[Imax].regval))
					{
						while((Imax-Imin) > 1)
						{
							i = (Imax + Imin) / 2;
							if(INRANGE(lookup->table[Imin].regval, regval, lookup->table[i].regval))
								Imax = i;
							else
								Imin = i;
						}	
						c_n = ((regval - lookup->table[Imin].regval) * (lookup->table[Imax].realval - lookup->table[Imin].realval) / (lookup->table[Imax].regval - lookup->table[Imin].regval)) + lookup->table[Imin].realval;

						c_n = (int)(c_n / 2);
						if (c_n >= 100)
							c_n = 98;
					}
					else if(regval < lookup->table[Imin].regval)
						c_n = 98;
				}
			}
			
		break;
		
		case FE_DVBS2_STANDARD:
			
			quant = ChipGetField(hChip, FSTB0899_UWP_ESN0_QUANT);
			c_n = FE_DVBS2_GetUWPEsNo(hChip, quant);
			if(c_n == 1)
				c_n = 301;   /*C/N = 30.1*/
			else if(c_n == 2)
				c_n = 270;   /*C/N = 27*/
			else
			{
				val2 = (long)(-10 * (Log10Int((long)(c_n)) - 2 * Log10Int((long)(quant))));
				val2 = MULT32X32(val2, 646456993L);
				val2 *= 10;
				c_n = (u16)(((unsigned long)(val2)) / PowOf2(24));
			}
		break;
	}
	
	return c_n;
}

u32
FE_STB0899_GetError(STCHIP_Handle_t hChip, u32 Standrad)
{
	u32 ber = 0,i;
	
	switch(Standrad)
	{
		case FE_DVBS1_STANDARD:
		case FE_DSS_STANDARD:
			/* force to viterbi bit error */
			ChipSetOneRegister(hChip, RSTB0899_ERRCTRL1, 0x3D);
			ChipGetOneRegister(hChip, RSTB0899_VSTATUS);
	
			/* Average 5 ber values */
			WAIT_N_MS(1000);
			for(i=0; i<5; i++)
			{
				WAIT_N_MS(100);
				ber += FE_STB0899_GetErrorCount(hChip, COUNTER1);
			}
	
			ber /= 5;
			/*Check for carrier*/
			if(ChipGetFieldImage(hChip, FSTB0899_PRFVIT))
			{
				/*Error Rate*/
				ber *= 9766;
				/*theses two lines => ber = ber * 10^7*/
				ber /= (-1 + PowOf2(0 + 2*ChipGetFieldImage(hChip, FSTB0899_NOE)));
				ber /= 8;
			}
		break;
		
		case FE_DVBS2_STANDARD:
			/*force to DVBS2 PER*/
			ChipSetOneRegister(hChip, RSTB0899_ERRCTRL1, 0xB6);
			ChipGetOneRegister(hChip, RSTB0899_VSTATUS);
	
			/*Average 5 ber values*/
			for(i=0; i<5; i++)
			{
				WAIT_N_MS(100);
				ber += FE_STB0899_GetErrorCount(hChip, COUNTER1);
			}
			
			ber *= 10000000;
			ber /= (-1 + PowOf2(4 + 2 * ChipGetFieldImage(hChip, FSTB0899_NOE)));
		break;
	}
	return ber;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_GetSignalInfo
--ACTION	::	Return informations on the locked transponder
--PARAMS IN	::	Handle	==>Front End Handle
--PARAMS OUT	::	pInfo	==> Informations (BER,C/N,power ...)
--RETURN	::	Error (if any)
--***************************************************/

FE_STB0899_Error_t
FE_STB0899_GetSignalInfo(FE_STB0899_Handle_t Handle, FE_STB0899_SignalInfo_t	*pInfo)
{
    FE_STB0899_Error_t st_error = FE_NO_ERROR;
    FE_STB0899_InternalParams_t *pParams = NULL;

    pParams = (FE_STB0899_InternalParams_t *) Handle;
	
    if(pParams != NULL)
    {
    	switch(pParams->Standard)
	{
	    case FE_DVBS1_STANDARD:
	    case FE_DSS_STANDARD:

		pInfo->Locked = ChipGetField(pParams->hDemod, FSTB0899_LOCKEDVIT);
		if(pInfo->Locked)
		{
		    pInfo->Power = FE_STB0899_GetRFLevel(pParams->hDemod, &FE_STB0899_RF_LookUp, (STB0899_STANDARD)pParams->Standard);
		    pInfo->C_N = CarrierGetQuality(pParams->hDemod, &FE_STB0899_CN_LookUp, (STB0899_STANDARD)pParams->Standard);
		    pInfo->BER = FE_STB0899_GetError(pParams->hDemod, pParams->Standard);
		}
	    break;
	
	    case FE_DVBS2_STANDARD:
		pInfo->Locked = ((FE_DVBS2_GetState(pParams->hDemod, 10) == FE_DVBS2_DATAOK) ? 1 : 0);
		{
		    pInfo->C_N = CarrierGetQuality(pParams->hDemod, &FE_STB0899_CN_LookUp, (STB0899_STANDARD)pParams->Standard);
		    pInfo->Power = FE_STB0899_GetRFLevel(pParams->hDemod, &FE_STB0899_DVBS2RF_LookUp, (STB0899_STANDARD)pParams->Standard);
		    pInfo->BER = FE_STB0899_GetError(pParams->hDemod, pParams->Standard);
		}
	    break;
	}
    }
    else
	st_error = FE_INVALID_HANDLE;
	
    return st_error;
}

FE_STB0899_Error_t
FE_STB0899_DiseqcSend(FE_STB0899_Handle_t Handle, u8 *Data, u32 NbData)
{
	FE_STB0899_Error_t st_error = FE_NO_ERROR;
	FE_STB0899_InternalParams_t *pParams = NULL;
	
	pParams = (FE_STB0899_InternalParams_t *)Handle;
	
	if(pParams != NULL)
	{
		u32 i=0;

		ChipSetField(pParams->hDemod, FSTB0899_DISPRECHARGE, 1);
		while(i<NbData)
		{
		    	/*wait for FIFO empty*/
			while(ChipGetField(pParams->hDemod, FSTB0899_FIFOPARITYFAIL));
			/*send byte to FIFO::WARNING don't use set field!!*/
			ChipSetOneRegister(pParams->hDemod, RSTB0899_DISFIFO, Data[i]);
			i++;
		}
		ChipSetField(pParams->hDemod, FSTB0899_DISPRECHARGE, 0);
	}
	else
		st_error = FE_INVALID_HANDLE;

	return st_error;
}

/*****************************************************
--FUNCTION	::	FE_STB0899_Set22KHZContinues
--ACTION	::	Initialize DiseqC 
--PARAMS IN	::	Handle	==> Front End Handle
			ToneOn	==> 22 KHz on Off
--PARAMS OUT	::	RxFreq	==> None.
--RETURN	::	Error (if any)
--***************************************************/

FE_STB0899_Error_t
FE_STB0899_Set22KHZContinues(FE_STB0899_Handle_t Handle, BOOL ToneOn)
{
	u32 mclk, div;
	FE_STB0899_Error_t st_error = FE_NO_ERROR;
	FE_STB0899_InternalParams_t *pParams = NULL;

	pParams = (FE_STB0899_InternalParams_t *)Handle;
	if(pParams != NULL)
	{
	    switch(ToneOn)
	    {
		case SEC_TONE_ON:
		    mclk=FE_STB0899_GetMclkFreq(pParams->hDemod, pParams->Quartz);
		    div = (mclk / 100) / (2 * 32 * 22 * 4);
		    div = (div + 5) / 10;
		    /*Route DiseqC Tx pin to AuxClock0 */
		    ChipSetOneRegister(pParams->hDemod, RSTB0899_DISEQCOCFG, 0x66);
		    ChipSetField(pParams->hDemod, FSTB0899_ACRPRESC, 3);
		    ChipSetField(pParams->hDemod, FSTB0899_ACRDIV1, div);
		break;

		case SEC_TONE_OFF:
		    /*Set Diseqc pin to general diseq mod*/
		    ChipSetOneRegister(pParams->hDemod, RSTB0899_DISEQCOCFG, 0x20);
		break;
		}
	}
	else
		st_error = FE_INVALID_HANDLE;

	return st_error;
}

STCHIP_Error_t
STB0899_RepeaterFn(STCHIP_Handle_t hChip, BOOL State)
{
	STCHIP_Error_t ch_error = CHIPERR_NO_ERROR;
	
	if(hChip != NULL)
	{
		if(State == TRUE)
			ChipSetField(hChip, FSTB0899_I2CTON, 1);
	}
	
	return ch_error;
}

⌨️ 快捷键说明

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