gr-baz Package
rtl2832-tuner_e4000.h
Go to the documentation of this file.
00001 #ifndef __TUNER_E4000_H
00002 #define __TUNER_E4000_H
00003 
00004 #include "rtl2832.h"
00005 
00006 namespace RTL2832_NAMESPACE { namespace TUNERS_NAMESPACE {
00007 
00008 class e4000 : public RTL2832_NAMESPACE::tuner_skeleton
00009 {
00010 IMPLEMENT_INLINE_TUNER_FACTORY(e4000)
00011 public:
00012         e4000(demod* p);
00013 public:
00014         inline virtual const char* name() const
00015         { return "Elonics E4000"; }
00016 public:
00017         int initialise(tuner::PPARAMS params = NULL);
00018         int set_frequency(double freq);
00019         int set_bandwidth(double bw);
00020         int set_gain(double gain);
00021         int set_gain_mode(int mode);
00022         int set_auto_gain_mode(bool on = true);
00023         bool calc_appropriate_gain_mode(int& mode)/* const*/;
00024 private:
00025         int update_gain_mode();
00026 };
00027 
00028 } } // TUNERS_NAMESPACE, RTL2832_NAMESPACE
00029 
00030 /**
00031 
00032 @file
00033 
00034 @brief   E4000 tuner module declaration
00035 One can manipulate E4000 tuner through E4000 module.
00036 E4000 module is derived from tuner module.
00037 
00038 @par Example:
00039 @code
00040 
00041 // The example is the same as the tuner example in tuner_base.h except the listed lines.
00042 
00043 #include "tuner_e4000.h"
00044 ...
00045 int main(void)
00046 {
00047         TUNER_MODULE        *pTuner;
00048         E4000_EXTRA_MODULE *pTunerExtra;
00049 
00050         TUNER_MODULE          TunerModuleMemory;
00051         BASE_INTERFACE_MODULE BaseInterfaceModuleMemory;
00052 //      I2C_BRIDGE_MODULE     I2cBridgeModuleMemory;
00053 
00054         unsigned long BandwidthMode;
00055 
00056         ...
00057 
00058         // Build E4000 tuner module.
00059         BuildE4000Module(
00060                 &pTuner,
00061                 &TunerModuleMemory,
00062                 &BaseInterfaceModuleMemory,
00063                 &I2cBridgeModuleMemory,
00064                 0xac,                                                           // I2C device address is 0xac in 8-bit format.
00065                 CRYSTAL_FREQ_16384000HZ,                        // Crystal frequency is 16.384 MHz.
00066                 E4000_AGC_INTERNAL                                      // The E4000 AGC mode is internal AGC mode.
00067                 );
00068 
00069         // Get E4000 tuner extra module.
00070         pTunerExtra = (T2266_EXTRA_MODULE *)(pTuner->pExtra);
00071 
00072         // ==== Initialize tuner and set its parameters =====
00073         ...
00074 
00075         // Set E4000 bandwidth.
00076         pTunerExtra->SetBandwidthMode(pTuner, E4000_BANDWIDTH_6MHZ);
00077 
00078         // ==== Get tuner information =====
00079         ...
00080 
00081         // Get E4000 bandwidth.
00082         pTunerExtra->GetBandwidthMode(pTuner, &BandwidthMode);
00083 
00084         // See the example for other tuner functions in tuner_base.h
00085 
00086         return 0;
00087 }
00088 @endcode
00089 */
00090 
00091 //#include "tuner_base.h"
00092 
00093 // The following context is implemented for E4000 source code.
00094 
00095 // Definition (implemeted for E4000)
00096 #define E4000_1_SUCCESS                 1
00097 #define E4000_1_FAIL                    0
00098 #define E4000_I2C_SUCCESS               1
00099 #define E4000_I2C_FAIL                  0
00100 /*
00101 // Function (implemeted for E4000)
00102 int
00103 I2CReadByte(
00104         RTL2832_NAMESPACE::tuner* pTuner,
00105         unsigned char NoUse,
00106         unsigned char RegAddr,
00107         unsigned char *pReadingByte
00108         );
00109 
00110 int
00111 I2CWriteByte(
00112         RTL2832_NAMESPACE::tuner* pTuner,
00113         unsigned char NoUse,
00114         unsigned char RegAddr,
00115         unsigned char WritingByte
00116         );
00117 
00118 int
00119 I2CWriteArray(
00120         RTL2832_NAMESPACE::tuner* pTuner,
00121         unsigned char NoUse,
00122         unsigned char RegStartAddr,
00123         unsigned char ByteNum,
00124         unsigned char *pWritingBytes
00125         );
00126 */
00127 // Functions (from E4000 source code)
00128 int tunerreset (RTL2832_NAMESPACE::tuner* pTuner);
00129 int Tunerclock(RTL2832_NAMESPACE::tuner* pTuner);
00130 int Qpeak(RTL2832_NAMESPACE::tuner* pTuner);
00131 int DCoffloop(RTL2832_NAMESPACE::tuner* pTuner);
00132 int GainControlinit(RTL2832_NAMESPACE::tuner* pTuner);
00133 
00134 int Gainmanual(RTL2832_NAMESPACE::tuner* pTuner);
00135 int E4000_gain_freq(RTL2832_NAMESPACE::tuner* pTuner, int frequency);
00136 int PLL(RTL2832_NAMESPACE::tuner* pTuner, int Ref_clk, int Freq);
00137 int LNAfilter(RTL2832_NAMESPACE::tuner* pTuner, int Freq);
00138 int IFfilter(RTL2832_NAMESPACE::tuner* pTuner, int bandwidth, int Ref_clk);
00139 int freqband(RTL2832_NAMESPACE::tuner* pTuner, int Freq);
00140 int DCoffLUT(RTL2832_NAMESPACE::tuner* pTuner);
00141 int GainControlauto(RTL2832_NAMESPACE::tuner* pTuner);
00142 
00143 int E4000_sensitivity(RTL2832_NAMESPACE::tuner* pTuner, int Freq, int bandwidth);
00144 int E4000_linearity(RTL2832_NAMESPACE::tuner* pTuner, int Freq, int bandwidth);
00145 int E4000_high_linearity(RTL2832_NAMESPACE::tuner* pTuner);
00146 int E4000_nominal(RTL2832_NAMESPACE::tuner* pTuner, int Freq, int bandwidth);
00147 
00148 // The following context is E4000 tuner API source code
00149 
00150 // Definitions
00151 /*
00152 // Bandwidth in Hz
00153 enum E4000_BANDWIDTH_HZ
00154 {
00155         E4000_BANDWIDTH_6000000HZ = 6000000,
00156         E4000_BANDWIDTH_7000000HZ = 7000000,
00157         E4000_BANDWIDTH_8000000HZ = 8000000,
00158 };
00159 */
00160 // Manipulaing functions
00161 void
00162 e4000_GetTunerType(
00163         RTL2832_NAMESPACE::tuner* pTuner,
00164         int *pTunerType
00165         );
00166 
00167 void
00168 e4000_GetDeviceAddr(
00169         RTL2832_NAMESPACE::tuner* pTuner,
00170         unsigned char *pDeviceAddr
00171         );
00172 
00173 int
00174 e4000_Initialize(
00175         RTL2832_NAMESPACE::tuner* pTuner,
00176         bool enable_dc_offset_loop = true,
00177         bool set_manual_gain = false
00178         );
00179 
00180 int
00181 e4000_SetRfFreqHz(
00182         RTL2832_NAMESPACE::tuner* pTuner,
00183         unsigned long RfFreqHz,
00184         bool update_gain_control = true,
00185         bool enable_dc_offset_lut = true
00186         );
00187 
00188 int
00189 e4000_GetRfFreqHz(
00190         RTL2832_NAMESPACE::tuner* pTuner,
00191         unsigned long *pRfFreqHz
00192         );
00193 
00194 // Extra manipulaing functions
00195 int
00196 e4000_GetRegByte(
00197         RTL2832_NAMESPACE::tuner* pTuner,
00198         unsigned char RegAddr,
00199         unsigned char *pReadingByte
00200         );
00201 
00202 int
00203 e4000_SetBandwidthHz(
00204         RTL2832_NAMESPACE::tuner* pTuner,
00205         unsigned long BandwidthHz
00206         );
00207 
00208 int
00209 e4000_GetBandwidthHz(
00210         RTL2832_NAMESPACE::tuner* pTuner,
00211         unsigned long *pBandwidthHz
00212         );
00213 
00214 ///////////////////////////////////////////////////////////////////////////////
00215 // Definitions
00216 
00217 #define RTL2832_E4000_ADDITIONAL_INIT_REG_TABLE_LEN             34
00218 
00219 #define RTL2832_E4000_LNA_GAIN_TABLE_LEN                                16
00220 #define RTL2832_E4000_LNA_GAIN_ADD_TABLE_LEN                    8
00221 #define RTL2832_E4000_MIXER_GAIN_TABLE_LEN                              2
00222 #define RTL2832_E4000_IF_STAGE_1_GAIN_TABLE_LEN                 2
00223 #define RTL2832_E4000_IF_STAGE_2_GAIN_TABLE_LEN                 4
00224 #define RTL2832_E4000_IF_STAGE_3_GAIN_TABLE_LEN                 4
00225 #define RTL2832_E4000_IF_STAGE_4_GAIN_TABLE_LEN                 4
00226 #define RTL2832_E4000_IF_STAGE_5_GAIN_TABLE_LEN                 8
00227 #define RTL2832_E4000_IF_STAGE_6_GAIN_TABLE_LEN                 8
00228 
00229 #define RTL2832_E4000_LNA_GAIN_BAND_NUM                                 2
00230 #define RTL2832_E4000_MIXER_GAIN_BAND_NUM                               2
00231 
00232 #define RTL2832_E4000_RF_BAND_BOUNDARY_HZ                               300000000
00233 
00234 #define RTL2832_E4000_LNA_GAIN_ADDR                                             0x14
00235 #define RTL2832_E4000_LNA_GAIN_MASK                                             0xf
00236 #define RTL2832_E4000_LNA_GAIN_SHIFT                                    0
00237 
00238 #define RTL2832_E4000_LNA_GAIN_ADD_ADDR                                 0x24
00239 #define RTL2832_E4000_LNA_GAIN_ADD_MASK                                 0x7
00240 #define RTL2832_E4000_LNA_GAIN_ADD_SHIFT                                0
00241 
00242 #define RTL2832_E4000_MIXER_GAIN_ADDR                                   0x15
00243 #define RTL2832_E4000_MIXER_GAIN_MASK                                   0x1
00244 #define RTL2832_E4000_MIXER_GAIN_SHIFT                                  0
00245 
00246 #define RTL2832_E4000_IF_STAGE_1_GAIN_ADDR                              0x16
00247 #define RTL2832_E4000_IF_STAGE_1_GAIN_MASK                              0x1
00248 #define RTL2832_E4000_IF_STAGE_1_GAIN_SHIFT                             0
00249 
00250 #define RTL2832_E4000_IF_STAGE_2_GAIN_ADDR                              0x16
00251 #define RTL2832_E4000_IF_STAGE_2_GAIN_MASK                              0x6
00252 #define RTL2832_E4000_IF_STAGE_2_GAIN_SHIFT                             1
00253 
00254 #define RTL2832_E4000_IF_STAGE_3_GAIN_ADDR                              0x16
00255 #define RTL2832_E4000_IF_STAGE_3_GAIN_MASK                              0x18
00256 #define RTL2832_E4000_IF_STAGE_3_GAIN_SHIFT                             3
00257 
00258 #define RTL2832_E4000_IF_STAGE_4_GAIN_ADDR                              0x16
00259 #define RTL2832_E4000_IF_STAGE_4_GAIN_MASK                              0x60
00260 #define RTL2832_E4000_IF_STAGE_4_GAIN_SHIFT                             5
00261 
00262 #define RTL2832_E4000_IF_STAGE_5_GAIN_ADDR                              0x17
00263 #define RTL2832_E4000_IF_STAGE_5_GAIN_MASK                              0x7
00264 #define RTL2832_E4000_IF_STAGE_5_GAIN_SHIFT                             0
00265 
00266 #define RTL2832_E4000_IF_STAGE_6_GAIN_ADDR                              0x17
00267 #define RTL2832_E4000_IF_STAGE_6_GAIN_MASK                              0x38
00268 #define RTL2832_E4000_IF_STAGE_6_GAIN_SHIFT                             3
00269 
00270 #define RTL2832_E4000_TUNER_OUTPUT_POWER_UNIT_0P1_DBM   -100
00271 
00272 #define RTL2832_E4000_TUNER_MODE_UPDATE_WAIT_TIME_MS    1000
00273 
00274 // Tuner gain mode
00275 enum RTL2832_E4000_TUNER_GAIN_MODE
00276 {
00277         RTL2832_E4000_TUNER_GAIN_SENSITIVE      = RTL2832_NAMESPACE::tuner::DEFAULT,
00278         RTL2832_E4000_TUNER_GAIN_NORMAL,
00279         RTL2832_E4000_TUNER_GAIN_LINEAR,
00280 };
00281 
00282 #endif