summaryrefslogtreecommitdiffstats
path: root/api/TDA18271.c
diff options
context:
space:
mode:
Diffstat (limited to 'api/TDA18271.c')
-rw-r--r--api/TDA18271.c2933
1 files changed, 2933 insertions, 0 deletions
diff --git a/api/TDA18271.c b/api/TDA18271.c
new file mode 100644
index 0000000..d47f1f0
--- /dev/null
+++ b/api/TDA18271.c
@@ -0,0 +1,2933 @@
+//-----------------------------------------------------------------------------
+// $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.c
+//
+// DESCRIPTION: Function for the Hybrid silicon tuner TDA18271
+//
+// DOCUMENT REF:
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Standard include files:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Project include files:
+//-----------------------------------------------------------------------------
+//
+//#include "tmbslTuner.h"
+#include "TDA18271Local.h"
+
+#include "standard.h"
+
+//-----------------------------------------------------------------------------
+// Types and defines:
+//-----------------------------------------------------------------------------
+//
+
+//-----------------------------------------------------------------------------
+// Global data:
+//-----------------------------------------------------------------------------
+//
+//
+// default instance
+tmTDA18271Object_t gTDA18271Instance[] =
+{
+ {
+ {
+ NULL, /* Demodulator */
+ 0x01 /* chip */
+ },
+
+ False, // init (instance initialization default)
+
+ 0, // uHwAddress (HwId default value)
+
+ { // SystemFunc (system functions default addresses)
+ NULL,
+ NULL,
+ },
+ tmPowerSleepMode, // default power state
+ tmDigital_TV_ATSC_6MHz, // default standard mode
+ { // Config
+ CUSTOM_BOARD_DEF, // uBoard [default Configuration structure]
+ OM57XX_STANDARD_DEF, // uStandard
+ 545000000, // uRF
+ 3250000, // uIF
+ 6000000, // uBW
+ 0, // uTMMODE
+ 1, // uPLMODE
+ 0, // uMapName
+ 0, // uMAPCOLUMN
+ 0, // uMAPROW
+ 0x6F, // uPROTOCOLSTEP
+ 0x051E3C00, // uPROTOCOLWAIT
+ { // IR_MEAS_Map uRF_Max
+ {30000000},
+ {200000000},
+ {600000000},
+ {865000000},
+ },
+ { // IR_CAL_Map uRF, uIR_GStep
+ {72000000, 0x03},
+ {408000000, 0x03},
+ {808000000, 0x03},
+ },
+ { // BP_FILTER_Map uRF_Max, uBP_Filter
+ {62000000, 0x00},
+ {84000000, 0x01},
+ {100000000, 0x02},
+ {140000000, 0x03},
+ {170000000, 0x04},
+ {180000000, 0x05},
+ {865000000, 0x06},
+ },
+ { // RF_BAND_Map uRF_Max, uRF_Band
+ {47900000, 0x00},
+ {61100000, 0x01},
+ {152600000, 0x02},
+ {164700000, 0x03},
+ {203500000, 0x04},
+ {457800000, 0x05},
+ {865000000, 0x06},
+ },
+ { // GAIN_TAPER_Map uRF_Max, uGain_Taper
+ {45400000, 0x1F},
+ {45800000, 0x1E},
+ {46200000, 0x1D},
+ {46700000, 0x1C},
+ {47100000, 0x1B},
+ {47500000, 0x1A},
+ {47900000, 0x19},
+ {49600000, 0x17},
+ {51200000, 0x16},
+ {52900000, 0x15},
+ {54500000, 0x14},
+ {56200000, 0x13},
+ {57800000, 0x12},
+ {59500000, 0x11},
+ {61100000, 0x10},
+ {67600000, 0x0D},
+ {74200000, 0x0C},
+ {80700000, 0x0B},
+ {87200000, 0x0A},
+ {93800000, 0x09},
+ {100300000, 0x08},
+ {106900000, 0x07},
+ {113400000, 0x06},
+ {119900000, 0x05},
+ {126500000, 0x04},
+ {133000000, 0x03},
+ {139500000, 0x02},
+ {146100000, 0x01},
+ {152600000, 0x00},
+ {154300000, 0x1F},
+ {156100000, 0x1E},
+ {157800000, 0x1D},
+ {159500000, 0x1C},
+ {161200000, 0x1B},
+ {163000000, 0x1A},
+ {164700000, 0x19},
+ {170200000, 0x17},
+ {175800000, 0x16},
+ {181300000, 0x15},
+ {186900000, 0x14},
+ {192400000, 0x13},
+ {198000000, 0x12},
+ {203500000, 0x11},
+ {216200000, 0x14},
+ {228900000, 0x13},
+ {241600000, 0x12},
+ {254400000, 0x11},
+ {267100000, 0x10},
+ {279800000, 0x0F},
+ {292500000, 0x0E},
+ {305200000, 0x0D},
+ {317900000, 0x0C},
+ {330700000, 0x0B},
+ {343400000, 0x0A},
+ {356100000, 0x09},
+ {368800000, 0x08},
+ {381500000, 0x07},
+ {394200000, 0x06},
+ {406900000, 0x05},
+ {419700000, 0x04},
+ {432400000, 0x03},
+ {445100000, 0x02},
+ {457800000, 0x01},
+ {476300000, 0x19},
+ {494800000, 0x18},
+ {513300000, 0x17},
+ {531800000, 0x16},
+ {550300000, 0x15},
+ {568900000, 0x14},
+ {587400000, 0x13},
+ {605900000, 0x12},
+ {624400000, 0x11},
+ {642900000, 0x10},
+ {661400000, 0x0F},
+ {679900000, 0x0E},
+ {698400000, 0x0D},
+ {716900000, 0x0C},
+ {735400000, 0x0B},
+ {753900000, 0x0A},
+ {772500000, 0x09},
+ {791000000, 0x08},
+ {809500000, 0x07},
+ {828000000, 0x06},
+ {846500000, 0x05},
+ {865000000, 0x04},
+ },
+ { // RF_CAL_Map uRF_Max, uRFC_Cprog
+ {41000000, 0x1E},
+ {43000000, 0x30},
+ {45000000, 0x43},
+ {46000000, 0x4D},
+ {47000000, 0x54},
+ {47900000, 0x64},
+ {49100000, 0x20},
+ {50000000, 0x22},
+ {51000000, 0x2A},
+ {53000000, 0x32},
+ {55000000, 0x35},
+ {56000000, 0x3C},
+ {57000000, 0x3F},
+ {58000000, 0x48},
+ {59000000, 0x4D},
+ {60000000, 0x58},
+ {61100000, 0x5F},
+ },
+ { // RF_CAL_KMCO_Map uRF_Max uK, uM, UCOAmp
+ {61100000, 7, 1, 3},
+ {350000000, 4, 0, 3},
+ {720000000, 3, 0, 3},
+ {865000000, 4, 0, 3},
+ },
+ { // THERMOMETER_Map uTM_D, uTM_60_92, uTM_92_122
+ {0x00, 0x3C, 0x5C},
+ {0x01, 0x3E, 0x5E},
+ {0x02, 0x42, 0x62},
+ {0x03, 0x40, 0x60},
+ {0x04, 0x4A, 0x6A},
+ {0x05, 0x48, 0x68},
+ {0x06, 0x44, 0x64},
+ {0x07, 0x46, 0x66},
+ {0x08, 0x5A, 0x7A},
+ {0x09, 0x58, 0x78},
+ {0x0A, 0x54, 0x74},
+ {0x0B, 0x56, 0x76},
+ {0x0C, 0x4C, 0x6C},
+ {0x0D, 0x4E, 0x6E},
+ {0x0E, 0x52, 0x72},
+ {0x0F, 0x50, 0x70},
+ },
+ { // CAL_PLL_Map uLO_Max, uPost_Div, uDiv
+ {33000000, 0xDD, 0xD0},
+ {36000000, 0xDC, 0xC0},
+ {40000000, 0xDB, 0xB0},
+ {44000000, 0xDA, 0xA0},
+ {49000000, 0xD9, 0x90},
+ {55000000, 0xD8, 0x80},
+ {63000000, 0xD3, 0x70},
+ {67000000, 0xCD, 0x68},
+ {73000000, 0xCC, 0x60},
+ {80000000, 0xCB, 0x58},
+ {88000000, 0xCA, 0x50},
+ {98000000, 0xC9, 0x48},
+ {110000000, 0xC8, 0x40},
+ {126000000, 0xC3, 0x38},
+ {135000000, 0xBD, 0x34},
+ {147000000, 0xBC, 0x30},
+ {160000000, 0xBB, 0x2C},
+ {176000000, 0xBA, 0x28},
+ {196000000, 0xB9, 0x24},
+ {220000000, 0xB8, 0x20},
+ {252000000, 0xB3, 0x1C},
+ {271000000, 0xAD, 0x1A},
+ {294000000, 0xAC, 0x18},
+ {321000000, 0xAB, 0x16},
+ {353000000, 0xAA, 0x14},
+ {392000000, 0xA9, 0x12},
+ {441000000, 0xA8, 0x10},
+ {505000000, 0xA3, 0x0E},
+ {543000000, 0x9D, 0x0D},
+ {589000000, 0x9C, 0x0C},
+ {642000000, 0x9B, 0x0B},
+ {707000000, 0x9A, 0x0A},
+ {785000000, 0x99, 0x09},
+ {883000000, 0x98, 0x08},
+ {1010000000,0x93, 0x07},
+ },
+ { // MAIN_PLL_Map uLO_Max, uPost_Div, uDiv
+ {32000000, 0x5F, 0xF0},
+ {35000000, 0x5E, 0xE0},
+ {37000000, 0x5D, 0xD0},
+ {41000000, 0x5C, 0xC0},
+ {44000000, 0x5B, 0xB0},
+ {49000000, 0x5A, 0xA0},
+ {54000000, 0x59, 0x90},
+ {61000000, 0x58, 0x80},
+ {65000000, 0x4F, 0x78},
+ {70000000, 0x4E, 0x70},
+ {75000000, 0x4D, 0x68},
+ {82000000, 0x4C, 0x60},
+ {89000000, 0x4B, 0x58},
+ {98000000, 0x4A, 0x50},
+ {109000000, 0x49, 0x48},
+ {123000000, 0x48, 0x40},
+ {131000000, 0x3F, 0x3C},
+ {141000000, 0x3E, 0x38},
+ {151000000, 0x3D, 0x34},
+ {164000000, 0x3C, 0x30},
+ {179000000, 0x3B, 0x2C},
+ {197000000, 0x3A, 0x28},
+ {219000000, 0x39, 0x24},
+ {246000000, 0x38, 0x20},
+ {263000000, 0x2F, 0x1E},
+ {282000000, 0x2E, 0x1C},
+ {303000000, 0x2D, 0x1A},
+ {329000000, 0x2C, 0x18},
+ {359000000, 0x2B, 0x16},
+ {395000000, 0x2A, 0x14},
+ {438000000, 0x29, 0x12},
+ {493000000, 0x28, 0x10},
+ {526000000, 0x1F, 0x0F},
+ {564000000, 0x1E, 0x0E},
+ {607000000, 0x1D, 0x0D},
+ {658000000, 0x1C, 0x0C},
+ {718000000, 0x1B, 0x0B},
+ {790000000, 0x1A, 0x0A},
+ {877000000, 0x19, 0x09},
+ {987000000, 0x18, 0x08},
+ },
+ },
+ 0, // I2CMap
+ 0, // I2CLog
+ 0, // uTickEnd [end tick value]
+ }, // end of 1st element
+ {
+ {
+ NULL, /* Demodulator */
+ 0x01 /* chip */
+ },
+
+ False, // init (instance initialization default)
+
+ 0, // uHwAddress (HwId default value)
+
+ { // SystemFunc (system functions default addresses)
+ NULL,
+ NULL,
+ },
+ tmPowerSleepMode, // default power state
+ tmDigital_TV_ATSC_6MHz, // default standard mode
+ { // Config
+ CUSTOM_BOARD_DEF, // uBoard [default Configuration structure]
+ OM57XX_STANDARD_DEF, // uStandard
+ 545000000, // uRF
+ 3250000, // uIF
+ 6000000, // uBW
+ 0, // uTMMODE
+ 1, // uPLMODE
+ 0, // uMapName
+ 0, // uMAPCOLUMN
+ 0, // uMAPROW
+ 0x6F, // uPROTOCOLSTEP
+ 0x051E3C00, // uPROTOCOLWAIT
+ { // IR_MEAS_Map uRF_Max
+ {30000000},
+ {200000000},
+ {600000000},
+ {865000000},
+ },
+ { // IR_CAL_Map uRF, uIR_GStep
+ {72000000, 0x03},
+ {408000000, 0x03},
+ {808000000, 0x03},
+ },
+ { // BP_FILTER_Map uRF_Max, uBP_Filter
+ {62000000, 0x00},
+ {84000000, 0x01},
+ {100000000, 0x02},
+ {140000000, 0x03},
+ {170000000, 0x04},
+ {180000000, 0x05},
+ {865000000, 0x06},
+ },
+ { // RF_BAND_Map uRF_Max, uRF_Band
+ {47900000, 0x00},
+ {61100000, 0x01},
+ {152600000, 0x02},
+ {164700000, 0x03},
+ {203500000, 0x04},
+ {457800000, 0x05},
+ {865000000, 0x06},
+ },
+ { // GAIN_TAPER_Map uRF_Max, uGain_Taper
+ {45400000, 0x1F},
+ {45800000, 0x1E},
+ {46200000, 0x1D},
+ {46700000, 0x1C},
+ {47100000, 0x1B},
+ {47500000, 0x1A},
+ {47900000, 0x19},
+ {49600000, 0x17},
+ {51200000, 0x16},
+ {52900000, 0x15},
+ {54500000, 0x14},
+ {56200000, 0x13},
+ {57800000, 0x12},
+ {59500000, 0x11},
+ {61100000, 0x10},
+ {67600000, 0x0D},
+ {74200000, 0x0C},
+ {80700000, 0x0B},
+ {87200000, 0x0A},
+ {93800000, 0x09},
+ {100300000, 0x08},
+ {106900000, 0x07},
+ {113400000, 0x06},
+ {119900000, 0x05},
+ {126500000, 0x04},
+ {133000000, 0x03},
+ {139500000, 0x02},
+ {146100000, 0x01},
+ {152600000, 0x00},
+ {154300000, 0x1F},
+ {156100000, 0x1E},
+ {157800000, 0x1D},
+ {159500000, 0x1C},
+ {161200000, 0x1B},
+ {163000000, 0x1A},
+ {164700000, 0x19},
+ {170200000, 0x17},
+ {175800000, 0x16},
+ {181300000, 0x15},
+ {186900000, 0x14},
+ {192400000, 0x13},
+ {198000000, 0x12},
+ {203500000, 0x11},
+ {216200000, 0x14},
+ {228900000, 0x13},
+ {241600000, 0x12},
+ {254400000, 0x11},
+ {267100000, 0x10},
+ {279800000, 0x0F},
+ {292500000, 0x0E},
+ {305200000, 0x0D},
+ {317900000, 0x0C},
+ {330700000, 0x0B},
+ {343400000, 0x0A},
+ {356100000, 0x09},
+ {368800000, 0x08},
+ {381500000, 0x07},
+ {394200000, 0x06},
+ {406900000, 0x05},
+ {419700000, 0x04},
+ {432400000, 0x03},
+ {445100000, 0x02},
+ {457800000, 0x01},
+ {476300000, 0x19},
+ {494800000, 0x18},
+ {513300000, 0x17},
+ {531800000, 0x16},
+ {550300000, 0x15},
+ {568900000, 0x14},
+ {587400000, 0x13},
+ {605900000, 0x12},
+ {624400000, 0x11},
+ {642900000, 0x10},
+ {661400000, 0x0F},
+ {679900000, 0x0E},
+ {698400000, 0x0D},
+ {716900000, 0x0C},
+ {735400000, 0x0B},
+ {753900000, 0x0A},
+ {772500000, 0x09},
+ {791000000, 0x08},
+ {809500000, 0x07},
+ {828000000, 0x06},
+ {846500000, 0x05},
+ {865000000, 0x04},
+ },
+ { // RF_CAL_Map uRF_Max, uRFC_Cprog
+ {41000000, 0x1E},
+ {43000000, 0x30},
+ {45000000, 0x43},
+ {46000000, 0x4D},
+ {47000000, 0x54},
+ {47900000, 0x64},
+ {49100000, 0x20},
+ {50000000, 0x22},
+ {51000000, 0x2A},
+ {53000000, 0x32},
+ {55000000, 0x35},
+ {56000000, 0x3C},
+ {57000000, 0x3F},
+ {58000000, 0x48},
+ {59000000, 0x4D},
+ {60000000, 0x58},
+ {61100000, 0x5F},
+ },
+ { // RF_CAL_KMCO_Map uRF_Max uK, uM, UCOAmp
+ {61100000, 7, 1, 3},
+ {350000000, 4, 0, 3},
+ {720000000, 3, 0, 3},
+ {865000000, 4, 0, 3},
+ },
+ { // THERMOMETER_Map uTM_D, uTM_60_92, uTM_92_122
+ {0x00, 0x3C, 0x5C},
+ {0x01, 0x3E, 0x5E},
+ {0x02, 0x42, 0x62},
+ {0x03, 0x40, 0x60},
+ {0x04, 0x4A, 0x6A},
+ {0x05, 0x48, 0x68},
+ {0x06, 0x44, 0x64},
+ {0x07, 0x46, 0x66},
+ {0x08, 0x5A, 0x7A},
+ {0x09, 0x58, 0x78},
+ {0x0A, 0x54, 0x74},
+ {0x0B, 0x56, 0x76},
+ {0x0C, 0x4C, 0x6C},
+ {0x0D, 0x4E, 0x6E},
+ {0x0E, 0x52, 0x72},
+ {0x0F, 0x50, 0x70},
+ },
+ { // CAL_PLL_Map uLO_Max, uPost_Div, uDiv
+ {33000000, 0xDD, 0xD0},
+ {36000000, 0xDC, 0xC0},
+ {40000000, 0xDB, 0xB0},
+ {44000000, 0xDA, 0xA0},
+ {49000000, 0xD9, 0x90},
+ {55000000, 0xD8, 0x80},
+ {63000000, 0xD3, 0x70},
+ {67000000, 0xCD, 0x68},
+ {73000000, 0xCC, 0x60},
+ {80000000, 0xCB, 0x58},
+ {88000000, 0xCA, 0x50},
+ {98000000, 0xC9, 0x48},
+ {110000000, 0xC8, 0x40},
+ {126000000, 0xC3, 0x38},
+ {135000000, 0xBD, 0x34},
+ {147000000, 0xBC, 0x30},
+ {160000000, 0xBB, 0x2C},
+ {176000000, 0xBA, 0x28},
+ {196000000, 0xB9, 0x24},
+ {220000000, 0xB8, 0x20},
+ {252000000, 0xB3, 0x1C},
+ {271000000, 0xAD, 0x1A},
+ {294000000, 0xAC, 0x18},
+ {321000000, 0xAB, 0x16},
+ {353000000, 0xAA, 0x14},
+ {392000000, 0xA9, 0x12},
+ {441000000, 0xA8, 0x10},
+ {505000000, 0xA3, 0x0E},
+ {543000000, 0x9D, 0x0D},
+ {589000000, 0x9C, 0x0C},
+ {642000000, 0x9B, 0x0B},
+ {707000000, 0x9A, 0x0A},
+ {785000000, 0x99, 0x09},
+ {883000000, 0x98, 0x08},
+ {1010000000,0x93, 0x07},
+ },
+ { // MAIN_PLL_Map uLO_Max, uPost_Div, uDiv
+ {32000000, 0x5F, 0xF0},
+ {35000000, 0x5E, 0xE0},
+ {37000000, 0x5D, 0xD0},
+ {41000000, 0x5C, 0xC0},
+ {44000000, 0x5B, 0xB0},
+ {49000000, 0x5A, 0xA0},
+ {54000000, 0x59, 0x90},
+ {61000000, 0x58, 0x80},
+ {65000000, 0x4F, 0x78},
+ {70000000, 0x4E, 0x70},
+ {75000000, 0x4D, 0x68},
+ {82000000, 0x4C, 0x60},
+ {89000000, 0x4B, 0x58},
+ {98000000, 0x4A, 0x50},
+ {109000000, 0x49, 0x48},
+ {123000000, 0x48, 0x40},
+ {131000000, 0x3F, 0x3C},
+ {141000000, 0x3E, 0x38},
+ {151000000, 0x3D, 0x34},
+ {164000000, 0x3C, 0x30},
+ {179000000, 0x3B, 0x2C},
+ {197000000, 0x3A, 0x28},
+ {219000000, 0x39, 0x24},
+ {246000000, 0x38, 0x20},
+ {263000000, 0x2F, 0x1E},
+ {282000000, 0x2E, 0x1C},
+ {303000000, 0x2D, 0x1A},
+ {329000000, 0x2C, 0x18},
+ {359000000, 0x2B, 0x16},
+ {395000000, 0x2A, 0x14},
+ {438000000, 0x29, 0x12},
+ {493000000, 0x28, 0x10},
+ {526000000, 0x1F, 0x0F},
+ {564000000, 0x1E, 0x0E},
+ {607000000, 0x1D, 0x0D},
+ {658000000, 0x1C, 0x0C},
+ {718000000, 0x1B, 0x0B},
+ {790000000, 0x1A, 0x0A},
+ {877000000, 0x19, 0x09},
+ {987000000, 0x18, 0x08},
+ },
+ },
+ 0, // I2CMap
+ 0, // I2CLog
+ 0, // uTickEnd [end tick value]
+ }, // end of 2nd element
+};
+
+//-----------------------------------------------------------------------------
+// Internal Prototypes:
+//-----------------------------------------------------------------------------
+//
+Bool_
+TDA18271Init (
+ tmUnitSelect_t TunerUnit // I: Tuner Object
+ );
+Bool_
+TDA18271WaitTick(
+ ptmTDA18271Object_t pObj // I: Tuner unit number
+ );
+Bool_
+TDA18271Write(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ );
+Bool_
+TDA18271Read(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ );
+Bool_
+TDA18271Wait(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt16 wTime // I: time to wait for
+ );
+Bool_
+TDA18271ShiftLog(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uNbRows // I: nb of lines
+ );
+Bool_
+TDA18271CalcMAINPLL (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ );
+Bool_
+TDA18271CalcCALPLL (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ );
+Bool_
+TDA18271CalcRFFilter (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ );
+tmErrorCode_t
+tmbslTDA18271SetConfig(
+ 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
+ );
+
+Bool_ SY_Write(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ for (i = 0; i < uNbData; i++)
+ {
+ uBuffer[i] = (UInt8)pDataBuff[i];
+ }
+
+ pObj = &gTDA18271Instance[0];
+
+ dwError = Standard_writeTunerRegisters (pObj->AFAInfo.demodulator, pObj->AFAInfo.chip,
+ (unsigned short)uSubAddress, (UInt8)uNbData, uBuffer);
+
+ if (dwError == 0) RetStatus = True;
+
+ return (RetStatus);
+};
+
+Bool_ SY_Read(UInt32 uAddress,
+ UInt32 uSubAddress,
+ UInt32 uNbData,
+ UInt32* pDataBuff)
+{
+ Bool_ RetStatus = False;
+ ptmTDA18271Object_t pObj;
+ UInt32 dwError = 0;
+ UInt8 uBuffer[39];
+ UInt32 i;
+
+ pObj = &gTDA18271Instance[0];
+
+ dwError = Standard_readTunerRegisters (pObj->AFAInfo.demodulator, pObj->AFAInfo.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 Tuner
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271Init(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmbslTuParam_t Param // I: setup parameters
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the max number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ //----------------------
+ // initialize the Object
+ //----------------------
+ // return if already initialized
+ if(gTDA18271Instance[TunerUnit].init == True)
+ return TM_OK;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //----------------
+ // init the Object
+ //----------------
+ // initialize the Object by default values
+ pObj->uHwAddress = Param.uHwAddress;
+ pObj->SystemFunc = Param.systemFunc;
+ 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 (
+ tmUnitSelect_t TunerUnit // I: Tuner unit number
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //-------------------------
+ // De-initialize the Object
+ //-------------------------
+ pObj->init = False;
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetSWVersion:
+//
+// DESCRIPTION: Return the version of this device
+//
+// RETURN: TM_OK
+//
+// NOTES: Values defined in the tmTDA18271Local.h file
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetSWVersion (
+ ptmSWVersion_t pSWVersion // I: Receives SW Version
+ )
+{
+ pSWVersion->compatibilityNr = TDA18271_BSL_COMP_NUM;
+ pSWVersion->majorVersionNr = TDA18271_BSL_MAJOR_VER;
+ pSWVersion->minorVersionNr = TDA18271_BSL_MINOR_VER;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetPowerState:
+//
+// 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 (
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271PowerState_t powerState // I: Power state of this device
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ switch (powerState)
+ {
+ case tmPowerNormalMode:
+ // set SM bits
+ pObj->I2CMap.SM = 0x00;
+ pObj->I2CMap.SM_LT = 0x00;
+ pObj->I2CMap.SM_XT = 0x00;
+ break;
+
+ case tmPowerSleepMode:
+ // set SM bits
+ pObj->I2CMap.SM = 0x01;
+ pObj->I2CMap.SM_LT = 0x01;
+ pObj->I2CMap.SM_XT = 0x01;
+ break;
+
+ case tmPowerStandbyWith16MHz:
+ // set SM bits
+ pObj->I2CMap.SM = 0x01;
+ pObj->I2CMap.SM_LT = 0x01;
+ pObj->I2CMap.SM_XT = 0x00;
+ break;
+
+ case tmPowerStandbyWith16MHzAndLoopThrough:
+ // set SM bits
+ pObj->I2CMap.SM = 0x01;
+ pObj->I2CMap.SM_LT = 0x00;
+ pObj->I2CMap.SM_XT = 0x00;
+ break;
+
+ case tmPowerStandbyWithLoopThrough:
+ // set SM bits
+ pObj->I2CMap.SM = 0x01;
+ pObj->I2CMap.SM_LT = 0x00;
+ pObj->I2CMap.SM_XT = 0x01;
+ break;
+
+ default:
+ // power state not supported
+ return TM_ERR_NOT_SUPPORTED;
+ }
+
+ // store powerstate
+ pObj->curPowerState = powerState;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetPowerState:
+//
+// 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 (
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271PowerState_t *pPowerState // O: Power state of this device
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //----------------------
+ // get the value
+ //----------------------
+ if ((pObj->I2CMap.SM == 0x00) && (pObj->I2CMap.SM_LT == 0x00) && (pObj->I2CMap.SM_XT == 0x00))
+ *pPowerState = tmPowerNormalMode;
+ else if ((pObj->I2CMap.SM == 0x01) && (pObj->I2CMap.SM_LT == 0x01) && (pObj->I2CMap.SM_XT == 0x01))
+ *pPowerState = tmPowerSleepMode;
+ else if ((pObj->I2CMap.SM == 0x01) && (pObj->I2CMap.SM_LT == 0x01) && (pObj->I2CMap.SM_XT == 0x00))
+ *pPowerState = tmPowerStandbyWith16MHz;
+ else if ((pObj->I2CMap.SM == 0x01) && (pObj->I2CMap.SM_LT == 0x00) && (pObj->I2CMap.SM_XT == 0x00))
+ *pPowerState = tmPowerStandbyWith16MHzAndLoopThrough;
+ else if ((pObj->I2CMap.SM == 0x01) && (pObj->I2CMap.SM_LT == 0x00) && (pObj->I2CMap.SM_XT == 0x01))
+ *pPowerState = tmPowerStandbyWithLoopThrough;
+ else
+ *pPowerState = tmPowerNotSupported;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetStandardMode:
+//
+// 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 (
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271StandardMode_t StandardMode // I: Standard mode of this device
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ // set uIF & Std & FM_RFn
+ switch (StandardMode)
+ {
+ case tmDigital_TV_ATSC_6MHz:
+ // set IF frequency
+ pObj->Config.uIF = 3250000;
+ // set Bandwith value
+ pObj->Config.uBW = 6000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x1C;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_DVBT_7MHz:
+ // set IF frequency
+ pObj->Config.uIF = 3800000;
+ // set Bandwith value
+ pObj->Config.uBW = 7000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x1D;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_DVBT_8MHz:
+ // set IF frequency
+ pObj->Config.uIF = 4300000;
+ // set Bandwith value
+ pObj->Config.uBW = 8000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x1E;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_MN:
+ // set IF frequency
+ pObj->Config.uIF = 5750000;
+ // set Bandwith value
+ pObj->Config.uBW = 6000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x0D;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_B:
+ // set IF frequency
+ pObj->Config.uIF = 6750000;
+ // set Bandwith value
+ pObj->Config.uBW = 7000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x0E;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_GH:
+ case tmAnalog_TV_I:
+ case tmAnalog_TV_DK:
+ case tmAnalog_TV_L:
+ // set IF frequency
+ pObj->Config.uIF = 7750000;
+ // set Bandwith value
+ pObj->Config.uBW = 8000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x0F;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_TV_LL:
+ // set IF frequency
+ pObj->Config.uIF = 1250000;
+ // set Bandwith value
+ pObj->Config.uBW = 1500000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x0F;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmAnalog_FM_Radio:
+ // set IF frequency
+ pObj->Config.uIF = 1250000;
+ // set Bandwith value
+ pObj->Config.uBW = 250000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x18; /* FM radio in digital mode */
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x01;
+ break;
+
+ case tmDigital_TV_QAM_6MHz:
+ // set IF frequency
+ pObj->Config.uIF = 4000000;
+ // set Bandwith value
+ pObj->Config.uBW = 6000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x1D;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+
+ case tmDigital_TV_QAM_8MHz:
+ // set IF frequency
+ pObj->Config.uIF = 5000000;
+ // set Bandwith value
+ pObj->Config.uBW = 8000000;
+ // set Std bit
+ pObj->I2CMap.Std = 0x1F;
+ // set FM_RFn bit
+ pObj->I2CMap.FM_RFn = 0x00;
+ break;
+ }
+
+ // set IF_Level & IF_notch & RFAGC_Top & IFAGC_Top
+ switch (StandardMode)
+ {
+ case tmDigital_TV_ATSC_6MHz:
+ case tmDigital_TV_DVBT_7MHz:
+ case tmDigital_TV_DVBT_8MHz:
+ case tmDigital_TV_QAM_6MHz:
+ case tmDigital_TV_QAM_8MHz:
+ // set IF_Level
+ pObj->I2CMap.IF_Level = 0x01;
+ // set IF_notch
+ pObj->I2CMap.IF_notch = 0x01;
+ // set RFAGC_Top & IFAGC_Top
+ pObj->I2CMap.EXTENDED_BYTE_22 = 0x37;
+ break;
+
+ case tmAnalog_TV_MN:
+ case tmAnalog_TV_B:
+ case tmAnalog_TV_GH:
+ case tmAnalog_TV_I:
+ case tmAnalog_TV_DK:
+ case tmAnalog_TV_L:
+ case tmAnalog_TV_LL:
+ case tmAnalog_FM_Radio:
+ // set IF_Level
+ pObj->I2CMap.IF_Level = 0x00;
+ // set IF_notch
+ pObj->I2CMap.IF_notch = 0x00;
+ // set RFAGC_Top & IFAGC_Top
+ pObj->I2CMap.EXTENDED_BYTE_22 = 0x2C;
+ break;
+
+ default:
+ // standard mode not supported
+ return TM_ERR_NOT_SUPPORTED;
+ }
+
+ // store standard mode
+ pObj->StandardMode = StandardMode;
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetStandardMode:
+//
+// 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 (
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ tmTDA18271StandardMode_t *pStandardMode // O: Standard mode of this device
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //----------------------
+ // get the value
+ //----------------------
+ *pStandardMode = pObj->StandardMode;
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271Write:
+//
+// 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 (
+ 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 pObj;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // test the parameters. uIndex is: 0x0X
+ if ((uIndex + uNbBytes) > TDA18271_NB_BYTES)
+ return TMBSL_ERR_TUNER_BAD_PARAMETER;
+
+ // pObj & pI2CMap initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+ pI2CMap = &(pObj->I2CMap.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(pObj,(UInt8)(uIndex),(UInt8)(uNbBytes)) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271WriteBit:
+//
+// DESCRIPTION: Write in the Tuner.
+//
+// RETURN: TM_ERR_NOT_SUPPORTED
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271WriteBit (
+ 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;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271Read:
+//
+// 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 (
+ 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 pObj;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // test the Object
+ if (uNbBytes > TDA18271_NB_BYTES)
+ return TMBSL_ERR_TUNER_BAD_PARAMETER;
+
+ // test uIndex
+ if (uIndex == -1)
+ uIndex = 0;
+
+ // pObj & pI2CMap initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+ pI2CMap = &(pObj->I2CMap.ID_BYTE) + uIndex;
+
+ //--------------
+ // get the value
+ //--------------
+ // read from the Tuner
+ if (TDA18271Read(pObj,(UInt8)(uIndex),(UInt8)(uNbBytes)) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // copy readen values to puBytes
+ for (uCounter = 0; uCounter < uNbBytes; uCounter++)
+ {
+ *puBytes = (UInt32)(*pI2CMap);
+ pI2CMap ++;
+ puBytes ++;
+ }
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271SetConfig:
+//
+// DESCRIPTION: Set the Config of the TDA18271
+//
+// 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(
+ 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 pObj;
+ UInt8* pI2CMap;
+ UInt32* pDataMap;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //--------------
+ // set the value
+ //--------------
+ switch((tmTDA18271cfgIndex_t)uItemId)
+ {
+ case BOARD:
+ 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;
+ }
+ // store board
+ gTDA18271Instance[TunerUnit].Config.uBoard = uValue;
+ break;
+
+ case FEINIT:
+ TDA18271Init(TunerUnit);
+ break;
+
+ case RF:
+ // set RF frequency
+ pObj->Config.uRF = uValue;
+ break;
+
+ case IF:
+ // set IF frequency
+ pObj->Config.uIF = uValue;
+ break;
+
+ case TMMODE:
+ // set TMMODE
+ pObj->Config.uTMMODE = uValue;
+ // set TM_ON
+ pObj->I2CMap.TM_ON = (UInt8)uValue;
+ // write byte THERMO_BYTE
+ if (TDA18271Write(pObj,0x01,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case PLMODE:
+ // set uPLMODE
+ pObj->Config.uPLMODE = uValue;
+ // set Dis_Power_level
+ pObj->I2CMap.Dis_Power_level = (UInt8)uValue;
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case POWERSTATE:
+ // set POWERSTATE
+ tmbslTDA18271SetPowerState (TunerUnit, (tmTDA18271PowerState_t)uValue);
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.CAL_Mode = 0x00;
+ // write byte EASY_PROG_BYTE_3
+ if (TDA18271Write(pObj,0x05,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ /*// wait 20 ms
+ if (TDA18271Wait(pObj,20) == False)
+ return TM_FALSE;*/
+ break;
+
+ case STANDARDMODE:
+ // set STANDARDMODE
+ tmbslTDA18271SetStandardMode (TunerUnit, (tmTDA18271StandardMode_t)uValue);
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.CAL_Mode = 0x00;
+ // write bytes EASY_PROG_BYTE_3 & EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x05,2) != True)
+ return TMBSL_ERR_IIC_ERR;
+ // write MAIN_POST_DIV_BYTE
+ if (TDA18271Write(pObj,0x0C,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ // write EXTENDED_BYTE_22
+ if (TDA18271Write(pObj,0x25,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case XTOUT:
+ // set XTout_ON
+ pObj->I2CMap.XTout_ON = (UInt8)(uValue) >> 1;
+ // set Xtout_400mV
+ pObj->I2CMap.Xtout_400mV = (UInt8)(uValue) & 0x01;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case IFLEVEL:
+ // set IF_Level
+ pObj->I2CMap.IF_Level = (UInt8)uValue;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case EXTENDEDREG:
+ // set Extended_Reg
+ pObj->I2CMap.Extended_Reg = (UInt8)uValue;
+ // write byte EASY_PROG_BYTE_5
+ if (TDA18271Write(pObj,0x07,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case MAPNAME:
+ // set map name
+ pObj->Config.uMapName = uValue;
+ break;
+
+ case MAPCOLUMN:
+ // set map x
+ pObj->Config.uMAPCOLUMN = uValue;
+ break;
+
+ case MAPROW:
+ // set map y
+ pObj->Config.uMAPROW = uValue;
+ break;
+
+ case MAPVALUE:
+ // set pointer on wanted cell
+ switch (pObj->Config.uMapName)
+ {
+ case tmTDA18271_IR_MEAS_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_MEAS_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_IR_MEAS_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.IR_MEAS_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_IR_CAL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_IR_CAL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.IR_CAL_Map[pObj->Config.uMAPROW].uRF);
+ break;
+
+ case tmTDA18271_BP_FILTER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_BP_FILTER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_BP_FILTER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.BP_FILTER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_BAND_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_BAND_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_BAND_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_BAND_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_GAIN_TAPER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_GAIN_TAPER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_GAIN_TAPER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.GAIN_TAPER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_CAL_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_KMCO_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_KMCO_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_KMCO_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_CAL_KMCO_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_THERMOMETER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_THERMOMETER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_THERMOMETER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.THERMOMETER_Map[pObj->Config.uMAPROW].uTM_D);
+ break;
+
+ case tmTDA18271_CAL_PLL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_CAL_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_CAL_PLL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.CAL_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_MAIN_PLL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_MAIN_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_MAIN_PLL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.MAIN_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_I2C_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > 0) || (pObj->Config.uMAPROW > TDA18271_NB_BYTES - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pI2CMap initialisation
+ pI2CMap = &(pObj->I2CMap.ID_BYTE) + pObj->Config.uMAPROW;
+ break;
+ }
+
+ // set cell value
+ if (pObj->Config.uMapName == tmTDA18271_I2C_Map)
+ *(pI2CMap + (UInt8)pObj->Config.uMAPCOLUMN) = (UInt8)uValue;
+ else
+ *(pDataMap + pObj->Config.uMAPCOLUMN) = uValue;
+ break;
+
+ case PROTOCOLSTEP:
+ // set channel configuration protocol steps to execute
+ pObj->Config.uPROTOCOLSTEP = uValue;
+ break;
+
+ case PROTOCOLWAIT:
+ // set channel configuration protocol wait times
+ pObj->Config.uPROTOCOLWAIT = uValue;
+ break;
+
+ case READINIT:
+ // activate extended register access
+ // read bytes 0x00 to 0x26
+#if (0)
+ if (TDA18271Read (pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR;
+#else
+ if (TDA18271Read (pObj,0x00,16) != True)
+ return TMBSL_ERR_IIC_ERR;
+#endif
+ break;
+
+ }
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetConfig:
+//
+// DESCRIPTION: Get the Config of the TDA18271
+//
+// RETURN: TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TM_OK
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+tmErrorCode_t
+tmbslTDA18271GetConfig(
+ 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 pObj;
+ UInt8* pI2CMap;
+ UInt32* pDataMap;
+ UInt32 uByte=0;
+
+ //----------------------
+ // test input parameters
+ //----------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //--------------
+ // get the value
+ //--------------
+ switch((tmTDA18271cfgIndex_t)uItemId)
+ {
+ case BOARD:
+ // get board
+ *puValue = pObj->Config.uBoard;
+ break;
+
+ case RF:
+ // get RF frequency
+ *puValue = pObj->Config.uRF;
+ break;
+
+ case IF:
+ // get IF frequency
+ *puValue = pObj->Config.uIF;
+ break;
+
+ case STATUSBYTE:
+ // read bytes 0x00 to 0x0F
+ if (TDA18271Read (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ break;
+
+ case GETNBOFUNIT:
+ *puValue = TDA18271_MAX_UNITS;
+ break;
+
+ case ID:
+ // get ID value
+ *puValue = pObj->I2CMap.ID;
+ break;
+
+ case POR:
+ // get POR value
+ *puValue = pObj->I2CMap.POR;
+ break;
+
+ case MAINLOCK:
+ // get MAINLOCK value
+ *puValue = pObj->I2CMap.MAIN_Lock;
+ break;
+
+ case TMMODE:
+ // get TMMODE value
+ *puValue = pObj->Config.uTMMODE;
+ break;
+
+ case TMVALUE:
+ // test IRCALOK value
+ if (pObj->I2CMap.IR_CAL_OK != 1)
+ return TMBSL_ERR_IIC_ERR;
+
+ // set CAL_Mode to thermo mode
+ pObj->I2CMap.CAL_Mode = 0x03;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // read byte THERMO_BYTE
+ if (TDA18271Read (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // set & write TM_Range
+ if (((pObj->I2CMap.TM_D == 0x00) && (pObj->I2CMap.TM_Range == 0x01)) || ((pObj->I2CMap.TM_D == 0x08) && (pObj->I2CMap.TM_Range == 0x00)))
+ {
+ pObj->I2CMap.TM_Range = !(pObj->I2CMap.TM_Range);
+ // write byte THERMO_BYTE
+ if (TDA18271Write(pObj,0x01,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ // wait 10ms
+ if (TDA18271Wait(pObj,10) == False)
+ return TM_FALSE;
+ // read byte THERMO_BYTE
+ if (TDA18271Read (pObj, 0x00, 16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ // set & write CAL_Mode to normal mode
+ pObj->I2CMap.CAL_Mode = 0x00;
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // search for TMVALUE corresponding to TM_D
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->I2CMap.TM_D > pObj->Config.THERMOMETER_Map[uCounter - 1].uTM_D && uCounter < TDA18271_THERMOMETER_NB_ROWS);
+ // get TMVALUE value
+ if (pObj->I2CMap.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;
+
+ break;
+
+ case PLMODE:
+ // get PLMODE value
+ *puValue = pObj->Config.uPLMODE;
+ break;
+
+ case PLAGC1:
+ // get PLAGC1 value
+ *puValue = 3 * (2 + ((pObj->I2CMap.Power_Level_7_to_0 & 0x7F) >> 5));
+ break;
+
+ case PLAGC2:
+ // get PLAGC2 value
+ *puValue = 3 * (2 + (3 - (pObj->I2CMap.Power_Level_8 << 1 | pObj->I2CMap.Power_Level_7_to_0 >> 7)));
+ break;
+
+ case PLRFAGC:
+ // get PLRFAGC value (PLRFAGC = PLRFAGC - 11)
+ if (((pObj->I2CMap.EXTENDED_BYTE_22 & 0x7F) >> 4) < 5)
+ *puValue = 11 + (92 + 2 * ((pObj->I2CMap.EXTENDED_BYTE_22 & 0x7F) >> 4)) - (103 - (pObj->I2CMap.Power_Level_7_to_0 & 0x1F));
+ else
+ *puValue = 11 + 102 - (103 - (pObj->I2CMap.Power_Level_7_to_0 & 0x1F));
+ // limit PLRFAGC value
+ if (*puValue > 33)
+ *puValue = 33;
+ else if (*puValue < 1)
+ *puValue = 1;
+ break;
+
+ case RFCALOK:
+ // get RFCALOK value
+ *puValue = pObj->I2CMap.RF_CAL_OK;
+ break;
+
+ case IRCALOK:
+ // get IRCALOK value
+ *puValue = pObj->I2CMap.IR_CAL_OK;
+ break;
+
+ case BPFILTER:
+ // get BPFILTER value
+ *puValue = pObj->I2CMap.BP_Filter;
+ break;
+
+ case RFBAND:
+ // get RFBAND value
+ *puValue = pObj->I2CMap.RF_Band;
+ break;
+
+ case GAINTAPER:
+ // get GAINTAPER value
+ *puValue = pObj->I2CMap.Gain_Taper;
+ break;
+
+ case POWERSTATE:
+ // get POWERSTATE
+ tmbslTDA18271GetPowerState(TunerUnit,(ptmTDA18271PowerState_t)puValue);
+ break;
+
+ case LPFC:
+ // get LPFC value
+ *puValue = pObj->I2CMap.Std & 0x03;
+ break;
+
+ case FMRFN:
+ // get FMRFN value
+ *puValue = pObj->I2CMap.FM_RFn;
+ break;
+
+ case STANDARDMODE:
+ // get STANDARDMODE
+ tmbslTDA18271GetStandardMode(TunerUnit,(ptmTDA18271StandardMode_t)puValue);
+ break;
+
+ case XTOUT:
+ // get XTout_ON & Xtout_400mV value
+ *puValue = (UInt32)(pObj->I2CMap.XTout_ON << 1 | pObj->I2CMap.Xtout_400mV);
+ break;
+
+ case IFLEVEL:
+ // get IFLEVEL value
+ *puValue = pObj->I2CMap.IF_Level;
+ break;
+
+ case EXTENDEDREG:
+ // get EXTENDEDREG value
+ *puValue = pObj->I2CMap.Extended_Reg;
+ break;
+
+ case CALPOSTDIV:
+ // get CALPOSTDIV value
+ *puValue = pObj->I2CMap.CAL_POST_DIV_BYTE & 0x7F;
+ break;
+
+ case CALDIV:
+ // get CALDIV value
+ *puValue = pObj->I2CMap.CAL_Div_22_to_16 << 16 | pObj->I2CMap.CAL_Div_15_to_8 << 8 | pObj->I2CMap.CAL_Div_7_to_0;
+ break;
+
+ case MAINPOSTDIV:
+ // get MAINPOSTDIV value
+ *puValue = pObj->I2CMap.MAIN_Post_Div;
+ break;
+
+ case MAINDIV:
+ // get MAINDIV value
+ *puValue = pObj->I2CMap.MAIN_Div_22_to_16 << 16 | pObj->I2CMap.MAIN_Div_15_to_8 << 8 | pObj->I2CMap.MAIN_Div_7_to_0;
+ break;
+
+ case MAPVALUE:
+ // set pointer on wanted cell
+ switch (pObj->Config.uMapName)
+ {
+ case tmTDA18271_IR_MEAS_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_MEAS_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_IR_MEAS_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.IR_MEAS_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_IR_CAL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_IR_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_IR_CAL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.IR_CAL_Map[pObj->Config.uMAPROW].uRF);
+ break;
+
+ case tmTDA18271_BP_FILTER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_BP_FILTER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_BP_FILTER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.BP_FILTER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_BAND_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_BAND_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_BAND_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_BAND_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_GAIN_TAPER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_GAIN_TAPER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_GAIN_TAPER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.GAIN_TAPER_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_CAL_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_RF_CAL_KMCO_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_RF_CAL_KMCO_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_RF_CAL_KMCO_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.RF_CAL_KMCO_Map[pObj->Config.uMAPROW].uRF_Max);
+ break;
+
+ case tmTDA18271_THERMOMETER_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_THERMOMETER_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_THERMOMETER_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.THERMOMETER_Map[pObj->Config.uMAPROW].uTM_D);
+ break;
+
+ case tmTDA18271_CAL_PLL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_CAL_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_CAL_PLL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.CAL_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_MAIN_PLL_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > TDA18271_MAIN_PLL_NB_COLUMNS - 1) || (pObj->Config.uMAPROW > TDA18271_MAIN_PLL_NB_ROWS - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pDataMap initialisation
+ pDataMap = &(pObj->Config.MAIN_PLL_Map[pObj->Config.uMAPROW].uLO_Max);
+ break;
+
+ case tmTDA18271_I2C_Map:
+ // test map column & row
+ if ((pObj->Config.uMAPCOLUMN > 0) || (pObj->Config.uMAPROW > TDA18271_NB_BYTES - 1))
+ return TM_ERR_NOT_SUPPORTED;
+ // pI2CMap initialisation
+ pI2CMap = &(pObj->I2CMap.ID_BYTE) + pObj->Config.uMAPROW;
+ break;
+ }
+ // get cell value
+ if (pObj->Config.uMapName == tmTDA18271_I2C_Map)
+ *puValue = *(pI2CMap + pObj->Config.uMAPCOLUMN);
+ else
+ *puValue = *(pDataMap + pObj->Config.uMAPCOLUMN);
+ break;
+
+ // backdoor functions
+ case IDENTITY:
+ pObj->SystemFunc.SY_Read( pObj->uHwAddress, TDA18271_IDENTITY_IND, 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:
+//
+// DESCRIPTION: Calculate i2c I2CMap & write in TDA18271
+//
+// 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(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32 uRF // I: RF frequency in hertz
+ )
+{
+ UInt16 uCounter = 0;
+ UInt8 uIRMeasCounter = 0;
+
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ // Config.uRF update
+ pObj->Config.uRF = uRF;
+
+ //----------------------
+ // read IR_CAL_OK bit value
+ //----------------------
+ if (((pObj->Config.uPROTOCOLSTEP & 0x40) >> 6) == 0x01)
+ {
+ // read bytes 0x00 to 0x0F
+ if (TDA18271Read (pObj,0x00,16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ //----------------------
+ // power on reset initialisation
+ // test IR_CAL_OK bit value to determine if initialisation is needed
+ //----------------------
+ if ((pObj->I2CMap.IR_CAL_OK != 1 && ((pObj->Config.uPROTOCOLSTEP & 0x20) >> 5) == 0x01) || ((pObj->Config.uPROTOCOLSTEP & 0x10) >> 4) == 0x01)
+ {
+ //----------------------
+ // I2C map initialisation
+ //----------------------
+ // set & write all bytes
+ pObj->I2CMap.ID_BYTE = 0x83;
+ pObj->I2CMap.THERMO_BYTE = 0x08;
+ pObj->I2CMap.POWER_LEVEL_BYTE = 0x80;
+ pObj->I2CMap.EASY_PROG_BYTE_1 = 0xC6;
+ pObj->I2CMap.EASY_PROG_BYTE_2 = 0xDF;
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x16; // SM = '0', AGC_Low_BW = 1;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x60;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x80; // Extended_Reg = '1'
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0x80; // Enable_Bus_Cal = '1', IR_GStep = '0'
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x00;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.MAIN_POST_DIV_BYTE = 0x00;
+ pObj->I2CMap.MAIN_DIV_BYTE_1 = 0x00;
+ pObj->I2CMap.MAIN_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.MAIN_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_1 = 0xFF;
+ pObj->I2CMap.EXTENDED_BYTE_2 = 0x01;
+ pObj->I2CMap.EXTENDED_BYTE_3 = 0x84;
+ pObj->I2CMap.EXTENDED_BYTE_4 = 0x41;
+ pObj->I2CMap.EXTENDED_BYTE_5 = 0x01; // HCvco[1] = '0'
+ pObj->I2CMap.EXTENDED_BYTE_6 = 0x84;
+ pObj->I2CMap.EXTENDED_BYTE_7 = 0x40; // Cal_Pulse_src = '125�s' // Decrease CAL pll locking time for IR calibration success
+ pObj->I2CMap.EXTENDED_BYTE_8 = 0x07; // IR_Loop = '8' & IR_Target = '62dB'
+ pObj->I2CMap.EXTENDED_BYTE_9 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_10 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_11 = 0x96; // CID_EN_Filt1M='1', HCvco[0]='1', CID_CkSpeed='250KHz/4�s', CID_CkDigSpeed='4MHz'
+ pObj->I2CMap.EXTENDED_BYTE_12 = 0x0F; // AGC12_Speed = '250 KHz'
+ pObj->I2CMap.EXTENDED_BYTE_13 = 0xC1; // RFC_Ckspeed = '62.5 KHz'
+ pObj->I2CMap.EXTENDED_BYTE_14 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_15 = 0x8F;
+ pObj->I2CMap.EXTENDED_BYTE_16 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_17 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_18 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_19 = 0x00;
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0x20; // Force_Lock = '1'
+ pObj->I2CMap.EXTENDED_BYTE_21 = 0x33;
+ pObj->I2CMap.EXTENDED_BYTE_22 = 0x48;
+ pObj->I2CMap.EXTENDED_BYTE_23 = 0xB0;
+#if (0)
+ if (TDA18271Write(pObj,0x00,39) != True)
+ return TMBSL_ERR_IIC_ERR;
+#else
+ if (TDA18271Write(pObj,0,16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ if (TDA18271Write(pObj,16,16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ if (TDA18271Write(pObj,32,7) != True)
+ return TMBSL_ERR_IIC_ERR;
+#endif
+
+ //----------------------
+ // AGC1 & AGC2 gains setup
+ //----------------------
+ // AGC1_Gain_do
+ // update & write EXTENDED_BYTE_17
+ pObj->I2CMap.EXTENDED_BYTE_17 = 0x00; // set gain_do address
+ if (TDA18271Write(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ pObj->I2CMap.EXTENDED_BYTE_17 = 0x03; // keep gain_do address, set gain_do
+ if (TDA18271Write(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // AGC1_Gain_up
+ // update & write EXTENDED_BYTE_17
+ pObj->I2CMap.EXTENDED_BYTE_17 = 0x43; // set gain_up address, keep gain_do
+ if (TDA18271Write(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ pObj->I2CMap.EXTENDED_BYTE_17 = 0x4C; // keep gain_up address, set gain_up
+ if (TDA18271Write(pObj,0x20,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // AGC2_Gain_do
+ // update & write EXTENDED_BYTE_20
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xA0; // set gain_do address
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xA7; // keep gain_do address, set gain_do
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // AGC2_Gain_up
+ // update & write EXTENDED_BYTE_20
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xE7; // set gain_up address, keep gain_do
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xEC; // keep gain_up address, set gain_up
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ //----------------------
+ // image rejection calibration
+ //----------------------
+ //
+ //------- low band calibration -------
+ //
+ // update & write bytes 0x05 to 0x0F
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x81;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0xCC;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x6C;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.MAIN_POST_DIV_BYTE = 0xCD;
+ pObj->I2CMap.MAIN_DIV_BYTE_1 = 0x77;
+ pObj->I2CMap.MAIN_DIV_BYTE_2 = 0x08;
+ pObj->I2CMap.MAIN_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_1
+ pObj->I2CMap.EASY_PROG_BYTE_1 = 0xC6;
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for wanted low measurement (default 5 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF000000) >> 24)) == False)
+ return TM_FALSE;
+
+ // update & write bytes 0x05 to 0x0B
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x85;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0xCB;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x66;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x70;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_2
+ pObj->I2CMap.EASY_PROG_BYTE_2 = 0xDF;
+ if (TDA18271Write(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for image low optimization completion (default 30 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF0000) >> 16)) == False)
+ return TM_FALSE;
+
+ //
+ //------- mid band calibration -------
+ //
+ // update & write bytes 0x05 to 0x0F
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x82;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0xA8;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x66;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.MAIN_POST_DIV_BYTE = 0xA9;
+ pObj->I2CMap.MAIN_DIV_BYTE_1 = 0x73;
+ pObj->I2CMap.MAIN_DIV_BYTE_2 = 0x1A;
+ pObj->I2CMap.MAIN_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_1
+ pObj->I2CMap.EASY_PROG_BYTE_1 = 0xC6;
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for wanted mid measurement (default 5 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF000000) >> 24)) == False)
+ return TM_FALSE;
+
+ // update & write bytes 0x05 to 0x0B
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x86;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0xA8;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x66;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0xA0;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_2
+ pObj->I2CMap.EASY_PROG_BYTE_2 = 0xDF;
+ if (TDA18271Write(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for image mid optimization completion (default 30 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF0000) >> 16)) == False)
+ return TM_FALSE;
+
+ //
+ //------- high band calibration -------
+ //
+ // update & write bytes 0x05 to 0x0F
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x83;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0x98;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x65;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x00;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ pObj->I2CMap.MAIN_POST_DIV_BYTE = 0x99;
+ pObj->I2CMap.MAIN_DIV_BYTE_1 = 0x71;
+ pObj->I2CMap.MAIN_DIV_BYTE_2 = 0xCD;
+ pObj->I2CMap.MAIN_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_1
+ pObj->I2CMap.EASY_PROG_BYTE_1 = 0xC6;
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for wanted high measurement (default 5 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF000000) >> 24)) == False)
+ return TM_FALSE;
+
+ // update & write bytes 0x05 to 0x0B
+ pObj->I2CMap.EASY_PROG_BYTE_3 = 0x1F;
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x66;
+ pObj->I2CMap.EASY_PROG_BYTE_5 = 0x87;
+ pObj->I2CMap.CAL_POST_DIV_BYTE = 0x98;
+ pObj->I2CMap.CAL_DIV_BYTE_1 = 0x65;
+ pObj->I2CMap.CAL_DIV_BYTE_2 = 0x50;
+ pObj->I2CMap.CAL_DIV_BYTE_3 = 0x00;
+ if (TDA18271Write(pObj,0x05,7) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_2
+ pObj->I2CMap.EASY_PROG_BYTE_2 = 0xDF;
+ if (TDA18271Write(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for image high optimization completion (default 30 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF0000) >> 16)) == False)
+ return TM_FALSE;
+
+ // update & write byte EASY_PROG_BYTE_4
+ pObj->I2CMap.EASY_PROG_BYTE_4 = 0x64;
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EASY_PROG_BYTE_1
+ pObj->I2CMap.EASY_PROG_BYTE_1 = 0xC6;
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ //----------------------
+ // RF tracking filter calibration
+ //----------------------
+ if (((pObj->Config.uPROTOCOLSTEP & 0x08) >> 3) == 0x01)
+ {
+ // search for BP_Filter corresponding to uRF
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.BP_FILTER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_BP_FILTER_NB_ROWS);
+ pObj->I2CMap.BP_Filter = (UInt8)pObj->Config.BP_FILTER_Map[uCounter - 1].uBP_Filter;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_4
+ pObj->I2CMap.EXTENDED_BYTE_4 = (pObj->I2CMap.EXTENDED_BYTE_4 & 0x07) | 0x60;
+ if (TDA18271Write(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_7
+ pObj->I2CMap.EXTENDED_BYTE_7 = 0x60;
+ if (TDA18271Write(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_14
+ pObj->I2CMap.EXTENDED_BYTE_14 = 0x00;
+ if (TDA18271Write(pObj,0x1D,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_20
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xCC;
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // set CAL_Mode to RF tracking filter calibration
+ pObj->I2CMap.CAL_Mode = 0x03;
+
+ // calculate CAL PLL
+ // CAL LO Frequency = beginning of the channel in analog / channel center frequency + bandwith/2 in digital
+ if (TDA18271CalcCALPLL(pObj, (pObj->StandardMode > 2) && (pObj->StandardMode < 11) ?
+ pObj->Config.uRF - 1250000 : pObj->Config.uRF + (pObj->Config.uBW/2)) == False)
+ return TM_FALSE;
+
+ // calculate MAIN PLL
+ // MAIN LO Frequency = beginning of the channel + 1MHz in analog / channel center frequency + bandwith/2 + 1MHz in digital
+ if (TDA18271CalcMAINPLL(pObj,(pObj->StandardMode > 2) && (pObj->StandardMode < 11) ?
+ pObj->Config.uRF - 250000 : pObj->Config.uRF + (pObj->Config.uBW/2) + 1000000) == False)
+ return TM_FALSE;
+
+ // write bytes 0x05 to 0x0F
+ if (TDA18271Write(pObj,0x05,11) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for RF tracking filter calibration initialisation
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // search for K,M,CO for RF Calibration, corresponding to uRF
+ uCounter=0;
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_KMCO_NB_ROWS);
+
+ // update & write EXTENDED_BYTE_13
+ pObj->I2CMap.EXTENDED_BYTE_13 = (UInt8)((pObj->I2CMap.EXTENDED_BYTE_13 & 0x83) | pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uK << 4 | pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uM << 2 );
+ if (TDA18271Write(pObj,0x1C,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ /*// update & write EXTENDED_BYTE_23
+ pObj->I2CMap.EXTENDED_BYTE_23 = (UInt8)((pObj->I2CMap.EXTENDED_BYTE_23 & 0xCF) | pObj->Config.RF_CAL_KMCO_Map[uCounter - 1].uCOAmpl << 4);
+ if (TDA18271Write(pObj,0x26,1) != True)
+ return TMBSL_ERR_IIC_ERR;*/
+
+ // search for RF_BAND corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS);
+ pObj->I2CMap.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;
+
+ // search for Gain_Taper corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_GAIN_TAPER_NB_ROWS);
+ pObj->I2CMap.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // write byte EASY_PROG_BYTE_2
+ if (TDA18271Write(pObj,0x04,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_4
+ pObj->I2CMap.EXTENDED_BYTE_4 = (pObj->I2CMap.EXTENDED_BYTE_4 & 0x07) | 0x40;
+ if (TDA18271Write(pObj,0x13,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // update & write byte EXTENDED_BYTE_7
+ pObj->I2CMap.EXTENDED_BYTE_7 = 0x40;
+ if (TDA18271Write(pObj,0x16,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 10 ms for pll locking
+ if (TDA18271Wait(pObj,10) == False)
+ return TM_FALSE;
+
+ // update & write byte EXTENDED_BYTE_20
+ pObj->I2CMap.EXTENDED_BYTE_20 = 0xEC;
+ if (TDA18271Write(pObj,0x23,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait x ms for for RF tracking filter calibration completion (default 60 ms)
+ if (TDA18271Wait(pObj,(UInt16)((pObj->Config.uPROTOCOLWAIT & 0xFF00) >> 8)) == False)
+ return TM_FALSE;
+
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.CAL_Mode = 0x00;
+
+ // write byte EASY_PROG_BYTE_4
+ if (TDA18271Write(pObj,0x06,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // write byte EASY_PROG_BYTE_1
+ if (TDA18271Write(pObj,0x03,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ //----------------------
+ // RF tracking filter correction for VHF_Low band
+ //----------------------
+ if ((((pObj->Config.uPROTOCOLSTEP & 0x04) >> 2) == 0x01) && (uRF <= pObj->Config.RF_CAL_Map[TDA18271_RF_CAL_NB_ROWS - 1].uRF_Max))
+ {
+ // search for RFC_Cprog corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (uRF > pObj->Config.RF_CAL_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_CAL_NB_ROWS);
+
+ // update & write EXTENDED_BYTE_14
+ pObj->I2CMap.EXTENDED_BYTE_14 = (UInt8)pObj->Config.RF_CAL_Map[uCounter - 1].uRFC_Cprog;
+ if (TDA18271Write(pObj,0x1D,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ //----------------------
+ // channel configuration
+ //----------------------
+ if (((pObj->Config.uPROTOCOLSTEP & 0x01) >> 0) == 0x01)
+ {
+ if (((pObj->Config.uPROTOCOLSTEP & 0x02) >> 1) == 0x01)
+ {
+ // set standard mode to current standard
+ tmbslTDA18271SetStandardMode (TunerUnit,pObj->StandardMode);
+ }
+
+ // write EXTENDED_BYTE_22
+ if (TDA18271Write(pObj,0x25,1) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // set CAL_Mode to normal mode
+ pObj->I2CMap.CAL_Mode = 0x00;
+
+ // set power level indicator to off
+ pObj->Config.uPLMODE = 1;
+ pObj->I2CMap.Dis_Power_level = 1;
+
+ // set thermometer to off
+ pObj->Config.uTMMODE = 0;
+ pObj->I2CMap.TM_ON = 0;
+
+ // search for IR_Meas corresponding to wanted frequency
+ uIRMeasCounter = 0;
+ do uIRMeasCounter ++;
+ while (pObj->Config.uRF > pObj->Config.IR_MEAS_Map[uIRMeasCounter - 1].uRF_Max && uIRMeasCounter - 1 < TDA18271_IR_MEAS_NB_ROWS);
+ pObj->I2CMap.IR_Meas = uIRMeasCounter + 3;
+
+ // calculate MAIN PLL
+ if (TDA18271CalcMAINPLL(pObj, pObj->Config.uRF + pObj->Config.uIF) == False)
+ return TM_FALSE;
+
+ // write bytes 0x01 to 0x0F
+ if (TDA18271Write(pObj,0x01,15) != True)
+ return TMBSL_ERR_IIC_ERR;
+
+ // wait 5 ms for pll locking
+ if (TDA18271Wait(pObj,5) == False)
+ return TM_FALSE;
+
+ // read bytes 0x00 to 0x0F
+ if (TDA18271Read (pObj,0x00,16) != True)
+ return TMBSL_ERR_IIC_ERR;
+ }
+
+ return TM_OK;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: tmbslTDA18271GetRf:
+//
+// 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(
+ tmUnitSelect_t TunerUnit, // I: Tuner unit number
+ UInt32* pRF // O: RF frequency in hertz
+ )
+{
+ ptmTDA18271Object_t pObj;
+
+ //------------------------------
+ // test input parameters
+ //------------------------------
+ // test the instance number
+ if (TunerUnit > TDA18271_MAX_UNITS)
+ return TMBSL_ERR_TUNER_BAD_UNIT_NUMBER;
+
+ // test the Object
+ if (gTDA18271Instance[TunerUnit].init == False)
+ return TMBSL_ERR_TUNER_NOT_INITIALIZED;
+
+ // pObj initialisation
+ pObj = &gTDA18271Instance[TunerUnit];
+
+ //----------------------
+ // get the value
+ //----------------------
+ // the read function can't be used
+ *pRF = pObj->Config.uRF;
+
+ return TM_OK;
+}
+
+
+//-----------------------------------------------------------------------------
+// Internal functions:
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+// FUNCTION: TDA18271Init:
+//
+// DESCRIPTION: Initialisation of the Tuner
+//
+// RETURN: always True
+//
+// NOTES:
+//-----------------------------------------------------------------------------
+//
+Bool_
+TDA18271Init (
+ tmUnitSelect_t TunerUnit // I: Tuner Object
+ )
+{
+ return True;
+}
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Write
+//
+// DESCRIPTION: This function writes I2C data in the Tuner
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Write(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ )
+{
+ Bool_ I2CCommResult;
+
+ UInt8 uCounter;
+ UInt8* pI2CMap;
+ UInt32 WriteBuffer[TDA18271_NB_BYTES] = {0};
+ UInt32* pWriteBuffer;
+
+ // pI2CMap & pWriteBuffer initialisation
+ pI2CMap = &(pObj->I2CMap.ID_BYTE);
+ pWriteBuffer = &(WriteBuffer[0]);
+
+ // copy I2CMap data in WriteBuffer
+ for (uCounter = 0; uCounter < TDA18271_NB_BYTES; uCounter++)
+ {
+ *pWriteBuffer = (UInt32)(*pI2CMap);
+ pWriteBuffer ++;
+ pI2CMap ++;
+ }
+
+ /*// activate extended register access if needed
+ if ( (uSubAddress + uNbData >= 0x11) && (uNbData > 1) )
+ {
+ // update & write byte EASY_PROG_BYTE_5
+ pObj->I2CMap.Extended_Reg = 0x01;
+ I2CCommResult = TDA18271Write(pObj,0x07,1);
+ }*/
+
+ // write data in the Tuner
+ I2CCommResult = pObj->SystemFunc.SY_Write( pObj->uHwAddress,
+ uSubAddress,
+ uNbData,
+ &(WriteBuffer[uSubAddress]) );
+
+ // shift I2CLog content
+ TDA18271ShiftLog (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] = pObj->uHwAddress;
+ pObj->I2CLog [0][TDA18271_NB_BYTES + 1] = I2CCommResult;
+
+ /*// deactivate extended register access if needed
+ if ( (uSubAddress + uNbData >= 0x11) && (uNbData > 1) )
+ {
+ // update & write byte EASY_PROG_BYTE_5
+ pObj->I2CMap.Extended_Reg = 0x00;
+ I2CCommResult = TDA18271Write(pObj,0x07,1);
+ }*/
+
+ // return value
+ return I2CCommResult;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Read
+//
+// DESCRIPTION: This function reads I2C data from the Tuner
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Read(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uSubAddress,// I: sub address
+ UInt8 uNbData // I: nb of data
+ )
+{
+ Bool_ I2CCommResult;
+
+ UInt8 uCounter;
+ UInt8* pI2CMap;
+ UInt32 ReadBuffer[TDA18271_NB_BYTES] = {0};
+ UInt32* pReadBuffer;
+
+ // pI2CMap & pReadBuffer initialisation
+ pI2CMap = &(pObj->I2CMap.ID_BYTE) + uSubAddress;
+ pReadBuffer = &(ReadBuffer[uSubAddress]);
+
+ // read data from the Tuner
+ I2CCommResult = pObj->SystemFunc.SY_Read( 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 (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] = pObj->uHwAddress + 1;
+ pObj->I2CLog [0][TDA18271_NB_BYTES + 1] = I2CCommResult;
+
+ // return value
+ return I2CCommResult;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271Wait
+//
+// DESCRIPTION: This function waits for requested time
+//
+// RETURN: True or False
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271Wait(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt16 wTime // I: time to wait for
+ )
+{
+ User_delay( pObj->AFAInfo.demodulator, wTime);
+
+ return True;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271ShiftLog
+//
+// DESCRIPTION: Shift I2CLog content of wanted lines
+//
+// RETURN: True
+//
+// NOTES:
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271ShiftLog(
+ ptmTDA18271Object_t pObj, // I: Tuner unit number
+ UInt8 uNbRows // I: nb of lines
+ )
+{
+ UInt8 uRow;
+ UInt8 uColumn;
+ UInt8 uCounter;
+
+ // Shift I2CLog content of wanted lines
+ for (uCounter = 0; uCounter < uNbRows; uCounter++)
+ {
+ for (uRow = TDA18271_LOG_NB_ROWS - 1; uRow > 0; uRow--)
+ {
+ for (uColumn = 0; uColumn < TDA18271_NB_BYTES + 2; uColumn++)
+ pObj->I2CLog [uRow][uColumn] = pObj->I2CLog [uRow - 1][uColumn];
+ }
+
+ for (uColumn = 0; uColumn < TDA18271_NB_BYTES + 2; uColumn++)
+ pObj->I2CLog [0][uColumn] = 256;
+ }
+
+ // Return value
+ return True;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcMAINPLL:
+//
+// DESCRIPTION: Calculate the MAIN fractionnal PLL settings
+//
+// RETURN: True or False
+//
+// NOTES: This function doesn't write in the tuner
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271CalcMAINPLL (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ )
+{
+ UInt8 uCounter = 0;
+ UInt32 uDiv;
+
+ // search for MAIN_Post_Div corresponding to uLO
+ uCounter = 0;
+ do uCounter ++;
+ while (uLO > pObj->Config.MAIN_PLL_Map[uCounter - 1].uLO_Max && uCounter < TDA18271_MAIN_PLL_NB_ROWS);
+ // Decalage table : MAIN_Post_Div[4] = 0 in table or MAIN_Post_Div[4] = 1
+ pObj->I2CMap.MAIN_Post_Div = ((UInt8)pObj->Config.MAIN_PLL_Map[uCounter - 1].uPost_Div) & 0x7F;
+
+ // calculate MAIN_Div
+ uDiv = (((UInt32)(pObj->Config.MAIN_PLL_Map[uCounter - 1].uDiv) * (uLO / 1000)) << 7) / 125;
+ pObj->I2CMap.MAIN_Div_22_to_16 = (UInt8)(uDiv >> 16) & 0x7F;
+ pObj->I2CMap.MAIN_Div_15_to_8 = (UInt8)(uDiv >> 8);
+ pObj->I2CMap.MAIN_Div_7_to_0 = (UInt8)(uDiv);
+
+ return True;
+}
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcCALPLL:
+//
+// DESCRIPTION: Calculate the CAL fractionnal PLL settings
+//
+// RETURN: True or False
+//
+// NOTES: This function doesn't write in the tuner
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271CalcCALPLL (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ )
+{
+ UInt8 uCounter = 0;
+ UInt32 uDiv;
+
+ // 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);
+ //CAL_POST_DIV_BYTE[7] = 0 in table or CAL_POST_DIV_BYTE[7]=1 =>(| 0x80)
+ pObj->I2CMap.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.CAL_Div_22_to_16 = (UInt8)(uDiv >> 16) & 0x7F;
+ pObj->I2CMap.CAL_Div_15_to_8 = (UInt8)(uDiv >> 8);
+ pObj->I2CMap.CAL_Div_7_to_0 = (UInt8)(uDiv);
+
+ return True;
+}
+
+
+//-------------------------------------------------------------------------------------
+// FUNCTION: TDA18271CalcRFFilter:
+//
+// DESCRIPTION: Calculate the RF Filters
+//
+// RETURN: True or False
+//
+// NOTES: This function doesn't write in the tuner
+//-------------------------------------------------------------------------------------
+//
+Bool_
+TDA18271CalcRFFilter (
+ ptmTDA18271Object_t pObj, // I: tuner Object
+ UInt32 uLO // I: local oscillator frequency in hertz
+ )
+{
+ UInt8 uCounter = 0;
+
+ // search for BP_Filter corresponding to uRF
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.BP_FILTER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_BP_FILTER_NB_ROWS);
+ pObj->I2CMap.BP_Filter = (UInt8)pObj->Config.BP_FILTER_Map[uCounter - 1].uBP_Filter;
+
+ // search for RF_BAND corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_RF_BAND_NB_ROWS);
+ pObj->I2CMap.RF_Band = (UInt8)pObj->Config.RF_BAND_Map[uCounter - 1].uRF_Band;
+
+ // search for Gain_Taper corresponding to uRF
+ uCounter = 0;
+ do uCounter ++;
+ while (pObj->Config.uRF > pObj->Config.GAIN_TAPER_Map[uCounter - 1].uRF_Max && uCounter < TDA18271_GAIN_TAPER_NB_ROWS);
+ pObj->I2CMap.Gain_Taper = (UInt8)pObj->Config.GAIN_TAPER_Map[uCounter - 1].uGain_Taper;
+
+ return True;
+}
+
+//-------------------------------------------------------------------------------------
+// TUNER ERRORS TYPES
+//
+// RETURN: TM_OK
+// TM_FALSE
+// TMBSL_ERR_TUNER_BAD_UNIT_NUMBER
+// TMBSL_ERR_TUNER_NOT_INITIALIZED
+// TMBSL_ERR_TUNER_BAD_PARAMETER
+// TMBSL_ERR_TUNER_NOT_SUPPORTED
+// TM_ERR_IIC_ERR
+//
+//-------------------------------------------------------------------------------------
+// \ No newline at end of file