📄 d0370vsb_drv.c
字号:
{
WAIT_N_MS(1);
FSM2Lock=(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_EQSTATE)==0x05);
Time++;
}while((FSM2Lock==0)&&(Time<pParams->TFSM2));
if (STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370_EQSTATE)==0x05) /* Read FSM2 LOCK indicator */
{
pParams->State = FSM2OK_370VSB;
}
else
{
pParams->State = NOFSM2_370VSB;
}
return pParams->State;
}
/*****************************************************
**FUNCTION :: FE_370_VSB_SetInternalError
**ACTION :: Set the internal error value and location
**PARAMS IN :: Type ==> Type of the error
** Location ==> Location of the error
**PARAMS OUT:: pError
**RETURN :: NONE
*****************************************************/
void FE_370_VSB_SetInternalError(FE_370_VSB_ErrorType_t Type,FE_370_VSB_Location_t Location,FE_370_VSB_InternalError_t *pError)
{
if(pError != NULL)
{
pError->Type = Type;
pError->Location = Location;
}
}
FE_370_VSB_Error_t STB0370_VSB_SetCarrier(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle,U32 IF,int clk,U32 IQMode)
{
FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
S32 IFfrequency;
if(IQMode == STTUNER_INVERSION)
{
IFfrequency=(S32)(IF*1000 - clk);
}
else
{
IFfrequency=(S32)(2*clk-IF*1000);
}
Set_NCOcnst_Regs(DeviceMap,IOHandle,(int)Calc_NCOcnst(IFfrequency,clk));
return error;
}
FE_370_VSB_Error_t STB0370_VSB_SetTiming(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle,int clk)
{
FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
Set_vcxoOffset_Regs(DeviceMap,IOHandle,(int)Calc_vcxoOffset(SYMBOLRATE,clk));
return error;
}
/*****************************************************
--FUNCTION :: FE_370_VSB_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_370_VSB_SIGNALTYPE_t FE_370_VSB_Algo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_370_VSB_InternalParams_t *pParams,STTUNER_Handle_t TopLevelHandle)
{
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
ST_ErrorCode_t Error = ST_NO_ERROR;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
/*pParams->Frequency = pParams->BaseFreq;*/ /*commented for repeated call*/
pParams->Ttiming = 100;
pParams->Tcarrier = 150;
pParams->Tdata = 200;
pParams->TFSM1 = 170;
pParams->TFSM2 = 300;
pParams->Frequency = pParams->BaseFreq;
pParams->TunerOffset = 0;
/* May be must called from Init routine */
STB0370_VSB_SetCarrier(DeviceMap, IOHandle,pParams->IF,pParams->Quartz,pParams->IQMode);
STB0370_VSB_SetTiming(DeviceMap, IOHandle,pParams->Quartz);
/**********************************************/
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle,(U32)pParams->Frequency,(U32 *)&pParams->Frequency); /* Move the tuner */
/* Temporisations */
FE_370VSB_WaitTuner(TunerInstance,100); /* Is tuner Locked ? (wait 100 ms maxi) */
if(1)
{
/* There is signal in the band */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_TIMING,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_CARRIER,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTAGC,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_PRST,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM1,1);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM2,1);
WAIT_N_MS(5);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_TIMING,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RST_CARRIER,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTAGC,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_PRST,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM1,0);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370_RSTFSM2,0);
if(CheckCarrier(DeviceMap,IOHandle,pParams) == CARRIEROK_370VSB)
{
pParams->FreqOffset=Get_FrequencyOffset(DeviceMap,IOHandle,pParams->Quartz);
if(CheckTiming(DeviceMap,IOHandle,pParams) == TIMINGOK_370VSB) /* Search for carrier */
{
if(CheckData(DeviceMap,IOHandle,pParams) == DATAOK_370VSB) /* Check for data */
{
if(CheckFSM1(DeviceMap,IOHandle,pParams) == FSM1OK_370VSB) /* Check for FSM1 Lock */
{
if(CheckFSM2(DeviceMap,IOHandle,pParams) == FSM2OK_370VSB) /* Check for FSM2 Lock */
{
pParams->Results.Frequency = pParams->Frequency+(pParams->FreqOffset/1000);
}
}
}
}
}
}
pParams->Results.SignalType = pParams->State;
return pParams->State;
}
/*****************************************************
--FUNCTION :: FE_370_VSB_Search
--ACTION :: Search for a valid transponder
--PARAMS IN :: Handle ==> Front End Handle
pSearch ==> Search parameters
pResult ==> Result of the search
--PARAMS OUT:: NONE
--RETURN :: Error (if any)
--***************************************************/
FE_370_VSB_Error_t FE_370_VSB_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
FE_370_VSB_SearchParams_t *pSearch,
FE_370_VSB_SearchResult_t *pResult,
STTUNER_Handle_t TopLevelHandle)
{
FE_370_VSB_Error_t error = FE_VSB_NO_ERROR;
FE_370_VSB_InternalParams_t pParams;
STTUNER_tuner_instance_t *TunerInstance;
STTUNER_InstanceDbase_t *Inst;
TUNER_Status_t TunerStatus;
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopLevelHandle].Terr.Tuner;
/*This is to be put in initparams*/pParams.Quartz = 27000000; /*For 27Mhz Quartz Frequency*/
FE_370_VSB_SetInternalError(FE_VSB_IERR_NO,FE_VSB_LOC_NOWHERE,&pParams.Error);
if(1)
{
if(1)
{
/* Fill pParams structure with search parameters */
pParams.BaseFreq = pSearch->Frequency;
pParams.SymbolRate = pSearch->SymbolRate;
pParams.SearchRange = pSearch->SearchRange;
pParams.DerotPercent = 30;
pParams.IQMode = pSearch->IQMode;
/* Run the search algorithm */
error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
pParams.IF = TunerStatus.IntermediateFrequency ;
if(FE_370_VSB_Algo(DeviceMap, IOHandle,&pParams,TopLevelHandle) == FSM2OK_370VSB)
{
pResult->Locked = TRUE;
/* update results */
pResult->Frequency = pParams.Results.Frequency;
pResult->SymbolRate = pParams.Results.SymbolRate;
}
else
{
pResult->Locked = FALSE;
switch(pParams.Error.Type)
{
case FE_VSB_IERR_I2C: /* I2C error */
error = FE_VSB_I2C_ERROR;
break;
case FE_VSB_IERR_NO:
default:
error = FE_VSB_SEARCH_FAILED;
break;
}
}
}
else
error = FE_VSB_BAD_PARAMETER;
}
return error;
}
void FE_370_VSB_Status(FE_370_VSB_Handle_t Handle,FE_370_VSB_SIGNALTYPE_t *SignalType)
{
if(Handle)
*SignalType = ((FE_370_VSB_InternalParams_t *)Handle)->Results.SignalType;
}
/*****************************************************
--FUNCTION :: FE_370_VSB_GetCarrierToNoiseRatio
--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
--***************************************************/
S32 FE_370_VSB_GetCarrierToNoiseRatio(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
S32 c_n = 0,
regval,
Imin,
Imax,
i;
if(FE_370_CN_LookUp.size)
{
regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_ERROR_POWER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_ERROR_POWER_LSB));
Imin = 0;
Imax = FE_370_CN_LookUp.size-1;
if(INRANGE(FE_370_CN_LookUp.table[Imin].regval,regval,FE_370_CN_LookUp.table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(FE_370_CN_LookUp.table[Imin].regval,regval,FE_370_CN_LookUp.table[i].regval))
Imax = i;
else
Imin = i;
}
c_n = ((regval - FE_370_CN_LookUp.table[Imin].regval)
* (FE_370_CN_LookUp.table[Imax].realval - FE_370_CN_LookUp.table[Imin].realval)
/ (FE_370_CN_LookUp.table[Imax].regval - FE_370_CN_LookUp.table[Imin].regval))
+ FE_370_CN_LookUp.table[Imin].realval;
}
else
c_n = 10;
}
return ( c_n);
}
/*****************************************************
--FUNCTION :: FE_370_VSB_GetBitErrorRate
--ACTION :: Return the bit error rate
--PARAMS IN :: NONE
--PARAMS OUT:: NONE
--RETURN :: 100000000 * ber
--***************************************************/
S32 FE_370_VSB_GetBitErrorRate(STTUNER_IOREG_DeviceMap_t *DeviceMap,IOARCH_Handle_t IOHandle)
{
S32 ber = 0,
regval,
divider,
Imin,
Imax,
i;
unsigned char low_precision=1;
if(FE_370_BER_LookUp.size)
{
regval = MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_LSB));
regval =regval*10000;
divider= MAKEWORD(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_PERIOD_MSB),STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370_SER_PERIOD_LSB));
if (regval < divider )/*If regval*10e4 < divider then div of regval by
divider will give 0. To avoid this multiply regval by 100 */
{
regval = regval *100;
low_precision=0;
}
else
{
low_precision =1;
}
if (divider!=0)
{
regval/=divider;
}
if (low_precision ==1 )/*Now multiply after division by 100 if it is not multiplied by 10e6 before*/
{
regval =regval *100;
}
Imin = 0;
Imax = FE_370_BER_LookUp.size-1;
if(INRANGE(FE_370_BER_LookUp.table[Imin].regval,regval,FE_370_BER_LookUp.table[Imax].regval))
{
while((Imax-Imin)>1)
{
i=(Imax+Imin)/2;
if(INRANGE(FE_370_BER_LookUp.table[Imin].regval,regval,FE_370_BER_LookUp.table[i].regval))
Imax = i;
else
Imin = i;
}
ber = ((regval - FE_370_BER_LookUp.table[Imin].regval)
* (FE_370_BER_LookUp.table[Imax].realval - FE_370_BER_LookUp.table[Imin].realval)
/ (FE_370_BER_LookUp.table[Imax].regval - FE_370_BER_LookUp.table[Imin].regval))
+ FE_370_BER_LookUp.table[Imin].realval;
}
else
ber = 684546;
}
return ber; /* returned value is 100000000 time the ber */
}
/*
--
--==============================================================================
--
-- END of the source code .
--
--==============================================================================
--
-- TTT H H EEE
-- T HHH EE
-- T H H EEE
--
--
-- EEEEEEEEEEEE NNNNNNNN NNNN DDDDDDDDDDDDDD
-- EEEEEEEEEEEE NNNNNNNN NNNN DDDDDDDDDDDDDDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEEEEEE NNNN NNNN NNNN DDDD DDDD
-- EEEEEEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNN NNNN DDDD DDDD
-- EEEE NNNN NNNNNNNN DDDD DDDD
-- EEEEEEEEEEEE NNNN NNNNNNN DDDDDDDDDDDDDDD
-- EEEEEEEEEEEE NNNN NNNNNN DDDDDDDDDDDDDD
--
--
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -