gr-baz Package
rtl2832-tuner_e4k.h
Go to the documentation of this file.
1 #ifndef _E4K_TUNER_H
2 #define _E4K_TUNER_H
3 
4 #include "rtl2832.h"
5 
6 namespace RTL2832_NAMESPACE { namespace TUNERS_NAMESPACE {
7 
8 class e4k;
9 
10 } } // TUNERS_NAMESPACE // RTL2832_NAMESPACE
11 
12 ///////////////////////////////////////////////////////////////////////////////
13 
14 /* (C) 2011-2012 by Harald Welte <laforge@gnumonks.org>
15  *
16  * All Rights Reserved
17  *
18  * This program is free software; you can redistribute it and/or modify
19  * it under the terms of the GNU General Public License as published by
20  * the Free Software Foundation; either version 3 of the License, or
21  * (at your option) any later version.
22  *
23  * This program is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26  * GNU General Public License for more details.
27  *
28  * You should have received a copy of the GNU General Public License
29  * along with this program. If not, see <http://www.gnu.org/licenses/>.
30  */
31 
32 enum e4k_reg {
49  E4K_REG_FILT1 = 0x10,
50  E4K_REG_FILT2 = 0x11,
51  E4K_REG_FILT3 = 0x12,
52  // gap
53  E4K_REG_GAIN1 = 0x14,
54  E4K_REG_GAIN2 = 0x15,
55  E4K_REG_GAIN3 = 0x16,
56  E4K_REG_GAIN4 = 0x17,
57  // gap
58  E4K_REG_AGC1 = 0x1a,
59  E4K_REG_AGC2 = 0x1b,
60  E4K_REG_AGC3 = 0x1c,
61  E4K_REG_AGC4 = 0x1d,
62  E4K_REG_AGC5 = 0x1e,
63  E4K_REG_AGC6 = 0x1f,
64  E4K_REG_AGC7 = 0x20,
65  E4K_REG_AGC8 = 0x21,
66  // gap
67  E4K_REG_AGC11 = 0x24,
68  E4K_REG_AGC12 = 0x25,
69  // gap
70  E4K_REG_DC1 = 0x29,
71  E4K_REG_DC2 = 0x2a,
72  E4K_REG_DC3 = 0x2b,
73  E4K_REG_DC4 = 0x2c,
74  E4K_REG_DC5 = 0x2d,
75  E4K_REG_DC6 = 0x2e,
76  E4K_REG_DC7 = 0x2f,
77  E4K_REG_DC8 = 0x30,
78  // gap
79  E4K_REG_QLUT0 = 0x50,
80  E4K_REG_QLUT1 = 0x51,
81  E4K_REG_QLUT2 = 0x52,
82  E4K_REG_QLUT3 = 0x53,
83  // gap
84  E4K_REG_ILUT0 = 0x60,
85  E4K_REG_ILUT1 = 0x61,
86  E4K_REG_ILUT2 = 0x62,
87  E4K_REG_ILUT3 = 0x63,
88  // gap
93  E4K_REG_PWM1 = 0x74,
94  E4K_REG_PWM2 = 0x75,
95  E4K_REG_PWM3 = 0x76,
96  E4K_REG_PWM4 = 0x77,
97  E4K_REG_BIAS = 0x78,
101  // FIXME
102 };
103 
104 #define E4K_MASTER1_RESET (1 << 0)
105 #define E4K_MASTER1_NORM_STBY (1 << 1)
106 #define E4K_MASTER1_POR_DET (1 << 2)
107 
108 #define E4K_SYNTH1_PLL_LOCK (1 << 0)
109 #define E4K_SYNTH1_BAND_SHIF 1
110 
111 #define E4K_SYNTH7_3PHASE_EN (1 << 3)
112 
113 #define E4K_SYNTH8_VCOCAL_UPD (1 << 2)
114 
115 #define E4K_FILT3_DISABLE (1 << 5)
116 
117 #define E4K_AGC1_LIN_MODE (1 << 4)
118 #define E4K_AGC1_LNA_UPDATE (1 << 5)
119 #define E4K_AGC1_LNA_G_LOW (1 << 6)
120 #define E4K_AGC1_LNA_G_HIGH (1 << 7)
121 
122 #define E4K_AGC6_LNA_CAL_REQ (1 << 4)
123 
124 #define E4K_AGC7_MIX_GAIN_AUTO (1 << 0)
125 #define E4K_AGC7_GAIN_STEP_5dB (1 << 5)
126 
127 #define E4K_AGC8_SENS_LIN_AUTO (1 << 0)
128 
129 #define E4K_AGC11_LNA_GAIN_ENH (1 << 0)
130 
131 #define E4K_DC1_CAL_REQ (1 << 0)
132 
133 #define E4K_DC5_I_LUT_EN (1 << 0)
134 #define E4K_DC5_Q_LUT_EN (1 << 1)
135 #define E4K_DC5_RANGE_DET_EN (1 << 2)
136 #define E4K_DC5_RANGE_EN (1 << 3)
137 #define E4K_DC5_TIMEVAR_EN (1 << 4)
138 
139 #define E4K_CLKOUT_DISABLE 0x96
140 
141 #define E4K_CHFCALIB_CMD (1 << 0)
142 
143 #define E4K_AGC1_MOD_MASK 0xF
144 
157 };
158 
159 enum e4k_band {
164 };
165 
176 };
177 
182 };
184  uint32_t fosc;
185  uint32_t intended_flo;
186  uint32_t flo;
187  uint16_t x;
188  uint8_t z;
189  uint8_t r;
190  uint8_t r_idx;
191  uint8_t threephase;
192 };
193 
194 struct e4k_state {
196  uint8_t i2c_addr;
199 };
200 
201 ///////////////////////////////////////////////////////////////////////////////
202 
203 /* structure describing a field in a register */
204 struct reg_field {
205  uint8_t reg;
206  uint8_t shift;
207  uint8_t width;
208 };
209 
211  const struct reg_field *fields;
212  const char **field_names;
213  uint32_t num_fields;
214  void *data;
215  int (*write_cb)(void *data, uint32_t reg, uint32_t val);
216  uint32_t (*read_cb)(void *data, uint32_t reg);
217 };
218 
219 enum cmd_op {
220  CMD_OP_GET = (1 << 0),
221  CMD_OP_SET = (1 << 1),
222  CMD_OP_EXEC = (1 << 2),
223 };
224 
225 uint32_t reg_field_read(struct reg_field_ops *ops, struct reg_field *field);
226 int reg_field_write(struct reg_field_ops *ops, struct reg_field *field, uint32_t val);
227 int reg_field_cmd(struct cmd_state *cs, enum cmd_op op,
228  const char *cmd, int argc, char **argv,
229  struct reg_field_ops *ops);
230 
231 ///////////////////////////////////////////////////////////////////////////////
232 
233 int e4k_init(struct e4k_state *e4k, bool enable_dc_offset_loop = true, bool set_manual_gain = false);
234 int e4k_if_gain_set(struct e4k_state *e4k, uint8_t stage, int8_t value);
235 int e4k_mixer_gain_set(struct e4k_state *e4k, int8_t value);
236 int e4k_commonmode_set(struct e4k_state *e4k, int8_t value);
237 int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq);
238 int e4k_tune_params(struct e4k_state *e4k, struct e4k_pll_params *p);
239 int e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo);
240 int e4k_if_filter_bw_get(struct e4k_state *e4k, enum e4k_if_filter filter);
241 int e4k_if_filter_bw_set(struct e4k_state *e4k, enum e4k_if_filter filter,
242  uint32_t bandwidth);
243 int e4k_if_filter_chan_enable(struct e4k_state *e4k, int on);
244 int e4k_rf_filter_set(struct e4k_state *e4k);
245 /*
246 int e4k_reg_write(struct e4k_state *e4k, uint8_t reg, uint8_t val);
247 int e4k_reg_read(struct e4k_state *e4k, uint8_t reg);
248 */
249 int sam3u_e4k_init(struct e4k_state *e4k, void *i2c, uint8_t slave_addr);
250 void sam3u_e4k_power(struct e4k_state *e4k, int on);
251 void sam3u_e4k_stby(struct e4k_state *e4k, int on);
252 
253 
254 int e4k_manual_dc_offset(struct e4k_state *e4k, int8_t iofs, int8_t irange, int8_t qofs, int8_t qrange);
255 int e4k_dc_offset_calibrate(struct e4k_state *e4k);
256 int e4k_dc_offset_gen_table(struct e4k_state *e4k);
257 
258 ///////////////////////////////////////////////////////////////////////////////
259 
260 namespace RTL2832_NAMESPACE { namespace TUNERS_NAMESPACE {
261 
263 {
265 public:
266  e4k(demod* p);
267 public:
268  inline virtual const char* name() const
269  { return "Elonics E4K"; }
270 public:
271  int initialise(tuner::PPARAMS params = NULL);
272  int set_frequency(double freq);
273  int set_bandwidth(double bw);
274  int set_gain(double gain);
275  int set_gain_mode(int mode);
276  int set_auto_gain_mode(bool on = true);
277  bool calc_appropriate_gain_mode(int& mode)/* const*/;
278 private:
279  int update_gain_mode();
280 public:
282 };
283 
284 } } // TUNERS_NAMESPACE, RTL2832_NAMESPACE
285 
286 ///////////////////////////////////////////////////////////////////////////////
287 
288 #define RTL2832_E4000_ADDITIONAL_INIT_REG_TABLE_LEN 34
289 
290 #define RTL2832_E4000_LNA_GAIN_TABLE_LEN 16
291 #define RTL2832_E4000_LNA_GAIN_ADD_TABLE_LEN 8
292 #define RTL2832_E4000_MIXER_GAIN_TABLE_LEN 2
293 #define RTL2832_E4000_IF_STAGE_1_GAIN_TABLE_LEN 2
294 #define RTL2832_E4000_IF_STAGE_2_GAIN_TABLE_LEN 4
295 #define RTL2832_E4000_IF_STAGE_3_GAIN_TABLE_LEN 4
296 #define RTL2832_E4000_IF_STAGE_4_GAIN_TABLE_LEN 4
297 #define RTL2832_E4000_IF_STAGE_5_GAIN_TABLE_LEN 8
298 #define RTL2832_E4000_IF_STAGE_6_GAIN_TABLE_LEN 8
299 
300 #define RTL2832_E4000_LNA_GAIN_BAND_NUM 2
301 #define RTL2832_E4000_MIXER_GAIN_BAND_NUM 2
302 
303 #define RTL2832_E4000_RF_BAND_BOUNDARY_HZ 300000000
304 
305 #define RTL2832_E4000_LNA_GAIN_ADDR 0x14
306 #define RTL2832_E4000_LNA_GAIN_MASK 0xf
307 #define RTL2832_E4000_LNA_GAIN_SHIFT 0
308 
309 #define RTL2832_E4000_LNA_GAIN_ADD_ADDR 0x24
310 #define RTL2832_E4000_LNA_GAIN_ADD_MASK 0x7
311 #define RTL2832_E4000_LNA_GAIN_ADD_SHIFT 0
312 
313 #define RTL2832_E4000_MIXER_GAIN_ADDR 0x15
314 #define RTL2832_E4000_MIXER_GAIN_MASK 0x1
315 #define RTL2832_E4000_MIXER_GAIN_SHIFT 0
316 
317 #define RTL2832_E4000_IF_STAGE_1_GAIN_ADDR 0x16
318 #define RTL2832_E4000_IF_STAGE_1_GAIN_MASK 0x1
319 #define RTL2832_E4000_IF_STAGE_1_GAIN_SHIFT 0
320 
321 #define RTL2832_E4000_IF_STAGE_2_GAIN_ADDR 0x16
322 #define RTL2832_E4000_IF_STAGE_2_GAIN_MASK 0x6
323 #define RTL2832_E4000_IF_STAGE_2_GAIN_SHIFT 1
324 
325 #define RTL2832_E4000_IF_STAGE_3_GAIN_ADDR 0x16
326 #define RTL2832_E4000_IF_STAGE_3_GAIN_MASK 0x18
327 #define RTL2832_E4000_IF_STAGE_3_GAIN_SHIFT 3
328 
329 #define RTL2832_E4000_IF_STAGE_4_GAIN_ADDR 0x16
330 #define RTL2832_E4000_IF_STAGE_4_GAIN_MASK 0x60
331 #define RTL2832_E4000_IF_STAGE_4_GAIN_SHIFT 5
332 
333 #define RTL2832_E4000_IF_STAGE_5_GAIN_ADDR 0x17
334 #define RTL2832_E4000_IF_STAGE_5_GAIN_MASK 0x7
335 #define RTL2832_E4000_IF_STAGE_5_GAIN_SHIFT 0
336 
337 #define RTL2832_E4000_IF_STAGE_6_GAIN_ADDR 0x17
338 #define RTL2832_E4000_IF_STAGE_6_GAIN_MASK 0x38
339 #define RTL2832_E4000_IF_STAGE_6_GAIN_SHIFT 3
340 
341 #define RTL2832_E4000_TUNER_OUTPUT_POWER_UNIT_0P1_DBM -100
342 
343 #define RTL2832_E4000_TUNER_MODE_UPDATE_WAIT_TIME_MS 1000
344 
345 #endif /* _E4K_TUNER_H */
int e4k_if_gain_set(struct e4k_state *e4k, uint8_t stage, int8_t value)
Definition: rtl2832-tuner_e4k.h:91
uint8_t z
Definition: rtl2832-tuner_e4k.h:188
Definition: rtl2832-tuner_e4k.h:162
Definition: rtl2832-tuner_e4k.h:97
Definition: rtl2832-tuner_e4k.h:148
Definition: rtl2832-tuner_e4k.h:43
int e4k_if_filter_bw_set(struct e4k_state *e4k, enum e4k_if_filter filter, uint32_t bandwidth)
uint32_t fosc
Definition: rtl2832-tuner_e4k.h:184
Definition: rtl2832-tuner_e4k.h:100
Definition: rtl2832-tuner_e4k.h:48
Definition: rtl2832-tuner_e4k.h:175
Definition: rtl2832-tuner_e4k.h:67
Definition: rtl2832-tuner_e4k.h:89
e4k_reg
Definition: rtl2832-tuner_e4k.h:32
uint16_t x
Definition: rtl2832-tuner_e4k.h:187
Definition: rtl2832-tuner_e4k.h:222
int e4k_tune_params(struct e4k_state *e4k, struct e4k_pll_params *p)
Definition: rtl2832-tuner_e4k.h:35
Definition: rtl2832-tuner_e4k.h:34
e4k_agc_mode
Definition: rtl2832-tuner_e4k.h:145
Definition: rtl2832-tuner_e4k.h:147
const tuner::PARAMS & params() const
Definition: rtl2832.h:253
Definition: rtl2832-tuner_e4k.h:42
int e4k_tune_freq(struct e4k_state *e4k, uint32_t freq)
int e4k_if_filter_chan_enable(struct e4k_state *e4k, int on)
Definition: rtl2832-tuner_e4k.h:79
Definition: rtl2832-tuner_e4k.h:99
Definition: rtl2832-tuner_e4k.h:37
Definition: rtl2832-tuner_e4k.h:155
Definition: rtl2832.h:144
Definition: rtl2832-tuner_e4k.h:70
Definition: rtl2832-tuner_e4k.h:82
int e4k_mixer_gain_set(struct e4k_state *e4k, int8_t value)
Definition: rtl2832-tuner_e4k.h:38
Definition: rtl2832-tuner_e4k.h:58
Definition: rtl2832-tuner_e4k.h:53
uint8_t r
Definition: rtl2832-tuner_e4k.h:189
Definition: rtl2832-tuner_e4k.h:90
Definition: rtl2832-tuner_e4k.h:39
int sam3u_e4k_init(struct e4k_state *e4k, void *i2c, uint8_t slave_addr)
Definition: rtl2832-tuner_e4k.h:167
Definition: rtl2832-tuner_e4k.h:85
int e4k_dc_offset_gen_table(struct e4k_state *e4k)
Definition: rtl2832-tuner_e4k.h:33
cmd_op
Definition: rtl2832-tuner_e4k.h:219
#define IMPLEMENT_INLINE_TUNER_FACTORY(class_name)
Definition: rtl2832.h:77
int e4k_if_filter_bw_get(struct e4k_state *e4k, enum e4k_if_filter filter)
uint32_t num_fields
Definition: rtl2832-tuner_e4k.h:213
Definition: rtl2832-tuner_e4k.h:171
uint32_t flo
Definition: rtl2832-tuner_e4k.h:186
Definition: rtl2832-tuner_e4k.h:220
Definition: rtl2832-tuner_e4k.h:86
struct e4k_pll_params vco
Definition: rtl2832-tuner_e4k.h:198
Definition: rtl2832-tuner_e4k.h:160
Definition: rtl2832-tuner_e4k.h:64
Definition: rtl2832-tuner_e4k.h:156
Definition: rtl2832-tuner_e4k.h:152
int initialise(tuner::PPARAMS params=NULL)
e4k_mixer_filter_bw
Definition: rtl2832-tuner_e4k.h:166
int e4k_commonmode_set(struct e4k_state *e4k, int8_t value)
uint32_t(* read_cb)(void *data, uint32_t reg)
Definition: rtl2832-tuner_e4k.h:216
Definition: rtl2832-tuner_e4k.h:60
Definition: rtl2832.h:309
void sam3u_e4k_power(struct e4k_state *e4k, int on)
Definition: rtl2832-tuner_e4k.h:47
Definition: rtl2832.h:186
Definition: rtl2832-tuner_e4k.h:204
Definition: rtl2832-tuner_e4k.h:50
Definition: rtl2832-tuner_e4k.h:56
Definition: rtl2832-tuner_e4k.h:98
Definition: rtl2832-tuner_e4k.h:71
int e4k_dc_offset_calibrate(struct e4k_state *e4k)
enum e4k_band band
Definition: rtl2832-tuner_e4k.h:197
Definition: rtl2832-tuner_e4k.h:194
Definition: rtl2832-tuner_e4k.h:168
const struct reg_field * fields
Definition: rtl2832-tuner_e4k.h:211
Definition: rtl2832-tuner_e4k.h:87
Definition: rtl2832-tuner_e4k.h:92
Definition: rtl2832-tuner_e4k.h:149
Definition: rtl2832-tuner_e4k.h:221
Definition: rtl2832-tuner_e4k.h:174
#define TUNERS_NAMESPACE
Definition: rtl2832.h:66
Definition: rtl2832-tuner_e4k.h:51
int e4k_rf_filter_set(struct e4k_state *e4k)
Definition: rtl2832-tuner_e4k.h:151
void * data
Definition: rtl2832-tuner_e4k.h:214
Definition: rtl2832-tuner_e4k.h:41
Definition: rtl2832-tuner_e4k.h:61
Definition: rtl2832-tuner_e4k.h:68
Definition: rtl2832-tuner_e4k.h:96
uint8_t threephase
Definition: rtl2832-tuner_e4k.h:191
int e4k_compute_pll_params(struct e4k_pll_params *oscp, uint32_t fosc, uint32_t intended_flo)
void sam3u_e4k_stby(struct e4k_state *e4k, int on)
Definition: rtl2832-tuner_e4k.h:94
Definition: rtl2832-tuner_e4k.h:169
Definition: rtl2832-tuner_e4k.h:84
Definition: rtl2832-tuner_e4k.h:163
Definition: rtl2832-tuner_e4k.h:74
int(* write_cb)(void *data, uint32_t reg, uint32_t val)
Definition: rtl2832-tuner_e4k.h:215
virtual double gain() const
Definition: rtl2832.h:228
Definition: rtl2832-tuner_e4k.h:63
Definition: rtl2832-tuner_e4k.h:80
Definition: rtl2832-tuner_e4k.h:172
Definition: rtl2832-tuner_e4k.h:150
Definition: rtl2832-tuner_e4k.h:72
Definition: rtl2832-tuner_e4k.h:59
Definition: rtl2832-tuner_e4k.h:62
Definition: rtl2832-tuner_e4k.h:40
Definition: rtl2832-tuner_e4k.h:95
Definition: rtl2832-tuner_e4k.h:45
Definition: rtl2832-tuner_e4k.h:54
e4k_band
Definition: rtl2832-tuner_e4k.h:159
int reg_field_cmd(struct cmd_state *cs, enum cmd_op op, const char *cmd, int argc, char **argv, struct reg_field_ops *ops)
Definition: rtl2832-tuner_e4k.h:262
Definition: rtl2832-tuner_e4k.h:76
Definition: rtl2832-tuner_e4k.h:44
RTL2832_NAMESPACE::TUNERS_NAMESPACE::e4k * pTuner
Definition: rtl2832-tuner_e4k.h:195
Definition: rtl2832-tuner_e4k.h:183
uint8_t shift
Definition: rtl2832-tuner_e4k.h:206
int e4k_manual_dc_offset(struct e4k_state *e4k, int8_t iofs, int8_t irange, int8_t qofs, int8_t qrange)
e4k_if_filter
Definition: rtl2832-tuner_e4k.h:178
Definition: rtl2832-tuner_e4k.h:146
struct e4k_state m_stateE4K
Definition: rtl2832-tuner_e4k.h:281
Definition: rtl2832-tuner_e4k.h:46
Definition: rtl2832-tuner_e4k.h:210
Definition: rtl2832-tuner_e4k.h:75
Definition: rtl2832-tuner_e4k.h:173
uint8_t width
Definition: rtl2832-tuner_e4k.h:207
Definition: rtl2832-tuner_e4k.h:181
int reg_field_write(struct reg_field_ops *ops, struct reg_field *field, uint32_t val)
Definition: rtl2832-tuner_e4k.h:179
const char ** field_names
Definition: rtl2832-tuner_e4k.h:212
Definition: rtl2832-tuner_e4k.h:49
int e4k_init(struct e4k_state *e4k, bool enable_dc_offset_loop=true, bool set_manual_gain=false)
Definition: rtl2832-tuner_e4k.h:55
Definition: rtl2832-tuner_e4k.h:154
Definition: rtl2832-tuner_e4k.h:170
Definition: rtl2832-tuner_e4k.h:93
Definition: rtl2832-tuner_e4000.h:6
virtual const char * name() const
Definition: rtl2832-tuner_e4k.h:268
Definition: rtl2832-tuner_e4k.h:161
uint8_t reg
Definition: rtl2832-tuner_e4k.h:205
Definition: rtl2832-tuner_e4k.h:65
Definition: rtl2832-tuner_e4k.h:81
Definition: rtl2832-tuner_e4k.h:77
Definition: rtl2832-tuner_e4k.h:73
Definition: rtl2832-tuner_e4k.h:36
uint8_t r_idx
Definition: rtl2832-tuner_e4k.h:190
Definition: rtl2832-tuner_e4k.h:153
uint32_t reg_field_read(struct reg_field_ops *ops, struct reg_field *field)
uint8_t i2c_addr
Definition: rtl2832-tuner_e4k.h:196
Definition: rtl2832-tuner_e4k.h:180
uint32_t intended_flo
Definition: rtl2832-tuner_e4k.h:185