⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmbsl10023.c

📁 Cu1216 解调器驱动
💻 C
📖 第 1 页 / 共 5 页
字号:
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 + -