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

📄 tmbsl10046.c

📁 TDA10046驱动源代码.TDA10046是PHILIPS的一款DVB-T TUNER
💻 C
📖 第 1 页 / 共 5 页
字号:
    case tmhalFERfOffsetNull:
        uAutoOffset = 0;
        uOffset = 0x00;
        break;
    case tmhalFERfOffsetPlus125:
    case tmhalFERfOffsetPlus166:
        uAutoOffset = 0;
        uOffset = 0x20;
        break;
    case tmhalFERfOffsetMinus125:
    case tmhalFERfOffsetMinus166:
        uAutoOffset = 0;
        uOffset = 0x40;
        break;
    case tmhalFERfOffsetPlus333:
        uAutoOffset = 0;
        uOffset = 0x60;
        break;
    case tmhalFERfOffsetMinus333:
        uAutoOffset = 0;
        uOffset = 0x80;
        break;
    case tmhalFERfOffsetPlus500:
        uAutoOffset = 0;
        uOffset = 0xA0;
        break;
    case tmhalFERfOffsetMinus500:
        uAutoOffset = 0;
        uOffset = 0xC0;
        break;
    }
    
    // write registers
	g10046Instance[demodUnit].systemFunc.SY_WriteBit(
		g10046Instance[demodUnit].uDemodHwAdd,
		TDA10046_AUTO_IND, TDA10046_AUTO_AUTOOFFSET_BIT, uAutoOffset);
	g10046Instance[demodUnit].systemFunc.SY_WriteBit(
		g10046Instance[demodUnit].uDemodHwAdd,
		TDA10046_IN_CONF1_IND, TDA10046_INCONF1_OFFSET_MSK, uOffset);
	g10046Instance[demodUnit].systemFunc.SY_WriteBit(
		g10046Instance[demodUnit].uDemodHwAdd,
		TDA10046_IN_CONF2_IND, TDA10046_INCONF2_OFFSET_MSK, uOffset << 1);

    // save auto mode
    if (uAutoOffset)
        g10046Instance[demodUnit].sApiFlags.iAutoOffset = 1;
    else
        g10046Instance[demodUnit].sApiFlags.iAutoOffset = 0;

    // extended offset activated
    if (g10046Instance[demodUnit].sConfig.bExtOffset == True)
    {
        //TODO:Extended offset
    }

    //----------------------
    // Frequency
    //----------------------
    if (Tda10046WriteRF(&g10046Instance[demodUnit], uRF, eRFO) == False)
		return TM_FALSE;

    // store the initial value
    g10046Instance[demodUnit].eStartOffset = eRFO;

	// start algo
	g10046Instance[demodUnit].sApiFlags.iStartAlgo = True;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046GetRF
//
// DESCRIPTION: this function gets the current RF Frequency.
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED    
//				TM_OK
//
// NOTES:       the value sotcked in the object is returned
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046GetRF (
    tmUnitSelect_t      demodUnit,		// I: Demod unit number
    UInt32			    *puRF,			// O: RF frequency (KHz)
	tmhalFERfOffset_t   *peRFO			// O: RF offset
)
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //----------------------
    // Implementation
    //----------------------
	*puRF = g10046Instance[demodUnit].sCurrentChannel.uRF;
	*peRFO = g10046Instance[demodUnit].sCurrentChannel.eRFO;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046SetCS
//
// DESCRIPTION: this function set the channel spacing
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED
//              TMBSL_ERR_DEMOD_BAD_PARAMETER
//				TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046SetCS (
    tmUnitSelect_t      demodUnit,		//  I: Demod unit number
    UInt32			    uCS				//  I: Channel spacing (hertz)
)
{
    UInt32 a_uTimeWref[5], uGpioSpDs1Byte, uWref, uInvWref;

    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

	// test the parameter value
	if (uCS < TDA10046_CS_MIN || uCS > TDA10046_CS_MAX)
        return TMBSL_ERR_DEMOD_BAD_PARAMETER;

    //----------------------
    // Implementation
    //----------------------
    switch (uCS)
    {
    case 8000000:
        uWref = g10046Instance[demodUnit].uWref8;
        uInvWref = g10046Instance[demodUnit].uInvWref8;
        uGpioSpDs1Byte = 0xFF;
        break;
    case 7000000:
        uWref = g10046Instance[demodUnit].uWref7;
        uInvWref = g10046Instance[demodUnit].uInvWref7;
        uGpioSpDs1Byte = 0x00;
        break;
    case 6000000:
        uWref = g10046Instance[demodUnit].uWref6;
        uInvWref = g10046Instance[demodUnit].uInvWref6;
        uGpioSpDs1Byte = 0x00;
        break;
    default :
        return TMBSL_ERR_DEMOD_BAD_PARAMETER;
    }

    // build register values
    a_uTimeWref[0] = (UInt32)(uInvWref >> 4);
    a_uTimeWref[1] = (UInt32)((uInvWref << 2 | uWref >> 24) & 0x3F);
    a_uTimeWref[2] = (UInt32)((uWref >> 16) & 0xFF);
    a_uTimeWref[3] = (UInt32)((uWref >> 8) & 0xFF);
    a_uTimeWref[4] = (UInt32)(uWref & 0xFF);

    // set the tuner in case of saw filter switching
	g10046Instance[demodUnit].tunerFunc.setCfgFunc(
        g10046Instance[demodUnit].eTunerUnit,
        tmhalFETunerBandwidth , uCS);

    // write the wref registers
	g10046Instance[demodUnit].systemFunc.SY_Write(
		g10046Instance[demodUnit].uDemodHwAdd,
        TDA10046_TIME_WREF_1_IND, 5, a_uTimeWref);

    // set the GPIO1 pin for external devices
	g10046Instance[demodUnit].systemFunc.SY_Write(
        g10046Instance[demodUnit].uDemodHwAdd,
        TDA10046_GPIO_SP_DS1_IND, 1, &uGpioSpDs1Byte);

    // update current config
	g10046Instance[demodUnit].sCurrentChannel.uCS = uCS;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046GetCS
//
// DESCRIPTION: this function returns the channel spacing
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED    
//				TM_OK
//
// NOTES:       the value stored in the object is returned
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046GetCS (
    tmUnitSelect_t      demodUnit,			//  I: Demod unit number
    UInt32			    *puCS				//  I: Channel Spacing (Hertz)
)
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //----------------------
    // Implementation
    //----------------------
	*puCS = g10046Instance[demodUnit].sCurrentChannel.uCS;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046SetSI
//
// 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
tmbsl10046SetSI (
    tmUnitSelect_t      demodUnit,			//  I: Demod unit number
	tmhalFESpectrum_t	eSI 				//  I: Spectral Inversion
)
{
    UInt32 uSi;

    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[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
    //----------------------
	if (eSI == tmhalFESpectrumInverted)
        uSi = TDA10046_CONFC1_INVQ_BIT;
    else
		uSi = 0;

	// check if I/Q are swapped outside the chip
    if (g10046Instance[demodUnit].sConfig.bIQ_Swapped)
	{
        // invert
        if (uSi == 0)
            uSi = TDA10046_CONFC1_INVQ_BIT;
        else
            uSi = 0;
    }

    // write the spectral inversion
	g10046Instance[demodUnit].systemFunc.SY_WriteBit(
		g10046Instance[demodUnit].uDemodHwAdd, 
		TDA10046_CONF_C1_IND, TDA10046_CONFC1_INVQ_BIT, uSi);

    // update value
	g10046Instance[demodUnit].sCurrentChannel.eSI = eSI;

	// start algo
	g10046Instance[demodUnit].sApiFlags.iStartAlgo = True;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046GetSI
//
// 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
tmbsl10046GetSI (
    tmUnitSelect_t      demodUnit,			//  I: Demod unit number
	tmhalFESpectrum_t	*peSI    			//  O: Spectral Inversion
)
{
    //UInt32 uSi;

    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

    //----------------------
    // Implementation
    //----------------------
	*peSI = g10046Instance[demodUnit].sCurrentChannel.eSI;

    return TM_OK;
}

//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl10046SetVRHP
//
// DESCRIPTION: this function programs the viterbi rate for the high priority channel
//
// RETURN:		TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER
//				TMBSL_ERR_DEMOD_NOT_INITIALIZED    
//              TMBSL_ERR_DEMOD_BAD_PARAMETER
//				TM_OK
//
// NOTES:       the auto mode is managed by Tda10046UseTPSbit()
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl10046SetVRHP (
    tmUnitSelect_t          demodUnit,			//  I: Demod unit number
	tmhalFEDepuncRate_t	    eVRHP				//  I: Viterbi Rate for HP
)
{
    UInt32 uVrHp;

	//----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (demodUnit > TDA10046_MAX_UNITS)
        return TMBSL_ERR_DEMOD_BAD_UNIT_NUMBER;

    // test the object
    if (g10046Instance[demodUnit].sApiFlags.iInit == False)
        return TMBSL_ERR_DEMOD_NOT_INITIALIZED;

	// test the parameter value
	if (eVRHP >= tmhalFEDepuncRateMax)
        return TMBSL_ERR_DEMOD_BAD_PARAMETER;

    //----------------------
    // Implementation
    //----------------------
    switch (eVRHP)
    {
    case tmhalFEDepuncRateAuto:
        break;
    case tmhalFEDepuncRate12:
        uVrHp = 0x00;
        break;
    case tmhalFEDepuncRate23:
        uVrHp = 0x01;
        break;
    case tmhalFEDepuncRate34:
        uVrHp = 0x02;
        break;
    case tmhalFEDepuncRate56:
        uVrHp = 0x03;
        break;
    case tmhalFEDepuncRate78:
        uVrHp = 0x04;
        break;
    default:
        return TMBSL_ERR_DEMOD_BAD_PARAMETER;
    }

    // write High Priority inner code rate

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -