📄 stb0899_drv.c
字号:
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 + -