📄 drv0297.c
字号:
/* =============================== */
const U8 QAM16_DEFTUN[] =
{
R0297_DELAGC_2, 0xF4,
R0297_DELAGC_7, 0x6F,
R0297_DELAGC_8, 0xDC,
R0297_WBAGC_1, 0xE5,
R0297_WBAGC_2, 0x2F,
R0297_WBAGC_3, 0x00,
R0297_WBAGC_4, 0xC4,
R0297_WBAGC_9, 0x09,
R0297_WBAGC_10, 0x66,
R0297_WBAGC_11, 0xE6,
R0297_STLOOP_3, 0x06,
R0297_STLOOP_9, 0x08,
R0297_STLOOP_10, 0x5E,
R0297_CRL_1, 0x49,
R0297_CRL_2, 0x0B,
R0297_CRL_9, 0x0F,
R0297_CRL_10, 0x03,
R0297_PMFAGC_4, 0x0C,
0x00
};
const U8 QAM32_DEFTUN[] =
{
R0297_DELAGC_2, 0xEB,
R0297_DELAGC_7, 0x6C,
R0297_DELAGC_8, 0x33,
R0297_WBAGC_1, 0x4A,
R0297_WBAGC_2, 0x2D,
R0297_WBAGC_3, 0x00,
R0297_WBAGC_4, 0xC4,
R0297_WBAGC_9, 0x09,
R0297_WBAGC_10, 0x0A,
R0297_WBAGC_11, 0xF7,
R0297_STLOOP_3, 0x08,
R0297_STLOOP_9, 0x08,
R0297_STLOOP_10, 0x1E,
R0297_CRL_1, 0x49,
R0297_CRL_2, 0x05,
R0297_CRL_9, 0x00,
R0297_CRL_10, 0x02,
R0297_PMFAGC_4, 0x0C,
0x00
};
const U8 QAM64_DEFTUN[] =
{
R0297_DELAGC_2, 0xE5,
R0297_DELAGC_7, 0x6C,
R0297_DELAGC_8, 0x6E,
R0297_WBAGC_1, 0x9F,
R0297_WBAGC_2, 0x20,
R0297_WBAGC_3, 0x18,
R0297_WBAGC_4, 0x80,
R0297_WBAGC_9, 0x12,
R0297_WBAGC_10, 0x51,
R0297_WBAGC_11, 0xF8,
R0297_STLOOP_3, 0x06,
R0297_STLOOP_9, 0x08,
R0297_STLOOP_10, 0x1E,
R0297_CRL_1, 0x49,
R0297_CRL_2, 0x05,
R0297_CRL_9, 0x00,
R0297_CRL_10, 0x03,
R0297_PMFAGC_4, 0x00,
0x00
};
const U8 QAM128_DEFTUN[] =
{
R0297_DELAGC_2, 0xE5,
R0297_DELAGC_7, 0x60,
R0297_DELAGC_8, 0x00,
R0297_WBAGC_1, 0xED,
R0297_WBAGC_2, 0x2F,
R0297_WBAGC_3, 0x00,
R0297_WBAGC_4, 0xC4,
R0297_WBAGC_9, 0x09,
R0297_WBAGC_10, 0x14,
R0297_WBAGC_11, 0xFE,
R0297_STLOOP_3, 0x06,
R0297_STLOOP_9, 0x08,
R0297_STLOOP_10, 0x5E,
R0297_CRL_1, 0x49,
R0297_CRL_2, 0x0B,
R0297_CRL_9, 0x0F,
R0297_CRL_10, 0x03,
R0297_PMFAGC_4, 0x0C,
0x00
};
const U8 QAM256_DEFTUN[] =
{
R0297_DELAGC_2, 0xE5,
R0297_DELAGC_7, 0x6C,
R0297_DELAGC_8, 0x42,
R0297_WBAGC_1, 0xFF,
R0297_WBAGC_2, 0x2F,
R0297_WBAGC_3, 0x00,
R0297_WBAGC_4, 0xC4,
R0297_WBAGC_9, 0x09,
R0297_WBAGC_10, 0x76,
R0297_WBAGC_11, 0xFE,
R0297_STLOOP_3, 0x06,
R0297_STLOOP_9, 0x08,
R0297_STLOOP_10, 0x5E,
R0297_CRL_1, 0x49,
R0297_CRL_2, 0x0B,
R0297_CRL_9, 0x0F,
R0297_CRL_10, 0x03,
R0297_PMFAGC_4, 0x0C,
0x00
};
/* variables --------------------------------------------------------------- */
static int Driv0297CN[5][40];
/* functions --------------------------------------------------------------- */
/***********************************************************
**FUNCTION :: Drv0297_GetLLARevision
**ACTION :: Returns the 297 LLA driver revision
**RETURN :: Revision297
***********************************************************/
ST_Revision_t Drv0297_GetLLARevision(void)
{
return (Revision297);
}
/*----------------------------------------------------
FUNCTION Drv0297_WaitTuner
ACTION Wait for tuner locked
PARAMS IN TimeOut -> Maximum waiting time (in ms)
PARAMS OUT NONE
RETURN NONE (Handle == THIS_INSTANCE.Tuner.DrvHandle)
------------------------------------------------------*/
void Drv0297_WaitTuner(STTUNER_tuner_instance_t *pTunerInstance, int TimeOut)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
const char *identity = "STTUNER drv0297.c Drv0297_WaitTuner()";
#endif
int Time = 0;
BOOL TunerLocked = FALSE;
ST_ErrorCode_t Error;
while(!TunerLocked && (Time < TimeOut))
{
STV0297_DelayInMilliSec(1);
Error = (pTunerInstance->Driver->tuner_IsTunerLocked)(pTunerInstance->DrvHandle, &TunerLocked);
Time++;
}
Time--;
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
STTBX_Print(("%s\n", identity));
#endif
}
/*----------------------------------------------------
--FUNCTION Drv0297_CarrierWidth
--ACTION Compute the width of the carrier
--PARAMS IN SymbolRate -> Symbol rate of the carrier (Kbauds or Mbauds)
-- RollOff -> Rolloff * 100
--PARAMS OUT NONE
--RETURN Width of the carrier (KHz or MHz)
------------------------------------------------------*/
long Drv0297_CarrierWidth(long SymbolRate, long RollOff)
{
return (SymbolRate + (SymbolRate * RollOff)/100);
}
/*----------------------------------------------------
--FUNCTION Drv0297_CheckAgc
--ACTION Check for Agc
--PARAMS IN Params => Pointer to SEARCHPARAMS structure
--PARAMS OUT Params->State => Result of the check
--RETURN E297_NOCARRIER carrier not founded, E297_CARRIEROK otherwise
------------------------------------------------------*/
D0297_SignalType_t Drv0297_CheckAgc(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0297_SearchParams_t *Params)
{
/*
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
const char *identity = "STTUNER drv0297.c Drv0297_CheckAgc()";
#endif
*/
if ( STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0297_WAGC_ACQ) )
{
Params->State = E297_AGCOK;
}
else
{
Params->State = E297_NOAGC;
}
/*
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
STTBX_Print(("%s\n", identity));
#endif
*/
return(Params->State);
}
/*----------------------------------------------------
FUNCTION Drv0297_CheckData
ACTION Check for data founded
PARAMS IN Params => Pointer to SEARCHPARAMS structure
PARAMS OUT Params->State => Result of the check
RETURN E297_NODATA data not founded, E297_DATAOK otherwise
------------------------------------------------------*/
D0297_SignalType_t Drv0297_CheckData(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle, D0297_SearchParams_t *Params)
{
/*
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
const char *identity = "STTUNER drv0297.c Drv0297_CheckData()";
#endif
*/
if ( STTUNER_IOREG_GetField(DeviceMap, IOHandle, F0297_SYNCSTATE) )
{
Params->State = E297_DATAOK;
}
else
{
Params->State = E297_NODATA;
}
/*
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
STTBX_Print(("%s\n", identity));
#endif
*/
return(Params->State);
}
/*----------------------------------------------------
FUNCTION Drv0297_InitParams
ACTION
PARAMS IN NONE
PARAMS OUT NONE
RETURN NONE
------------------------------------------------------*/
void Drv0297_InitParams(STTUNER_IOREG_DeviceMap_t *DeviceMap, IOARCH_Handle_t IOHandle)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
const char *identity = "STTUNER drv0297.c Drv0297_InitParams()";
#endif
int idB ;
int iQAM ;
/*
Driv0297CN[iQAM][idB] init
This table is used for the C/N estimation (performed in the
Driv0297CNEstimator routine).
Driv0297CNB[iQAM][idB] gives the C/N estimated value for
a given iQAM QAM size and idB C/N ratio.
*/
for (idB = 0 ; idB < 40; idB++)
for (iQAM = 0 ; iQAM < 5 ; iQAM++)
Driv0297CN[iQAM][idB] = 100000;
/* QAM = 16 */
iQAM = 0 ;
for (idB = 0 ; idB < 15 ; idB++)
Driv0297CN[iQAM][idB] = 10500 + (15-idB)*1000;
Driv0297CN[iQAM][15] = 10500 ;
Driv0297CN[iQAM][16] = 9000 ;
Driv0297CN[iQAM][17] = 8120 ;
Driv0297CN[iQAM][18] = 7300 ;
Driv0297CN[iQAM][19] = 6530 ;
Driv0297CN[iQAM][20] = 5870 ;
Driv0297CN[iQAM][21] = 5310 ;
Driv0297CN[iQAM][22] = 4790 ;
Driv0297CN[iQAM][23] = 4320 ;
Driv0297CN[iQAM][24] = 3920 ;
Driv0297CN[iQAM][25] = 3590 ;
Driv0297CN[iQAM][26] = 3270 ;
Driv0297CN[iQAM][27] = 3000 ;
Driv0297CN[iQAM][28] = 2760 ;
Driv0297CN[iQAM][29] = 2560 ;
Driv0297CN[iQAM][30] = 2420 ;
Driv0297CN[iQAM][31] = 2260 ;
Driv0297CN[iQAM][32] = 2150 ;
Driv0297CN[iQAM][33] = 2060 ;
Driv0297CN[iQAM][34] = 1980 ;
Driv0297CN[iQAM][35] = 1910 ;
Driv0297CN[iQAM][36] = 1850 ;
Driv0297CN[iQAM][37] = 1810 ;
Driv0297CN[iQAM][38] = 1750 ;
Driv0297CN[iQAM][39] = 1740 ;
/* QAM = 32 */
iQAM = 1 ;
for (idB = 0 ; idB < 18 ; idB++)
Driv0297CN[iQAM][idB] = 10500 + (18-idB)*1000;
Driv0297CN[iQAM][18] = 10500 ;
Driv0297CN[iQAM][19] = 9120 ;
Driv0297CN[iQAM][20] = 8100 ;
Driv0297CN[iQAM][21] = 7300 ;
Driv0297CN[iQAM][22] = 6560 ;
Driv0297CN[iQAM][23] = 5930 ;
Driv0297CN[iQAM][24] = 5380 ;
Driv0297CN[iQAM][25] = 4920 ;
Driv0297CN[iQAM][26] = 4520 ;
Driv0297CN[iQAM][27] = 4130 ;
Driv0297CN[iQAM][28] = 3800 ;
Driv0297CN[iQAM][29] = 3520 ;
Driv0297CN[iQAM][30] = 3290 ;
Driv0297CN[iQAM][31] = 3120 ;
Driv0297CN[iQAM][32] = 2980 ;
Driv0297CN[iQAM][33] = 2850 ;
Driv0297CN[iQAM][34] = 2730 ;
Driv0297CN[iQAM][35] = 2650 ;
Driv0297CN[iQAM][36] = 2560 ;
Driv0297CN[iQAM][37] = 2510 ;
Driv0297CN[iQAM][38] = 2480 ;
Driv0297CN[iQAM][39] = 2440 ;
/* QAM = 64 */
iQAM = 2 ;
for (idB = 0 ; idB < 21 ; idB++)
Driv0297CN[iQAM][idB] = 10500 + (21-idB)*1000;
Driv0297CN[iQAM][21] = 10500 ;
Driv0297CN[iQAM][22] = 9300 ;
Driv0297CN[iQAM][23] = 8400 ;
Driv0297CN[iQAM][24] = 7600 ;
Driv0297CN[iQAM][25] = 6850 ;
Driv0297CN[iQAM][26] = 6250 ;
Driv0297CN[iQAM][27] = 5750 ;
Driv0297CN[iQAM][28] = 5250 ;
Driv0297CN[iQAM][29] = 4850 ;
Driv0297CN[iQAM][30] = 4450 ;
Driv0297CN[iQAM][31] = 4200 ;
Driv0297CN[iQAM][32] = 3900 ;
Driv0297CN[iQAM][33] = 3700 ;
Driv0297CN[iQAM][34] = 3550 ;
Driv0297CN[iQAM][35] = 3400 ;
Driv0297CN[iQAM][36] = 3300 ;
Driv0297CN[iQAM][37] = 3200 ;
Driv0297CN[iQAM][38] = 3130 ;
Driv0297CN[iQAM][39] = 3060 ;
/* QAM = 128 */
iQAM = 3 ;
for (idB = 0 ; idB < 24 ; idB++)
Driv0297CN[iQAM][idB] = 10500 + (24-idB)*1000;
Driv0297CN[iQAM][24] = 10500 ;
Driv0297CN[iQAM][25] = 9660 ;
Driv0297CN[iQAM][26] = 8780 ;
Driv0297CN[iQAM][27] = 7970 ;
Driv0297CN[iQAM][28] = 7310 ;
Driv0297CN[iQAM][29] = 6750 ;
Driv0297CN[iQAM][30] = 6220 ;
Driv0297CN[iQAM][31] = 5810 ;
Driv0297CN[iQAM][32] = 5430 ;
Driv0297CN[iQAM][33] = 5090 ;
Driv0297CN[iQAM][34] = 4880 ;
Driv0297CN[iQAM][35] = 4700 ;
Driv0297CN[iQAM][36] = 4500 ;
Driv0297CN[iQAM][37] = 4340 ;
Driv0297CN[iQAM][38] = 4270 ;
Driv0297CN[iQAM][39] = 4150 ;
/* QAM = 256 */
iQAM = 4 ;
for (idB = 0 ; idB < 28 ; idB++)
Driv0297CN[iQAM][idB] = 10500 + (28-idB)*1000;
Driv0297CN[iQAM][28] = 10500 ;
Driv0297CN[iQAM][29] = 9600 ;
Driv0297CN[iQAM][30] = 9000 ;
Driv0297CN[iQAM][31] = 8400 ;
Driv0297CN[iQAM][32] = 7800 ;
Driv0297CN[iQAM][33] = 7400 ;
Driv0297CN[iQAM][34] = 7100 ;
Driv0297CN[iQAM][35] = 6700 ;
Driv0297CN[iQAM][36] = 6550 ;
Driv0297CN[iQAM][37] = 6370 ;
Driv0297CN[iQAM][38] = 6200 ;
Driv0297CN[iQAM][39] = 6150 ;
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
STTBX_Print(("%s\n", identity));
#endif
}
/*----------------------------------------------------
FUNCTION Drv0297_InitSearch
ACTION Set Params fields that are used by the search algorithm
PARAMS IN
PARAMS OUT
RETURN NONE
------------------------------------------------------*/
void Drv0297_InitSearch(STTUNER_tuner_instance_t *TunerInstance, D0297_StateBlock_t *StateBlock,
STTUNER_Modulation_t Modulation, int Frequency, int SymbolRate, STTUNER_Spectrum_t Spectrum,
BOOL ScanExact)
{
#ifdef STTUNER_DEBUG_MODULE_CABDRV_DRV0297
const char *identity = "STTUNER drv0297.c Drv0297_InitSearch()";
#endif
U32 BandWidth;
ST_ErrorCode_t Error;
TUNER_Status_t TunerStatus;
/* Obtain current tuner status */
Error = (TunerInstance->Driver->tuner_GetStatus)(TunerInstance->DrvHandle, &TunerStatus);
/* Select closest bandwidth for tuner */ /* cast to U32 type to match function argument & eliminate compiler warning --SFS */
Error = (TunerInstance->Driver->tuner_SetBandWidth)( TunerInstance->DrvHandle,
(U32)( Drv0297_CarrierWidth(SymbolRate, StateBlock->Params.RollOff) /1000 + 3000),
&BandWidth);
/*
--- Set Parameters
*/
StateBlock->Params.Frequency = Frequency;
StateBlock->Params.SymbolRate = SymbolRate;
StateBlock->Params.TunerBW
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -