📄 drv0370qam.c
字号:
if (CurrentMean < OldMean)
{
Result -= (100*(CurrentMean - ComputedMean))/(CurrentMean - OldMean);
}
*Mean_p = Instance->Driv0370QAMCNEstimation;
*CN_Ratio_p = Result;
*CN_dB100_p = Result;
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("%s Mean %d CNdBx100 %d CNRatio %d\n", identity, *Mean_p, *CN_dB100_p, *CN_Ratio_p));
#endif
}
/*----------------------------------------------------
FUNCTION Drv0370QAMApplicationSaturationComputation
ACTION
PARAMS IN NONE
PARAMS OUT NONE
RETURN NONE
------------------------------------------------------*/
void Drv0370QAMApplicationSaturationComputation(int * _pSaturation)
{
int int_tmp ;
/*
In order to get a smooth saturation value, this is filtered
with a low-pass filter : sat(n) = 0.25*sat(n-1) + 0.75*acc(n)
pSaturation[0] = accumulator value
pSaturation[1] = low-pass filter memory
*/
if (_pSaturation[0] != 0)
{
int_tmp = 100*_pSaturation[0];
int_tmp /= 65536;
if(_pSaturation[1] > int_tmp)
{
int_tmp = 10*int_tmp/100;
int_tmp += 90*_pSaturation[1]/100;
}
else
{
int_tmp = 75*int_tmp/100;
int_tmp += 25*_pSaturation[1]/100;
}
if(int_tmp > 100) int_tmp = 100;
_pSaturation[1] = int_tmp ;
}
return ;
}
/*----------------------------------------------------
FUNCTION Driv0370QAMBertCount
ACTION
PARAMS IN NONE
PARAMS OUT NONE
RETURN NONE
------------------------------------------------------*/
void Driv0370QAMBertCount(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
D0370QAM_StateBlock_t *StateBlock_p, STTUNER_tuner_instance_t *TunerInstance_p,
int *_pBER_Cnt, int *_pBER)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
const char *identity = "STTUNER drv0370qam.c Driv0370QAMBertCount()";
#endif
int err_hi1, err_lo1,err_hi0,err_lo0;
int int_tmp;
U32 BER;
int double_tmp ;
int NumberBitsPerFrame;
/*
--- Set parameters
*/
_pBER[0] = 0;
/*
--- Compute ...
---
--- BER = 10E6 * (Counter)/(2^(2*NBYTE + 12))
--- = 244,14 * (Counter)/(2^(2*NBYTE)) (Unit 10E-6)
*/
/* rate mode */
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("===> Count is finished\n"));
#endif
/* the previous count is finished */
/* Get BER from demod */
err_hi0 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_LSB);
err_lo0 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_MSB);
err_hi1 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_LSB);
err_lo1 = STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0370QAM_RS_RATE_MSB);
if(err_hi0 == err_hi1)
{
*_pBER_Cnt = err_lo0 + (err_hi0 <<8);
}
else
{
*_pBER_Cnt = err_lo1 + (err_hi1 <<8);
}
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("===> _pBER_Cnt = %d\n", *_pBER_Cnt));
#endif
BER = *_pBER_Cnt;
double_tmp = (int)*_pBER_Cnt;
int_tmp = STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370QAM_RS_RATE_ADJ);
NumberBitsPerFrame = 78888;
if (STTUNER_IOREG_GetField(DeviceMap, IOHandle,F0370QAM_F_64_256) == 1)
{
NumberBitsPerFrame = 53802;
}
double_tmp /= (4*NumberBitsPerFrame);
double_tmp *= 7;
double_tmp /= (int)(POW_370QAM(4,int_tmp));
_pBER[0] = *_pBER_Cnt;
Drv0370QAMApplicationSaturationComputation(_pBER);
/*
--- Get Blk parameters
*/
StateBlock_p->BlkCounter = Reg0370QAM_GetBlkCounter(DeviceMap, IOHandle);
StateBlock_p->CorrBlk = Reg0370QAM_GetCorrBlk(DeviceMap, IOHandle);
StateBlock_p->UncorrBlk = Reg0370QAM_GetUncorrBlk(DeviceMap, IOHandle);
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("%s BER_Cnt %9d BER Cnt %9d Sat %3d Rate %9d (10E-6)\n", identity,
*_pBER_Cnt,
_pBER[0],
_pBER[1],
_pBER[2]
));
STTBX_Print(("%s BlkCounter %9d CorrBlk %9d UncorrBlk %9d\n", identity,
StateBlock_p->BlkCounter,
StateBlock_p->CorrBlk,
StateBlock_p->UncorrBlk
));
#endif
}
/*----------------------------------------------------
FUNCTION Driv0370QAMFECLockCheck
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
FLAG_370QAM Driv0370QAMFECLockCheck (STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,FE_370QAM_InternalParams_t *pParams, FLAG_370QAM EndOfSearch, int TimeOut, int DataSearchTime)
{
int QAMSize, MPEGLockCount;
int noCodeWordsInAframe = 60, Log2QAMSize;
int FrameSyncTimeOut, ViterbiTimeOut, MPEGTimeOut;
long SymbolRate;
FLAG_370QAM DataFound = NO;
QAMSize = pParams->Modulation ;
SymbolRate = pParams->SymbolRate ; /* in Baud/s */
switch (QAMSize)
{
case 16:
Log2QAMSize = 4;
break;
case 32 :
Log2QAMSize = 5;
break ;
case 64 :
Log2QAMSize = 6;
noCodeWordsInAframe = 60;
break;
case 128 :
Log2QAMSize = 7;
break ;
case 256 :
Log2QAMSize = 8;
noCodeWordsInAframe = 88;
break;
}
ViterbiTimeOut = 20;
MPEGTimeOut = 200;
/* frameSyncTimeOut (in mSec) : it is the time necessary for an MPEG frame lock in the worst case. */
FrameSyncTimeOut =((int) (noCodeWordsInAframe*128*7)/(int)(Log2QAMSize*(SymbolRate/1000))); /* in ms */
/* length of a code word is 128 words; each word is of 7 bits
Waiting for MPEG sync Lock or a time-out; A few successful
tracking indicators are required in succession to decide MPEG Sync */
EndOfSearch = NO;
MPEGTimeOut = MPEGTimeOut + ViterbiTimeOut + FrameSyncTimeOut;
TimeOut = DataSearchTime + MPEGTimeOut;
MPEGLockCount = 0;
while (EndOfSearch == NO)
{
WAIT_N_MS_370QAM(5);
DataSearchTime += 5;
if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_MPEG_SYNC) == 1) MPEGLockCount++;
else MPEGLockCount = 0;
if((MPEGLockCount == 1)||(DataSearchTime > TimeOut))
EndOfSearch = YES;
}
if(MPEGLockCount == 1)
DataFound = YES;
else
{
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_INV_SPEC_MAPPING,!STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_INV_SPEC_MAPPING)); /*Check this syntax???? */
WAIT_N_MS_370QAM(20);
DataSearchTime += 20 ;
if(STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_MPEG_SYNC) == 1)
DataFound = YES;
}
if(STTUNER_IOREG_GetRegister(DeviceMap, IOHandle,R0370QAM_SYNC_STAT) != 0x1e)
{
DataFound = NO;
if (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_COMB_STATE) != 2)
{
DataFound = NO;
if( (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_VIT_I_SYNC) == 0) || (STTUNER_IOREG_GetField(DeviceMap,IOHandle,F0370QAM_VIT_Q_SYNC) == 0))
{
DataFound = NO;
}
}
return (DataFound);
}
DataFound = YES;
return DataFound;
}
/*----------------------------------------------------
FUNCTION Driv0370QAMFecInit
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
ST_ErrorCode_t Driv0370QAMFecInit (STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle) /*FECType is the value of FEC_AC_OR_B*/
{
ST_ErrorCode_t Error = ST_NO_ERROR;
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FEC_NRESET,0) ; /* FEC B reset */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_FEC_NRESET,1) ; /* FEC B reset cleared */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_NRST,0) ; /* FEC B viterbi reset */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_RS_EN,0) ; /* FEC B RS correction disabled */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_NRST,1) ; /* FEC B viterbi reset cleared */
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_RS_EN,1) ; /* FEC B RS correction enabled */
return Error;
}
/*----------------------------------------------------
FUNCTION LoadRegisters
ACTION
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
ST_ErrorCode_t LoadRegisters(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,int QAMSize,int TunerType)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
const char *identity = "STTUNER drv0370qam.c LoadRegisters()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
switch (QAMSize)
{
case 64:
switch(TunerType)
{
case STTUNER_TUNER_TD1336:
/*QAMDefaultValue = STB0370_DefVal_64QAM_TD1336 ;*/
/*Set the corresponding registers which are required to reprogram for
lock for 64 QAM from the default value of 256 QAM*/
STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x04);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x80);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,1);
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("%s Default Value of Tuner TD1336, QAM-64 used\n", identity));
#endif
break;
case STTUNER_TUNER_DCT7050:
case STTUNER_TUNER_DTT7600:
/* QAMDefaultValue =STB0370_DefVal_64QAM_DCT7050;*/
/*Set the corresponding registers which are required to reprogram for
lock for 64 QAM from the default value of 256 QAM*/
STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x04);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x80);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,1);
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
STTBX_Print(("%s Default Value of Tuner DCT7050, QAM-64 used\n", identity));
#endif
break;
default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
STTBX_Print(("%s WARNING - Any Supported Tuner is not specified\n", identity));
#endif
break;
}
break;
case 256:
switch(TunerType)
{
case STTUNER_TUNER_TD1336:
/*QAMDefaultValue = STB0370_DefVal_256QAM_TD1336 ;*/
/*Set the corresponding registers which are required to reprogram to
lock for 256 QAM from the default value of 256 QAM and after
applying modifications for 64 QAM*/
STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x03);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x81);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,0);
break;
case STTUNER_TUNER_DCT7050:
case STTUNER_TUNER_DTT7600:
/*QAMDefaultValue =STB0370_DefVal_256QAM_DCT7050;*/
/*Set the corresponding registers which are required to reprogram to
lock for 256 QAM from the default value of 256 QAM and after
applying modifications for 64 QAM*/
STTUNER_IOREG_SetField(DeviceMap, IOHandle,F0370QAM_MODE_SEL,0x03);
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle,R0370QAM_FREQ_6,0x81);
STTUNER_IOREG_SetField(DeviceMap,IOHandle,F0370QAM_F_64_256,0);
break;
default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
STTBX_Print(("%s WARNING - Any Supported Tuner is not specified\n", identity));
#endif
break;
}
break;
default:
#ifdef STTUNER_DEBUG_MODULE_SHARED_TUNSHDRV
STTBX_Print(("%s WARNING - Any Supported QAM(64/256) is not specified\n", identity));
#endif
break;
}
return Error;
}
/*----------------------------------------------------
FUNCTION Driv0370QAMDataSearch
ACTION
This routine performs a carrier lock trial with a given offset and sweep rate.
The returned value is a flag (TRUE, FALSE) which indicates if the trial is
successful or not. In case of lock, _pSignal->Frequency and _pSignal->SymbolRate
are modifyed accordingly with the found carrier parameters.
PARAMS IN
PARAMS OUT
RETURN
------------------------------------------------------*/
BOOL Driv0370QAMDataSearch(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle,
FE_370QAM_InternalParams_t *pParams, STTUNER_tuner_instance_t *TunerInstance_p)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0370QAM
const char *identity = "STTUNER drv0370QAM.c Driv0370QAMDataSearch()";
clock_t time_spend_register;
clock_t time_start_lock, time_end_lock;
#endif
int TimeOut, LMS2TimeOut, AcqLoopsTime, DataSearchTime;
int NbSymbols, Log2QAMSize, LMS2TrackingLock;
int QAMSize, SweepRate, CarrierOffset;
long SymbolRate;
long Frequency;
FLAG_370QAM SpectrumInversion;
int AGC2SD, int_tmp, WBAGCLock, AGCLoop, ACQThreshold;
int Freq19, Freq23, Freq24;
FLAG_370QAM EndOfSearch, DataFound;
int multiply_factor_times_quartz;
int Clk50_QAM;
/**/
/******************************/
/* Variables Initialization */
/******************************/
DataFound = NO;
EndOfSearch = NO;
DataSearchTime = 0;
Frequency = pParams->Frequency;
QAMSize = pParams->Modulation;
SymbolRate = pParams->SymbolRate; /* in Baud/s */
SweepRate = pParams->SweepRate; /* in 1/ms */
CarrierOffset = pParams->CarrierOffset;
SpectrumInversion = pParams->SpecInv;
/**/
/******************************/
/* Timouts Computation */
/******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -