📄 drv0299.c
字号:
Drv0299_CheckData(Params);
break;
case STTUNER_IQ_MODE_INVERTED:
Drv0299_IQSet(1); /* Set to Inverted */
Drv0299_CheckData(Params);
break;
case STTUNER_IQ_MODE_AUTO:
if (Drv0299_CheckData(Params) == E299_NODATA) /* Check for data */
{
Drv0299_IQInvertion(); /* Invert I and Q */
if(Drv0299_CheckData(Params) == E299_NODATA) /* Check for data */
{
Drv0299_IQInvertion(); /* Invert I and Q */
}
}
break;
default:
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
STTBX_Print(("%s Drv0299 SearchData inavlid IQ Mode\n"));
#endif
break;
}
return(Params->State);
}
D0299_SignalType_t Drv0299_SearchData(D0299_SearchParams_t *Params)
{
short int DerotFreq;
short int DerotStep;
short int DerotLimit;
short int NextLoop = 2;
int index = 0;
U8 nsbuffer[2];
long CurrentFreq;
U8 Data;
DerotStep = (short int)( (Params->SymbolRate/4L) / Params->Mclk); /* cast to eliminate compiler warning --SFS */
DerotLimit = (short int)( (Params->SubRange/2L) / Params->Mclk); /* cast to eliminate compiler warning --SFS */
DerotFreq = Params->DerotFreq;
CurrentFreq = Params->Frequency + ( ((long)(DerotFreq)) * Params->Mclk)/1000;
do
{
if((Params->State != E299_CARRIEROK)||(Drv0299_Searchlock(Params)!=E299_DATAOK))
{
index++;
DerotFreq = DerotFreq + ((int)Params->TunerIQSense * index * Params->Direction * DerotStep); /* Compute the next derotator position for the zig zag */
if(MAC0299_ABS(DerotFreq) > DerotLimit) NextLoop--;
if(NextLoop)
{
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R0299_CFD, F0299_CFD_ALGO, F0299_CFD_ALGO_L, &Data, 1, FALSE);
nsbuffer[1] = MAC0299_LSB(DerotFreq);
nsbuffer[0] = MAC0299_MSB(DerotFreq);
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R0299_CFRM, 0, 0, nsbuffer, 2, FALSE);
SystemWaitFor(5);
Drv0299_CheckCarrier(Params);
}
}
Params->Direction = -Params->Direction; /* Change the zigzag direction */
}
while((Params->State != E299_DATAOK) && NextLoop);
if(Params->State == E299_DATAOK)
{
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_READ, R0299_CFRM, 0, 0, nsbuffer, 2, FALSE);
/* Multiply DerotFreq with IQ wiring sense of tuner & Demod */
Params->DerotFreq = (short int)Params->TunerIQSense * (short int)MAC0299_MAKEWORD( nsbuffer[0],nsbuffer[1] );
}
return(Params->State);
}
D0299_SignalType_t Drv0299_CheckRange(D0299_SearchParams_t *Params)
{
int RangeOffset;
int TransponderFrequency;
RangeOffset = (int)(Params->SearchRange / 2000); /* cast to eliminate compiler warning --SFS */
TransponderFrequency = (int)(Params->Frequency + (Params->DerotFreq * Params->Mclk)/1000); /* cast to eliminate compiler warning --SFS */
if( (TransponderFrequency >= Params->Frequency - RangeOffset) &&
(TransponderFrequency <= Params->Frequency + RangeOffset) )
Params->State = E299_RANGEOK;
else
Params->State = E299_OUTOFRANGE;
return(Params->State);
}
#endif
#ifndef STTUNER_MINIDRIVER
/*----------------------------------------------------
FUNCTION CheckRange
ACTION Check if the founded frequency is in the correct range
PARAMS IN Params->BaseFreq =>
PARAMS OUT Params->State => Result of the check
RETURN E299_RANGEOK if check success, E299_OUTOFRANGE otherwise
------------------------------------------------------*/
D0299_SignalType_t Drv0299_CheckRange(D0299_SearchParams_t *Params, D0299_Searchresult_t *Result)
{
int RangeOffset;
int TransponderFrequency;
RangeOffset = (int)(Params->SearchRange / 2000); /* cast to eliminate compiler warning --SFS */
TransponderFrequency = (int)(Params->Frequency + (((long)(Params->DerotFreq)) * Params->Mclk)/1000); /* cast to eliminate compiler warning --SFS */
if( (TransponderFrequency >= Params->BaseFreq - RangeOffset) &&
(TransponderFrequency <= Params->BaseFreq + RangeOffset) )
Params->State = E299_RANGEOK;
else
Params->State = E299_OUTOFRANGE;
return(Params->State);
}
/*----------------------------------------------------
FUNCTION CarrierNotCentered
ACTION Check if the carrier is correctly centered
PARAMS IN
PARAMS OUT
RETURN 1 if not centered, 0 otherwise
------------------------------------------------------*/
int Drv0299_CarrierNotCentered(STTUNER_IOREG_DeviceMap_t *DeviceMap, D0299_SearchParams_t *Params, int AllowedOffset)
{
int Fs;
int DerotFreq;
int NotCentered = 0;
Fs = (int)(Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff)); /* cast to eliminate compiler warning --SFS */
DerotFreq = MAC0299_ABS( (int)Params->DerotFreq * (int)Params->Mclk ); /* cast with macro to eliminate compiler warning --SFS */
if( (Params->TunerIF == 0) && (Fs < 4000000) )
NotCentered = (int)( (Params->TunerBW - Fs) / 4); /* cast to eliminate compiler warning --SFS */
else
NotCentered = (( (int)Params->TunerBW/2 - DerotFreq - Fs/2) < AllowedOffset) &&
(DerotFreq > Params->TunerStep); /* cast to eliminate compiler warning --SFS */
return(NotCentered);
}
/*----------------------------------------------------
FUNCTION TunerCentering
ACTION Optimisation of the tuner position to allow frequency variations
PARAMS IN Params
PARAMS OUT Result
RETURN E299_DATAOK if success
------------------------------------------------------*/
D0299_SignalType_t Drv0299_TunerCentering(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0299_SearchParams_t *Params, D0299_Searchresult_t *Result, int AllowedOffset,STTUNER_Handle_t TopLevelHandle )
{
int DerotFreq, MinOffset/*, MaxOffset*/;
int CentringFrequency;
int TransponderFrequency;
int Fs, sign;
U8 Derottemp[2];
ST_ErrorCode_t Error;
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
/* 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;
Fs = (int)Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff); /* cast to eliminate compiler warning --SFS */
DerotFreq = MAC0299_ABS( (int)Params->DerotFreq * (int)Params->Mclk ); /* cast to eliminate compiler warning --SFS */
if((Params->TunerIF == 0) && (Params->SymbolRate <= 6000000))
MinOffset = CARRIEROFFSET;
else
MinOffset = 0;
/*MaxOffset = MAC0299_MAX( (int)(Params->TunerBW)/2 - Fs/2- AllowedOffset , MinOffset + (int)(Params->TunerStep) );*/ /* casts to eliminate compiler warning --SFS */
/* Do tuner retuning if derotator frequency offset is more than 1MHz */
if( ((DerotFreq >= 1000000) && (Params->SymbolRate > 6000000)) /*|| (Drv0299_CheckData(DeviceMap, IOHandle, Params) != E299_DATAOK)*/ )
{
sign = (Params->DerotFreq > 0) ? 1: -1;
TransponderFrequency = (int)(Params->Frequency + (Params->DerotFreq * Params->Mclk)/1000); /* cast to eliminate compiler warning --SFS */
CentringFrequency = TransponderFrequency + MinOffset;
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, CentringFrequency, (U32 *)&CentringFrequency);
Drv0299_WaitTuner(TunerInstance, 100); /* Is tuner Locked ? (wait 100 ms maxi) */
/* Reset Derotator */
Params->DerotFreq = (short int)Params->TunerIQSense * (short int)(((TransponderFrequency - CentringFrequency)*1000)/(int)Params->Mclk); /* casts to eliminate compiler warning --SFS */
Params->Frequency = CentringFrequency;
Params->Direction = 1;
Derottemp[0]= MAC0299_MSB(Params->DerotFreq);
Derottemp[1]= MAC0299_LSB(Params->DerotFreq);
STTUNER_IOREG_SetContigousRegisters(DeviceMap,IOHandle, R0299_CFRM,Derottemp, 2);
/* Wait for agc1,agc2 and timing loop */
SystemWaitFor(Params->Tagc1 + Params->Tagc2 + Params->Ttiming);
/* Search for carrier */
if ( Drv0299_SearchCarrier(DeviceMap, IOHandle, Params, Result, TopLevelHandle) == E299_CARRIEROK )
{
Drv0299_SearchData(DeviceMap, IOHandle, Params, Result, TopLevelHandle); /* Search for data */
}
}
return(Params->State);
}
/*----------------------------------------------------
FUNCTION FirstSubRange
ACTION Compute the first SubRange of the search
PARAMS IN Params->SearchRange
PARAMS OUT Params->SubRange
RETURN NONE
------------------------------------------------------*/
D0299_SignalType_t Drv0299_FirstSubRange(D0299_SearchParams_t *Params)
{
Params->SubRange = MAC0299_MIN(Params->SearchRange,9000000);/* fix to 9MHz to ensure signal not to get out from tuner BW*/
Params->Frequency = Params->BaseFreq;
Params->TunerOffset = 0L;
Params->SubDir = 1;
if( Params->TunerBW > Drv0299_CarrierWidth(Params->SymbolRate, Params->RollOff)/2 )/* to give support for 30Msym/sec symbol rate and solve bug GNBvd17144*/
Params->State = E299_BWOK;
else
Params->State = E299_BWTOONARROW;
return(Params->State);
}
#endif
/*----------------------------------------------------
FUNCTION NextSubRange
ACTION Compute the next SubRange of the search
PARAMS IN Frequency -> Start frequency
Params->SearchRange
PARAMS OUT Params->SubRange
RETURN NONE
------------------------------------------------------*/
void Drv0299_NextSubRange(D0299_SearchParams_t *Params)
{
long OldSubRange;
if(Params->SubDir > 0)
{
OldSubRange = Params->SubRange;
Params->SubRange = MAC0299_MIN( (Params->SearchRange/2) - (Params->TunerOffset + Params->SubRange/2) , Params->SubRange);
Params->TunerOffset = Params->TunerOffset + ( (OldSubRange + Params->SubRange)/2 );
}
Params->Frequency = Params->BaseFreq + (Params->SubDir * Params->TunerOffset)/1000;
Params->SubDir = -Params->SubDir;
}
#ifndef STTUNER_MINIDRIVER
/* This define is to remain commented out as it is used as an internal test */
/* #define STTUNER_TEST_SEARCH_MODULE_SATDRV_DRV0299 1 */
/*----------------------------------------------------
FUNCTION AutoSearchAlgo
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)
Note: Drv0299_CheckAgc( ) removed, no need because different tuners have different sensitivity
------------------------------------------------------*/
D0299_SignalType_t Drv0299_AutoSearchAlgo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0299_StateBlock_t *StateBlock, STTUNER_Handle_t TopLevelHandle)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
const char *identity = "STTUNER drv0299.c Drv0299_AutoSearchAlgo()";
#endif
int errorrate, sn, to, hy;
D0299_SearchParams_t *Params;
D0299_Searchresult_t *Result;
ST_ErrorCode_t Error;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_DRV0299
U32 Fold;
#endif
STTUNER_InstanceDbase_t *Inst;
STTUNER_tuner_instance_t *TunerInstance;
TUNSDRV_InstanceData_t *Instance;
long TransponderFreq;
U8 Derottemp[2];
U8 PRCopy , VsearchCopy;
/* 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);
Params = &StateBlock->Params;
Result = &StateBlock->Result;
Instance->SymbolRate = (U32)Params->SymbolRate;
Params->BaseFreq = Params->Frequency;
/*The following setting is dependent on Symbol Rate*/
/* Values are freezed after tests done in SKY Italia Lab */
if((Params->SymbolRate>=5000000) && (Params->SymbolRate<=45000000))
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0299_ACLC, 0x99);
STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_BETA_CAR, 0x17);
}
else if((Params->SymbolRate>=1000000) && (Params->SymbolRate<=5000000))
{
STTUNER_IOREG_SetRegister(DeviceMap,IOHandle,R0299_ACLC, 0x9B);
STTUNER_IOREG_SetField(DeviceMap, IOHandle, F0299_BETA_CAR, 0x13);
}
if(Params->SymbolRate < 2000000)
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0299_AGC1_REF, 0x10);
else
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0299_AGC1_REF, 0x14);
/*PRCopy = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_PR);*/
VsearchCopy = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_VSEARCH);
/* Get fields value */
sn = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_SN);
to = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_TO);
hy = STTUNER_IOREG_FieldExtractVal(VsearchCopy, F0299_H);
errorrate = STTUNER_IOREG_GetRegister(DeviceMap, IOHandle, R0299_PR);
Params->DerotStep = (short int)(Params->DerotPercent * (Params->SymbolRate/1000L) / Params->Mclk); /* sa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -