📄 tmbsl10023.c
字号:
tmErrorCode_t
tmbsl10023GetSR (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 *puSR // O: Symbol rate (bauds)
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
*puSR = g10023Instance[demodUnit].sCurrentChannel.uSR;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10023SetSI
//
// DESCRIPTION: this function programs the spectral inversion
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TMBSL_ERR_DEMOD_BAD_PARAMETER
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10023SetSI (
tmUnitSelect_t demodUnit, // I: Demod unit number
tmhalFESpectrum_t eSI // I: Spectral Inversion
)
{
UInt32 uSi;
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
// test the parameter value
if (eSI >= tmhalFESpectralInvMax || eSI < tmhalFESpectrumAuto)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
//----------------------
// Implementation
//----------------------
switch (eSI)
{
case tmhalFESpectrumAuto:
g10023Instance[demodUnit].sApiFlags.iAutoSi = True;
return TM_OK;
case tmhalFESpectrumNormal:
g10023Instance[demodUnit].sApiFlags.iAutoSi = False;
if (g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
uSi = TDA10023_CARCONF_INVIQ_BIT;
else
uSi = 0;
break;
case tmhalFESpectrumInverted:
g10023Instance[demodUnit].sApiFlags.iAutoSi = False;
if (g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
uSi = 0;
else
uSi = TDA10023_CARCONF_INVIQ_BIT;
break;
default:
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
}
// write the spectral inversion
if(g10023Instance[demodUnit].sApiFlags.iAutoSi == False)
{
g10023Instance[demodUnit].systemFunc.SY_WriteBit(
g10023Instance[demodUnit].uDemodHwAdd,
TDA10023_CARCONF_IND,
TDA10023_CARCONF_AUTOINVIQ_BIT | TDA10023_CARCONF_INVIQ_BIT,
uSi);
}
else
{
g10023Instance[demodUnit].systemFunc.SY_WriteBit(
g10023Instance[demodUnit].uDemodHwAdd,
TDA10023_CARCONF_IND,
TDA10023_CARCONF_AUTOINVIQ_BIT,
TDA10023_CARCONF_AUTOINVIQ_BIT);
}
// update value
g10023Instance[demodUnit].sCurrentChannel.eSI = eSI;
// start algo
g10023Instance[demodUnit].sApiFlags.iStartAlgo = True;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10023GetSI
//
// DESCRIPTION: this function reads the spectral inversion regarding to the value of the
// IQswapped at the input of the tuner.
// 0: no spectral inversion else spectral inversion.
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
// NOTES: the register is readed each time
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10023GetSI (
tmUnitSelect_t demodUnit, // I: Demod unit number
tmhalFESpectrum_t *peSI // O: Spectral Inversion
)
{
UInt32 uSi;
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
g10023Instance[demodUnit].systemFunc.SY_Read(
g10023Instance[demodUnit].uDemodHwAdd, TDA10023_CARCONF_IND, 1, &uSi);
// test different cases regarding to the spectral inversion in the tuner
if ((uSi & TDA10023_CARCONF_INVIQ_BIT) && g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
*peSI = tmhalFESpectrumNormal;
else if ((uSi & TDA10023_CARCONF_INVIQ_BIT) && !g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
*peSI = tmhalFESpectrumInverted;
else if (!(uSi & TDA10023_CARCONF_INVIQ_BIT) && g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
*peSI = tmhalFESpectrumInverted;
else if (!(uSi & TDA10023_CARCONF_INVIQ_BIT) && !g10023Instance[demodUnit].sConfig.bTUN_IQSwap)
*peSI = tmhalFESpectrumNormal;
// update value
g10023Instance[demodUnit].sCurrentChannel.eSI = *peSI;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10023SetMod
//
// DESCRIPTION: this function programs the modulation
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TMBSL_ERR_DEMOD_BAD_PARAMETER
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10023SetMod (
tmUnitSelect_t demodUnit, // I: Demod unit number
tmhalFEModulation_t eMOD // I: Modulation type
)
{
UInt32 uMod;
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
// test the parameter value
if (eMOD >= tmhalFEModulationMax)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
// !!!! TO BE REMOVED !!!!
if (eMOD == tmhalFEModulationAuto)
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
// In MCNS mode, only 64QAM and 256QAM are allowed
if ((g10023Instance[demodUnit].sConfig.bModeDvbMcns) &&
(eMOD != tmhalFEModulationAuto) &&
(eMOD != tmhalFEModulationQam64) &&
(eMOD != tmhalFEModulationQam256) )
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
//----------------------
// Implementation
//----------------------
switch (eMOD)
{
case tmhalFEModulationAuto:
g10023Instance[demodUnit].sApiFlags.iAutoQam = True;
uMod = 2;
break;
case tmhalFEModulationQam4:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 5;
break;
case tmhalFEModulationQam16:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 0;
break;
case tmhalFEModulationQam32:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 1;
break;
case tmhalFEModulationQam64:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 2;
break;
case tmhalFEModulationQam128:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 3;
break;
case tmhalFEModulationQam256:
g10023Instance[demodUnit].sApiFlags.iAutoQam = False;
uMod = 4;
break;
default:
return TMBSL_ERR_DEMOD_BAD_PARAMETER;
}
// write the new modulation
Tda10023WriteQAM(&g10023Instance[demodUnit], uMod);
// update current config
if (tmhalFEModulationAuto == eMOD)
g10023Instance[demodUnit].sCurrentChannel.eMOD = tmhalFEModulationQam64;
else
g10023Instance[demodUnit].sCurrentChannel.eMOD = eMOD;
// start algo
g10023Instance[demodUnit].sApiFlags.iStartAlgo = True;
return TM_OK;
}
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10023GetMod
//
// DESCRIPTION: this function reads the current modulation
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10023GetMod (
tmUnitSelect_t demodUnit, // I: Demod unit number
tmhalFEModulation_t *peMOD // O: Modulation type
)
{
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
*peMOD = g10023Instance[demodUnit].sCurrentChannel.eMOD;
return TM_OK;
}
//-----------------------------------------------------------------------------
// Status functions:
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// FUNCTION: tmbsl10023GetBER
//
// DESCRIPTION: this function reads the BER
//
// RETURN: TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
// TMBSL_ERR_DEMOD_NOT_INITIALIZED
// TM_OK
//
// NOTES: the ber value read needs to be corrected due to the real
// counter depth for 10e5
//
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10023GetBER (
tmUnitSelect_t demodUnit, // I: Demod unit number
UInt32 *puBer // O: BER
)
{
UInt32 puBerBuf[3], puUncorBuf[2], uBerDepth;
UInt32 uUncor;
UInt32 uMeanBer;
static UInt32 *psuPrevBer = Null;
static UInt32 suIndex=0;
static UInt32 suWindowSize = 0;
//----------------------
// test input parameters
//----------------------
// test the instance number
if (demodUnit > TDA10023_MAX_UNITS)
return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;
// test the object
if (g10023Instance[demodUnit].sApiFlags.iInit == False)
return TMBSL_ERR_DEMOD_NOT_INITIALIZED;
//----------------------
// Implementation
//----------------------
if(g10023Instance[demodUnit].sConfig.bModeDvbMcns)
{
// MCNS mode
// Read RSBER
g10023Instance[demodUnit].systemFunc.SY_Read(g10023Instance[demodUnit].uDemodHwAdd,
TDA10023_RSBERLO_IND, 2, puBerBuf);
// Read RSUNCOR
g10023Instance[demodUnit].systemFunc.SY_Read(g10023Instance[demodUnit].uDemodHwAdd,
TDA10023_RSUNCORLO_IND, 2, puUncorBuf);
*puBer = puBerBuf[1]<<8 | puBerBuf[0];
uUncor = puUncorBuf[1]<<8 | puUncorBuf[0];
// We consider that there are 16 wrong bits per uncor
*puBer += (uUncor*16);
// read the BER depth
g10023Instance[demodUnit].systemFunc.SY_Read(g10023Instance[demodUnit].uDemodHwAdd,
TDA10023_RSCFG_IND, 1, &uBerDepth);
if(((uBerDepth & TDA10023_RSCFG_PRG_TBER_MSK)>>2) == 0x01)
{
if(g10023Instance[demodUnit].sConfig.uBERwindow != 0)
{
UInt32 i;
// If not already done, configure sliding window
if(suWindowSize != g10023Instance[demodUnit].sConfig.uBERwindow)
{
if(psuPrevBer != Null)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -