📄 tmbsl8260.c
字号:
// 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 + -