📄 d0288.c
字号:
/* private driver instance data */
Instance = D0288_GetInstFromHandle(Handle);
/*
** uData1 - FEC Mode Register
** 0 - DVB QPSK, 1 - DVB BPSK, 4 = DSS
*/
uData1 = STTUNER_IOREG_GetField(&Instance->DeviceMap, Instance->IOHandle,F288_FECMODE);
/*
** For each STTUNER FEC rates (see sttuner.h)
** Set specific bit of enable puncture rate register
** Bit 0 - 1/2, 1 - 2/3, 2 - 3/4, 3 - 5/6, 4 - 7/8(DVB) or 6/7(DSS)
*/
if (FECRates & STTUNER_FEC_1_2) Data |= 1;
if (FECRates & STTUNER_FEC_2_3) Data |= 2;
if (FECRates & STTUNER_FEC_3_4) Data |= 4;
if (FECRates & STTUNER_FEC_5_6) Data |= 8;
if (FECRates & STTUNER_FEC_6_7) Data |= 16;
if (FECRates & STTUNER_FEC_7_8) Data |= 32;
Error = STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, R288_PR, Data);
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
STTBX_Print(("%s Field F0288_RATE = 0x%02x\n", identity, Data));
#endif
Error |= Instance->DeviceMap.Error;
Instance->DeviceMap.Error = ST_NO_ERROR;
return(Error);
}
/* ----------------------------------------------------------------------------
Name: demod_d0288_Tracking()
Description:
This routine checks the carrier against a certain threshold value and will
perform derotator centering, if necessary -- using the ForceTracking
option ensures that derotator centering is always performed when
this routine is called.
This routine should be periodically called once a lock has been
established in order to maintain the lock.
Parameters:
ForceTracking, boolean to control whether to always perform
derotator centering, regardless of the carrier.
NewFrequency, pointer to area where to store the new frequency
value -- it may be changed when trying to optimize
the derotator.
SignalFound, indicates that whether or not we're still locked
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_Tracking(DEMOD_Handle_t Handle, BOOL ForceTracking, U32 *NewFrequency, BOOL *SignalFound)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
const char *identity = "STTUNER d0288.c demod_d0288_Tracking()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
STTUNER_tuner_instance_t *TunerInstance; /* don't really need all these variables, done for clarity */
STTUNER_InstanceDbase_t *Inst; /* pointer to instance database */
STTUNER_Handle_t TopHandle; /* instance that contains the demos, tuner and lnb driver set */
D0288_InstanceData_t *Instance;
TUNER_Status_t TunerStatus;
U32 MasterClock, Mclk;
FE_288_SignalInfo_t pInfo;
/* private driver instance data */
Instance = D0288_GetInstFromHandle(Handle);
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* this driver knows what to level instance it belongs to */
TopHandle = Instance->TopLevelHandle;
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[TopHandle].Sat.Tuner;
/*Drv0288_CarrierTracking(&Instance->DeviceMap, Instance->IOHandle, &Instance->StateBlock, TopHandle);*/
Error = demod_d0288_IsLocked(Handle, SignalFound);
/**NewFrequency = (U32)Instance->StateBlock.Result.Frequency;*/
if((Error == ST_NO_ERROR) && (*SignalFound == TRUE))
{
Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
MasterClock = FE_288_GetMclkFreq(&Instance->DeviceMap, Instance->IOHandle,Instance->ExternalClock);
Mclk = (U32)(MasterClock/65536L);
Inst[TopHandle].CurrentTunerInfo.ScanInfo.SymbolRate = FE_288_GetSymbolRate(&Instance->DeviceMap, Instance->IOHandle, MasterClock);
FE_288_GetSignalInfo(&Instance->DeviceMap, Instance->IOHandle, &pInfo);
*NewFrequency = TunerInstance->realfrequency;
Inst[TopHandle].CurrentTunerInfo.BitErrorRate = pInfo.BER;
Inst[TopHandle].CurrentTunerInfo.SignalQuality = pInfo.CN_dBx10;
Inst[TopHandle].CurrentTunerInfo.ScanInfo.AGC = pInfo.Power_dBm;
Inst[TopHandle].CurrentTunerInfo.ScanInfo.FECRates = pInfo.Rate;
Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.IQMode=pInfo.SpectralInv;
Inst[TopHandle].CurrentTunerInfo.ScanInfo.Modulation = STTUNER_MOD_QPSK;
if(Instance->SET_TSCLOCK == TRUE)
{
Instance->SET_TSCLOCK = FALSE;
}
}
#ifdef STTUNER_DRV_SAT_SCR
if((Inst[Instance->TopLevelHandle].Capability.SCREnable) && (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
{
*NewFrequency = Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRVCOFrequency - TunerInstance->realfrequency;
}
#endif
if(Inst[TopHandle].Sat.Ioctl.SignalNoise == TRUE)
#ifndef ST_OSLINUX
{
{
static BOOL SRand = TRUE;
U32 r;
if (SRand)
{
srand((unsigned int)time_now());
SRand = FALSE;
}
/* Calculate percentage fluctuation from current position */
r = rand() % 100; /* Percent change */
Inst[TopHandle].CurrentTunerInfo.SignalQuality -= (
(((Inst[TopHandle].CurrentTunerInfo.SignalQuality << 7) * r) / 100) >> 7 );
/* Estimate ber from signal quality based on a linear relationship */
Inst[TopHandle].CurrentTunerInfo.BitErrorRate = ( MAX_BER - (
(Inst[TopHandle].CurrentTunerInfo.SignalQuality * MAX_BER) / 100 ));
}
}
#endif
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
STTBX_Print(("%s SignalFound=%u NewFrequency=%u\n", identity, *SignalFound, *NewFrequency));
#endif
/* GNBvd17801-> Error Handling for any error returned during I2C operation inside the driver */
Error |= Instance->DeviceMap.Error;
Instance->DeviceMap.Error = ST_NO_ERROR;
return(Error);
}
/* ----------------------------------------------------------------------------
Name: demod_d0288_ScanFrequency()
Description:
This routine will attempt to scan and find a QPSK signal based on the
passed in parameters.
Parameters:
InitialFrequency, IF value to commence scan (in kHz).
SymbolRate, required symbol bit rate (in Hz).
MaxLNBOffset, maximum allowed LNB offset (in Hz).
TunerStep, Tuner's step value -- enables override of
TNR device's internal setting.
DerotatorStep, derotator step (usually 6).
ScanSuccess, boolean that indicates QPSK search success.
NewFrequency, pointer to area to store locked frequency.
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_ScanFrequency(DEMOD_Handle_t Handle, U32 InitialFrequency, U32 SymbolRate, U32 MaxOffset,
U32 TunerStep, U8 DerotatorStep, BOOL *ScanSuccess,
U32 *NewFrequency, U32 Mode, U32 Guard,
U32 Force, U32 Hierarchy, U32 Spectrum,
U32 FreqOff, U32 ChannelBW, S32 EchoPos)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
const char *identity = "STTUNER d0288.c demod_d0288_ScanFrequency()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
FE_288_SearchParams_t Params;
FE_288_SearchResult_t Result;
STTUNER_InstanceDbase_t *Inst;
#ifdef STTUNER_DRV_SAT_SCR
U32 SCRVCOFrequency, TunerFrequency;
#endif
D0288_InstanceData_t *Instance;
STTUNER_tuner_instance_t *TunerInstance;
/* private driver instance data */
Instance = D0288_GetInstFromHandle(Handle);
/* top level public instance data */
Inst = STTUNER_GetDrvInst();
/* get the tuner instance for this driver from the top level handle */
TunerInstance = &Inst[Instance->TopLevelHandle].Sat.Tuner;
Params.ExternalClock = Instance->ExternalClock;
Params.Frequency = InitialFrequency; /* demodulator (output from LNB) frequency (in KHz) */
Params.Symbolrate = SymbolRate; /* transponder symbol rate (in bds) */
if (Inst[Instance->TopLevelHandle].Sat.BlindScan)
Params.SearchRange = 4000000;
else
Params.SearchRange = MaxOffset*2;
Params.Modulation = FE_288_MOD_QPSK;
Params.DemodIQMode=(STTUNER_IQMode_t) Spectrum;
/* Set SCR frequency here -> Now SCR Index starts from "0" v0.3 ST7 firmware*/
#ifdef STTUNER_DRV_SAT_SCR
if((Inst[Instance->TopLevelHandle].Capability.SCREnable) && (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
{
if(!Inst[Instance->TopLevelHandle].Sat.BlindScan)
{
Error = scr_scrdrv_SetFrequency(Instance->TopLevelHandle, Handle, Instance->DeviceName, InitialFrequency/1000, Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.LNBIndex,Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRBPF );
TunerFrequency = (Inst[Instance->TopLevelHandle].Capability.SCRBPFFrequencies[Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRBPF])*1000;
Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.BPFFrequency = TunerFrequency;
SCRVCOFrequency = TunerFrequency + InitialFrequency;
Params.Frequency = TunerFrequency;
Inst[Instance->TopLevelHandle].Sat.ScanInfo.Scan->ScrParams.SCRVCOFrequency = SCRVCOFrequency;
}
else
{
Error = scr_scrdrv_SetFrequency(Instance->TopLevelHandle, Handle, Instance->DeviceName, InitialFrequency/1000, Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.LNBIndex,Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRBPF );
TunerFrequency = (Inst[Instance->TopLevelHandle].Capability.SCRBPFFrequencies[Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRBPF])*1000;
Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.BPFFrequency = TunerFrequency;
SCRVCOFrequency = TunerFrequency + InitialFrequency;
Params.Frequency = TunerFrequency;
Inst[Instance->TopLevelHandle].Sat.BlindScanInfo.ScrParams.SCRVCOFrequency = SCRVCOFrequency;
}
}
#endif
Error |= FE_288_Search( &(Instance->DeviceMap),Instance->IOHandle, &Params, &Result, Instance->TopLevelHandle );
if (Error == FE_288_BAD_PARAMETER) /* element(s) of Params bad */
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s fail, scan not done: bad parameter(s) to FE_399_Search() == FE_899_BAD_PARAMETER\n", identity ));
#endif
return(ST_ERROR_BAD_PARAMETER);
}
else if (Error == FE_288_SEARCH_FAILED) /* found no signal within limits */
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0288
STTBX_Print(("%s FE_399_Search() == FE_288_SEARCH_FAILED\n", identity ));
#endif
return(ST_NO_ERROR); /* no error so try next F or stop if band limits reached */
}
*ScanSuccess = Result.Locked;
if (Result.Locked == TRUE)
{
Instance->Symbolrate = Result.Symbolrate;
Instance->SET_TSCLOCK = TRUE;
#ifdef STTUNER_DRV_SAT_SCR
if((Inst[Instance->TopLevelHandle].Capability.SCREnable)&& (Inst[Instance->TopLevelHandle].CurrentTunerInfo.ScanInfo.LNB_SignalRouting == STTUNER_VIA_SCRENABLED_LNB))
{
*NewFrequency = (SCRVCOFrequency - TunerFrequency) + (TunerFrequency - Result.Frequency);
}
else
{
*NewFrequency = Result.Frequency;
}
#else
*NewFrequency = Result.Frequency;
#endif
}
/* GNBvd17801-> Error Handling for any error returned during I2C operation inside the driver */
Error |= Instance->DeviceMap.Error;
Instance->DeviceMap.Error = ST_NO_ERROR;
return(Error);
}
ST_ErrorCode_t demod_0288_GetSymbolrate(DEMOD_Handle_t Handle, U32 *SymbolRate)
{
ST_ErrorCode_t Error = ST_NO_ERROR;
D0288_InstanceData_t *Instance;
Instance = D0288_GetInstFromHandle(Handle);
*SymbolRate = Instance->Symbolrate;
return Error;
}
/* ----------------------------------------------------------------------------
Name: demod_d0288_DiseqcInit
Description:
Selects the DiSEqC F22RX for maximum hits. THis function should be called when DiSEqC 2.0 Rx
Envelop mode is not used.
Parameters:
Handle, Demod Handle
Return Value:
ST_NO_ERROR, the operation was carried out without error.
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0288_DiseqcInit(DEMOD_Handle_t Handle)
{
ST_ErrorCode_t Error = ST_NO_ERROR;
U8 f22Tx, f22Rx, sendData[3]={0xE2,0x00,0x00},/*diseqC command to send */
ReceveData[8]={0};
STTUNER_DiSEqCSendPacket_t pDiSEqCSendPacket;
STTUNER_DiSEqCResponsePacket_t pDiSEqCResponsePacket;
D0288_InstanceData_t *Instance;
U32 mclk, txFreq=22000, RxFreq,
recevedok=0,
i,
trial = 0, /*try number maximum = 2 (try 20khz and 17.5 khz)*/
sucess1=0, /*20 Khz sucess */
sucess2=0; /*17.5 Khz sucess */
Instance = D0288_GetInstFromHandle(Handle);
pDiSEqCSendPacket.DiSEqCCommandType = STTUNER_DiSEqC_COMMAND;
pDiSEqCSendPacket.pFrmAddCmdData = &sendData[0];
pDiSEqCSendPacket.uc_TotalNoOfBytes = 3;
pDiSEqCResponsePacket.ReceivedFrmAddData = ReceveData;
Error = STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_ONECHIP_TRX,0); /*Disable Tx spy off */
Error |= STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_DIS_RESET,1);
Error |= STTUNER_IOREG_SetField(&Instance->DeviceMap, Instance->IOHandle, F288_DIS_RESET,0);
mclk = FE_288_GetMclkFreq(&Instance->DeviceMap, Instance->IOHandle,Instance->ExternalClock); /* For 5188 */
f22Tx= mclk /(txFreq*32);
Error |= STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, F288_FFR_REG, f22Tx);/*Set DiseqC Tx freq */
RxFreq=20000;
f22Rx= mclk /((RxFreq)*32);
if(Error == ST_NO_ERROR)
{
while ((recevedok <5) && (trial <2))
{
Instance->DiSEqC_RxFreq = RxFreq;
STTUNER_IOREG_SetRegister(&Instance->DeviceMap, Instance->IOHandle, F288_FRX_REG, f22Rx); /*Set Rx freq 2 possible value 20khz or 17.5 khz*/
for(i=0;i<5;i++)
{
pDiSEqCResponsePacket.uc_TotalBytesReceived = 0;
Error = demod_d0288_DiSEqC(Handle, &pDiSEqCSendPacket, &pDiSEqCResponsePacket);
if(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -