summaryrefslogtreecommitdiffstats
path: root/api/TDA18271_C2_Askey.c
diff options
context:
space:
mode:
Diffstat (limited to 'api/TDA18271_C2_Askey.c')
-rw-r--r--api/TDA18271_C2_Askey.c3637
1 files changed, 3637 insertions, 0 deletions
diff --git a/api/TDA18271_C2_Askey.c b/api/TDA18271_C2_Askey.c
new file mode 100644
index 0000000..e299158
--- /dev/null
+++ b/api/TDA18271_C2_Askey.c
@@ -0,0 +1,3637 @@
+//-----------------------------------------------------------------------------
+// $Header:
+// (C) Copyright 2001 NXP Semiconductors, All rights reserved
+//
+// This source code and any compilation or derivative thereof is the sole
+// property of NXP Corporation and is provided pursuant to a Software
+// License Agreement. This code is the proprietary information of NXP
+// Corporation and is confidential in nature. Its use and dissemination by
+// any party other than NXP Corporation is strictly limited by the
+// confidential information provisions of the Agreement referenced above.
+//-----------------------------------------------------------------------------
+// FILE NAME: tmbslTDA18271_C2_Askey.c
+//
+// DESCRIPTION: Function for the Hybrid silicon tuner TDA18271
+//
+// DOCUMENT REF:
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Standard include files:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Project include files:
+//-----------------------------------------------------------------------------
+//
+#include "TDA18271local_C2_Askey.h"
+#include "TDA18271_C2_Askey.h"
+#include "TDA18271StaticInstance_C2_Askey.h"
+#include "standard.h"
+
+//-----------------------------------------------------------------------------
+// Types and defines:
+//-----------------------------------------------------------------------------
+//
+#define FEQ_OFFSET 0
+
+//-----------------------------------------------------------------------------
+// Global data:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Internal Prototypes:
+//-----------------------------------------------------------------------------
+//
+Bool_ SY_Write_C2_Askey(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t_C2_Askey pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ for (i = 0; i < uNbData; i++)
+ {
+ uBuffer[i] = (UInt8)pDataBuff[i];
+ }
+
+ pObj = &gTDA18271Instance_C2_Askey[0];
+
+ dwError = Standard_writeTunerRegisters (pObj->AFAInfo_C2_Askey.demodulator, pObj->AFAInfo_C2_Askey.chip,
+ (unsigned short)uSubAddress, (UInt8)uNbData, uBuffer);
+
+ if (dwError == 0) RetStatus = True;
+
+ return (RetStatus);
+};
+
+Bool_ SY_Read_C2_Askey(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t_C2_Askey pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ pObj = &gTDA18271Instance_C2_Askey[0];
+
+ dwError = Standard_readTunerRegisters (pObj->AFAInfo_C2_Askey.demodulator, pObj->AFAInfo_C2_Askey.chip, (UInt16)uSubAddress, (UInt8)uNbData, uBuffer);
+
+ if (dwError == 0)
+ {
+ RetStatus = True;
+
+ for (i = 0; i < uNbData; i++)
+ {
+ pDataBuff[i] = (UInt32)uBuffer[i];
+ }
+ }
+
+ return (RetStatus);
+};
+
+
+Bool_ SY_Write_Slave_C2_Askey(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t_C2_Askey pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ for (i = 0; i < uNbData; i++)
+ {
+ uBuffer[i] = (UInt8)pDataBuff[i];
+ }
+
+ pObj = &gTDA18271Instance_C2_Askey[1];
+
+ dwError = Standard_writeTunerRegisters (pObj->AFAInfo_C2_Askey.demodulator, pObj->AFAInfo_C2_Askey.chip,
+ (unsigned short)uSubAddress, (UInt8)uNbData, uBuffer);
+
+ if (dwError == 0) RetStatus = True;
+
+ return (RetStatus);
+};
+
+Bool_ SY_Read_Slave_C2_Askey(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t_C2_Askey pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ pObj = &gTDA18271Instance_C2_Askey[1];
+
+ dwError = Standard_readTunerRegisters (pObj->AFAInfo_C2_Askey.demodulator, pObj->AFAInfo_C2_Askey.chip, (UInt16)uSubAddress, (UInt8)uNbData, uBuffer);
+
+ if (dwError == 0)
+ {
+ RetStatus = True;
+
+ for (i = 0; i < uNbData; i++)
+ {
+ pDataBuff[i] = (UInt32)uBuffer[i];
+ }
+ }
+
+ return (RetStatus);
+};
+//-----------------------------------------------------------------------------
+// Exported functions:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271Init:
+//
+// DESCRIPTION: create an instance of a TDA18271_C2_Askey Tuner
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271Init_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmbslTuParam_t_C2_Askey Param // I: setup parameters
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ //----------------------
+ // initialize the Object
+ //----------------------
+ // pObj initialization
+ getInstance_C2_Askey(TunerUnit, &pObj);
+
+ // return if already initialized
+ if (pObj != Null && pObj->init == True)
+ return TM_OK;
+
+ //----------------
+ // init the Object
+ //----------------
+ // initialize the Object
+// if (pObj == Null)
+// {
+ ret = allocInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK || pObj == Null)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // initialize the Object by default values
+ pObj->SystemFunc = Param.systemFunc;
+ pObj->uHwAddress = Param.uHwAddress;
+ pObj->init = True;
+// }
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271DeInit:
+//
+// DESCRIPTION: destroy an instance of a TDA18271 Tuner
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271DeInit_C2_Askey
+(
+ tmUnitSelect_t TunerUnit // I: Tuner unit number
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ //----------------------
+ // De-initialize the Object
+ //----------------------
+ // pObj initialization
+ getInstance_C2_Askey(TunerUnit, &pObj);
+
+ // return if already initialized
+ if (pObj == Null || pObj->init == False)
+ return TM_OK;
+
+ //----------------
+ // Deinit the Object
+ //----------------
+ // initialize the Object
+ if (pObj != Null)
+ {
+ pObj->init = False;
+ ret = deAllocInstance_C2_Askey(TunerUnit);
+ }
+
+ return ret;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetSWVersion:
+//
+// DESCRIPTION: Return the version of this device
+//
+// RETURN: TM_OK
+//
+// NOTES: Values defined in the tmTDA18271Local.h file
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetSWVersion_C2_Askey
+(
+ ptmSWVersion_t_C2_Askey pSWVersion // I: Receives SW Version
+ )
+{
+ pSWVersion->compatibilityNr = TDA18271_BSL_COMP_NUM_C2_Askey;
+ pSWVersion->majorVersionNr = TDA18271_BSL_MAJOR_VER_C2_Askey;
+ pSWVersion->minorVersionNr = TDA18271_BSL_MINOR_VER_C2_Askey;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetPowerState_C2_Askey:
+//
+// DESCRIPTION: Set the power state of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271SetPowerState_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271PowerState_t_C2_Askey powerState_C2_Askey // I: Power state of this device
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // set power state
+ return TDA18271SetPowerState_C2_Askey(pObj, powerState_C2_Askey);
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271SetPowerState_C2_Askey:
+//
+// DESCRIPTION: Set the power state of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271SetPowerState_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ tmTDA18271PowerState_t_C2_Askey powerState // I: Power state of this device
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ switch (powerState)
+ {
+ case tmPowerNormalMode_C2_Askey:
+ // set SM bits
+ pObj->I2CMap.uBx05.bF.SM = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
+ break;
+
+ case tmPowerSleepMode_C2_Askey:
+ // set SM bits
+ pObj->I2CMap.uBx05.bF.SM = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x01;
+ break;
+
+ case tmPowerStandbyWith16MHz_C2_Askey:
+ // set SM bits
+ pObj->I2CMap.uBx05.bF.SM = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
+ break;
+
+ case tmPowerStandbyWith16MHzAndLoopThrough_C2_Askey:
+ // set SM bits
+ pObj->I2CMap.uBx05.bF.SM = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
+ break;
+
+ case tmPowerStandbyWithLoopThrough_C2_Askey:
+ // set SM bits
+ pObj->I2CMap.uBx05.bF.SM = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x01;
+ break;
+
+ default:
+ // power state not supported
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ }
+
+ // store powerstate
+ pObj->curPowerState = powerState;
+
+ return TM_OK;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetPowerState_C2_Askey:
+//
+// DESCRIPTION: Get the power state of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetPowerState_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271PowerState_t_C2_Askey *pPowerState_C2_Askey // O: Power state of this device
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // get power state
+ return TDA18271GetPowerState_C2_Askey(pObj, pPowerState_C2_Askey);
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271GetPowerState_C2_Askey:
+//
+// DESCRIPTION: Get the power state of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271GetPowerState_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ tmTDA18271PowerState_t_C2_Askey *pPowerState// I: Power state of this device
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //----------------------
+ // get the value
+ //----------------------
+ if ((pObj->I2CMap.uBx05.bF.SM == 0x00) && (pObj->I2CMap.uBx05.bF.SM_LT == 0x00) && (pObj->I2CMap.uBx05.bF.SM_XT == 0x00))
+ *pPowerState = tmPowerNormalMode_C2_Askey;
+ else if ((pObj->I2CMap.uBx05.bF.SM == 0x01) && (pObj->I2CMap.uBx05.bF.SM_LT == 0x01) && (pObj->I2CMap.uBx05.bF.SM_XT == 0x01))
+ *pPowerState = tmPowerSleepMode_C2_Askey;
+ else if ((pObj->I2CMap.uBx05.bF.SM == 0x01) && (pObj->I2CMap.uBx05.bF.SM_LT == 0x01) && (pObj->I2CMap.uBx05.bF.SM_XT == 0x00))
+ *pPowerState = tmPowerStandbyWith16MHz_C2_Askey;
+ else if ((pObj->I2CMap.uBx05.bF.SM == 0x01) && (pObj->I2CMap.uBx05.bF.SM_LT == 0x00) && (pObj->I2CMap.uBx05.bF.SM_XT == 0x00))
+ *pPowerState = tmPowerStandbyWith16MHzAndLoopThrough_C2_Askey;
+ else if ((pObj->I2CMap.uBx05.bF.SM == 0x01) && (pObj->I2CMap.uBx05.bF.SM_LT == 0x00) && (pObj->I2CMap.uBx05.bF.SM_XT == 0x01))
+ *pPowerState = tmPowerStandbyWithLoopThrough_C2_Askey;
+ else
+ *pPowerState = tmPowerNotSupported_C2_Askey;
+
+ return TM_OK;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetStandardMode_C2_Askey:
+//
+// DESCRIPTION: Set the standard mode of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271SetStandardMode_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271StandardMode_t_C2_Askey StandardMode // I: Standard mode of this device
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // set standard mode
+ return TDA18271SetStandardMode_C2_Askey(pObj, StandardMode);
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271SetStandardMode_C2_Askey:
+//
+// DESCRIPTION: Set the standard mode of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271SetStandardMode_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ tmTDA18271StandardMode_t_C2_Askey StandardMode// I: Standard mode of this device
+ )
+{
+ Bool_ customIF = FALSE;
+ Bool_ customLPFc = FALSE;
+ UInt8 stdValue = 0;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // set custom IF flag
+ if (((pObj->Config.uPROTOCOLSTEP & 0x02) >> 1) == 0x01)
+ customIF = TRUE;
+
+ // set custom LPFc flag
+ if (((pObj->Config.uPROTOCOLSTEP & 0x01) >> 0) == 0x01)
+ customLPFc = TRUE;
+
+ // set uIF & Std
+ switch (StandardMode)
+ {
+ case tmDigital_TV_ATSC_6MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 3250000;
+ // set Std bit
+ stdValue = 0x1C;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_DVBT_7MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 3500000;
+ // set Std bit
+ stdValue = 0x1C;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_DVBT_8MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 4000000;
+ // set Std bit
+ stdValue = 0x1D;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_MN_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 5400000;
+#else
+ pObj->Config.uIF = 5750000;
+#endif
+ // set Std bit
+ stdValue = 0x0C;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_B_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 6400000;
+#else
+ pObj->Config.uIF = 6750000;
+#endif
+ // set Std bit
+ stdValue = 0x0D;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_GH_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 6750000;
+#else
+ pObj->Config.uIF = 7750000;
+#endif
+ // set Std bit
+ stdValue = 0x0E;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_I_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 7250000;
+#else
+ pObj->Config.uIF = 7750000;
+#endif
+ // set Std bit
+ stdValue = 0x0E;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_DK_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 6850000;
+#else
+ pObj->Config.uIF = 7750000;
+#endif
+ // set Std bit
+ stdValue = 0x0E;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_L_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+#if FEQ_OFFSET
+ pObj->Config.uIF = 6750000;
+#else
+ pObj->Config.uIF = 7750000;
+#endif
+ // set Std bit
+ stdValue = 0x0E;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_LL_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 1250000;
+ // set Std bit
+ stdValue = 0x0E;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_FM_Radio_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 1250000;
+ // set Std bit
+ stdValue = 0x18;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x01;
+ break;
+
+ case tmDigital_CAL_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 1250000;
+ // set Std bit
+ stdValue = 0x18;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x01;
+ break;
+
+ case tmDigital_TV_QAM_6MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 4000000;
+ // set Std bit
+ stdValue = 0x1D;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_QAM_8MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 5000000;
+ // set Std bit
+ stdValue = 0x1F;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_ISDBT_6MHz_C2_Askey:
+ // set IF frequency
+ if (!customIF)
+ pObj->Config.uIF = 4063000;
+ // set Std bit
+ stdValue = 0x1D;
+ pObj->I2CMap.uBx05.bF.Std = (!customLPFc) ? stdValue : (pObj->I2CMap.uBx05.bF.Std & 0xE3) | (stdValue & 0x1C);
+ // set FM_RFn bit
+ pObj->I2CMap.uBx06.bF.FM_RFn = 0x00;
+ break;
+ }
+
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+
+ // set IF_Level & IF_notch & RFAGC_Top & IFAGC_Top
+ switch (StandardMode)
+ {
+ case tmDigital_TV_ATSC_6MHz_C2_Askey:
+ case tmDigital_TV_DVBT_7MHz_C2_Askey:
+ case tmDigital_TV_DVBT_8MHz_C2_Askey:
+ case tmDigital_TV_QAM_6MHz_C2_Askey:
+ case tmDigital_TV_QAM_8MHz_C2_Askey:
+ case tmDigital_TV_ISDBT_6MHz_C2_Askey:
+ // set IF_Level
+ pObj->I2CMap.uBx06.bF.IF_Level = 0x01;
+ // set IF_notch
+ pObj->I2CMap.uBx0C.bF.IF_notch = 0x01;
+ // set RFAGC_Top & IFAGC_Top
+ pObj->I2CMap.uBx25.EXTENDED_BYTE_22 = 0x37;
+ break;
+
+ case tmAnalog_TV_MN_C2_Askey:
+ case tmAnalog_TV_B_C2_Askey:
+ case tmAnalog_TV_GH_C2_Askey:
+ case tmAnalog_TV_I_C2_Askey:
+ case tmAnalog_TV_DK_C2_Askey:
+ case tmAnalog_TV_L_C2_Askey:
+ case tmAnalog_TV_LL_C2_Askey:
+ case tmAnalog_FM_Radio_C2_Askey:
+ case tmDigital_CAL_C2_Askey:
+ // set IF_Level
+ pObj->I2CMap.uBx06.bF.IF_Level = 0x00;
+ // set IF_notch
+ pObj->I2CMap.uBx0C.bF.IF_notch = 0x00;
+ // set RFAGC_Top & IFAGC_Top
+ pObj->I2CMap.uBx25.EXTENDED_BYTE_22 = 0x2C;
+ break;
+
+ default:
+ // standard mode not supported
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ }
+
+ // store standard mode
+ pObj->StandardMode = StandardMode;
+
+ return TM_OK;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetStandardMode_C2_Askey:
+//
+// DESCRIPTION: Get the standard mode of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetStandardMode_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271StandardMode_t_C2_Askey *pStandardMode // O: Standard mode of this device
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // get standard mode
+ return TDA18271GetStandardMode_C2_Askey(pObj, pStandardMode);
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetStandardMode_C2_Askey:
+//
+// DESCRIPTION: Get the standard mode of this device.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271GetStandardMode_C2_Askey
+(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ tmTDA18271StandardMode_t_C2_Askey *pStandardMode // O: Standard mode of this device
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_BAD_PARAMETER_C2_Askey;
+
+ //----------------------
+ // get the value
+ //----------------------
+ *pStandardMode = pObj->StandardMode;
+
+ return TM_OK;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271Write_C2_Askey:
+//
+// DESCRIPTION: Write in the Tuner.
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES: uIndex: IN parameter containing the HW Sub Address as specified in
+// the datasheet (i.e. looks like 0xX0)
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271Write_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uIndex, // I: Start index to write
+ UInt32 uNbBytes, // I: Number of bytes to write
+ UInt32* puBytes // I: Pointer on an array of bytes
+ )
+{
+
+ UInt32 uCounter;
+ UInt8* pI2CMap;
+
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // test the parameters. uIndex is: 0x0X
+ if ((uIndex + uNbBytes) > TDA18271_NB_BYTES_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_PARAMETER_C2_Askey;
+
+ // pI2CMap initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + uIndex;
+
+ //--------------
+ // set the value
+ //--------------
+ // save the values written in the Tuner
+ for (uCounter = 0; uCounter < uNbBytes; uCounter++)
+ {
+ *pI2CMap = (UInt8)(puBytes[uCounter]);
+ pI2CMap ++;
+ }
+
+ // write in the Tuner
+ if (TDA18271Write_C2_Askey(pObj,(UInt8)(uIndex),(UInt8)(uNbBytes)) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ return TM_OK;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271WriteBit_C2_Askey:
+//
+// DESCRIPTION: Write in the Tuner.
+//
+// RETURN: TM_ERR_NOT_SUPPORTED
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271WriteBit_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uIndex, // I: Start index to write
+ UInt32 uBitMask, // I: bit mask
+ UInt32 uBitValue // I: bit value
+ )
+{
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271Read_C2_Askey:
+//
+// DESCRIPTION: Read in the Tuner.
+//
+// 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
+tmbslTDA18271Read_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uIndex, // I: Start index to read
+ UInt32 uNbBytes, // I: Number of bytes to read
+ UInt32* puBytes // I: Pointer on an array of bytes
+ )
+{
+ UInt32 uCounter;
+ UInt8* pI2CMap;
+
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // test the parameters
+ if (uNbBytes > TDA18271_NB_BYTES_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_PARAMETER_C2_Askey;
+
+ // test uIndex
+ if (uIndex == -1)
+ uIndex = 0;
+
+ // pI2CMap initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + uIndex;
+
+ //--------------
+ // get the value
+ //--------------
+ // read from the Tuner
+ if (TDA18271Read_C2_Askey(pObj,(UInt8)(uIndex),(UInt8)(uNbBytes)) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // copy readen values to puBytes
+ for (uCounter = 0; uCounter < uNbBytes; uCounter++)
+ {
+ *puBytes = (UInt32)(*pI2CMap);
+ pI2CMap ++;
+ puBytes ++;
+ }
+ return TM_OK;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetConfig_C2_Askey:
+//
+// DESCRIPTION: Set the Config of the TDA18271_C2_Askey
+//
+// 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
+tmbslTDA18271SetConfig_C2_Askey
+(
+ 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
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ UInt8* pI2CMap;
+ UInt32* pDataMap;
+ tmErrorCode_t ret = TM_OK;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //--------------
+ // set the value
+ //--------------
+ switch((tmTDA18271cfgIndex_t_C2_Askey)uItemId)
+ {
+ case BOARD_C2_Askey:
+ switch (uValue & 0xffff0000)
+ {
+ case OM5776_BOARD_DEF:
+ case OM5780_BOARD_DEF:
+ case OM5782_BOARD_DEF:
+ case OM5764_BOARD_DEF:
+ /*pObj->Config.uXTOUT = 1;
+ pObj->I2CMap.XTout_ON = 1;*/
+ break;
+ case OM5770C2_BOARD_DEF & 0xffff0000:
+ case OM5775_BOARD_DEF:
+ case OM5777_BOARD_DEF:
+ case CUSTOM_BOARD_DEF:
+ // do nothing more than setting the default values
+ break;
+ default:
+ // board not supported
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ }
+ // store board
+ gTDA18271Instance_C2_Askey[TunerUnit].Config.uBoard = uValue;
+ break;
+
+ case FEINIT_C2_Askey:
+ if(TDA18271Init_C2_Askey(TunerUnit) == TMBSL_ERR_IIC_ERR_C2_Askey)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case RF_C2_Askey:
+ // set RF_C2_Askey frequency
+ pObj->Config.uRF = uValue;
+ break;
+
+ case IF_C2_Askey:
+ // set IF_C2_Askey frequency
+ pObj->Config.uIF = uValue;
+ break;
+
+ case PLMODE_C2_Askey:
+ // set uPLMODE_C2_Askey
+ pObj->Config.uPLMODE = uValue;
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case PLRUN_C2_Askey:
+ // switch AGC2_C2_Askey power detector on
+ pObj->I2CMap.uBx1B.bF.PD_AGC2_Det = 0x00;
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // switch power level indicator on
+ pObj->Config.uPLMODE = 0x00;
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 20 ms for charge pump source
+ if (TDA18271Wait_C2_Askey(pObj,20) == False)
+ return TM_FALSE;
+
+ // read bytes 0x00 to 0x0F
+ if (TDA18271Read_C2_Askey (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // switch power level indicator off
+ pObj->Config.uPLMODE = 0x01;
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // switch AGC2 power detector off
+ pObj->I2CMap.uBx1B.bF.PD_AGC2_Det = 0x01;
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ break;
+
+ case POWERSTATE_C2_Askey:
+ // set POWERSTATE
+ TDA18271SetPowerState_C2_Askey (pObj, (tmTDA18271PowerState_t_C2_Askey)uValue);
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case STANDARDMODE_C2_Askey:
+ // set STANDARDMODE_C2_Askey
+ TDA18271SetStandardMode_C2_Askey (pObj, (tmTDA18271StandardMode_t_C2_Askey)uValue);
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+ // write bytes EASY_PROG_BYTE_3 & EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x05,2) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ // write MAIN_POST_DIV_BYTE
+ if (TDA18271Write_C2_Askey(pObj,0x0C,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ // write byte EXTENDED_BYTE_22
+ if (TDA18271Write_C2_Askey(pObj,0x25,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case LPFC_C2_Askey:
+ // set LP_Fc_C2_Askey
+ pObj->I2CMap.uBx05.bF.Std = (pObj->I2CMap.uBx05.bF.Std & 0xFC) | ((UInt8)uValue & 0x03);
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case XTOUT_C2_Askey:
+ // set XTout_ON_C2_Askey
+ pObj->I2CMap.uBx06.bF.XTout_ON = (UInt8)(uValue) >> 1;
+ // set Xtout_400mV
+ pObj->I2CMap.uBx06.bF.Xtout_400mV = (UInt8)(uValue) & 0x01;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case IFLEVEL_C2_Askey:
+ // set IF_Level_C2_Askey
+ pObj->I2CMap.uBx06.bF.IF_Level = (UInt8)uValue;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case EXTENDEDREG_C2_Askey:
+ // set Extended_Reg_C2_Askey
+ pObj->I2CMap.uBx07.bF.Extended_Reg = (UInt8)uValue;
+ // write byte EASY_PROG_BYTE_5
+ if (TDA18271Write_C2_Askey(pObj,0x07,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case MAPNAME_C2_Askey:
+ // set map name
+ pObj->Config.uMAPNAME = uValue;
+ break;
+
+ case MAPCOLUMN_C2_Askey:
+ // set map x
+ pObj->Config.uMAPCOLUMN = uValue;
+ break;
+
+ case MAPROW_C2_Askey:
+ // set map y
+ pObj->Config.uMAPROW = uValue;
+ break;
+
+ case MAPVALUE_C2_Askey:
+ // set pointer on wanted cell
+ switch (pObj->Config.uMAPNAME)
+ {
+ case tmTDA18271_IR_MEAS_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_MEAS_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_IR_MEAS_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.IR_MEAS_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_IR_CAL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_CAL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_IR_CAL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.IR_CAL_Map[pObj->Config.uMAPROW].uRF);
+ break;
+
+ case tmTDA18271_BP_FILTER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_BP_FILTER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_BP_FILTER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.BP_FILTER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_BAND_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_BAND_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_BAND_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_BAND_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_GAIN_TAPER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_GAIN_TAPER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_GAIN_TAPER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.GAIN_TAPER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_DC_OVER_DT_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_DC_OVER_DT_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_DC_OVER_DT_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_DC_OVER_DT_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_KMCO_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_KMCO_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_KMCO_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_KMCO_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_CID_TARGET_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_CID_TARGET_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_CID_TARGET_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_CID_TARGET_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_THERMOMETER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_THERMOMETER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_THERMOMETER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.THERMOMETER_Map[pObj->Config.uMAPROW].uTM_D);
+ break;
+
+ case tmTDA18271_CAL_PLL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_CAL_PLL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_CAL_PLL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.CAL_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_MAIN_PLL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_MAIN_PLL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_MAIN_PLL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.MAIN_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_I2C_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > 0) || (pObj->Config.uMAPROW > TDA18271_NB_BYTES_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pI2CMap initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + pObj->Config.uMAPROW;
+ break;
+ }
+
+ // set cell value
+ if (pObj->Config.uMAPNAME == tmTDA18271_I2C_Map_C2_Askey)
+ *(pI2CMap + (UInt8)pObj->Config.uMAPCOLUMN) = (UInt8)uValue;
+ else
+ *(pDataMap + pObj->Config.uMAPCOLUMN) = uValue;
+ break;
+
+ case PROTOCOLSTEP_C2_Askey:
+ // set channel configuration protocol steps to execute
+ pObj->Config.uPROTOCOLSTEP = uValue;
+ break;
+
+ case READINIT_C2_Askey:
+ // read bytes 0x00 to 0x26
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ if (uValue == 1)
+ {
+ // initialize device
+ if(TDA18271Init_C2_Askey(TunerUnit) == TMBSL_ERR_IIC_ERR_C2_Askey)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ }
+ break;
+ }
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetConfig_C2_Askey:
+//
+// DESCRIPTION: Get the Config of the TDA18271_C2_Askey
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetConfig_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uItemId, // I: Identifier of the item to get value
+ UInt32* puValue // I: Address of the variable to output the Config item value
+ )
+{
+ UInt32 uCounter = 0;
+
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ UInt8* pI2CMap;
+ UInt32* pDataMap;
+ UInt32 uByte=0;
+ tmErrorCode_t ret = TM_OK;
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //--------------
+ // get the value
+ //--------------
+ switch((tmTDA18271cfgIndex_t_C2_Askey)uItemId)
+ {
+ case BOARD_C2_Askey:
+ // get board
+ *puValue = pObj->Config.uBoard;
+ break;
+
+ case RF_C2_Askey:
+ // get RF_C2_Askey frequency
+ *puValue = pObj->Config.uRF;
+ break;
+
+ case IF_C2_Askey:
+ // get IF frequency
+ *puValue = pObj->Config.uIF;
+ break;
+
+ case STATUSBYTE_C2_Askey:
+ // read bytes 0x00 to 0x26
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case GETNBOFUNIT_C2_Askey:
+ *puValue = TDA18271_MAX_UNITS_C2_Askey;
+ break;
+
+ case ID_C2_Askey:
+ // get ID_C2_Askey value
+ *puValue = pObj->I2CMap.uBx00.bF.ID;
+ break;
+
+ case POR_C2_Askey:
+ // get POR_C2_Askey value
+ *puValue = pObj->I2CMap.uBx01.bF.POR;
+ break;
+
+ case MAINLOCK_C2_Askey:
+ // get MAINLOCK value
+ *puValue = TunerUnit == 0 ? pObj->I2CMap.uBx01.bF.MAIN_Lock : pObj->I2CMap.uBx16.bF.CAL_Lock;
+ break;
+
+ case TMVALUE_C2_Askey:
+ // read byte THERMO_BYTE
+ if (TDA18271ThermometerRead_C2_Askey(pObj, puValue) != TM_OK || pObj->I2CMap.uBx05.bF.SM == 1)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ case PLMODE_C2_Askey:
+ // get PLMODE value
+ *puValue = pObj->Config.uPLMODE;
+ break;
+
+ case PLAGC1_C2_Askey:
+ // get PLAGC1 value
+ *puValue = 3 * (2 + ((pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x7F) >> 5));
+ break;
+
+ case PLAGC2_C2_Askey:
+ // get PLAGC2 value
+ *puValue = 3 * (2 + (3 - (pObj->I2CMap.uBx03.bF.Power_Level_8 << 1 | pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 >> 7)));
+ break;
+
+ case PLRFAGC_C2_Askey:
+ // get PLRFAGC value (PLRFAGC = PLRFAGC - 11)
+ if (((pObj->I2CMap.uBx25.EXTENDED_BYTE_22 & 0x7F) >> 4) < 5)
+ *puValue = 11 + (92 + 2 * ((pObj->I2CMap.uBx25.EXTENDED_BYTE_22 & 0x7F) >> 4)) - (103 - (pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x1F));
+ else
+ *puValue = 11 + 102 - (103 - (pObj->I2CMap.uBx02.bF.Power_Level_7_to_0 & 0x1F));
+ // limit PLRFAGC value
+ if (*puValue > 33)
+ *puValue = 33;
+ else if (*puValue < 1)
+ *puValue = 1;
+ break;
+
+ case RFCALOK_C2_Askey:
+ // get RFCALOK value
+ *puValue = pObj->I2CMap.uBx03.bF.RF_CAL_OK;
+ break;
+
+ case RFCAL_TCOMP_C2_Askey:
+ // get RFCAL_TCOMP value
+ *puValue = pObj->Config.uRFCAL_TCOMP;
+ break;
+
+ case IRCALOK_C2_Askey:
+ // get IRCALOK value
+ *puValue = pObj->I2CMap.uBx03.bF.IR_CAL_OK;
+ break;
+
+ case BPFILTER_C2_Askey:
+ // get BPFILTER value
+ *puValue = pObj->I2CMap.uBx03.bF.BP_Filter;
+ break;
+
+ case RFBAND_C2_Askey:
+ // get RFBAND_C2_Askey value
+ *puValue = pObj->I2CMap.uBx04.bF.RF_Band;
+ break;
+
+ case GAINTAPER_C2_Askey:
+ // get GAINTAPER_C2_Askey value
+ *puValue = pObj->I2CMap.uBx04.bF.Gain_Taper;
+ break;
+
+ case POWERSTATE_C2_Askey:
+ // get POWERSTATE_C2_Askey
+ TDA18271GetPowerState_C2_Askey(pObj,(ptmTDA18271PowerState_t_C2_Askey)puValue);
+ break;
+
+ case LPFC_C2_Askey:
+ // get LPFC_C2_Askey value
+ *puValue = pObj->I2CMap.uBx05.bF.Std & 0x03;
+ break;
+
+ case FMRFN_C2_Askey:
+ // get FMRFN_C2_Askey value
+ *puValue = pObj->I2CMap.uBx06.bF.FM_RFn;
+ break;
+
+ case STANDARDMODE_C2_Askey:
+ // get STANDARDMODE_C2_Askey
+ TDA18271GetStandardMode_C2_Askey(pObj, (ptmTDA18271StandardMode_t_C2_Askey)puValue);
+ break;
+
+ case XTOUT_C2_Askey:
+ // get XTout_ON & Xtout_400mV value
+ *puValue = (UInt32)(pObj->I2CMap.uBx06.bF.XTout_ON << 1 | pObj->I2CMap.uBx06.bF.Xtout_400mV);
+ break;
+
+ case IFLEVEL_C2_Askey:
+ // get IFLEVEL_C2_Askey value
+ *puValue = pObj->I2CMap.uBx06.bF.IF_Level;
+ break;
+
+ case EXTENDEDREG_C2_Askey:
+ // get EXTENDEDREG_C2_Askey value
+ *puValue = pObj->I2CMap.uBx07.bF.Extended_Reg;
+ break;
+
+ case CALPOSTDIV_C2_Askey:
+ // get CALPOSTDIV_C2_Askey value
+ *puValue = pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE & 0x7F;
+ break;
+
+ case CALDIV_C2_Askey:
+ // get CALDIV_C2_Askey value
+ *puValue = pObj->I2CMap.uBx09.bF.CAL_Div_22_to_16 << 16 | pObj->I2CMap.uBx0A.bF.CAL_Div_15_to_8 << 8 | pObj->I2CMap.uBx0B.bF.CAL_Div_7_to_0;
+ break;
+
+ case MAINPOSTDIV_C2_Askey:
+ // get MAINPOSTDIV_C2_Askey value
+ *puValue = pObj->I2CMap.uBx0C.bF.MAIN_Post_Div;
+ break;
+
+ case MAINDIV_C2_Askey:
+ // get MAINDIV_C2_Askey value
+ *puValue = pObj->I2CMap.uBx0D.bF.MAIN_Div_22_to_16 << 16 | pObj->I2CMap.uBx0E.bF.MAIN_Div_15_to_8 << 8 | pObj->I2CMap.uBx0F.bF.MAIN_Div_7_to_0;
+ break;
+
+ case MAPVALUE_C2_Askey:
+ // set pointer on wanted cell
+ switch (pObj->Config.uMAPNAME)
+ {
+ case tmTDA18271_IR_MEAS_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_MEAS_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_IR_MEAS_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.IR_MEAS_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_IR_CAL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_CAL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_IR_CAL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.IR_CAL_Map[pObj->Config.uMAPROW].uRF);
+ break;
+
+ case tmTDA18271_BP_FILTER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_BP_FILTER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_BP_FILTER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.BP_FILTER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_BAND_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_BAND_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_BAND_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_BAND_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_GAIN_TAPER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_GAIN_TAPER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_GAIN_TAPER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.GAIN_TAPER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_DC_OVER_DT_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_DC_OVER_DT_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_DC_OVER_DT_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_DC_OVER_DT_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_KMCO_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_KMCO_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_KMCO_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_KMCO_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_CID_TARGET_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_CID_TARGET_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_CID_TARGET_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.RF_CAL_CID_TARGET_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_THERMOMETER_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_THERMOMETER_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_THERMOMETER_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.THERMOMETER_Map[pObj->Config.uMAPROW].uTM_D);
+ break;
+
+ case tmTDA18271_CAL_PLL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_CAL_PLL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_CAL_PLL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.CAL_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_MAIN_PLL_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_MAIN_PLL_NB_COLUMNS_C2_Askey - 1) || (pObj->Config.uMAPROW > TDA18271_MAIN_PLL_NB_ROWS_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pDataMap initialization
+ pDataMap = &(pObj->Config.MAIN_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_I2C_Map_C2_Askey:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > 0) || (pObj->Config.uMAPROW > TDA18271_NB_BYTES_C2_Askey - 1))
+ return TM_ERR_NOT_SUPPORTED_C2_Askey;
+ // pI2CMap initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + pObj->Config.uMAPROW;
+ break;
+ }
+ // get cell value
+ if (pObj->Config.uMAPNAME == tmTDA18271_I2C_Map_C2_Askey)
+ *puValue = *(pI2CMap + pObj->Config.uMAPCOLUMN);
+ else
+ *puValue = *(pDataMap + pObj->Config.uMAPCOLUMN);
+ break;
+
+ case PROTOCOLSTEP_C2_Askey:
+ // get channel configuration protocol steps
+ *puValue = pObj->Config.uPROTOCOLSTEP;
+ break;
+
+ // backdoor functions
+ case IDENTITY_C2_Askey:
+ _SYSTEMFUNC.SY_Read_C2_Askey( pObj->uHwAddress, TDA18271_IDENTITY_IND_C2_Askey, 1, &uByte);
+ /*if (uByte != 0x82)
+ *puValue = False;
+ else
+ *puValue = True;
+ */
+ switch (pObj->Config.uBoard & 0xffff0000)
+ {
+ case 0x57750000:
+ *puValue = True;
+ break;
+ default:
+ *puValue = False;
+ break;
+ }
+ break;
+
+ }
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetRf_C2_Askey:
+//
+// DESCRIPTION: Calculate i2c I2CMap & write in TDA18271_C2_Askey
+//
+// 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
+tmbslTDA18271SetRf_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uRF // I: RF frequency in hertz
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj;
+ tmErrorCode_t ret = TM_OK;
+
+ UInt32 uCounter = 0;
+ UInt32 uTMVALUE_CURRENT = 0;
+ UInt8 utmpStd = 0;
+
+ UInt8 uCprog_table = 0;
+ Int32 uCapprox = 0;
+ Int32 uCprog_signed = 0;
+
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // Config.uRF update
+ pObj->Config.uRF = uRF;
+
+ //----------------------
+ // configuration reset
+ //----------------------
+ // set power level indicator to off
+ pObj->Config.uPLMODE = 1;
+
+ //----------------------
+ // normal mode restore
+ //----------------------
+ // power up in calibration standard
+ pObj->I2CMap.uBx05.bF.SM = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x5,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //----------------------
+ // RF tracking filter correction
+ //----------------------
+ // sense temperature
+ ret = TDA18271ThermometerRead_C2_Askey(pObj, &uTMVALUE_CURRENT);
+ if (ret != TM_OK)
+ return ret;
+
+ //----------------------
+ // frequency dependent parameters update
+ //----------------------
+ // search for uCprog_table corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS_C2_Askey);
+ uCprog_table = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+
+ // search for sub-band corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS_C2_Askey);
+
+ // calculate Capprox
+ if (pObj->Config.RF_BAND_Map[uCounter - 1].uRF1 == 0)
+ {
+ // Capprox = uCprog_table
+ uCapprox = (Int32)uCprog_table;
+ }
+ else if ((pObj->Config.RF_BAND_Map[uCounter - 1].uRF3 != 0) && (uRF >= pObj->Config.RF_BAND_Map[uCounter - 1].uRF2))
+ {
+ // Capprox = A2 * (uRF - uRF2) + B2 + uCprog_table
+ uCapprox = (Int32)(((pObj->Config.RF_BAND_Map[uCounter - 1].uRF_A2 * ((Int32)(uRF - pObj->Config.RF_BAND_Map[uCounter - 1].uRF2) / 1000000)) / 1000000)
+ + pObj->Config.RF_BAND_Map[uCounter - 1].uRF_B2 + uCprog_table);
+ }
+ else
+ {
+ // Capprox = A1 * (uRF - uRF1) + B1 + uCprog_table
+ uCapprox = (Int32)(((pObj->Config.RF_BAND_Map[uCounter - 1].uRF_A1 * ((Int32)(uRF - pObj->Config.RF_BAND_Map[uCounter - 1].uRF1) / 1000000)) / 1000000)
+ + pObj->Config.RF_BAND_Map[uCounter - 1].uRF_B1 + uCprog_table);
+ }
+
+ // search for udC_Over_dT corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_CAL_DC_OVER_DT_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_DC_OVER_DT_NB_ROWS_C2_Askey);
+
+ // calculate CTcomp
+ pObj->Config.uRFCAL_TCOMP = (Int32)(pObj->Config.RF_CAL_DC_OVER_DT_Map[uCounter - 1].udC_Over_dT * (uTMVALUE_CURRENT - pObj->Config.uTMVALUE_RFCAL)) / 1000;
+
+ // calculate Cprog
+ uCprog_signed = uCapprox + pObj->Config.uRFCAL_TCOMP;
+ if (uCprog_signed < 0) uCprog_signed = 0;
+ if (uCprog_signed > 255) uCprog_signed = 255;
+ pObj->I2CMap.uBx1D.RFC_Cprog = (UInt8)uCprog_signed;
+
+ // write byte RFC_Cprog
+ if (TDA18271Write_C2_Askey(pObj,0x1D,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //----------------------
+ // standard mode update
+ //----------------------
+ // update TV broadcast parameters
+ ret = TDA18271SetStandardMode_C2_Askey(pObj, pObj->StandardMode);
+ if (ret != TM_OK)
+ return ret;
+
+ // switch RFAGC to high speed mode (store current value)
+ utmpStd = pObj->I2CMap.uBx05.bF.Std;
+ pObj->I2CMap.uBx05.bF.Std &= 0x1B;
+
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x5,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+#ifdef TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+ /////////////////////////////////////////////
+ //----------------------
+ // unfreeze AGC 1&2 detectors for secam L only
+ //----------------------
+ switch (pObj->StandardMode)
+ {
+ case tmAnalog_TV_L_C2_Askey:
+ case tmAnalog_TV_LL_C2_Askey:
+ // switch to digital mode
+ pObj->I2CMap.uBx05.bF.Std |= 0x10;
+
+ // start AGC1
+ pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x00;
+ pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x00;
+
+ // start AGC2
+ pObj->I2CMap.uBx1B.bF.PD_AGC2_Det = 0x00;
+ pObj->I2CMap.uBx24.bF.AGC2_loop_off = 0x00;
+
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ default:
+ // start AGC1
+ pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x00;
+ pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x00;
+
+ // freeze AGC2 (set AGC2Gain = -6dB)
+ pObj->I2CMap.uBx1B.bF.PD_AGC2_Det = 0x01;
+ pObj->I2CMap.uBx24.bF.AGC2_loop_off = 0x01;
+ pObj->I2CMap.uBx24.bF.AGC2_Gain = 0x03;
+ break;
+ }
+
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+#endif // TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+
+ // write bytes EXTENDED_BYTE_21 to EXTENDED_BYTE_23
+ if (TDA18271Write_C2_Askey(pObj,0x24,3) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+#ifdef TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+ switch (pObj->StandardMode)
+ {
+ case tmAnalog_TV_L_C2_Askey:
+ case tmAnalog_TV_LL_C2_Askey:
+ // wait 1 s for AGC 1&2 startup
+ TDA18271Wait_C2_Askey(pObj,1000);
+ break;
+ }
+ /////////////////////////////////////////////
+#endif // TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+
+ //----------------------
+ // update frequency dependent parameters
+ //----------------------
+ // search for IR_Meas corresponding to wanted frequency
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.IR_MEAS_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_IR_MEAS_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx07.bF.IR_Meas = (UInt8)pObj->Config.IR_MEAS_Map[uCounter - 1].uIR_Meas;
+
+ // search for BP_Filter corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.BP_FILTER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_BP_FILTER_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx03.bF.BP_Filter = (UInt8)pObj->Config.BP_FILTER_Map[uCounter - 1].uBP_Filter;
+
+ // search for RF_BAND corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;
+
+ // search for Gain_Taper corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_GAIN_TAPER_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;
+
+ //---------------------
+ // dual tuner and AGC1 extra configuration management
+ //---------------------
+ // use MAIN VCO when master, CAL VCO when slave
+ pObj->I2CMap.uBx10.bF.CALVCO_forLOn = (TunerUnit == 0) ? 1 : 0;
+
+ // AGC1 & AGC2 management
+ pObj->I2CMap.uBx10.bF.AGC1_always_mastern = 0x00;
+ pObj->I2CMap.uBx10.bF.AGC1_firstn = 0x00;
+
+ // write byte EXTENDED_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x10,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //---------------------
+ // tune to wanted channel frequency
+ //---------------------
+ // use MAIN VCO when master, CAL VCO when slave
+ if (TunerUnit == 0) // master
+ {
+ // calculate MAIN PLL
+ if (TDA18271CalcMAINPLL_C2_Askey(pObj, uRF + pObj->Config.uIF) == False)
+ return TM_FALSE;
+
+ // write bytes 0x01 to 0x0F
+ if (TDA18271Write_C2_Askey(pObj,0x01,15) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // MAIN pll charge pump source
+ pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x01;
+ // write byte EXTENDED_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 1 ms for charge pump source
+ if (TDA18271Wait_C2_Askey(pObj,1) == False)
+ return TM_FALSE;
+
+ // MAIN pll normal operation
+ pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x00;
+ // write byte EXTENDED_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ }
+ else // slave
+ {
+ // calculate CAL PLL
+ if (TDA18271CalcCALPLL_C2_Askey(pObj, uRF + pObj->Config.uIF) == False)
+ return TM_FALSE;
+
+ // copy CAL PLL PostDiv to MAIN PLL Post Div
+ pObj->I2CMap.uBx0C.bF.MAIN_Post_Div = pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE & 0x77;
+
+ // write bytes 0x01 to 0x0F
+ if (TDA18271Write_C2_Askey(pObj,0x01,15) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // CAL pll charge pump source
+ pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x01;
+ // write byte EXTENDED_BYTE_7
+ if (TDA18271Write_C2_Askey(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 1 ms for charge pump source
+ if (TDA18271Wait_C2_Askey(pObj,1) == False)
+ return TM_FALSE;
+
+ // CAL pll normal operation
+ pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x00;
+ // write byte EXTENDED_BYTE_7
+ if (TDA18271Write_C2_Askey(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ }
+
+ // wait 20 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,20) == False)
+ return TM_FALSE;
+
+ // switch RFAGC to normal mode (restore previous value)
+ pObj->I2CMap.uBx05.bF.Std = utmpStd;
+
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x5,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+#ifdef TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+ /////////////////////////////////////////////
+ //----------------------
+ // freeze AGC 1&2 detectors for secam L only
+ //----------------------
+ switch (pObj->StandardMode)
+ {
+ case tmAnalog_TV_L_C2_Askey:
+ case tmAnalog_TV_LL_C2_Askey:
+ // switch back to analog mode
+ pObj->I2CMap.uBx05.bF.Std &= 0xEF;
+
+ // freeze AGC1
+ pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x01;
+ pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x01;
+
+ // freeze AGC2
+ pObj->I2CMap.uBx1B.bF.PD_AGC2_Det = 0x01;
+ pObj->I2CMap.uBx24.bF.AGC2_loop_off = 0x01;
+// break;
+
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write bytes EXTENDED_BYTE_21
+ if (TDA18271Write_C2_Askey(pObj,0x24,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+
+ default:
+ pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x01;
+ pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x01;
+
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ break;
+ }
+ /////////////////////////////////////////////
+#endif // TMBSL_TDA18271_FREEZE_AGC_C2_Askey
+
+ // read bytes 0x00 to 0x26
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetRf_C2_Askey:
+//
+// 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
+tmbslTDA18271GetRf_C2_Askey
+(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32* pRF // O: RF frequency in hertz
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //----------------------
+ // get the value
+ //----------------------
+ // the read function can't be used
+ *pRF = pObj->Config.uRF;
+
+ return TM_OK;
+}
+
+//-----------------------------------------------------------------------------
+// Internal functions:
+//-----------------------------------------------------------------------------
+//
+#ifndef NXPFE
+//-----------------------------------------------------------------------------
+// FUNCTION: allocInstance:
+//
+// DESCRIPTION: allocate new instance
+//
+// RETURN:
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+allocInstance_C2_Askey (
+ UInt32 DeviceUnit, // I: Device unit number
+ pptmTDA18271Object_t_C2_Askey ppDrvObject // I: Device Object
+ )
+{
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (DeviceUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // return value
+ return getInstance_C2_Askey(DeviceUnit, ppDrvObject);
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: deAllocInstance:
+//
+// DESCRIPTION: deallocate instance
+//
+// RETURN: always TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+deAllocInstance_C2_Askey (
+ UInt32 DeviceUnit // I: Device unit number
+ )
+{
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (DeviceUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // return value
+ return TM_OK;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: getInstance:
+//
+// DESCRIPTION: get the instance
+//
+// RETURN: always True
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+getInstance_C2_Askey (
+ tmUnitSelect_t DeviceUnit, // I: Device unit number
+ pptmTDA18271Object_t_C2_Askey ppDrvObject // I: Device Object
+ )
+{
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (DeviceUnit > TDA18271_MAX_UNITS_C2_Askey)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER_C2_Askey;
+
+ // get instance
+ *ppDrvObject = &gTDA18271Instance_C2_Askey[DeviceUnit];
+
+ // return value
+ return TM_OK;
+}
+#endif // NXPFE
+
+//-----------------------------------------------------------------------------
+// FUNCTION: TDA18271Init_C2_Askey:
+//
+// DESCRIPTION: initialization of the Tuner
+//
+// RETURN: always True
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271Init_C2_Askey (
+ tmUnitSelect_t TunerUnit // I: Tuner Object
+ )
+{
+ ptmTDA18271Object_t_C2_Askey pObj = Null;
+ tmErrorCode_t ret = TM_OK;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // pObj initialization
+ ret = getInstance_C2_Askey(TunerUnit, &pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //----------------------
+ // configuration reset
+ //----------------------
+ // set power level indicator to off
+ pObj->Config.uPLMODE = 1;
+
+ //----------------------
+ // I2C map initialization
+ //----------------------
+ // set & write all bytes
+ pObj->I2CMap.uBx01.THERMO_BYTE = 0x08;
+ pObj->I2CMap.uBx02.POWER_LEVEL_BYTE = 0x80;
+ pObj->I2CMap.uBx03.EASY_PROG_BYTE_1 = 0xC6;
+ pObj->I2CMap.uBx04.EASY_PROG_BYTE_2 = 0xDF;
+ pObj->I2CMap.uBx05.EASY_PROG_BYTE_3 = 0x16;
+ pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x60;
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x80;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0x80;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x00;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.uBx0B.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0x00;
+ pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x00;
+ pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.uBx0F.MAIN_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.uBx10.EXTENDED_BYTE_1 = 0xFC;
+ pObj->I2CMap.uBx11.EXTENDED_BYTE_2 = 0x01;
+ pObj->I2CMap.uBx12.EXTENDED_BYTE_3 = 0x84;
+ pObj->I2CMap.uBx13.EXTENDED_BYTE_4 = 0x41;
+ pObj->I2CMap.uBx14.EXTENDED_BYTE_5 = 0x01;
+ pObj->I2CMap.uBx15.EXTENDED_BYTE_6 = 0x84;
+ pObj->I2CMap.uBx16.EXTENDED_BYTE_7 = 0x40;
+ pObj->I2CMap.uBx17.EXTENDED_BYTE_8 = 0x07;
+ pObj->I2CMap.uBx18.EXTENDED_BYTE_9 = 0x00;
+ pObj->I2CMap.uBx19.EXTENDED_BYTE_10 = 0x00;
+ pObj->I2CMap.uBx1A.EXTENDED_BYTE_11 = 0x96;
+ pObj->I2CMap.uBx1B.EXTENDED_BYTE_12 = 0x3F;
+ pObj->I2CMap.uBx1C.EXTENDED_BYTE_13 = 0xC1;
+ pObj->I2CMap.uBx1D.EXTENDED_BYTE_14 = 0x00;
+ pObj->I2CMap.uBx1E.EXTENDED_BYTE_15 = 0x8F;
+ pObj->I2CMap.uBx1F.EXTENDED_BYTE_16 = 0x00;
+ pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x00;
+ pObj->I2CMap.uBx21.EXTENDED_BYTE_18 = 0x8C;
+ pObj->I2CMap.uBx22.EXTENDED_BYTE_19 = 0x00;
+ pObj->I2CMap.uBx23.EXTENDED_BYTE_20 = 0x20;
+ pObj->I2CMap.uBx24.EXTENDED_BYTE_21 = 0xB3;
+ pObj->I2CMap.uBx25.EXTENDED_BYTE_22 = 0x48;
+ pObj->I2CMap.uBx26.EXTENDED_BYTE_23 = 0xB0;
+ if (TDA18271Write_C2_Askey(pObj,0x01,38) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //----------------------
+ // AGC1 gain setup
+ //----------------------
+ // AGC1_Gain_do
+ // update & write EXTENDED_BYTE_17
+ pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x00; // set gain_do address
+ if (TDA18271Write_C2_Askey(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x03; // keep gain_do address, set gain_do
+ if (TDA18271Write_C2_Askey(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // AGC1_Gain_up
+ // update & write EXTENDED_BYTE_17
+ pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x43; // set gain_up address, keep gain_do
+ if (TDA18271Write_C2_Askey(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ pObj->I2CMap.uBx20.EXTENDED_BYTE_17 = 0x4C; // keep gain_up address, set gain_up
+ if (TDA18271Write_C2_Askey(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //----------------------
+ // image rejection calibration - low band
+ //----------------------
+ // initialisation
+ pObj->I2CMap.uBx05.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x81;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xCC;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x6C;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.uBx0B.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0xC5;
+ pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x77;
+ pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x08;
+ pObj->I2CMap.uBx0F.MAIN_DIV_BYTE_3 = 0x00;
+ // write bytes EASY_PROG_BYTE_2 to MAIN_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x04,12) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch detector
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for wanted measurement
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // CAL pll update
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x85;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xCB;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x66;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x70;
+
+ // write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch optimisation algorithm
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 30 ms for image optimization completion
+ if (TDA18271Wait_C2_Askey(pObj,30) == False)
+ return TM_FALSE;
+
+ //----------------------
+ // image rejection calibration - mid band
+ //----------------------
+ // initialisation
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x82;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xA8;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0xA1;
+ pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x73;
+ pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0x1A;
+ // write bytes EASY_PROG_BYTE_3 to MAIN_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch detector
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for wanted measurement
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // CAL pll update
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x86;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0xA8;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x66;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0xA0;
+
+ // write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch optimisation algorithm
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 30 ms for image optimization completion
+ if (TDA18271Wait_C2_Askey(pObj,30) == False)
+ return TM_FALSE;
+
+ //----------------------
+ // image rejection calibration - high band
+ //----------------------
+ // initialisation
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x83;
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = 0x98;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x65;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.uBx0C.MAIN_POST_DIV_BYTE = 0x91;
+ pObj->I2CMap.uBx0D.MAIN_DIV_BYTE_1 = 0x71;
+ pObj->I2CMap.uBx0E.MAIN_DIV_BYTE_2 = 0xCD;
+ // write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch detector
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for wanted measurement
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // CAL pll update
+ pObj->I2CMap.uBx07.EASY_PROG_BYTE_5 = 0x87;
+ pObj->I2CMap.uBx09.CAL_DIV_BYTE_1 = 0x65;
+ pObj->I2CMap.uBx0A.CAL_DIV_BYTE_2 = 0x50;
+
+ // write bytes EASY_PROG_BYTE_3 to CAL_DIV_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch optimisation algorithm
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 30 ms for image optimization completion
+ if (TDA18271Wait_C2_Askey(pObj,30) == False)
+ return TM_FALSE;
+
+ //----------------------
+ // back to normal mode
+ //----------------------
+ // update & write byte EASY_PROG_BYTE_4
+ pObj->I2CMap.uBx06.EASY_PROG_BYTE_4 = 0x64;
+ if (TDA18271Write_C2_Askey(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // synchronization
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //----------------------
+ // RF tracking filters calibration
+ //----------------------
+ ret = TDA18271CalcRFFilterCurve_C2_Askey(pObj);
+ if (ret != TM_OK)
+ return ret;
+
+ //----------------------
+ // back to POR mode
+ //----------------------
+ // power up detector 1
+ pObj->I2CMap.uBx1B.bF.PD_AGC1_Det = 0x00;
+ // write byte EXTENDED_BYTE_12
+ if (TDA18271Write_C2_Askey(pObj,0x1B,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // turn AGC1 loop on
+ pObj->I2CMap.uBx21.bF.AGC1_loop_off = 0x00;
+ // set AGC1Gain = 6dB
+ pObj->I2CMap.uBx21.bF.AGC1_Gain = 0x00;
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set AGC2Gain = -6dB
+ pObj->I2CMap.uBx24.bF.AGC2_Gain = 0x03;
+
+ // swicth to POR mode
+ pObj->I2CMap.uBx05.bF.SM = 0x01;
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+ pObj->I2CMap.uBx05.bF.SM_XT = 0x00;
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x5,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // disable 1.5MHz low pass filter
+ pObj->I2CMap.uBx26.bF.ForceLP_Fc2_En = 0x00;
+ pObj->I2CMap.uBx26.bF.LP_Fc = 0x00;
+
+ // write bytes EXTENDED_BYTE_21 to EXTENDED_BYTE_23
+ if (TDA18271Write_C2_Askey(pObj,0x24,3) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: TDA18271InitTick_C2_Askey
+//
+// DESCRIPTION: this function will delay for the number of millisecond
+//
+// RETURN: nothing
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+Bool_
+TDA18271InitTick_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt16 wTime // I: time to wait for
+ )
+{
+ UInt32 uCurrentTick;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // get current tick
+ uCurrentTick = _SYSTEMFUNC.SY_GetTickTime();
+
+ // Calculate end tick
+ pObj->uTickEnd = (UInt32)wTime;
+ pObj->uTickEnd += _SYSTEMFUNC.SY_GetTickPeriod()/2;
+ pObj->uTickEnd /= _SYSTEMFUNC.SY_GetTickPeriod();
+ pObj->uTickEnd += uCurrentTick;
+
+ // always add 1 because of rounding issue
+ if (wTime)
+ pObj->uTickEnd++;
+
+ // test overflow
+ if (pObj->uTickEnd < uCurrentTick)
+ return False;
+ else
+ return True;
+}
+
+//-----------------------------------------------------------------------------
+// FUNCTION: TDA18271WaitTick_C2_Askey
+//
+// DESCRIPTION: this function will block for the number of millisecond
+//
+// RETURN: True if time has elapsed else False
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+Bool_
+TDA18271WaitTick_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj // I: Tuner unit number
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // test if time has elapsed
+ if (_SYSTEMFUNC.SY_GetTickTime() >= pObj->uTickEnd)
+ return True;
+ else
+ return False;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Write_C2_Askey
+//
+// DESCRIPTION: This function writes I2C data in the Tuner
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Write_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ )
+{
+ Bool_ I2CCommResult = TM_FALSE;
+
+ UInt8 uCounter;
+ UInt8* pI2CMap;
+ UInt32 WriteBuffer[TDA18271_NB_BYTES_C2_Askey] = {0};
+ UInt32* pWriteBuffer;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // force I2CMap
+ pObj->I2CMap.uBx03.bF.Dis_Power_level = (UInt8)pObj->Config.uPLMODE;
+
+ // pI2CMap & pWriteBuffer initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE);
+ pWriteBuffer = &(WriteBuffer[0]);
+
+ // copy I2CMap data in WriteBuffer
+ for (uCounter = 0; uCounter < TDA18271_NB_BYTES_C2_Askey; uCounter++)
+ {
+ *pWriteBuffer = (UInt32)(*pI2CMap);
+ pWriteBuffer ++;
+ pI2CMap ++;
+ }
+
+ // write data in the Tuner
+ I2CCommResult = _SYSTEMFUNC.SY_Write_C2_Askey( pObj->uHwAddress,
+ uSubAddress,
+ uNbData,
+ &(WriteBuffer[uSubAddress]) );
+
+ // shift I2CLog content
+ TDA18271ShiftLog_C2_Askey (pObj,1);
+
+ // copy written data in I2CLog [0]
+ for (uCounter = uSubAddress; uCounter < uSubAddress + uNbData; uCounter++)
+ pObj->I2CLog [0][uCounter] = WriteBuffer [uCounter];
+
+ // set additional values
+ pObj->I2CLog [0][TDA18271_NB_BYTES_C2_Askey] = pObj->uHwAddress;
+ pObj->I2CLog [0][TDA18271_NB_BYTES_C2_Askey + 1] = I2CCommResult;
+
+ // return value
+ return I2CCommResult;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Read_C2_Askey
+//
+// DESCRIPTION: This function reads I2C data from the Tuner
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Read_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ )
+{
+ Bool_ I2CCommResult = TM_FALSE;
+
+ UInt8 uCounter;
+ UInt8* pI2CMap;
+ UInt32 ReadBuffer[TDA18271_NB_BYTES_C2_Askey] = {0};
+ UInt32* pReadBuffer;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // pI2CMap & pReadBuffer initialization
+ pI2CMap = &(pObj->I2CMap.uBx00.ID_BYTE) + uSubAddress;
+ pReadBuffer = &(ReadBuffer[uSubAddress]);
+
+ // read data from the Tuner
+ I2CCommResult = _SYSTEMFUNC.SY_Read_C2_Askey( pObj->uHwAddress,
+ 0,
+ uSubAddress + uNbData,
+ &(ReadBuffer[0]));
+
+ // copy readen data in I2CMap
+ for (uCounter = 0; uCounter < uNbData; uCounter++)
+ {
+ *pI2CMap = (UInt8)(*pReadBuffer);
+ pI2CMap ++;
+ pReadBuffer ++;
+ }
+
+ // shift I2CLog content
+ TDA18271ShiftLog_C2_Askey (pObj,1);
+
+ // copy readen data in I2CLog [0]
+ for (uCounter = uSubAddress; uCounter < uSubAddress + uNbData; uCounter++)
+ pObj->I2CLog [0][uCounter] = ReadBuffer [uCounter];
+
+ // set additional values
+ pObj->I2CLog [0][TDA18271_NB_BYTES_C2_Askey] = pObj->uHwAddress + 1;
+ pObj->I2CLog [0][TDA18271_NB_BYTES_C2_Askey + 1] = I2CCommResult;
+
+ // return value
+ return I2CCommResult;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Wait_C2_Askey
+//
+// DESCRIPTION: This function waits for requested time
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Wait_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt16 wTime // I: time to wait for
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ User_delay( pObj->AFAInfo_C2_Askey.demodulator, wTime);
+ // Return value
+ return True;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271ShiftLog_C2_Askey
+//
+// DESCRIPTION: Shift I2CLog content of wanted lines
+//
+// RETURN: True
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271ShiftLog_C2_Askey(
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt32 uNbRows // I: nb of lines
+ )
+{
+ UInt32 uRow;
+ UInt8 uColumn;
+ UInt32 uCounter;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // Shift I2CLog content of wanted lines
+ for (uCounter = 0; uCounter < uNbRows; uCounter++)
+ {
+ for (uRow = TDA18271_LOG_NB_ROWS_C2_Askey - 1; uRow > 0; uRow--)
+ {
+ for (uColumn = 0; uColumn < TDA18271_NB_BYTES_C2_Askey + 2; uColumn++)
+ pObj->I2CLog [uRow][uColumn] = pObj->I2CLog [uRow - 1][uColumn];
+ }
+
+ for (uColumn = 0; uColumn < TDA18271_NB_BYTES_C2_Askey + 2; uColumn++)
+ pObj->I2CLog [0][uColumn] = TDA18271_LOG_BLANK_DATA_C2_Askey;
+ }
+
+ // Return value
+ return True;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcMAINPLL_C2_Askey:
+//
+// DESCRIPTION: Calculate the MAIN fractionnal PLL settings
+//
+// RETURN: True or False
+//
+// NOTES: This function doesn't write in the tuner
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271CalcMAINPLL_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ )
+{
+ UInt8 uCounter = 0;
+ UInt32 uDiv;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // search for MAIN_Post_Div corresponding to uLO
+ do uCounter ++;
+ while (uLO > pObj->Config.MAIN_PLL_Map[uCounter - 1].uLO_Max && uCounter < TDA18271_MAIN_PLL_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx0C.bF.MAIN_Post_Div = ((UInt8)pObj->Config.MAIN_PLL_Map[uCounter - 1].uPost_Div) & 0x77;
+
+ // calculate MAIN_Div
+ uDiv = (((UInt32)(pObj->Config.MAIN_PLL_Map[uCounter - 1].uDiv) * (uLO / 1000)) << 7) / 125;
+ pObj->I2CMap.uBx0D.bF.MAIN_Div_22_to_16 = (UInt8)(uDiv >> 16) & 0x7F;
+ pObj->I2CMap.uBx0E.bF.MAIN_Div_15_to_8 = (UInt8)(uDiv >> 8);
+ pObj->I2CMap.uBx0F.bF.MAIN_Div_7_to_0 = (UInt8)(uDiv);
+
+ return True;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcCALPLL_C2_Askey:
+//
+// DESCRIPTION: Calculate the CAL fractionnal PLL settings
+//
+// RETURN: True or False
+//
+// NOTES: This function doesn't write in the tuner
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271CalcCALPLL_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ )
+{
+ UInt8 uCounter = 0;
+ UInt32 uDiv;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return False;
+
+ // search for CAL_Post_Div corresponding to uLO
+ do uCounter ++;
+ while (uLO > pObj->Config.CAL_PLL_Map[uCounter - 1].uLO_Max && uCounter < TDA18271_CAL_PLL_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx08.CAL_POST_DIV_BYTE = (UInt8)pObj->Config.CAL_PLL_Map[uCounter - 1].uPost_Div;
+
+ // calculate CAL_Div
+ uDiv = (((UInt32)(pObj->Config.CAL_PLL_Map[uCounter - 1].uDiv) * (uLO / 1000)) << 7) / 125;
+ pObj->I2CMap.uBx09.bF.CAL_Div_22_to_16 = (UInt8)(uDiv >> 16) & 0x7F;
+ pObj->I2CMap.uBx0A.bF.CAL_Div_15_to_8 = (UInt8)(uDiv >> 8);
+ pObj->I2CMap.uBx0B.bF.CAL_Div_7_to_0 = (UInt8)(uDiv);
+
+ return True;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalibrateRF_C2_Askey:
+//
+// DESCRIPTION: RF tracking filter calibration
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271CalibrateRF_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ UInt32 uRF, // I: RF frequency in hertz
+ UInt8* puCprog // I: Address of the variable to output the Cprog value
+ )
+{
+ UInt32 uCounter = 0;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //------------------------------
+ // initialization
+ //------------------------------
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set AGC1Gain = 15dB
+ pObj->I2CMap.uBx21.bF.AGC1_Gain = 0x03;
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // switch off AGC1
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x01;
+
+ //------------------------------
+ // frequency dependent parameters update
+ //------------------------------
+ // search for BP_Filter corresponding to uRF
+ uCounter=0;
+ do uCounter ++;
+ while (uRF > pObj->Config.BP_FILTER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_BP_FILTER_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx03.bF.BP_Filter = (UInt8)pObj->Config.BP_FILTER_Map[uCounter - 1].uBP_Filter;
+
+ // search for Gain_Taper corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_GAIN_TAPER_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;
+
+ // search for RF_BAND corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;
+
+ // search for K,M corresponding to uRF
+ uCounter=0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_KMCO_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx1C.bF.RFC_K = (UInt8)pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uK;
+ pObj->I2CMap.uBx1C.bF.RFC_M = (UInt8)pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uM;
+
+ // write bytes EASY_PROG_BYTE_1 to EASY_PROG_BYTE_3
+ if (TDA18271Write_C2_Askey(pObj,0x03,3) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_13
+ if (TDA18271Write_C2_Askey(pObj,0x1C,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // MAIN pll charge pump source
+ pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x01;
+ // write byte EXTENDED_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // CAL pll charge pump source
+ pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x01;
+ // write byte EXTENDED_BYTE_7
+ if (TDA18271Write_C2_Askey(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // force DCDC converter to 0V
+ pObj->I2CMap.uBx1D.RFC_Cprog = 0x00;
+ // write byte EXTENDED_BYTE_14
+ if (TDA18271Write_C2_Askey(pObj,0x1D,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // disable plls lock
+ pObj->I2CMap.uBx23.bF.Force_Lock = 0x00;
+ // write byte EXTENDED_BYTE_20
+ if (TDA18271Write_C2_Askey(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // RF tracking filters calibration mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x03;
+
+ // write bytes EASY_PROG_BYTE_4 & EASY_PROG_BYTE_5
+ if (TDA18271Write_C2_Askey(pObj,0x06,2) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //------------------------------
+ // set internal calibration signals
+ //------------------------------
+ // calculate CAL PLL
+ // CAL LO Frequency = channel center frequency
+ if (TDA18271CalcCALPLL_C2_Askey(pObj, uRF) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // calculate MAIN PLL
+ // MAIN LO Frequency = channel center frequency + 1MHz
+ if (TDA18271CalcMAINPLL_C2_Askey(pObj, uRF + RF_CAL_IF_FREQ_C2_Askey) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write bytes 0x05 to 0x0F
+ if (TDA18271Write_C2_Askey(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for RF tracking filter calibration initialization
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //------------------------------
+ // internal synchronization
+ //------------------------------
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //------------------------------
+ // RF calibration launch
+ //------------------------------
+ // MAIN pll charge pump source
+ pObj->I2CMap.uBx13.bF.LO_ForceSrce = 0x00;
+ // write byte EXTENDED_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // CAL pll charge pump source
+ pObj->I2CMap.uBx16.bF.CAL_ForceSrce = 0x00;
+ // write byte EXTENDED_BYTE_7
+ if (TDA18271Write_C2_Askey(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 10 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,10) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // launch the RF tracking filters calibartion
+ pObj->I2CMap.uBx23.bF.Force_Lock = 0x01;
+ // write byte EXTENDED_BYTE_20
+ if (TDA18271Write_C2_Askey(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 60 ms for calibration
+ if (TDA18271Wait_C2_Askey(pObj,60) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // normal mode
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+
+ // set AGC1Gain = 6dB
+ pObj->I2CMap.uBx21.bF.AGC1_Gain = 0x00;
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // switch on AGC1
+ pObj->I2CMap.uBx05.bF.SM_LT = 0x00;
+
+ // write bytes EASY_PROG_BYTE_3 & EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x05,2) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write_C2_Askey(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // read bytes 0x00 to 0x26
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // update puCprog
+ *puCprog = pObj->I2CMap.uBx1D.RFC_Cprog;
+
+ // return value
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271PowerScanInit_C2_Askey:
+//
+// DESCRIPTION: Initializes power scan
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271PowerScanInit_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj // I: Tuner unit number
+ )
+{
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // set standard mode to DVBT 1.5 MHz
+ pObj->I2CMap.uBx05.bF.Std = 0x12;
+ pObj->I2CMap.uBx06.bF.IF_Level = 0x00;
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x00;
+ // write bytes EASY_PROG_BYTE_3 & EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x05,2) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set AGC1Gain = 6dB
+ pObj->I2CMap.uBx21.bF.AGC1_Gain = 0x00;
+ // write byte EXTENDED_BYTE_18
+ if (TDA18271Write_C2_Askey(pObj,0x21,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set AGC2Gain = -15dB
+ pObj->I2CMap.uBx24.bF.AGC2_Gain = 0x00;
+ // set low pass filter to 1.5MHz
+ pObj->I2CMap.uBx26.bF.ForceLP_Fc2_En = 0x01;
+ pObj->I2CMap.uBx26.bF.LP_Fc = 0x01;
+ // write byte EXTENDED_BYTE_21 to EXTENDED_BYTE_23
+ if (TDA18271Write_C2_Askey(pObj,0x24,3) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // return value
+ return TM_OK;
+}
+
+#define POWER_SCAN_FREQ_STEP 200000
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271PowerScan_C2_Askey:
+//
+// DESCRIPTION: Scan power and adjust RF Frequency
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271PowerScan_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt32* puRF, // I/O: RF frequency in hertz
+ Bool_* pCal // O: Calibration allowed if pCal = True
+ )
+{
+ UInt32 uCounter = 0;
+ UInt32 count_limit = 0;
+ UInt32 freq_input = 0;
+ UInt32 freq_MAINPLL = 0;
+ UInt32 step = 0;
+
+ UInt8 CID_Gain = 0;
+ UInt8 CID_Target = 0;
+
+ Int8 sgn = 0;
+
+ Bool_ wait = False;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // set freq_input
+ freq_input = *puRF;
+
+ // search for count_limit corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (freq_input > pObj->Config.RF_CAL_CID_TARGET_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_CID_TARGET_NB_ROWS_C2_Askey);
+ count_limit = pObj->Config.RF_CAL_CID_TARGET_Map[uCounter - 1].uCount_Limit;
+
+ // check if powerscan is requested
+ if (count_limit == 0)
+ {
+ // enable calibration and exit
+ *pCal = True;
+ return TM_OK;
+ }
+
+ // search for CID_Target corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (freq_input > pObj->Config.RF_CAL_CID_TARGET_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_CID_TARGET_NB_ROWS_C2_Askey);
+ CID_Target = (UInt8)pObj->Config.RF_CAL_CID_TARGET_Map[uCounter - 1].uCID_Target;
+
+ // search for sub-band corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (freq_input > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;
+
+ // search for Cprog corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (freq_input > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx1D.RFC_Cprog = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+
+ // search for Gain_Taper corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (freq_input > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_GAIN_TAPER_NB_ROWS_C2_Askey);
+ pObj->I2CMap.uBx04.bF.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EXTENDED_BYTE_14
+ if (TDA18271Write_C2_Askey(pObj,0x1D,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set freq_MAINPLL
+ freq_MAINPLL = freq_input + RF_CAL_IF_FREQ_C2_Askey;
+
+ // calculate MAIN PLL
+ if (TDA18271CalcMAINPLL_C2_Askey(pObj, freq_MAINPLL) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write bytes 0x0C to 0x0F
+ if (TDA18271Write_C2_Askey(pObj,0x0C,4) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // launch power detection measurement
+ pObj->I2CMap.uBx06.bF.CAL_Mode = 0x01;
+
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write_C2_Askey(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // read power detector informations
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ //update CID_Gain
+ CID_Gain = pObj->I2CMap.uBx19.bF.CID_Gain;
+
+ //----------------------
+ // power scan algorithm
+ //----------------------
+ // initialization
+ uCounter = 0;
+ sgn = 1;
+ *puRF = freq_input;
+ *pCal = False;
+ step = POWER_SCAN_FREQ_STEP;
+ wait = False;
+
+ // main loop
+ while (CID_Gain < CID_Target)
+ {
+ // update freq_MAINPLL
+ freq_MAINPLL = freq_input + sgn * uCounter + RF_CAL_IF_FREQ_C2_Askey;
+
+ // calculate MAIN PLL
+ if (TDA18271CalcMAINPLL_C2_Askey(pObj, freq_MAINPLL) == False)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // write bytes 0x0C to 0x0F
+ if (TDA18271Write_C2_Askey(pObj,0x0C,4) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ if (wait)
+ {
+ // wait 5 ms for pll locking
+ if (TDA18271Wait_C2_Askey(pObj,5) == False)
+ return TM_FALSE;
+
+ // reset wait flag
+ wait = False;
+ }
+ else
+ {
+ // wait 100 s for pll locking
+ }
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write_C2_Askey(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // read power detector informations
+ if (TDA18271Read_C2_Askey (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // update CID_Gain
+ CID_Gain = pObj->I2CMap.uBx19.bF.CID_Gain;
+
+ // increase count
+ uCounter += step;
+
+ // check uCounter
+ if (uCounter >= count_limit)
+ {
+ if (sgn > 0)
+ {
+ // update sgn
+ sgn = -sgn;
+
+ // update uCounter
+ uCounter = step;
+
+ // update wait flag
+ wait = True;
+ }
+ else
+ {
+ // exit loop
+ break;
+ }
+ }
+ }
+
+ // return results
+ if (CID_Gain >= CID_Target)
+ {
+ *pCal = True;
+ *puRF = freq_MAINPLL - RF_CAL_IF_FREQ_C2_Askey;
+ }
+ else
+ {
+ *pCal = False;
+ *puRF = freq_input;
+ }
+
+ return TM_OK;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcRFFilterCurve_C2_Askey:
+//
+// DESCRIPTION: Calculate RF Filter curve coefficients
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271CalcRFFilterCurve_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj // I: tuner Object
+ )
+{
+ tmErrorCode_t ret = TM_OK;
+ UInt32 uCounter = 0;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // wait 200 ms for die temperature stabilization
+ if (TDA18271Wait_C2_Askey(pObj,200) == False)
+ return TM_FALSE;
+
+ // power scan initialization
+ TDA18271PowerScanInit_C2_Askey(pObj);
+
+ // calculate RF filter curve
+ for (uCounter = 0; uCounter < TDA18271_RF_BAND_NB_ROWS_C2_Askey; uCounter++)
+ {
+ if (pObj->Config.RF_BAND_Map[uCounter].uRF1_default != 0)
+ {
+ ret = TDA18271RFTrackingFiltersInit_C2_Askey(pObj, &(pObj->Config.RF_BAND_Map[uCounter]));
+ if (ret != TM_OK)
+ return ret;
+ }
+ }
+
+ // sense temperature
+ ret = TDA18271ThermometerRead_C2_Askey(pObj, &(pObj->Config.uTMVALUE_RFCAL));
+ if (ret != TM_OK)
+ return ret;
+
+ // return value
+ return TM_OK;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271RFTrackingFiltersInit_C2_Askey:
+//
+// DESCRIPTION: Initialize RF Filter calibration
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271RFTrackingFiltersInit_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: tuner Object
+ ptmTDA18271_RF_BAND_Map_t_C2_Askey pRF_BAND_Map // I: address of RF band map
+ )
+{
+ tmErrorCode_t ret = TM_OK;
+
+ UInt32 uCounter = 0;
+
+ UInt8 uCprog_cal_1 = 0;
+ UInt8 uCprog_table_1 = 0;
+ UInt8 uCprog_cal_2 = 0;
+ UInt8 uCprog_table_2 = 0;
+ UInt8 uCprog_cal_3 = 0;
+ UInt8 uCprog_table_3 = 0;
+
+ Bool_ bCal = False;
+
+ tmTDA18271StandardMode_t_C2_Askey StandardMode = pObj->StandardMode;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ //----------------------
+ // RF tracking filter calibration at RF1 frequency
+ //----------------------
+ // test uRF1_default value
+ if (pRF_BAND_Map->uRF1_default == 0)
+ return ret;
+
+ // look for optimized calibration frequency
+ pRF_BAND_Map->uRF1 = pRF_BAND_Map->uRF1_default;
+ ret = TDA18271PowerScan_C2_Askey(pObj, &pRF_BAND_Map->uRF1, &bCal);
+ if (ret != TM_OK)
+ return ret;
+
+ // search for uCprog_table_1 corresponding to RF1
+ uCounter = 0;
+ do uCounter ++;
+ while (pRF_BAND_Map->uRF1 > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS_C2_Askey);
+ uCprog_table_1 = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+
+ if(bCal)
+ {
+ // launch tracking filter calibration
+ ret = TDA18271CalibrateRF_C2_Askey(pObj, pRF_BAND_Map->uRF1, &uCprog_cal_1);
+ if (ret != TM_OK)
+ return ret;
+ }
+ else
+ {
+ // use tracking filter table value
+ uCprog_cal_1 = uCprog_table_1;
+ }
+
+ // set A1 coefficient
+ pRF_BAND_Map->uRF_A1 = 0;
+
+ // calculate B1 coefficient
+ pRF_BAND_Map->uRF_B1 = uCprog_cal_1 - uCprog_table_1;
+
+ //----------------------
+ // RF tracking filter calibration at RF2 frequency
+ //----------------------
+ // test RF2 value
+ if (pRF_BAND_Map->uRF2_default == 0)
+ return ret;
+
+ // look for optimized calibration frequency
+ pRF_BAND_Map->uRF2 = pRF_BAND_Map->uRF2_default;
+ ret = TDA18271PowerScan_C2_Askey(pObj, &pRF_BAND_Map->uRF2, &bCal);
+ if (ret != TM_OK)
+ return ret;
+
+ // search for uCprog_table_2 corresponding to RF2
+ uCounter = 0;
+ do uCounter ++;
+ while (pRF_BAND_Map->uRF2 > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS_C2_Askey);
+ uCprog_table_2 = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+
+ if(bCal)
+ {
+ // launch tracking filter calibration
+ ret = TDA18271CalibrateRF_C2_Askey(pObj, pRF_BAND_Map->uRF2, &uCprog_cal_2);
+ if (ret != TM_OK)
+ return ret;
+ }
+ else
+ {
+ // use tracking filter table value
+ uCprog_cal_2 = uCprog_table_2;
+ }
+
+ // calculate A1 coefficient
+ pRF_BAND_Map->uRF_A1 = ((uCprog_cal_2 - uCprog_table_2 - (uCprog_cal_1 - uCprog_table_1)) * 1000000)
+ / (Int32)((pRF_BAND_Map->uRF2 - pRF_BAND_Map->uRF1) / 1000000);
+
+ //----------------------
+ // RF tracking filter calibration at RF3 frequency
+ //----------------------
+ // test RF3 value
+ if (pRF_BAND_Map->uRF3_default == 0)
+ return ret;
+
+ // look for optimized calibration frequency
+ pRF_BAND_Map->uRF3 = pRF_BAND_Map->uRF3_default;
+ ret = TDA18271PowerScan_C2_Askey(pObj, &pRF_BAND_Map->uRF3, &bCal);
+ if (ret != TM_OK)
+ return ret;
+
+ // search for uCprog_table_3 corresponding to RF3
+ uCounter = 0;
+ do uCounter ++;
+ while (pRF_BAND_Map->uRF3 > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS_C2_Askey);
+ uCprog_table_3 = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+
+ if(bCal)
+ {
+ // launch tracking filter calibration
+ ret = TDA18271CalibrateRF_C2_Askey(pObj, pRF_BAND_Map->uRF3, &uCprog_cal_3);
+ if (ret != TM_OK)
+ return ret;
+ }
+ else
+ {
+ // use tracking filter table value
+ uCprog_cal_3 = uCprog_table_3;
+ }
+
+ // calculate A2 coefficient
+ pRF_BAND_Map->uRF_A2 = ((uCprog_cal_3 - uCprog_table_3 - (uCprog_cal_2 - uCprog_table_2)) * 1000000)
+ / (Int32)((pRF_BAND_Map->uRF3 - pRF_BAND_Map->uRF2) / 1000000);
+
+ // calculate B2 coefficient
+ pRF_BAND_Map->uRF_B2 = uCprog_cal_2 - uCprog_table_2;
+
+ // return value
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271ThermometerRead_C2_Askey:
+//
+// DESCRIPTION: Read die temperature
+//
+// RETURN: TMBSL_ERR_IIC_ERR
+// TM_OK
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+tmErrorCode_t
+TDA18271ThermometerRead_C2_Askey (
+ ptmTDA18271Object_t_C2_Askey pObj, // I: Tuner unit number
+ UInt32* puValue // O: Read thermometer value
+ )
+{
+ tmErrorCode_t ret = TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ UInt32 uCounter = 0;
+
+ // test the Object
+ if (pObj == Null || pObj->init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED_C2_Askey;
+
+ // switch thermometer on
+ pObj->I2CMap.uBx01.bF.TM_ON = 0x01;
+
+ // write byte THERMO_BYTE
+ if (TDA18271Write_C2_Askey(pObj,0x01,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // read byte THERMO_BYTE
+ if (TDA18271Read_C2_Askey (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // set & write TM_Range
+ if (((pObj->I2CMap.uBx01.bF.TM_D == 0x00) && (pObj->I2CMap.uBx01.bF.TM_Range == 0x01)) || ((pObj->I2CMap.uBx01.bF.TM_D == 0x08) && (pObj->I2CMap.uBx01.bF.TM_Range == 0x00)))
+ {
+ pObj->I2CMap.uBx01.bF.TM_Range = !(pObj->I2CMap.uBx01.bF.TM_Range);
+
+ // write byte THERMO_BYTE
+ if (TDA18271Write_C2_Askey(pObj,0x01,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ // wait 10ms
+ if (TDA18271Wait_C2_Askey(pObj,10) == False)
+ return TM_FALSE;
+
+ // read byte THERMO_BYTE
+ if (TDA18271Read_C2_Askey (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+ }
+
+ // search for TMVALUE corresponding to TM_D
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->I2CMap.uBx01.bF.TM_D > pObj->Config.THERMOMETER_Map[uCounter - 1].uTM_D && uCounter < TDA18271_THERMOMETER_NB_ROWS_C2_Askey);
+
+ // get TMVALUE value
+ if (pObj->I2CMap.uBx01.bF.TM_Range == 0x00)
+ *puValue = (UInt8)pObj->Config.THERMOMETER_Map[uCounter - 1].uTM_60_92;
+ else
+ *puValue = (UInt8)pObj->Config.THERMOMETER_Map[uCounter - 1].uTM_92_122;
+
+ // switch thermometer off
+ pObj->I2CMap.uBx01.bF.TM_ON = 0x00;
+
+ // write byte THERMO_BYTE
+ if (TDA18271Write_C2_Askey(pObj,0x01,1) != True)
+ return TMBSL_ERR_IIC_ERR_C2_Askey;
+
+ return TM_OK;
+} \ No newline at end of file