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

📄 tmbsl8260.c

📁 卫星解码器相关代码解析
💻 C
📖 第 1 页 / 共 2 页
字号:
// FUNCTION:    tmbsl8260SetRf:
//
// DESCRIPTION: Set the PLL of the 8260
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TMBSL_ERR_TUNER_BAD_PARAMETER
//              TMBSL_ERR_IIC_ERR
//              TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl8260SetRf(
    tmUnitSelect_t  TunerUnit,     //  I: Tuner unit number
    UInt32          uRf            //  I: Frequency in hertz
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > TDA8260_MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g8260Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    // don't test the RF to qvoid side effect
    //if(uRf < TDA8260_RF_MIN || uRf > TDA8260_RF_MAX)
    //    return TMBSL_ERR_TUNER_BAD_PARAMETER;

    //--------------
    // set the value
    //--------------
    // calculate the tuner reg
    tda8260CalcReg(&g8260Instance[TunerUnit], uRf);

    // write in the tuner
	if (g8260Instance[TunerUnit].systemFunc.SY_Write(
        g8260Instance[TunerUnit].uHwAddress,
        0, 4, g8260Instance[TunerUnit].pTunerReg) != 1)
        return TMBSL_ERR_IIC_ERR;

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl8260GetRf:
//
// DESCRIPTION: Get the frequency programmed in the tuner
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_OK
//
// NOTES:       The value returned is the one stored in the object
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl8260GetRf(
    tmUnitSelect_t  TunerUnit,     //  I: Tuner unit number
    UInt32*         puRf           //  O: Frequency in hertz
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > TDA8260_MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g8260Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    //--------------
    // get the value
    //--------------
    // the read function can't be used
    *puRf = g8260Instance[TunerUnit].uRfProg;

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl8260SetConfig:
//
// DESCRIPTION: Set the config of the 8260
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_ERR_NOT_SUPPORTED
//              TMBSL_ERR_TUNER_BAD_PARAMETER
//              TM_OK
//
// NOTES:
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl8260SetConfig(
    tmUnitSelect_t     TunerUnit,  //  I: TunerUnit number
    UInt32             uItemId,    //  I: Identifier of the item to modify
    UInt32             uValue      //  I: Value to set for the config item
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > TDA8260_MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g8260Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    //--------------
    // set the value
    //--------------
    switch((tm8260cfgIndex_t)uItemId)
    {
    case BOARD:
        // default hardware config
        g8260Instance[TunerUnit].config.uXtall         = OM57XX_XTAL_DEF;
        g8260Instance[TunerUnit].config.bDivRatio      = OM57XX_DIVRATIO_DEF;
        g8260Instance[TunerUnit].config.bPrescaler     = OM57XX_PRESCALER_DEF;
        g8260Instance[TunerUnit].config.bCpump         = OM57XX_CPUMP_DEF;

		// specific soft config
		// none

		// specific board config
		// none

        // store board
        g8260Instance[TunerUnit].config.uBoard = uValue;
        break;

    case XTALL:
        g8260Instance[TunerUnit].config.uXtall = uValue;
        break;
    case DIVRATIO:
        g8260Instance[TunerUnit].config.bDivRatio = (UInt8)uValue;
        break;
    case PRESCALER:
        g8260Instance[TunerUnit].config.bPrescaler = (UInt8)uValue;
        break;
    case CPUMP:
        g8260Instance[TunerUnit].config.bCpump = (UInt8)uValue;
        break;
    default:
        return TMBSL_ERR_TUNER_BAD_PARAMETER;
    }

    // init
    tda8260Init(&g8260Instance[TunerUnit]);

    return TM_OK;
}


//-----------------------------------------------------------------------------
// FUNCTION:    tmbsl8260GetConfig:
//
// DESCRIPTION: Get the config of the 8260
//
// RETURN:      TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
//              TMBSL_ERR_TUNER_NOT_INITIALIZED
//              TM_OK
//
// NOTES:       
//-----------------------------------------------------------------------------
//
tmErrorCode_t
tmbsl8260GetConfig(
    tmUnitSelect_t     TunerUnit,  //  I: Tuner unit number
    UInt32             uItemId,    //  I: Identifier of the item to modify
    UInt32*            puValue     //  I: Value to set for the config item
    )
{
    //----------------------
    // test input parameters
    //----------------------
    // test the instance number
    if (TunerUnit > TDA8260_MAX_UNITS)
        return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;

    // test the object
    if (g8260Instance[TunerUnit].init == False)
        return TMBSL_ERR_TUNER_NOT_INITIALIZED;

    //--------------
    // get the value
    //--------------
    switch((tm8260cfgIndex_t)uItemId)
    {
    case BOARD:
        *puValue = g8260Instance[TunerUnit].config.uBoard;
        break;
    case XTALL:
        *puValue = g8260Instance[TunerUnit].config.uXtall;
        break;
    case DIVRATIO:
        *puValue = g8260Instance[TunerUnit].config.bDivRatio;
        break;
    case PRESCALER:
        *puValue = g8260Instance[TunerUnit].config.bPrescaler;
        break;
    case CPUMP:
        *puValue = g8260Instance[TunerUnit].config.bCpump;
        break;
    case GETNBOFUNIT:
        *puValue = TDA8260_MAX_UNITS;
        break;
    default:
        return TMBSL_ERR_TUNER_BAD_PARAMETER;
    }

    return TM_OK;
}


//-----------------------------------------------------------------------------
// Internal functions:
//-----------------------------------------------------------------------------
//

//-----------------------------------------------------------------------------
// FUNCTION:    tda8260Init:
//
// DESCRIPTION: Initialisation of the tuner
//
// RETURN:      always True
//
// NOTES:       Calcute only the frequency step, regarding to the config
//-----------------------------------------------------------------------------
//
Bool
tda8260Init (
    ptm8260object_t p8260object	    // I: tuner object
    )
{
    // calculate the frequency step
    p8260object->uPllStep = p8260object->config.uXtall;
    if (p8260object->config.bPrescaler)
        p8260object->uPllStep <<= 1;
    switch(p8260object->config.bDivRatio)
    {
        case 0:
            p8260object->uPllStep += 1;
            p8260object->uPllStep /= 2;
            break;
        case 1:
            p8260object->uPllStep += 2;
            p8260object->uPllStep /= 4;
            break;
        case 2:
            p8260object->uPllStep += 4;
            p8260object->uPllStep /= 8;
            break;
        case 3:
            p8260object->uPllStep += 8;
            p8260object->uPllStep /= 16;
            break;
        case 4:
            p8260object->uPllStep += 16;
            p8260object->uPllStep /= 32;
            break;
        case 5:
            p8260object->uPllStep += 32;
            p8260object->uPllStep /= 64;
            break;
        case 6:
            p8260object->uPllStep += 64;
            p8260object->uPllStep /= 128;
            break;
        case 7:
            p8260object->uPllStep += 128;
            p8260object->uPllStep /= 256;
            break;
        case 8:
            p8260object->uPllStep /= 12;
            p8260object->uPllStep /= 24;
            break;
        case 9:
            p8260object->uPllStep += 2;
            p8260object->uPllStep /= 5;
            break;
        case 10:
            p8260object->uPllStep += 5;
            p8260object->uPllStep /= 10;
            break;
        case 11:
            p8260object->uPllStep += 10;
            p8260object->uPllStep /= 20;
            break;
        case 12:
            p8260object->uPllStep += 20;
            p8260object->uPllStep /= 40;
            break;
        case 13:
            p8260object->uPllStep += 40;
            p8260object->uPllStep /= 80;
            break;
        case 14:
            p8260object->uPllStep += 80;
            p8260object->uPllStep /= 160;
            break;
        case 15:
            p8260object->uPllStep += 160;
            p8260object->uPllStep /= 320;
            break;
    }

    // return value
    return True;

}

//-----------------------------------------------------------------------------
// FUNCTION:    tda8260CalcReg:
//
// DESCRIPTION: Calculate the value to set in the registers of the tuner
//
// RETURN:      always true
//
// NOTES:       This function doesn't write in the tuner
//-----------------------------------------------------------------------------
//
Bool
tda8260CalcReg (
    ptm8260object_t p8260object,    // I: tuner object
    UInt32          uRf             // I: frequency in hertz
    )
{
    UInt32 uFreqPll;

	// calculate N0-N16
	uFreqPll  = uRf + p8260object->uPllStep/2;
    uFreqPll /= p8260object->uPllStep;

    // real frequency programmed
	p8260object->uRfProg = uFreqPll*p8260object->uPllStep;

    //-------------
   	// byte 0 and 1
    //-------------
	p8260object->pTunerReg[0] = (UInt8)(uFreqPll >> 8);
    p8260object->pTunerReg[1] = (UInt8)uFreqPll;

    //-------
    // byte 2
     //------
   p8260object->pTunerReg[2]  = 0xC0;
    if ( p8260object->config.bDivRatio < 3 )
        p8260object->pTunerReg[2] |= (p8260object->config.bDivRatio << 1) & 0x0E;
    if ( p8260object->config.bDivRatio == 3 )
        p8260object->pTunerReg[2] |= 0x0A;
    if ( p8260object->config.bDivRatio == 4 )
        p8260object->pTunerReg[2] |= 0x0E;

    //-------
    // byte 3
    //-------
    if (p8260object->config.bCpump != 0)
    {
        // mode not auto
        p8260object->pTunerReg[3] = (p8260object->config.bCpump-1) << 6;
    }
    else
    {
        // auto mode
        if (uRf < 1450000000)
            p8260object->pTunerReg[3] = 0 << 6;
        else if (uRf < 1800000000)
            p8260object->pTunerReg[3] = 1 << 6;
        else if (uRf < 2000000000)
            p8260object->pTunerReg[3] = 2 << 6;
        else
            p8260object->pTunerReg[3] = 3 << 6;
    }

    return True;
}

⌨️ 快捷键说明

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