📄 drv0899.c
字号:
/* -------------------------------------------------------------------------
File Name: drv0899.c
History:
Description: STb0899 driver LLA V1.0.8 17/01/2005
Date 18/04/05
Comments: LLA2.0.0 integration
author: SD
Date 22/06/05
Comments: LLA V3.0.3 integration
author: SD
Date 29/03/06
Comments: LLA V3.6.0 integration
author: SD
---------------------------------------------------------------------------- */
/* includes ---------------------------------------------------------------- */
#ifdef ST_OSLINUX
#include "stos.h"
#else
#include "string.h"
#include "stdlib.h"
#endif
/* STB0899 includes */
#include "drv0899.h"
#include "d0899_util.h"
#include "d0899_dvbs2util.h"
#include "dbtypes.h"
#include "sysdbase.h"
#include "d0899.h"
#include "mtuner.h"
#include "tunsdrv.h"
extern TUNSDRV_InstanceData_t *TUNSDRV_GetInstFromHandle(TUNER_Handle_t Handle);
#define MULT32X32(a,b) (((((long)((a)>>16))*((long)((b)>>16)))<<1) +((((long)((a)>>16))*((long)(b&0x0000ffff)))>>15) + ((((long)((b)>>16))*((long)((a)&0x0000ffff)))>>15))
#define angle_threshold 1042
#define LPDPC_MAX_ITER 70
static FE_STB0899_LOOKUP_t FE_STB0899_CN_LookUp = {
22,
{ 0, 10780,
1, 10420,
15, 10030,
20, 9815,
30, 9320,
40, 8760,
50, 8150,
60, 7500,
70, 6850,
80, 6215,
90, 5625,
100,5080,
110,4580,
120,4140,
130,3740,
140,3390,
150,3080,
160,2800,
170,2550,
180,2330,
190,2160,
200,1995
}
};
static FE_STB0899_LOOKUP_t FE_STB0899_RF_LookUp = {
20,
{
-5, 79,
-10, 73,
-15, 67,
-20, 62,
-25, 56,
-30, 49,
-33, 44,
-35, 40,
-37, 36,
-38, 33,
-40, 27,
-45, 4,
-47, -11,
-48, -19,
-50, -29,
-55, -43,
-60, -52,
-65, -61,
-67, -65,
-70, -128,
}
};
static FE_STB0899_LOOKUP_t FE_STB0899_DVBS2RF_LookUp = {
15,
{
-5, 2899,
-10, 3330,
-15, 3123,
-20, 3577,
-25, 4004,
-30, 4417,
-35, 4841,
-40, 5300,
-45, 5822,
-50, 6491,
-55, 7516,
-60, 9235,
-65, 11374,
-70, 12364,
-75, 13063,
}
};
static const ST_Revision_t RevisionSTB0899 = " STB0899-LLA_REL_3.6.0 ";
ST_Revision_t DrvSTB0899_GetLLARevision(void)
{
return (RevisionSTB0899);
}
/*****************************************************
--FUNCTION :: FE_STB0899_WaitTuner
--ACTION :: Wait for tuner locked
--PARAMS IN :: TimeOut -> Maximum waiting time (in ms)
--PARAMS OUT:: NONE
--RETURN :: NONE
--***************************************************/
ST_ErrorCode_t FE_STB0899_WaitTuner(STTUNER_tuner_instance_t *TunerInstance, int TimeOut)
{
int Time = 0;
BOOL TunerLocked = FALSE;
ST_ErrorCode_t Error;
while(!TunerLocked && (Time < TimeOut))
{
WAIT_N_MS_899(1);
Error = (TunerInstance->Driver->tuner_IsTunerLocked)(TunerInstance->DrvHandle, &TunerLocked);
if(Error != ST_NO_ERROR)
return Error;
Time++;
}
Time--;
return Error;
}
/*****************************************************
**FUNCTION :: FE_STB0899_F22Freq
**ACTION :: Compute F22 frequency
**PARAMS IN :: DigFreq ==> Frequency of the digital synthetizer (Hz)
** F22 ==> Content of the F22 register
**PARAMS OUT:: NONE
**RETURN :: F22 frequency
*****************************************************/
U32 FE_STB0899_F22Freq(U32 DigFreq,U32 F22)
{
return (F22!=0) ? (DigFreq/(32*F22)) : 0;
}
/*****************************************************
--FUNCTION :: FE_STB0899_CheckTiming
--ACTION :: Check for timing locked
--PARAMS IN :: Params->Ttiming => Time to wait for timing loop locked
--PARAMS OUT:: Params->State => result of the check
--RETURN :: NOTIMING_899 if timing not locked, TIMINGOK otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckTiming(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
int locked,
timing;
WAIT_N_MS_899(Params->Ttiming);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_TIMING_LOOP_FREQ,FSTB0899_TIMING_LOOP_FREQ_INFO, 0xf2);
locked=STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TMG_LOCK_IND, FSTB0899_TMG_LOCK_IND_INFO);
timing=abs(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_TIMING_LOOP_FREQ, FSTB0899_TIMING_LOOP_FREQ_INFO));
if(locked >= 42)
{
if((locked > 48) && (timing >= 110))
Params->State = ANALOGCARRIER_899;
else
Params->State = TIMINGOK_899;
}
else
Params->State = NOTIMING_899;
return Params->State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_CheckCarrier
--ACTION :: Check for carrier founded
--PARAMS IN :: Params => Pointer to FE_STB0899_InternalParams_t structure
--PARAMS OUT:: Params->State => Result of the check
--RETURN :: NOCARRIER carrier not founded, CARRIEROK_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckCarrier(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
WAIT_N_MS_899(Params->Tderot); /* wait for derotator ok */
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CFD_ON, FSTB0899_CFD_ON_INFO,0);
if (STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_CARRIER_FOUND,FSTB0899_CARRIER_FOUND_INFO))
Params->State = CARRIEROK_899;
else
Params->State = NOCARRIER_899;
return Params->State;
}
U32 FE_STB0899_GetErrorCount(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle ,ERRORCOUNTER Counter)
{
U32 lsb,msb;
/*Do not modified the read order (lsb first)*/
switch(Counter)
{
case COUNTER1_899:
lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ERROR_COUNT_LSB,FSTB0899_ERROR_COUNT_LSB_INFO);
msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_ERROR_COUNT_MSB,FSTB0899_ERROR_COUNT_MSB_INFO);
break;
case COUNTER2_899:
lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT2_LSB,FSTB0899_ERROR_COUNT2_LSB_INFO);
msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT2_MSB,FSTB0899_ERROR_COUNT2_MSB_INFO);
break;
case COUNTER3_899:
lsb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT3_LSB,FSTB0899_ERROR_COUNT3_LSB_INFO);
msb = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle ,FSTB0899_ERROR_COUNT3_MSB,FSTB0899_ERROR_COUNT3_MSB_INFO);
break;
}
return (MAKEWORD(msb,lsb));
}
/*****************************************************
--FUNCTION :: FE_STB0899_CheckData
--ACTION :: Check for data founded
--PARAMS IN :: Params => Pointer to FE_STB0899_InternalParams_t structure
--PARAMS OUT:: Params->State => Result of the check
--RETURN :: NODATA data not founded, DATAOK_899 otherwise
--***************************************************/
FE_STB0899_SIGNALTYPE_t FE_STB0899_CheckData(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, FE_STB0899_InternalParams_t *Params)
{
int lock = 0,loopcount = 0,
index=0,
dataTime=500;
Params->State = NODATA_899;
/* reset du FEC */
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESACS,FSTB0899_FRESACS_INFO, 1);
WAIT_N_MS_899(1);
STTUNER_IOREG_SetField_SizeU32(DeviceMap, IOHandle, FSTB0899_FRESACS,FSTB0899_FRESACS_INFO, 0);
if(Params->SymbolRate <= 2000000)
dataTime=2000;
else if(Params->SymbolRate <= 5000000)
dataTime=1500;
else if(Params->SymbolRate <= 15000000)
dataTime=1000;
else
dataTime=500;
STTUNER_IOREG_SetRegister(DeviceMap, IOHandle, RSTB0899_DSTATUS2,0x00); /* force search loop */
index = dataTime/10;
do
{
WAIT_N_MS_899(1);
++loopcount;
}
while( !(STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO)) && /* warning : vit locked has to be tested before end_loop */
!STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle,FSTB0899_END_LOOPVIT,FSTB0899_END_LOOPVIT_INFO) &&
loopcount<index);
/* wait for viterbi end loop */
lock = STTUNER_IOREG_GetField_SizeU32(DeviceMap, IOHandle, FSTB0899_LOCKEDVIT,FSTB0899_LOCKEDVIT_INFO);
if (lock) /* Test DATA LOCK indicator */
Params->State = DATAOK_899;
return Params->State;
}
/*****************************************************
--FUNCTION :: FE_STB0899_TimingTimeConstant
--ACTION :: Compute the amount of time needed by the timing loop to lock
--PARAMS IN :: SymbolRate -> symbol rate value
--PARAMS OUT:: NONE
--RETURN :: Timing loop time constant (ms)
--***************************************************/
long FE_STB0899_TimingTimeConstant(long SymbolRate)
{
if(SymbolRate > 0)
return (100000/(SymbolRate/1000));
else
return 0;
}
/*****************************************************
--FUNCTION :: FE_STB0899_DerotTimeConstant
--ACTION :: Compute the amount of time needed by the Derotator to lock
--PARAMS IN :: SymbolRate -> symbol rate value
--PARAMS OUT:: NONE
--RETURN :: Derotator time constant (ms)
--***************************************************/
long FE_STB0899_DerotTimeConstant(long SymbolRate)
{
if(SymbolRate > 0)
return (100000/(SymbolRate/1000));
else
return 0;
}
/*****************************************************
--FUNCTION :: FE_STB0899_DataTimeConstant
--ACTION :: Compute the amount of time needed to capture data
--PARAMS IN :: Er -> Viterbi rror rate
-- Sn -> viterbi averaging period
-- To -> viterbi time out
-- Hy -> viterbi hysteresis
-- SymbolRate -> symbol rate value
--PARAMS OUT:: NONE
--RETURN :: Data time constant
--***************************************************/
long FE_STB0899_DataTimeConstant(int Er, int Sn,int To,int Hy,long SymbolRate)
{
long Tviterbi = 0,
TimeOut =0,
THysteresis = 0,
PhaseNumber[6] = {2,6,4,6,14,8},
averaging[4] = {1024L,4096L,16384L,65536L},
InnerCode = 1000,
HigherRate = 1000;
int i;
/* =======================================================================
-- Data capture time (in ms)
-- -------------------------
-- This time is due to the Viterbi synchronisation.
--
-- For each authorized inner code, the Viterbi search time is calculated,
-- and the results are cumulated in ViterbiSearch. */
for(i=0;i<6;i++)
{
if (((Er >> i)& 0x01) == 0x01)
{
switch(i)
{
case 0: /* inner code 1/2 */
InnerCode = 2000; /* 2.0 */
break;
case 1: /* inner code 2/3 */
InnerCode = 1500; /* 1.5 */
break;
case 2: /* inner code 3/4 */
InnerCode = 1333; /* 1.333 */
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -