📄 driv0299.c
字号:
else
pParams->State = BWTOONARROW;
return pParams->State;
}
/****************************************************
--FUNCTION :: NextSubRange
--ACTION :: Compute the next SubRange of the search
--PARAMS IN :: Frequency -> Start frequency
-- pParams->SearchRange
--PARAMS OUT:: pParams->SubRange
--RETURN :: NONE
--***************************************************/
void NextSubRange(SEARCHPARAMS *pParams)
{
long OldSubRange;
if(pParams->SubDir > 0)
{
OldSubRange = pParams->SubRange;
pParams->SubRange = MIN((pParams->SearchRange/2) - (pParams->TunerOffset + pParams->SubRange/2),pParams->SubRange);
pParams->TunerOffset += (OldSubRange + pParams->SubRange)/2;
}
pParams->Frequency = pParams->BaseFreq + (pParams->SubDir * pParams->TunerOffset)/1000;
pParams->SubDir = -pParams->SubDir;
#if 1
do_report ( severity_info, "New => SubR[%d] SrchR[%d] TO[%d] Dir[%d] Freq[%d]\n",
pParams->SubRange,
pParams->SearchRange,
pParams->TunerOffset,
pParams->SubDir,
pParams->Frequency );
#endif
}
/*****************************************************
--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)
--***************************************************/
SIGNALTYPE AutoSearchAlgo(void)
{
int errorrate,sn,to,hy;
SEARCHPARAMS *pParams;
SEARCHRESULT *pResult;
pParams = &Params;
pResult = &Result;
pParams->Frequency = pParams->BaseFreq;
pParams->Direction = 1;
#if 0
/* VICKY - 290200 - modify the beta_car depending on the i/p symb rate */
{
int iValue2Write;
iValue2Write = RegGetField ( BETA_CAR );
if ( pParams -> SymbolRate > 15000000L )
{
iValue2Write = 0x15;
}
else
{
if ( pParams -> SymbolRate > 5000000L )
{
iValue2Write = 0x0F;
}
else
{
if ( pParams -> SymbolRate > 2000000L )
{
iValue2Write = 0x09;
}
else
{
iValue2Write = 0x06;
}
}
}
RegSetField ( BETA_CAR, iValue2Write );
}
#endif
/* Insert I2C access here */
RegTriggerOn(); /*______________________________________TRIGGER____________________________________________*/
RegSetSymbolRate ( pParams -> SymbolRate ); /* Set the symbol rate */
RegGetOneRegister(R_PR);
RegGetOneRegister(R_VSEARCH);
/* Get fields value */
sn=FieldGetVal(SN);
to=FieldGetVal(TO);
hy=FieldGetVal(H);
errorrate=FieldGetVal(RATE);
RegTriggerOff(); /*______________________________________TRIGGER____________________________________________*/
/* Initial calculations */
RegTriggerOn(); /*______________________________________TRIGGER____________________________________________*/
pParams->DerotStep = pParams->DerotPercent*(pParams->SymbolRate/1000L)/pParams->Mclk; /* saut de DerotStep/1000 * Fsymbol */
pParams->Ttiming = CalcTimingTimeConstant(pParams->SymbolRate);
pParams->Tderot = 2 + CalcDerotTimeConstant(pParams->SymbolRate);
pParams->Tdata = 2 + CalcDataTimeConstant(errorrate,sn,to,hy,pParams->SymbolRate);
RegTriggerOff(); /*______________________________________TRIGGER____________________________________________*/
REPORT_PRINT ( ( FE_MSG_CALC_AGC_TIMING,
pParams -> Tagc1,
pParams -> Tagc2,
pParams -> DerotStep ) );
REPORT_PRINT ( ( FE_MSG_CALC_SEARCH_TIMING,
pParams -> Ttiming,
pParams -> Tderot,
pParams -> Tdata ) );
if ( FirstSubRange(pParams) == BWOK )
{
do
{
REPORT_PRINT ( ( FE_MSG_SEARCH_PARAMS,
pParams -> SubRange,
pParams -> TunerOffset,
pParams -> SubDir ) );
/* Initialisations */
FieldSetVal(DEROTATORFREQUENCYMSB,0);
FieldSetVal(DEROTATORFREQUENCYLSB,0);
RegSetRegisters(R_CFRM,2); /* Reset of the derotator frequency */
RegSetField(RTF,0);
RegSetField(CFD_ALGO,1);
pParams->DerotFreq = 0;
pParams->State = NOAGC1;
RegTriggerOn(); /*______________________________________TRIGGER____________________________________________*/
pParams->Frequency = TunerSetFrequency(pParams->Frequency); /* Move the tuner */
RegTriggerOff(); /*______________________________________TRIGGER____________________________________________*/
/* Temporisations */
RegTriggerOn(); /*______________________________________TRIGGER____________________________________________*/
SystemWaitFor(pParams->Tagc1 + pParams->Tagc2 + pParams->Ttiming); /* Wait for agc1,agc2 and timing loop */
WaitTuner(100); /* Is tuner Locked ? (wait 100 ms maxi) */
#if (HOST > 1000)
ReportInsertMessage(SEARCHFREQUENCY,pParams->Frequency,0);
#endif
RegTriggerOff(); /*______________________________________TRIGGER____________________________________________*/
REPORT_PRINT ( ( FE_MSG_SEARCH_FREQUENCY, pParams -> Frequency, 0, 0 ) );
RegTriggerOn(); /*______________________________________TRIGGER____________________________________________*/
if(CheckAgc1(pParams)>AGC1SATURATION)
{
#if (HOST > 1000)
ReportInsertMessage(SEARCHAGC1,0,0);
#endif
REPORT_PRINT ( ( FE_MSG_SEARCH_AGC1, 0, 0, 0 ) );
/* There is signal in the band */
#if 0
if ( pParams -> SymbolRate <= ( pParams -> SubRange / 2L ) )
#else
if ( pParams -> SymbolRate <= ( pParams -> TunerBW / 2L ) )
#endif
{
SearchTiming(pParams,pResult); /* For low rates (SCPC) */
}
else
{
CheckTiming(pParams); /* For high rates (MCPC) */
}
if(pParams->State == TIMINGOK)
{
#if (HOST > 1000)
ReportInsertMessage(SEARCHTIMING,pParams->DerotFreq,pParams->Mclk);
#endif
REPORT_PRINT ( ( FE_MSG_CARRIER_SEARCH, pParams -> DerotFreq, pParams -> Mclk, 0 ) );
#ifdef ENABLE_CENTRE_TIMING
{
long lNewSymbolRate;
lNewSymbolRate = CenterTimingLoop ( pParams -> SymbolRate, pParams -> MasterClock );
#if 0
printf ( "\n\n\n\n****> Old(%d) New(%d)\n\n\n",
pParams -> SymbolRate,
lNewSymbolRate );
#endif
}
#endif
if(SearchCarrier(pParams,pResult) == CARRIEROK) /* Search for carrier */
{
#if (HOST > 1000)
ReportInsertMessage(SEARCHCARRIER,pParams->DerotFreq,pParams->Mclk);
#endif
if(SearchData(pParams,pResult) == DATAOK) /* Check for data */
{
if(pParams->ScanMode != DRV_SCAN)
TunerCentering(pParams,pResult,2000000);
if(CheckRange(pParams,pResult) == RANGEOK)
{
pResult->Frequency = pParams->Frequency + (pParams->DerotFreq*(pParams->Mclk)/1000);
pResult->PunctureRate = RegGetField(CPR);
#if (HOST > 1000)
ReportInsertMessage(SEARCHFOUND,pResult->Frequency,0);
ReportInsertMessage(SEARCH_SR_PR,pResult->SymbolRate,pResult->PunctureRate);
#endif
REPORT_PRINT ( ( FE_MSG_DATA_LOCKED, pResult -> Frequency, 0, 0 ) );
REPORT_PRINT ( ( FE_MSG_SYMBOL_PR, pResult -> SymbolRate, pResult -> PunctureRate, 0 ) );
}
}
}
}
}
if(pParams->State != RANGEOK)
{
NextSubRange(pParams);
}
RegTriggerOff(); /*______________________________________TRIGGER____________________________________________*/
}
#ifdef SYNCHRONISE_WITH_TUNER_TASK_STATE
while(pParams->SubRange && pParams->State!=RANGEOK && iCurTunerTaskState == iSavedTunerTaskState );
#else
while(pParams->SubRange && pParams->State!=RANGEOK );
#endif
}
else
{
#if (HOST > 1000)
ReportInsertMessage(SEARCHBW,0,0);
#endif
}
pResult->SignalType = pParams->State;
return pParams->State;
}
/****************************************************
--FUNCTION :: FillWidthArray
--ACTION :: Create a list of carrier's width
--PARAMS IN :: pSymbolRate -> List of carrier's symbol rate (Kbauds or Mbauds)
-- RollOff -> Rolloff * 100
--PARAMS OUT:: NONE
--RETURN :: List of carrier's width (KHz or MHz)
--**************************************************/
long *FillWidthArray(long *pSymbolRate, long RollOff,long *Min)
{
long *pWidth;
int Width=0;
int i;
while(pSymbolRate[Width]) Width++;
pWidth =(long *) calloc (Width,sizeof(long));
for(i=0;i<Width;i++)
{
pWidth[i]=CarrierWidth(pSymbolRate[i],RollOff);
if(i==0 || pWidth[i]<*Min)
*Min = pWidth[i];
}
return pWidth;
}
/*****************************************************
--FUNCTION :: DeleteWidthArray
--ACTION :: Destroy a list of carrier's width
--PARAMS IN :: pWidth -> List of carrier's width
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
void DeleteWidthArray(long *pWidth)
{
if(pWidth) free(pWidth);
}
/*****************************************************
--FUNCTION :: EndOfScan
--ACTION :: Check the end of the scan
--PARAMS IN :: Direction -> Direction of the scan
-- Frequency -> Current frequency
-- EndFrequency -> Frequency to be reached
--PARAMS OUT:: NONE
--RETURN :: TRUE if the end is reached, FALSE otherwise
--***************************************************/
int EndOfScan(SCANDIR Direction, long Frequency, long EndFrequency)
{
if(Direction == SCANUP)
return Frequency >= EndFrequency;
else
return Frequency <= EndFrequency;
}
/*****************************************************
--FUNCTION :: SetPolarization
--ACTION :: set the polarization
--PARAMS IN :: Polarization -> Polarization
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
void SetPolarization(POLARIZATION Polarization)
{
U8 DataBuf[2];
U32 ActLen;
extern STI2C_Handle_t I2CDemodHandle;
/* LP - 28/08/00 - Standard settings restored:
Polarization vert == 13V (LOW) => OP2=0
Polarization horiz == 18V (HIGH) => OP2=1
Lock configuration == Push-Pull
Remark: In MiCo software or EVAL0299MAX the reverse convention has been adopted!
*/
if(Polarization == VERTICAL)
{ /* RegSetField(LOCKOUTPUT,0x40);*/
RegSetOneRegister(R_DISEQC, 0x0);
/* DataBuf[0] = (char) R_DISEQC;
DataBuf[1] = 0 ;
STI2C_Write(I2CDemodHandle, DataBuf, sizeof(DataBuf), 100, &ActLen );*/
}
else
{
/*DataBuf[0]= (char)R_DISEQC;
DataBuf[1]= 0x40;
STI2C_Write(I2CDemodHandle, DataBuf, sizeof(DataBuf), 100, &ActLen );
RegSetField(LOCKOUTPUT,0);*/
RegSetOneRegister(R_DISEQC,0x40);
}
}
/*****************************************************
--FUNCTION :: GetPolarization
--ACTION :: Get the polarization
--PARAMS IN :: Polarization -> Polarization
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
POLARIZATION GetPolarization(void)
{
if(RegGetField(LOCKOUTPUT))
return HORIZONTAL;
else
return VERTICAL;
}
/*****************************************************
--FUNCTION :: NextPolarization
--ACTION :: Compute the next polarization
--PARAMS IN :: Polarization -> Current polarization
-- Mode -> Polarization mode
--PARAMS OUT:: NONE
--RETURN :: Next polarization
--***************************************************/
int NextPolarization(POLARIZATION Polarization,POLARIZATION Mode)
{
switch(Polarization)
{
case HORIZONTAL:
if(Mode == H_V)
Polarization = VERTICAL;
else
Polarization = NOPOLARIZATION;
break;
case VERTICAL:
if(Mode == V_H)
Polarization = HORIZONTAL;
else
Polarization = NOPOLARIZATION;
break;
default:
Polarization = NOPOLARIZATION;
break;
}
if(Polarization != NOPOLARIZATION)
SetPolarization(Polarization);
return Polarization;
}
/*****************************************************
--FUNCTION :: FirstPolarization
--ACTION :: Compute the first polarization
--PARAMS IN :: Mode -> Polarization mode
--PARAMS OUT:: NONE
--RETURN :: First polarization
--***************************************************/
int FirstPolarization(POLARIZATION Mode)
{
int Polarization = NOPOLARIZATION;
switch(Mode)
{
case HORIZONTAL:
case H_V:
Polarization = HORIZONTAL;
break;
case VERTICAL:
case V_H:
Polarization = VERTICAL;
break;
}
/* Insert here your code to change the polarization */
SetPolarization(Polarization);
return Polarization;
}
/*****************************************************
--FUNCTION :: SetLnb
--ACTION :: set the Lnb
--PARAMS IN :: Lnb -> true for LnbHigh, false for LnbLow
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
void SetLnb(int Lnb)
{
RegSetField(OP0VALUE,Lnb);
}
/*****************************************************
--FUNCTION :: SelectLnb
--ACTION :: Select the local oscillator corresponding to the current frequency
--PARAMS IN :: CurrentLnb -> Current value of the Lnb offset
-- ScanLnb -> List of Lnb followed by the switch value
-- CurrentFrequency -> Frequency to be scanned
--PARAMS OUT:: CurrentLnb -> New value of the Lnb offset
--RETURN :: NONE
--***************************************************/
void SelectLnb(long *CurrentLnb,long *ScanLnb,long CurrentFrequency)
{
if((CurrentFrequency > ScanLnb[2]) && (*CurrentLnb!=ScanLnb[1]))
{
*CurrentLnb = ScanLnb[1];
SetLnb(1);
}
if((CurrentFrequency < ScanLnb[2]) && (*CurrentLnb!=ScanLnb[0]))
{
*CurrentLnb = ScanLnb[0];
SetLnb(0);
}
}
/*****************************************************
--FUNCTION :: AutoFrequencyScan
--ACTION :: Search all the carriers with the selected symbol rates and polarization
-- in the bandwidth [StartScanFrequency,EndScanFrequency]
-- (symbol rates must be in increase order)
--PARAMS IN :: StartScanFrequency -> start frequency
-- EndScanFrequency -> end frequency
-- ScanLnb -> LowLnb, HighLnb and switch value
-- pSymbolRate -> List of symbol rates (Kbauds)
-- DerotStep -> Step of the derotator during the carrier search
-- PolarizationMode -> polarization test order
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -