📄 drv0899.c
字号:
c_n = (int)(((unsigned long)(val2*100))/FE_899_PowOf2(24));
}
}
if(c_n>=100)
c_n = 100;
return c_n;
}
/*****************************************************
--FUNCTION :: FE_STB0899_GetError
--ACTION :: Return the BER
--PARAMS IN ::
--PARAMS OUT::
--RETURN :: In DVBS1 returns BER & In DVBS2 returns LDPC errors
--***************************************************/
U32 FE_STB0899_GetError(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
U32 ber = 0,i;
if((FECType == STTUNER_FEC_MODE_DVBS1) || (FECMode == STTUNER_FEC_MODE_DIRECTV))
{
/*Read registers*/
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,RSTB0899_ERRCTRL1,0x3D); /* force to viterbi bit error */
STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_VSTATUS);
/* Average 5 ber values */
for(i=0;i<5;i++)
{
WAIT_N_MS_899(100);
ber += FE_STB0899_GetErrorCount(DeviceMap,IOHandle,COUNTER1_899);
}
ber/=5;
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_PRFVIT,FSTB0899_PRFVIT_INFO)) /* Check for carrier */
{
/* Error Rate */
ber *= 9766;
ber /= (U32)(-1+FE_899_PowOf2(0 + 2*STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_NOE,FSTB0899_NOE_INFO))); /* theses two lines => ber = ber * 10^7 */
ber/=8;
}
}
else if(FECType == STTUNER_FEC_MODE_DVBS2)
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,RSTB0899_ERRCTRL1,0xB6); /* force to DVBS2 PER */
STTUNER_IOREG_GetRegister(DeviceMap,IOHandle,RSTB0899_VSTATUS);
/* Average 5 ber values */
for(i=0;i<5;i++)
{
WAIT_N_MS_899(100);
ber += FE_STB0899_GetErrorCount(DeviceMap,IOHandle,COUNTER1_899);
}
ber/=5;
ber*=10000000;
ber/=(U32)(-1+FE_899_PowOf2(4 + 2*STTUNER_IOREG_GetField_SizeU32(DeviceMap,IOHandle,FSTB0899_NOE,FSTB0899_NOE_INFO))); /* theses two lines => per = ber * 10^7 */
}
return ber;
}
/*Symbol Rate in Hz,Mclk in Hz */
void FE_STB0899_SetIterScal(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 MasterClock,U32 SymbolRate)
{
S32 iTerScal,
maxIter;
iTerScal = 17* (MasterClock/1000);
iTerScal +=410000;
iTerScal /= (SymbolRate/1000000);
iTerScal /=1000;
maxIter=LPDPC_MAX_ITER;
if(iTerScal>maxIter)
iTerScal=maxIter;
/*use set field mandatory*/
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ITERATION_SCALE,FSTB0899_ITERATION_SCALE_INFO,iTerScal);
}
/*****************************************************
--FUNCTION :: FE_STB0899_Search
--ACTION :: Run the search algo for DVBS1 & DVBS2 signal
--PARAMS IN :: FE_STB0899_SearchParams_t
--PARAMS OUT::
--RETURN :: Error
--***************************************************/
FE_STB0899_Error_t FE_STB0899_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
FE_STB0899_SearchParams_t *pSearch,
FE_STB0899_SearchResult_t *pResult,
STTUNER_Handle_t TopLevelHandle)
{
FE_STB0899_Error_t error = FE_899_NO_ERROR;
FE_STB0899_InternalParams_t *Params;
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
TUNSDRV_InstanceData_t *Instance;
TUNER_Status_t TunerStatus;
ST_ErrorCode_t Error;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
Instance = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle);
Instance->SymbolRate = (U32)pSearch->SymbolRate;
Params = memory_allocate_clear(DeviceMap->MemoryPartition, 1, sizeof( FE_STB0899_InternalParams_t));
Params->Quartz = 27000000; /* 27 MHz quartz */
Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
Params->TunerIQSense = TunerStatus.IQSense;
Params->DemodIQMode = pSearch->DemodIQMode;
Params->Standard = pSearch->Standard;
Params->FECMode = pSearch->FECMode;
/*Params->Pilots = pSearch->Pilots;*/
FE_STB0899_InitialCalculations(DeviceMap, IOHandle, Params);
if(Params != NULL)
{
if( (INRANGE(1000000,pSearch->SymbolRate,45000000)) &&
(INRANGE(1000000,pSearch->SearchRange,50000000))
)
{
FE_STB0899_SetStandard(DeviceMap, IOHandle, pSearch->Standard, pSearch->FECMode);
/*For Low Symbol Rate (<=5Mbs) set Mclk to 45MHz, else use 108MHz*/
if(pSearch->SymbolRate <= 5000000)
{
FE_STB0899_SetMclk(DeviceMap, IOHandle, 45000000,Params);
}
else
{
FE_STB0899_SetMclk(DeviceMap, IOHandle, 99000000,Params);
}
if((Params->FECMode == STTUNER_FEC_MODE_DIRECTV) || (Params->Standard == STTUNER_FEC_MODE_DVBS1))
{
/* Fill Params structure with search parameters */
Params->BaseFreq = pSearch->Frequency;
Params->SymbolRate = pSearch->SymbolRate;
Params->SearchRange = pSearch->SearchRange;
Params->DerotPercent = 1000;
Error = (TunerInstance->Driver->tuner_SetBandWidth)( TunerInstance->DrvHandle,
(13*((U32)( FE_899_CarrierWidth(Params->SymbolRate,Params->RollOff) + 10000000)/1000)/10),/* set bandwidth some more to optimize scanning->GNBvd26185*/
&(Params->TunerBW));
/* Run the search algorithm */
/*Set DVB-S1 AGC*/
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_AGCRFCFG, 0x11);
if((FE_STB0899_Algo(DeviceMap, IOHandle, Params, TopLevelHandle) == RANGEOK_899) && (DeviceMap->Error==ST_NO_ERROR))
{
pResult->Locked = TRUE;
/* update results */
pResult->Frequency = Params->Results.Frequency;
pResult->SymbolRate = Params->Results.SymbolRate;
pResult->Rate = Params->Results.PunctureRate;
}
else
{
pResult->Locked = FALSE;
error = FE_899_SEARCH_FAILED;
}
}
else if(Params->Standard == STTUNER_FEC_MODE_DVBS2)
{
/* Fill Params structure with search parameters */
Params->Frequency = pSearch->Frequency;
Params->BaseFreq = pSearch->Frequency;
Params->DVBS2SymbolRate = pSearch->SymbolRate;
Params->SpectralInv=pSearch->DemodIQMode;
Params->SearchRange = pSearch->SearchRange;
Error = (TunerInstance->Driver->tuner_SetBandWidth)( TunerInstance->DrvHandle,(U32)(((FE_DVBS2_CarrierWidth(Params->DVBS2SymbolRate,Params->RrcAlpha)) + 10000000)/1000), &(Params->TunerBW));
/*Set DVB-S2 AGC*/
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_AGCRFCFG, 0x1c);
/*Set IterScale =f(MCLK,SYMB,MODULATION*/
FE_STB0899_SetIterScal(DeviceMap, IOHandle, Params->MasterClock,Params->DVBS2SymbolRate);
/* Run the DVBS2 search algorithm */
if((FE_STB0899_DVBS2Algo(DeviceMap, IOHandle, Params, TopLevelHandle) == FE_DVBS2_DATAOK)&& (DeviceMap->Error==ST_NO_ERROR))
{
pResult->Locked = TRUE;
/* update results */
pResult->Frequency = Params->Results.Frequency;
pResult->SymbolRate = Params->Results.DVBS2SymbolRate;
pResult->ModCode = Params->Results.ModCode;
pResult->Pilots = Params->Results.Pilots;
pResult->FrameLength = Params->Results.FrameLength;
}
else
{
pResult->Locked = FALSE;
error = FE_899_SEARCH_FAILED;
}
}
}
else
error = FE_899_BAD_PARAMETER;
}
else
error=FE_899_BAD_PARAMETER;
TunerInstance->realfrequency = pResult->Frequency;
memory_deallocate(DeviceMap->MemoryPartition, Params);
return error;
}
/*****************************************************
--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(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,STTUNER_Handle_t TopLevelHandle, FE_STB0899_SignalInfo_t *pInfo, STTUNER_FECType_t FECType, STTUNER_FECMode_t FECMode)
{
FE_STB0899_Error_t error = FE_899_NO_ERROR;
STTUNER_tuner_instance_t *TunerInstance;
STTUNER_InstanceDbase_t *Inst;
U32 cfrm[2];
S32 derotFreq, offsetfreq;
U32 MasterClock, Mclk;
Inst = STTUNER_GetDrvInst();
TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
MasterClock = FE_STB0899_GetMclkFreq(DeviceMap, IOHandle,27000000);
Mclk = (U32)(MasterClock/65536L);
if((FECMode == STTUNER_FEC_MODE_DIRECTV) || (FECType== STTUNER_FEC_MODE_DVBS1))
{
pInfo->Locked = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO);
if(pInfo->Locked)
{
STTUNER_IOREG_GetContigousRegisters_SizeU32(DeviceMap, IOHandle,RSTB0899_CFRM,2,cfrm); /* read derotator value */
cfrm[0]&=0xff;
cfrm[1]&=0xff;
derotFreq = (S16) MAKEWORD(cfrm[0],cfrm[1]);
/* transponder_frequency = tuner + derotator_frequency */
pInfo->Frequency = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle)->Status.Frequency + ((derotFreq*((S16)Mclk))/1000);
pInfo->SymbolRate = FE_STB0899_GetSymbolRate(DeviceMap, IOHandle, MasterClock); /* Get symbol rate */
pInfo->SymbolRate += (pInfo->SymbolRate*STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO))>>19; /* Get timing loop offset */
pInfo->Rate = (FE_STB0899_Rate_t)STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_VIT_CURPUN,FSTB0899_VIT_CURPUN_INFO);
pInfo->Power = FE_STB0899_GetRFLevel(DeviceMap, IOHandle, FECType, FECMode);
pInfo->C_N = FE_STB0899_GetCarrierQuality(DeviceMap, IOHandle,FECType, FECMode);
pInfo->BER = FE_STB0899_GetError(DeviceMap, IOHandle, FECType, FECMode);
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SYMI,FSTB0899_SYMI_INFO)==0)
pInfo->SpectralInv = STTUNER_IQ_MODE_NORMAL;
else
pInfo->SpectralInv = STTUNER_IQ_MODE_INVERTED;
}
}
else
{
pInfo->Locked=(((STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCK, FSTB0899_LOCK_INFO))&&
(STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,RSTB0899_DMDSTAT2)==0x03))?1:0);
if(pInfo->Locked)
{
offsetfreq=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CRL_FREQUENCY, FSTB0899_CRL_FREQUENCY_INFO);
offsetfreq = (S32)(offsetfreq/(FE_899_PowOf2(30)/1000));
offsetfreq*=(MasterClock/1000000);
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_SPECTRUM_INVERT, FSTB0899_SPECTRUM_INVERT_INFO))
offsetfreq*=-1;
pInfo->Frequency=TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle)->Status.Frequency - offsetfreq;
pInfo->SymbolRate=FE_DVBS2_GetSymbolRate(DeviceMap, IOHandle, MasterClock);
pInfo->ModCode=(FE_DVBS2_ModCod_t)FE_DVBS2_GetModCod(DeviceMap, IOHandle);
pInfo->Pilots=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE,FSTB0899_UWP_DECODED_MODCODE_INFO)&0x01;
pInfo->FrameLength= (STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_UWP_DECODED_MODCODE,FSTB0899_UWP_DECODED_MODCODE_INFO)>>1)&0x01;
pInfo->C_N = FE_STB0899_GetCarrierQuality(DeviceMap, IOHandle,FECType, FECMode);
pInfo->Power = FE_STB0899_GetRFLevel(DeviceMap, IOHandle, FECType, FECMode);
pInfo->BER = FE_STB0899_GetError(DeviceMap, IOHandle,FECType, FECMode);
if(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_SPECTRUM_INVERT,FSTB0899_SPECTRUM_INVERT_INFO)==0)
pInfo->SpectralInv = STTUNER_IQ_MODE_NORMAL;
else
pInfo->SpectralInv = STTUNER_IQ_MODE_INVERTED;
}
}
return error;
}
/*****************************************************
--FUNCTION :: FE_STB0899_ToneDetection
--Description :: Returns the no. of tones detected and fill their freq in ToneLIst
--Return: No. of tones deteced.
--***************************************************/
U32 FE_STB0899_ToneDetection(STTUNER_IOREG_DeviceMap_t *DeviceMap,STTUNER_Handle_t TopLevelHandle,U32 StartFreq,U32 StopFreq,U32 *ToneList, U8 mode)
{
U32 step; /* Frequency step */
U32 BandWidth;
U8 nbTones=0;
STTUNER_InstanceDbase_t *Inst;
ST_ErrorCode_t Error = ST_NO_ERROR;
STTUNER_tuner_instance_t *TunerInstance;
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Sat.Tuner;
/* wide band acquisition */
step = 36000000; /* use 36MHz step */
if(TunerInstance->Driver->ID == STTUNER_TUNER_STB6100)
Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
else
Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
if(Error == ST_NO_ERROR)
{
nbTones = FE_STB0899_SpectrumAnalysis(TunerInstance, DeviceMap, Inst[TopLevelHandle].Sat.Demod.IOHandle, StartFreq, StopFreq, step, ToneList, mode); /* spectrum acquisition */
}
return nbTones;
}
/*****************************************************
--FUNCTION :: FE_STB0899_SpectrumAnalysis
--Description :: Read the tone spectrum in given band.
--Return: No. of tones deteced.
--***************************************************/
U32 FE_STB0899_SpectrumAnalysis(STTUNER_tuner_instance_t *TunerInstance, STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, U32 StartFreq,U32 StopFreq,U32 StepSize,U32 *ToneList, U8 mode)
{
U32 freq, realTunerFreq, freqstep = 2000000,
tempfreq,lastfreq,freqlowerthreshold, freqhigherthreshold,epsilon;
int agcVal[500],index=0, points = 0, pt_max,i=0, j = 1;
int direction = 1, agc_threshold, *spectrum_agc ,agc_threshold_adjust,agc_high,agc_low,agc_threshold_detect;
U32 *spectrum;
ST_ErrorCode_t Error = ST_NO_ERROR;
TUNSDRV_InstanceData_t *Instance;
points = (U16)((StopFreq - StartFreq)/StepSize + 1);
spectrum = memory_allocate_clear(DeviceMap->MemoryPartition, points, sizeof(U16));
spectrum_agc = memory_allocate_clear(DeviceMap->MemoryPartition, points, sizeof(int));
Instance = TUNSDRV_GetInstFromHandle(TunerInstance->DrvHandle);
if(Instance->TunerType == STTUNER_TUNER_STB6100)
STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FSTB6100_G,7, Instance->TunerRegVal); /* Gain = 0 */
Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap), Instance->IOHandle, 5,Instance->TunerRegVal, 1);
Error |= STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -