📄 d0399e.c
字号:
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_FECM, F399_FECMODE, F399_FECMODE_L, &Data, 1, FALSE);
break;
case STTUNER_FEC_MODE_DIRECTV:
Data = 4;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_FECM, F399_FECMODE, F399_FECMODE_L, &Data, 1, FALSE);
Data = 1;
/* Nyquist Filter to 20% for DIRECTV */
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_R8PSK, F399_MODE_COEF, F399_MODE_COEF_L, &Data, 1, FALSE);
Data = 0;
/* Descrambler is disactivated */
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_DESCRAM, F399_DESCRAM_L, &Data, 1, FALSE);
break;
default:
break;
}
switch(DEMODInstance->TSOutputMode)
{
case STTUNER_TS_MODE_DEFAULT:
case STTUNER_TS_MODE_PARALLEL:
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_OUTRS_PS, F399_OUTRS_PS_L, &Data, 1, FALSE);
break;
case STTUNER_TS_MODE_SERIAL:
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_OUTRS_PS, F399_OUTRS_PS_L, &Data, 1, FALSE);
break;
default:
break;
}
/* Set serial data mode */
if (DEMODInstance->TSOutputMode == STTUNER_TS_MODE_SERIAL)
{
if ( ((DEMODInstance->SerialDataMode) & STTUNER_SDAT_VALID_RISING) != 0) /* Rising edge */
{
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_CLK_POL, F399_CLK_POL_L, &Data, 1, FALSE);
}
else
{
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_CLK_POL, F399_CLK_POL_L, &Data, 1, FALSE);
}
if ((DEMODInstance->SerialDataMode & STTUNER_SDAT_PARITY_ENABLE) != 0) /* Parity enable changes done for 5528 live decode issue*/
{
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_CLK_CFG, F399_CLK_CFG_L, &Data, 1, FALSE);
}
else
{
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_CLK_CFG, F399_CLK_CFG_L, &Data, 1, FALSE);
}
}
/* Set Block Sync control for bug GNBvd27452. Block Sync bit will set sync byte 0x47 or 0xb8 after every 8th packet */
#ifdef STTUNER_BLOCK_SYNC_MODE_SELECT
if((DEMODInstance->BlockSyncMode == STTUNER_SYNC_NORMAL) || (DEMODInstance->BlockSyncMode == STTUNER_SYNC_DEFAULT))
{
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_MPEG, F399_MPEG_L, &Data, 1, FALSE);
}
else
{
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RS, F399_MPEG, F399_MPEG_L, &Data, 1, FALSE);
}
if(DEMODInstance->DataFIFOMode == STTUNER_DATAFIFO_ENABLED)
{
if(DEMODInstance->OutputFIFOConfig.OutputRateCompensationMode == STTUNER_COMPENSATE_DATACLOCK)
{
Data = 1;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RSOUT, F399_EN_STBACKEND, F399_EN_STBACKEND_L, &Data, 1, FALSE);
}
else if(DEMODInstance->OutputFIFOConfig.OutputRateCompensationMode == STTUNER_COMPENSATE_DATAVALID)
{
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RSOUT, F399_EN_STBACKEND, F399_EN_STBACKEND_L, &Data, 1, FALSE);
}
if (DEMODInstance->TSOutputMode == STTUNER_TS_MODE_SERIAL)
{
ENA8_LevelValue = 0x01;/* use only ENA8_LEVEL[3:2] in serial mode*/
ENA8_LevelValue |= ((DEMODInstance->OutputFIFOConfig.CLOCKPERIOD - 1)<<2);
Data = ENA8_LevelValue;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RSOUT, F399_ENA8_LEVEL, F399_ENA8_LEVEL_L, &Data, 1, FALSE);
}
else if (DEMODInstance->TSOutputMode == STTUNER_TS_MODE_PARALLEL)
{
ENA8_LevelValue = (Instance->OutputFIFOConfig.CLOCKPERIOD) / 4;
Data = ENA8_LevelValue;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_RSOUT, F399_ENA8_LEVEL, F399_ENA8_LEVEL_L, &Data, 1, FALSE);
}
}
#endif
/* ERRCNTL #1: Set default error count mode i.e., QPSK bit error rate */
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_ERRCTRL, F399_ERRMODE, F399_ERRMODE_L, &Data, 1, FALSE);
Data = 0;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_ERRCTRL, F399_ERR_SOURCE, F399_ERR_SOURCE_L, &Data, 1, FALSE);
Data = 3;
STTUNER_IODIRECT_ReadWrite(STTUNER_IO_SA_WRITE, R399_ERRCTRL, F399_NOE, F399_NOE_L, &Data, 1, FALSE);
Capability->SymbolMin = STV0399E_SYMBOL_RATE_MIN; /* 1 MegaSymbols/sec */
Capability->SymbolMax = STV0399E_SYMBOL_RATE_MAX; /* 45 MegaSymbols/sec */
Capability->FreqMin = STV0399E_FREQ_MIN; /* 950000 */
Capability->FreqMax = STV0399E_FREQ_MAX; /* 2150000 */
/* change tuner step size to best fixed value for STV0399 */
Inst = STTUNER_GetDrvInst();
Inst[OpenParams->TopLevelHandle].Sat.Ioctl.TunerStepSize = STV0399_TUNER_SCAN_STEP;
/* finally (as nor more errors to check for, allocate handle */
DEMODInstance->TopLevelHandle = OpenParams->TopLevelHandle;
/* in loopthriugh mode the second demod which is connected by loopthrough of first cannot send disecq-st
command because of a DC block in the loop-through path. Presently it depends upon toplevelhandle but when tone detection
LLA of SatCR will be written "DISECQ_ST_ENABLE" will be initalized automatically depending upon the tone sent*/
#ifdef STTUNER_DRV_SAT_SCR
#ifdef STTUNER_DRV_SAT_SCR_LOOPTHROUGH
if(OpenParams->TopLevelHandle == 0)
DEMODInstance->DISECQ_ST_ENABLE = TRUE;
if(OpenParams->TopLevelHandle == 1)
DEMODInstance->DISECQ_ST_ENABLE = FALSE;
#endif
#endif
*Handle = (U32)DEMODInstance;
SEM_UNLOCK(Lock_InitTermOpenClose);
#endif
return(Error);
}
#ifdef STTUNER_MINIDRIVER
ST_ErrorCode_t demod_d0399_Close(DEMOD_Handle_t Handle, DEMOD_CloseParams_t *CloseParams)
{
DEMODInstance->TopLevelHandle = STTUNER_MAX_HANDLES;
FE_399_Term();
return(ST_NO_ERROR);
}
#endif
#ifndef STTUNER_MINIDRIVER
/* ----------------------------------------------------------------------------
Name: demod_d0399_Close()
Description:
Parameters:
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0399_Close(DEMOD_Handle_t Handle, DEMOD_CloseParams_t *CloseParams)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
const char *identity = "STTUNER d0399.c demod_d0399_Close()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
D0399_InstanceData_t *Instance;
/* private driver instance data */
Instance = D0399_GetInstFromHandle(Handle);
if(Installed == FALSE)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s fail driver not installed\n", identity));
#endif
return(STTUNER_ERROR_INITSTATE);
}
SEM_LOCK(Lock_InitTermOpenClose);
/* ---------- check that at least one init has taken place ---------- */
if(InstanceChainTop == NULL)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s fail nothing initalized\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(STTUNER_ERROR_INITSTATE);
}
if(Instance->TopLevelHandle == STTUNER_MAX_HANDLES)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s fail driver instance not open\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(ST_ERROR_OPEN_HANDLE);
}
/* ---------- Term LLA ---------- */
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s FE_399_Term() with Instance->FE_399_Handle at 0x%08x\n", identity, Instance->FE_399_Handle));
#endif
/* indidcate insatance is closed */
Instance->TopLevelHandle = STTUNER_MAX_HANDLES;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s closed\n", identity));
#endif
SEM_UNLOCK(Lock_InitTermOpenClose);
return(Error);
}
#endif
#ifndef STTUNER_MINIDRIVER
/* ----------------------------------------------------------------------------
Name: demod_d0399_IsAnalogCarrier()
Description:
This routine checks for an analog carrier on the current frequency
by setting the symbol rate to 5M (never a digital signal).
Parameters:
IsAnalog, pointer to area to store result:
TRUE - is analog
FALSE - is not analog
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0399_IsAnalogCarrier(DEMOD_Handle_t Handle, BOOL *IsAnalog) /* TODO */
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
const char *identity = "STTUNER d0399.c demod_d0399_IsAnalogCarrier()";
#endif
ST_ErrorCode_t Error = ST_NO_ERROR;
U8 loop,temp[1];
U16 Agc2;
D0399_InstanceData_t *Instance;
/* private driver instance data */
Instance = D0399_GetInstFromHandle(Handle);
Agc2 = 0;
*IsAnalog = FALSE; /* Assume no analog carrier */
/* Set the symbol rate to analog carrier rate 144000000 */
FE_399_SetSymbolRate(&Instance->DeviceMap, Instance->IOHandle, Instance->ExternalClock, ANALOG_CARRIER_DETECT_SYMBOL_RATE);
/* Take four AGC2 samples */
for (loop = 0; loop < 4; loop++)
{
/* Read AGC2I1 and AGC2I2 registers */
STTUNER_IOREG_GetContigousRegisters(&Instance->DeviceMap, Instance->IOHandle, R399_AGC2I1, 2, temp);
Agc2 += ((temp[0]<<8) + temp[1]);
}
Agc2 = Agc2 / 4; /* Average AGC2 values */
/* Test for good signal strength -- centre of analog carrier */
*IsAnalog = (Agc2 < ANALOG_CARRIER_DETECT_AGC2_VALUE) ? TRUE : FALSE;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s IsAnalog=%u\n", identity, *IsAnalog));
#endif
return(Error);
}
#endif
/* ----------------------------------------------------------------------------
Name: demod_d0399_GetSignalQuality()
Description:
Obtains a signal quality setting for the current lock.
Parameters:
SignalQuality_p, pointer to area to store the signal quality value.
Ber, pointer to area to store the bit error rate.
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0399_GetSignalQuality(DEMOD_Handle_t Handle, U32 *SignalQuality_p, U32 *Ber)
{
int i;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
const char *identity = "STTUNER d0399.c demod_d0399_GetSignalQuality()";
#endif
D0399_InstanceData_t *Instance;
ST_ErrorCode_t Error = ST_NO_ERROR;
Instance = D0399_GetInstFromHandle(Handle);
#ifndef STTUNER_MINIDRIVER
*Ber = FE_399_GetError(&Instance->DeviceMap, Instance->IOHandle);
*SignalQuality_p = FE_399_GetCarrierToNoiseRatio(&Instance->DeviceMap, Instance->IOHandle);
/**SignalQuality_p = Info.C_N;*/
for(i=0; i<20; ++i)
{
if(FE_399_SignalQuality_LookUp[i][0] >= *SignalQuality_p)
{
*SignalQuality_p = FE_399_SignalQuality_LookUp[i][1];
break;
}
}
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s SignalQuality=%u Ber=%u\n", identity, *SignalQuality_p, *Ber));
#endif
#endif
/**************************STTUNER_MINIDRIVER**************************
************************************************************************
*************************************************************************/
#ifdef STTUNER_MINIDRIVER
Error = FE_399_GetSignalInfo(&Info);
if ( Error != ST_NO_ERROR)
{
return(Error);
}
for(i=0; i<20; ++i)
{
if(FE_399_SignalQuality_LookUp[i][0] >= Info.C_N)
{
*SignalQuality_p = FE_399_SignalQuality_LookUp[i][1];
break;
}
}
*Ber = Info.BER;
#endif
return(Error);
}
#ifndef STTUNER_MINIDRIVER
/* ----------------------------------------------------------------------------
Name: demod_d0399_GetModulation()
Description:
This routine returns the modulation scheme in use by this device.
Parameters:
Modulation, pointer to area to store modulation scheme.
Return Value:
---------------------------------------------------------------------------- */
ST_ErrorCode_t demod_d0399_GetModulation(DEMOD_Handle_t Handle, STTUNER_Modulation_t *Modulation)
{
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
const char *identity = "STTUNER d0399.c demod_d0399_GetModulation()";
#endif
FE_399_Error_t Error;
D0399_InstanceData_t *Instance;
Instance = D0399_GetInstFromHandle(Handle);
*Modulation = STTUNER_MOD_QPSK;
#ifdef STTUNER_DEBUG_MODULE_SATDRV_D0399
STTBX_Print(("%s Modulation=%u\n", identity, *Modulation));
#endif
return(Error);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -