summaryrefslogtreecommitdiffstats
path: root/api/driver_tua9001.c
diff options
context:
space:
mode:
Diffstat (limited to 'api/driver_tua9001.c')
-rw-r--r--api/driver_tua9001.c409
1 files changed, 409 insertions, 0 deletions
diff --git a/api/driver_tua9001.c b/api/driver_tua9001.c
new file mode 100644
index 0000000..cf61fe9
--- /dev/null
+++ b/api/driver_tua9001.c
@@ -0,0 +1,409 @@
+/* ============================================================================
+** Copyright (C) 1997-2007 Infineon AG All rights reserved.
+** ============================================================================
+**
+** ============================================================================
+** Revision Information :
+** File name: driver_tua9001.c
+** Version: V 1.01
+** Date:
+**
+** ============================================================================
+** History:
+**
+** Date Author Comment
+** ----------------------------------------------------------------------------
+**
+** 2007.11.06 Walter Pichler created.
+** 2008.04.08 Walter Pichler adaption to TUA 9001E
+**
+** ============================================================================
+*/
+
+/*============================================================================
+Includes
+============================================================================*/
+
+#include "driver_tua9001.h"
+#include "driver_tua9001_NeededFunctions.h" /* Note: This function have to be provided by the user */
+
+/*============================================================================
+Local compiler keeys ( usage depends on the application )
+============================================================================*/
+
+#define CRYSTAL_26_MHZ
+//#define CRYSTAL_19.2_MHZ
+//#define CRYSTAL_20.48_MHZ
+
+//#define AGC_BY_IIC
+#define AGC_BY_AGC_BUS
+//#define AGC_BY_EXT_PIN
+
+
+/*============================================================================
+Named Constants Definitions ( usage depends on the application )
+============================================================================*/
+
+#define TUNERs_TUA9001_DEVADDR 0xC0
+
+/* Note: The correct device address depends hardware settings. See Datasheet
+ and User Manual for details. */
+
+/*============================================================================
+Local Named Constants Definitions
+============================================================================*/
+#define OPERATIONAL_MODE 0x03
+#define CHANNEL_BANDWITH 0x04
+#define SW_CONTR_TIME_SLICING 0x05
+#define BASEBAND_GAIN_CONTROL 0x06
+#define MANUAL_BASEBAND_GAIN 0x0b
+#define REFERENCE_FREQUENCY 0x1d
+#define CHANNEL_WORD 0x1f
+#define CHANNEL_OFFSET 0x20
+#define CHANNEL_FILTER_TRIMMING 0x2f
+#define OUTPUT_BUFFER 0x32
+#define RF_AGC_CONFIG_A 0x36
+#define RF_AGC_CONFIG_B 0x37
+#define UHF_LNA_SELECT 0x39
+#define LEVEL_DETECTOR 0x3a
+#define MIXER_CURRENT 0x3b
+#define PORT_CONTROL 0x3e
+#define CRYSTAL_TRIMMING 0x41
+#define CHANNEL_FILTER_STATUS 0x60
+#define SIG_STRENGHT_INDICATION 0x62
+#define PLL_LOCK 0x69
+#define RECEIVER_STATE 0x70
+#define RF_INPUT 0x71
+#define BASEBAND_GAIN 0x72
+#define CHIP_IDENT_CODE 0x7e
+#define CHIP_REVISION 0x7f
+
+#define TUNERs_TUA9001_BW_8 0xcf
+#define TUNERs_TUA9001_BW_7 0x10
+#define TUNERs_TUA9001_BW_6 0x20
+#define TUNERs_TUA9001_BW_5 0x30
+
+
+
+
+/*============================================================================
+ Types definition
+============================================================================*/
+
+
+
+
+/*============================================================================
+ Public Functions
+============================================================================*/
+
+
+/**
+ * tuner initialisation
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int initializeTua9001 (void)
+{
+ unsigned int counter;
+ char i2cseq[2];
+ tunerReceiverState_t tunerState;
+
+ /* Note: CEN may also be hard wired in the application*/
+ setCEN (H_LEVEL); /* asserting Chip enable */
+
+ setRESETN (L_LEVEL); /* asserting RESET */
+
+ setRXEN (L_LEVEL); /* RXEN to low >> IDLE STATE */
+
+ /* Note: 20µs assumes that all external power supplies are settled. If not, add more time here */
+ waitloop (20); /* wait for 20 uS */
+
+ setRESETN (H_LEVEL); /* de-asserting RESET */
+
+ /* This is to wait for the Crystal Oscillator to settle .. wait until IDLE mode is reached */
+ counter = 7;
+ do
+ {
+ counter --;
+ waitloop (1000); /* wait for 1 mS */
+
+ }while ((counter));
+
+
+ /**** Overwrite default register value ****/
+ i2cseq[0] = 0x65; /* Waiting time before PLL cal. start */
+ i2cseq[1] = 0x12;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x1e, i2cseq, 2);
+
+ i2cseq[0] = 0xB8; /* VCO Varactor bias fine tuning */
+ i2cseq[1] = 0x88;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x25, i2cseq, 2);
+
+ i2cseq[0] = 0x54; /* LNA switching Threshold for UHF1/2 */
+ i2cseq[1] = 0x60;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x39, i2cseq, 2);
+
+ i2cseq[0] = 0x00;
+ i2cseq[1] = 0xC0;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x3b, i2cseq, 2);
+
+ i2cseq[0] = 0xF0; /* LO- Path Set LDO output voltage */
+ i2cseq[1] = 0x00;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x3a, i2cseq, 2);
+
+ i2cseq[0] = 0x00; /* Set EXTAGC interval */
+ i2cseq[1] = 0x00;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x08, i2cseq, 2);
+
+ i2cseq[0] = 0x00; /* Set max. capacitive load */
+ i2cseq[1] = 0x30;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x32, i2cseq, 2);
+
+
+ /**** Set Crystal Reference Frequency an Trim value ****/
+#if defined(CRYSTAL_26_MHZ) /* Frequency 26 MHz */
+ i2cseq[0] = 0x01;
+ i2cseq[1] = 0xB0;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x1d, i2cseq, 2);
+
+ i2cseq[0] = 0x70; /* NDK 3225 series 26 MHz XTAL */
+ i2cseq[1] = 0x3a;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x41, i2cseq, 2);
+ i2cseq[0] = 0x1C;
+ i2cseq[1] = 0x78;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x40, i2cseq, 2);
+
+#elif defined(CRYSTAL_19.2_MHZ) /* Frequency 19.2 MHz */
+ i2cseq[0] = 0x01;
+ i2cseq[1] = 0xA0;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x1d, i2cseq, 2);
+ /* Note: Insert optimised register values for 0x40 / 0x41 for used crystal */
+ /* contact application support for further information */
+#elif defined(CRYSTAL_20.48_MHZ) /* Frequency 20,48 MHz */
+ i2cseq[0] = 0x01;
+ i2cseq[1] = 0xA8;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x1d, i2cseq, 2);
+ /* Note: Insert optimised register values for 0x40 / 0x41 for used crystal */
+ /* contact application support for further information */
+#endif
+
+
+
+ /**** Set desired Analog Baseband AGC mode ****/
+#if defined (AGC_BY_IIC)
+ i2cseq[0] = 0x00; /* Bypass AGC controller >> IIC based AGC */
+ i2cseq[1] = 0x40;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x06, i2cseq, 2);
+#elif defined(AGC_BY_AGC_BUS)
+ i2cseq[0] = 0x00; /* Digital AGC bus */
+ i2cseq[1] = 0x00; /* 0,5 dB steps */
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x06, i2cseq, 2);
+#elif defined(AGC_BY_EXT_PIN)
+ i2cseq[0] = 0x40; /* Ext. AGC pin */
+ i2cseq[1] = 0x00;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x06, i2cseq, 2);
+#endif
+
+
+ /**** set desired RF AGC parameter *****/
+ i2cseq[0] = 0x1c; /* Set Wideband Detector Current (100 uA) */
+ i2cseq[1] = 0x00;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x2c, i2cseq, 2);
+
+ i2cseq[0] = 0xC0; /* Set RF AGC Threshold (-32.5dBm) */
+ i2cseq[1] = 0x13;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x36, i2cseq, 2);
+
+ i2cseq[0] = 0x6f; /* RF AGC Parameter */
+ i2cseq[1] = 0x18;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x37, i2cseq, 2);
+
+ i2cseq[0] = 0x00; /* aditional VCO settings */
+ i2cseq[1] = 0x08;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x27, i2cseq, 2);
+
+ i2cseq[0] = 0x00; /* aditional PLL settings */
+ i2cseq[1] = 0x01;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x2a, i2cseq, 2);
+
+ i2cseq[0] = 0x0a; /* VCM correction */
+ i2cseq[1] = 0x40;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x34, i2cseq, 2);
+
+ return TUNER_OK;
+}
+
+
+
+/**
+ * tuner tune
+ * @param i_freq tuning frequency
+ * @param i_bandwidth channel bandwidth
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int tuneTua9001 (long i_freq, tunerDriverBW_t i_bandwidth)
+{
+ char i2cseq[2];
+ unsigned int divider_factor;
+ unsigned int ch_offset;
+ unsigned int counter;
+ unsigned int lo_path_settings;
+ tunerReceiverState_t tunerState;
+
+
+
+ /* de-assert RXEN >> IDLE STATE */
+ setRXEN (L_LEVEL);
+
+
+ /* calculate divider factor */
+ if (i_freq < 1000000) /* divider factor and channel offset for UHF/VHF III */
+ {
+ ch_offset = 0x1C20; /* channel offset 150 MHz */
+ divider_factor = (unsigned int) (((i_freq - 150000) * 48) / 1000);
+ lo_path_settings = 0xb6de;
+ }
+
+ else /* calculate divider factor for L-Band Frequencies */
+ {
+ ch_offset = 0x5460; /* channel offset 450 MHz */
+ divider_factor = (unsigned int) (((i_freq - 450000) * 48) / 1000);
+ lo_path_settings = 0xbede;
+ }
+
+
+ // Set LO Path
+ i2cseq[0] = lo_path_settings >> 8;
+ i2cseq[1] = lo_path_settings & 0xff;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x2b, i2cseq, 2);
+
+ // Set channel offset
+ i2cseq [0] = ch_offset >> 8;
+ i2cseq [1] = ch_offset & 0xff;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x20, i2cseq, 2);
+
+ // Set Frequency
+ i2cseq [0] = divider_factor >> 8;
+ i2cseq [1] = divider_factor & 0xff;
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x1f, i2cseq, 2);
+
+ // Set bandwidth
+
+ i2cseq [0] = 0;
+ switch (i_bandwidth)
+ {
+ case TUNER_BANDWIDTH_8MHZ: i2cseq [0] |= TUNERs_TUA9001_BW_8;
+ break;
+ case TUNER_BANDWIDTH_7MHZ: i2cseq [0] |= TUNERs_TUA9001_BW_7;
+ break;
+ case TUNER_BANDWIDTH_6MHZ: i2cseq [0] |= TUNERs_TUA9001_BW_6;
+ break;
+ case TUNER_BANDWIDTH_5MHZ: i2cseq [0] |= TUNERs_TUA9001_BW_5;
+ break;
+ }
+
+ i2cBusWrite (TUNERs_TUA9001_DEVADDR, 0x04, i2cseq, 2);
+
+ /* assert RXEN >> RX STATE */
+ setRXEN (H_LEVEL);
+
+ /* This is to wait for the RX state to settle .. wait until RX mode is reached */
+ counter = 5;
+ do
+ {
+ counter --;
+ waitloop (1000); /* wait for 1 mS */
+ }while ((counter));
+
+
+ return TUNER_OK;
+}
+
+
+/**
+ * Get pll locked state
+ * @param o_pll pll locked state
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int getPllLockedStateTua9001 (tunerPllLocked_t *o_pll)
+{
+ char i2cseq[2];
+
+ i2cBusRead (TUNERs_TUA9001_DEVADDR, 0x69, i2cseq, 2); /* get current register value */
+
+ o_pll[0] = (i2cseq[1] & 0x08) ? PLL_LOCKED : PLL_NOT_LOCKED;
+
+ return TUNER_OK;
+}
+
+
+/**
+ * Get tuner state
+ * @param o_tunerState tuner state
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int getReceiverStateTua9001 (tunerReceiverState_t *o_tunerState)
+{
+ char i2cseq[2];
+
+ i2cBusRead (TUNERs_TUA9001_DEVADDR, 0x70, i2cseq, 2); /* get current register value */
+
+ switch (i2cseq[1] & ~0x1f)
+ {
+ case 0x80: o_tunerState [0] = IDLE; break;
+ case 0x40: o_tunerState [0] = RX; break;
+ case 0x20: o_tunerState [0] = STANDBY;
+ }
+
+ return TUNER_OK;
+}
+
+
+/**
+ * Get active input
+ * @param o_activeInput active input info
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int getActiveInputTua9001 (tunerActiveInput_t *o_activeInput)
+{
+ char i2cseq[2];
+
+ i2cBusRead (TUNERs_TUA9001_DEVADDR, 0x71, i2cseq, 2); /* get current register value */
+
+ switch (i2cseq[1] & ~0x0f)
+ {
+ case 0x80: o_activeInput [0] = L_INPUT_ACTIVE; break;
+ case 0x20: o_activeInput [0] = UHF_INPUT_ACTIVE; break;
+ case 0x10: o_activeInput [0] = VHF_INPUT_ACTIVE;
+ }
+
+ return TUNER_OK;
+}
+
+
+/**
+ * Get baseband gain value
+ * @param o_basebandGain baseband gain value
+ * @retval TUNER_OK No error
+ * @retval TUNER__ERROR Error
+*/
+
+int getBasebandGainTua9001 (char *o_basebandGain)
+{
+ char i2cseq[2];
+
+ i2cBusRead (TUNERs_TUA9001_DEVADDR, 0x72, i2cseq, 2); /* get current register value */
+ o_basebandGain [0] = i2cseq [1];
+
+ return TUNER_OK;
+}