📄 drv0288.c
字号:
/*****************************************************
--FUNCTION :: FE_288_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_288_Error_t FE_288_Search(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
FE_288_SearchParams_t *pSearch,
FE_288_SearchResult_t *pResult,
STTUNER_Handle_t TopLevelHandle)
{
FE_288_Error_t error = FE_288_NO_ERROR;
FE_288_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_288_InternalParams_t));
Params->BaseFreq = pSearch->Frequency;
Params->Symbolrate = pSearch->Symbolrate;
Params->SearchRange = pSearch->SearchRange;
Params->DerotPercent = 1000;
Params->Quartz = pSearch->ExternalClock; /* 30 MHz quartz in 5188*/
Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
Params->TunerIQSense = /*TunerStatus.IQSense;*/-1;
Params->DemodIQMode = pSearch->DemodIQMode;
Params->MasterClock = FE_288_GetMclkFreq(DeviceMap, IOHandle, Params->Quartz);
Params->Tagc1 = 0;
Params->Tagc2 = 0;
Params->Mclk = (U32)(Params->MasterClock/65536L);
Params->RollOff = FE_288_GetRollOff(DeviceMap, IOHandle);
Params->MinOffset = -(S32)(pSearch->SearchRange/1000);
Params->MaxOffset = (S32)(pSearch->SearchRange/1000);
if(Params != NULL)
{
if( (pSearch != NULL) && (pResult != NULL) &&
(INRANGE_288(0,(S32)pSearch->Symbolrate,60000000)) &&
(INRANGE_288(500000,pSearch->SearchRange,50000000)) &&
(INRANGE_288(FE_288_MOD_BPSK,pSearch->Modulation,FE_288_MOD_QPSK))
)
{
Params->State = FE_288_Algo(DeviceMap, IOHandle, Params, TopLevelHandle );
/* check results */
if( (Params->State == RANGEOK_288) && (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_288_SEARCH_FAILED;
}
}
else
{
error = FE_288_BAD_PARAMETER;
}
}
else
error = FE_288_INVALID_HANDLE;
TunerInstance->realfrequency = pResult->Frequency;
memory_deallocate(DeviceMap->MemoryPartition, Params);
return error;
}
BOOL FE_288_Status(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
BOOL lock = FALSE;
lock=STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_LK);
return lock;
}
/*****************************************************
--FUNCTION :: FE_288_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_288_Error_t FE_288_GetSignalInfo(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_288_SignalInfo_t *pInfo)
{
U8 cfrm[2];
FE_288_Error_t error = FE_288_NO_ERROR;
pInfo->Locked = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_LK);
if(pInfo->Locked)
{
STTUNER_IOREG_GetContigousRegisters(DeviceMap,IOHandle,R288_CFRM,2,cfrm); /* read derotator value */
pInfo->derotFreq = (S16) MAKEWORD_288(cfrm[0],cfrm[1]);
pInfo->Rate = 1 << STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_PR);
pInfo->Power_dBm = FE_288_GetRFLevel(DeviceMap,IOHandle);/*+(pInfo->Frequency-945000)/12000;*/ /* correction applied according to RF frequency */
pInfo->CN_dBx10 = FE_288_GetCarrierToNoiseRatio(DeviceMap,IOHandle);
pInfo->BER = FE_288_GetError(DeviceMap,IOHandle);
pInfo->SpectralInv = STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_SYM);
}
return error;
}
FE_288_Error_t FE_288_SetTSClock_OutputRate(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,U32 SymbolRate, U32 MasterClock)
{
U32 bitrate;
U8 ENA8_Level;
FE_288_Error_t error = FE_288_NO_ERROR;
bitrate = SymbolRate*2;
switch(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_PR))
{
case 0: /* PR 1/2 */
bitrate *= 1;
bitrate /= 2;
break;
case 1: /* PR 2/3 */
bitrate *= 2;
bitrate /= 3;
break;
case 2: /* PR 3/4 */
bitrate *= 3;
bitrate /= 4;
break;
case 3: /* PR 5/6 */
bitrate *= 5;
bitrate /= 6;
break ;
case 4: /* PR 6/7 */
bitrate *= 6;
bitrate /= 7;
break;
case 5: /* PR 7/8 */
bitrate *= 7;
bitrate /= 8;
break;
default :
break;
}
if(!(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F288_OUTRS_PS)))
{
ENA8_Level = (MasterClock*8) / (bitrate*4);
if(ENA8_Level>=15)
ENA8_Level = 15;
STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_ENA8_LEVEL, ENA8_Level);
}
else
{
ENA8_Level = MasterClock / bitrate;
ENA8_Level -= 1;
if(ENA8_Level>=3)
ENA8_Level = 3;
ENA8_Level <<= 2;
ENA8_Level |= 0x01;
STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_ENA8_LEVEL, ENA8_Level);
}
return error;
}
#ifndef STTUNER_MINIDRIVER
#ifdef STTUNER_DRV_SAT_SCR
U32 Drv0288_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,int* power_detection_level)
{
U32 freq, realTunerFreq, freqstep = 2000000,
tempfreq,lastfreq,freqlowerthreshold, freqhigherthreshold,epsilon;
int i=0, j = 1,pt_max;
int agcVal[500],index=0,points;
int direction = 1, agc_threshold, *spectrum_agc ,agc_threshold_adjust,agc_high,agc_low,agc_threshold_detect;
U32 *spectrum;
U8 gain;
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_STB6000)
gain=0;
STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FSTB6000_G, 0,Instance->TunerRegVal); /* Gain = 0 */
else if(Instance->TunerType == STTUNER_TUNER_MAX2116)
STTUNER_IOREG_SetFieldVal(&(Instance->DeviceMap),FMAX2116_G,0x1F,Instance->TunerRegVal);
gain=0x1F;
Error = STTUNER_IOREG_SetContigousRegisters(&(Instance->DeviceMap), Instance->IOHandle, 0, gain,(Instance->DeviceMap).Registers);
Error |= STTUNER_IOREG_SetField(DeviceMap, IOHandle, F288_AGC1R_REF, 48); /* set AGC_Ref as 48*/
lastfreq = StartFreq - 100000000;
/*added by fsu*/
/*auto detection of max AGC*/
if(mode==1)
{
agc_high=-500;
agc_low=500;
for(freq=StartFreq;freq<StopFreq;freq+=3000000)
{
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, freq/1000, (U32 *)&realTunerFreq);
WAIT_N_MS_288(2);
agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
agcVal[index]=agc_threshold;
index++;
if(agc_threshold>agc_high) {
agc_high=agc_threshold;
}
if(agc_threshold<agc_low) {
agc_low=agc_threshold;
}
};
/*adjust agc_threshold*/
points=0;
agc_threshold_adjust=(agc_high+agc_low)/2;
pt_max=3*index/4;
epsilon=agc_high-agc_low;
while(epsilon>5) {
points=0;
/*get numbers of points for which treshold is lower than agc_threshold_adjust*/
for(i=0;i<index;i++) {
if(agcVal[i]<agc_threshold_adjust) {
points++;
}
}
if(points>pt_max) {
/*most of points are bellow agc_threshold_adjust level*/
agc_high=agc_threshold_adjust;
} else {
agc_low=agc_threshold_adjust;
}
agc_threshold_adjust=(agc_high+agc_low)/2;
epsilon=agc_high-agc_low;
}
agc_threshold_detect=agc_threshold_adjust;
*power_detection_level=agc_threshold_adjust;
} else {
agc_threshold_detect=*power_detection_level; /*quick setup*/
}
i=0;
points=0;
for(freq=StartFreq;freq<StopFreq;freq+=StepSize)
{
direction = 1;j = 1;
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, freq/1000, (U32 *)&realTunerFreq);
WAIT_N_MS_288(2);
agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
if(agc_threshold > agc_threshold_detect)/* - 70 */
{
if(((agc_threshold >= agc_threshold_detect) && (ABS_288((S32)(freq - lastfreq)))>40000000))
{
while(agc_threshold > agc_threshold_detect)/* -128*/
{
tempfreq = freq+(freqstep)*direction * j/* *2 */;
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, tempfreq/1000, (U32 *)&realTunerFreq);
WAIT_N_MS_288(2);
agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
++j;
}
freqhigherthreshold = tempfreq;
direction *= -1;
agc_threshold = 0; j = 1;
do
{
tempfreq = freq+(freqstep)*direction * j/* *2 */;
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, tempfreq/1000, (U32 *)&realTunerFreq);
WAIT_N_MS_288(2);
agc_threshold = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
++j;
}while( agc_threshold> agc_threshold_detect);
freqlowerthreshold = tempfreq;
spectrum[i] = freqlowerthreshold + (freqhigherthreshold - freqlowerthreshold)/2;
if(spectrum[i] >= StartFreq && spectrum[i] <= StopFreq)
{
lastfreq = spectrum[i];
Error = (TunerInstance->Driver->tuner_SetFrequency)(TunerInstance->DrvHandle, spectrum[i]/1000, (U32 *)&realTunerFreq);
WAIT_N_MS_288(2);
spectrum_agc[i] = (S8)STTUNER_IOREG_GetField(DeviceMap, IOHandle, F288_AGC1_VALUE);
++i;
}
}
}
}
if(mode==1) {
agc_threshold=agc_threshold_detect;
for(j = 0; j<i; ++j) {
ToneList[points] = spectrum[j];
points++;
if(points>=8)
break;
}
} else {
for(j = 0; j<i; ++j) {
ToneList[points] = spectrum[j];
points++;
if(points>=8)
break;
}
}
memory_deallocate(DeviceMap->MemoryPartition, spectrum);
memory_deallocate(DeviceMap->MemoryPartition, spectrum_agc);
/*memory_deallocate(DeviceMap->MemoryPartition, agcVal);*/
return points;
}
#endif
#endif
#ifndef STTUNER_MINIDRIVER
#ifdef STTUNER_DRV_SAT_SCR
U32 Drv0288_ToneDetection(STTUNER_IOREG_DeviceMap_t *DeviceMap,STTUNER_Handle_t TopLevelHandle,U32 StartFreq,U32 StopFreq,U32 *ToneList,U8 mode,int* power_detection_level)
{
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_STB6000)
{
step = 9000000;
Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 12000, &BandWidth); /* LPF cut off freq = 4+5+5MHz*/
}
else if(TunerInstance->Driver->ID == STTUNER_TUNER_MAX2116)
Error = (TunerInstance->Driver->tuner_SetBandWidth)(TunerInstance->DrvHandle, 36000, &BandWidth); /* LPF cut off freq = 18MHz*/
else if(TunerInstance->Driver->ID == STTUNER_TUNER_HZ1184)
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*/
nbTones = Drv0288_SpectrumAnalysis(TunerInstance, DeviceMap, Inst[TopLevelHandle].Sat.Demod.IOHandle, StartFreq, StopFreq, step, ToneList,mode,power_detection_level); /* spectrum acquisition */
return nbTones;
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -