blob: 7e687171301b5f2df8f6f5903e6d690f1a8c9914 [file] [log] [blame]
Steven Toth52c99bd2008-05-01 04:57:01 -03001/*
2 * For the Realtek RTL chip RTL2831U
3 * Realtek Release Date: 2008-03-14, ver 080314
4 * Realtek version RTL2831 Linux driver version 080314
5 * ver 080314
6 *
7 * for linux kernel version 2.6.21.4 - 2.6.22-14
8 * support MXL5005s and MT2060 tuners (support tuner auto-detecting)
9 * support two IR types -- RC5 and NEC
10 *
11 * Known boards with Realtek RTL chip RTL2821U
12 * Freecom USB stick 14aa:0160 (version 4)
13 * Conceptronic CTVDIGRCU
14 *
15 * Copyright (c) 2008 Realtek
16 * Copyright (c) 2008 Jan Hoogenraad, Barnaby Shearer, Andy Hasper
17 * This code is placed under the terms of the GNU General Public License
18 *
19 * Released by Realtek under GPLv2.
20 * Thanks to Realtek for a lot of support we received !
21 *
22 * Revision: 080314 - original version
23 */
24
Steven Toth2637d5b2008-05-01 05:01:31 -030025#include "mxl5005s.h"
Steven Toth52c99bd2008-05-01 04:57:01 -030026
Steven Toth85d220d2008-05-01 05:48:14 -030027static int debug;
28
29#define dprintk(level, arg...) do { \
30 if (debug >= level) \
31 printk(arg); \
32 } while (0)
33
34#define TUNER_REGS_NUM 104
35#define INITCTRL_NUM 40
36
37#ifdef _MXL_PRODUCTION
38#define CHCTRL_NUM 39
39#else
40#define CHCTRL_NUM 36
41#endif
42
43#define MXLCTRL_NUM 189
44#define MASTER_CONTROL_ADDR 9
45
46/* Enumeration of AGC Mode */
47typedef enum
48{
49 MXL_DUAL_AGC = 0,
50 MXL_SINGLE_AGC
51} AGC_Mode;
52
53/* Enumeration of Master Control Register State */
54typedef enum
55{
56 MC_LOAD_START = 1,
57 MC_POWER_DOWN,
58 MC_SYNTH_RESET,
59 MC_SEQ_OFF
60} Master_Control_State;
61
62/* Enumeration of MXL5005 Tuner Mode */
63typedef enum
64{
65 MXL_ANALOG_MODE = 0,
66 MXL_DIGITAL_MODE
67} Tuner_Mode;
68
69/* Enumeration of MXL5005 Tuner IF Mode */
70typedef enum
71{
72 MXL_ZERO_IF = 0,
73 MXL_LOW_IF
74} Tuner_IF_Mode;
75
76/* Enumeration of MXL5005 Tuner Clock Out Mode */
77typedef enum
78{
79 MXL_CLOCK_OUT_DISABLE = 0,
80 MXL_CLOCK_OUT_ENABLE
81} Tuner_Clock_Out;
82
83/* Enumeration of MXL5005 Tuner Div Out Mode */
84typedef enum
85{
86 MXL_DIV_OUT_1 = 0,
87 MXL_DIV_OUT_4
88
89} Tuner_Div_Out;
90
91/* Enumeration of MXL5005 Tuner Pull-up Cap Select Mode */
92typedef enum
93{
94 MXL_CAP_SEL_DISABLE = 0,
95 MXL_CAP_SEL_ENABLE
96
97} Tuner_Cap_Select;
98
99/* Enumeration of MXL5005 Tuner RSSI Mode */
100typedef enum
101{
102 MXL_RSSI_DISABLE = 0,
103 MXL_RSSI_ENABLE
104
105} Tuner_RSSI;
106
107/* Enumeration of MXL5005 Tuner Modulation Type */
108typedef enum
109{
110 MXL_DEFAULT_MODULATION = 0,
111 MXL_DVBT,
112 MXL_ATSC,
113 MXL_QAM,
114 MXL_ANALOG_CABLE,
115 MXL_ANALOG_OTA
116} Tuner_Modu_Type;
117
118/* Enumeration of MXL5005 Tuner Tracking Filter Type */
119typedef enum
120{
121 MXL_TF_DEFAULT = 0,
122 MXL_TF_OFF,
123 MXL_TF_C,
124 MXL_TF_C_H,
125 MXL_TF_D,
126 MXL_TF_D_L,
127 MXL_TF_E,
128 MXL_TF_F,
129 MXL_TF_E_2,
130 MXL_TF_E_NA,
131 MXL_TF_G
132} Tuner_TF_Type;
133
134/* MXL5005 Tuner Register Struct */
135typedef struct _TunerReg_struct
136{
137 u16 Reg_Num; /* Tuner Register Address */
138 u16 Reg_Val; /* Current sofware programmed value waiting to be writen */
139} TunerReg_struct;
140
141typedef enum
142{
143 /* Initialization Control Names */
144 DN_IQTN_AMP_CUT = 1, /* 1 */
145 BB_MODE, /* 2 */
146 BB_BUF, /* 3 */
147 BB_BUF_OA, /* 4 */
148 BB_ALPF_BANDSELECT, /* 5 */
149 BB_IQSWAP, /* 6 */
150 BB_DLPF_BANDSEL, /* 7 */
151 RFSYN_CHP_GAIN, /* 8 */
152 RFSYN_EN_CHP_HIGAIN, /* 9 */
153 AGC_IF, /* 10 */
154 AGC_RF, /* 11 */
155 IF_DIVVAL, /* 12 */
156 IF_VCO_BIAS, /* 13 */
157 CHCAL_INT_MOD_IF, /* 14 */
158 CHCAL_FRAC_MOD_IF, /* 15 */
159 DRV_RES_SEL, /* 16 */
160 I_DRIVER, /* 17 */
161 EN_AAF, /* 18 */
162 EN_3P, /* 19 */
163 EN_AUX_3P, /* 20 */
164 SEL_AAF_BAND, /* 21 */
165 SEQ_ENCLK16_CLK_OUT, /* 22 */
166 SEQ_SEL4_16B, /* 23 */
167 XTAL_CAPSELECT, /* 24 */
168 IF_SEL_DBL, /* 25 */
169 RFSYN_R_DIV, /* 26 */
170 SEQ_EXTSYNTHCALIF, /* 27 */
171 SEQ_EXTDCCAL, /* 28 */
172 AGC_EN_RSSI, /* 29 */
173 RFA_ENCLKRFAGC, /* 30 */
174 RFA_RSSI_REFH, /* 31 */
175 RFA_RSSI_REF, /* 32 */
176 RFA_RSSI_REFL, /* 33 */
177 RFA_FLR, /* 34 */
178 RFA_CEIL, /* 35 */
179 SEQ_EXTIQFSMPULSE, /* 36 */
180 OVERRIDE_1, /* 37 */
181 BB_INITSTATE_DLPF_TUNE, /* 38 */
182 TG_R_DIV, /* 39 */
183 EN_CHP_LIN_B, /* 40 */
184
185 /* Channel Change Control Names */
186 DN_POLY = 51, /* 51 */
187 DN_RFGAIN, /* 52 */
188 DN_CAP_RFLPF, /* 53 */
189 DN_EN_VHFUHFBAR, /* 54 */
190 DN_GAIN_ADJUST, /* 55 */
191 DN_IQTNBUF_AMP, /* 56 */
192 DN_IQTNGNBFBIAS_BST, /* 57 */
193 RFSYN_EN_OUTMUX, /* 58 */
194 RFSYN_SEL_VCO_OUT, /* 59 */
195 RFSYN_SEL_VCO_HI, /* 60 */
196 RFSYN_SEL_DIVM, /* 61 */
197 RFSYN_RF_DIV_BIAS, /* 62 */
198 DN_SEL_FREQ, /* 63 */
199 RFSYN_VCO_BIAS, /* 64 */
200 CHCAL_INT_MOD_RF, /* 65 */
201 CHCAL_FRAC_MOD_RF, /* 66 */
202 RFSYN_LPF_R, /* 67 */
203 CHCAL_EN_INT_RF, /* 68 */
204 TG_LO_DIVVAL, /* 69 */
205 TG_LO_SELVAL, /* 70 */
206 TG_DIV_VAL, /* 71 */
207 TG_VCO_BIAS, /* 72 */
208 SEQ_EXTPOWERUP, /* 73 */
209 OVERRIDE_2, /* 74 */
210 OVERRIDE_3, /* 75 */
211 OVERRIDE_4, /* 76 */
212 SEQ_FSM_PULSE, /* 77 */
213 GPIO_4B, /* 78 */
214 GPIO_3B, /* 79 */
215 GPIO_4, /* 80 */
216 GPIO_3, /* 81 */
217 GPIO_1B, /* 82 */
218 DAC_A_ENABLE, /* 83 */
219 DAC_B_ENABLE, /* 84 */
220 DAC_DIN_A, /* 85 */
221 DAC_DIN_B, /* 86 */
222#ifdef _MXL_PRODUCTION
223 RFSYN_EN_DIV, /* 87 */
224 RFSYN_DIVM, /* 88 */
225 DN_BYPASS_AGC_I2C /* 89 */
226#endif
227} MXL5005_ControlName;
228
229/*
230 * The following context is source code provided by MaxLinear.
231 * MaxLinear source code - Common_MXL.h (?)
232 */
233
234/* Constants */
235#define MXL5005S_REG_WRITING_TABLE_LEN_MAX 104
236#define MXL5005S_LATCH_BYTE 0xfe
237
238/* Register address, MSB, and LSB */
239#define MXL5005S_BB_IQSWAP_ADDR 59
240#define MXL5005S_BB_IQSWAP_MSB 0
241#define MXL5005S_BB_IQSWAP_LSB 0
242
243#define MXL5005S_BB_DLPF_BANDSEL_ADDR 53
244#define MXL5005S_BB_DLPF_BANDSEL_MSB 4
245#define MXL5005S_BB_DLPF_BANDSEL_LSB 3
246
247/* Standard modes */
248enum
249{
250 MXL5005S_STANDARD_DVBT,
251 MXL5005S_STANDARD_ATSC,
252};
253#define MXL5005S_STANDARD_MODE_NUM 2
254
255/* Bandwidth modes */
256enum
257{
258 MXL5005S_BANDWIDTH_6MHZ = 6000000,
259 MXL5005S_BANDWIDTH_7MHZ = 7000000,
260 MXL5005S_BANDWIDTH_8MHZ = 8000000,
261};
262#define MXL5005S_BANDWIDTH_MODE_NUM 3
263
264/* Top modes */
265enum
266{
267 MXL5005S_TOP_5P5 = 55,
268 MXL5005S_TOP_7P2 = 72,
269 MXL5005S_TOP_9P2 = 92,
270 MXL5005S_TOP_11P0 = 110,
271 MXL5005S_TOP_12P9 = 129,
272 MXL5005S_TOP_14P7 = 147,
273 MXL5005S_TOP_16P8 = 168,
274 MXL5005S_TOP_19P4 = 194,
275 MXL5005S_TOP_21P2 = 212,
276 MXL5005S_TOP_23P2 = 232,
277 MXL5005S_TOP_25P2 = 252,
278 MXL5005S_TOP_27P1 = 271,
279 MXL5005S_TOP_29P2 = 292,
280 MXL5005S_TOP_31P7 = 317,
281 MXL5005S_TOP_34P9 = 349,
282};
283
284/* IF output load */
285enum
286{
287 MXL5005S_IF_OUTPUT_LOAD_200_OHM = 200,
288 MXL5005S_IF_OUTPUT_LOAD_300_OHM = 300,
289};
290
Steven Toth3935c252008-05-01 05:45:44 -0300291/* MXL5005 Tuner Control Struct */
292typedef struct _TunerControl_struct {
293 u16 Ctrl_Num; /* Control Number */
294 u16 size; /* Number of bits to represent Value */
295 u16 addr[25]; /* Array of Tuner Register Address for each bit position */
296 u16 bit[25]; /* Array of bit position in Register Address for each bit position */
297 u16 val[25]; /* Binary representation of Value */
298} TunerControl_struct;
Steven Toth52c99bd2008-05-01 04:57:01 -0300299
Steven Toth3935c252008-05-01 05:45:44 -0300300/* MXL5005 Tuner Struct */
301struct mxl5005s_state
Steven Toth52c99bd2008-05-01 04:57:01 -0300302{
Steven Toth3935c252008-05-01 05:45:44 -0300303 u8 Mode; /* 0: Analog Mode ; 1: Digital Mode */
304 u8 IF_Mode; /* for Analog Mode, 0: zero IF; 1: low IF */
305 u32 Chan_Bandwidth; /* filter channel bandwidth (6, 7, 8) */
306 u32 IF_OUT; /* Desired IF Out Frequency */
307 u16 IF_OUT_LOAD; /* IF Out Load Resistor (200/300 Ohms) */
308 u32 RF_IN; /* RF Input Frequency */
309 u32 Fxtal; /* XTAL Frequency */
310 u8 AGC_Mode; /* AGC Mode 0: Dual AGC; 1: Single AGC */
311 u16 TOP; /* Value: take over point */
312 u8 CLOCK_OUT; /* 0: turn off clock out; 1: turn on clock out */
313 u8 DIV_OUT; /* 4MHz or 16MHz */
314 u8 CAPSELECT; /* 0: disable On-Chip pulling cap; 1: enable */
315 u8 EN_RSSI; /* 0: disable RSSI; 1: enable RSSI */
316 u8 Mod_Type; /* Modulation Type; */
317 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
318 u8 TF_Type; /* Tracking Filter Type */
319 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -0300320
Steven Toth3935c252008-05-01 05:45:44 -0300321 /* Calculated Settings */
322 u32 RF_LO; /* Synth RF LO Frequency */
323 u32 IF_LO; /* Synth IF LO Frequency */
324 u32 TG_LO; /* Synth TG_LO Frequency */
Steven Toth52c99bd2008-05-01 04:57:01 -0300325
Steven Toth3935c252008-05-01 05:45:44 -0300326 /* Pointers to ControlName Arrays */
327 u16 Init_Ctrl_Num; /* Number of INIT Control Names */
328 TunerControl_struct
329 Init_Ctrl[INITCTRL_NUM]; /* INIT Control Names Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300330
Steven Toth3935c252008-05-01 05:45:44 -0300331 u16 CH_Ctrl_Num; /* Number of CH Control Names */
332 TunerControl_struct
333 CH_Ctrl[CHCTRL_NUM]; /* CH Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300334
Steven Toth3935c252008-05-01 05:45:44 -0300335 u16 MXL_Ctrl_Num; /* Number of MXL Control Names */
336 TunerControl_struct
337 MXL_Ctrl[MXLCTRL_NUM]; /* MXL Control Name Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300338
Steven Toth3935c252008-05-01 05:45:44 -0300339 /* Pointer to Tuner Register Array */
340 u16 TunerRegs_Num; /* Number of Tuner Registers */
341 TunerReg_struct
342 TunerRegs[TUNER_REGS_NUM]; /* Tuner Register Array Pointer */
Steven Toth52c99bd2008-05-01 04:57:01 -0300343
Steven Toth85d220d2008-05-01 05:48:14 -0300344 /* Linux driver framework specific */
345 const struct mxl5005s_config *config;
346
347 struct dvb_frontend *frontend;
348 struct i2c_adapter *i2c;
Steven Toth3935c252008-05-01 05:45:44 -0300349};
Steven Toth52c99bd2008-05-01 04:57:01 -0300350
Steven Toth85d220d2008-05-01 05:48:14 -0300351// funcs
352u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value);
353u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value);
354u16 MXL_GetMasterControl(u8 *MasterReg, int state);
355void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal);
356u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
357u32 MXL_Ceiling(u32 value, u32 resolution);
358u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal);
359u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal);
360u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup);
361u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val);
362u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count);
363u32 MXL_GetXtalInt(u32 Xtal_Freq);
364u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq);
365void MXL_SynthIFLO_Calc(struct dvb_frontend *fe);
366void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe);
367u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 *RegNum, u8 *RegVal, int *count);
368int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen);
369u16 MXL_IFSynthInit(struct dvb_frontend *fe);
Steven Toth52c99bd2008-05-01 04:57:01 -0300370
Steven Toth85d220d2008-05-01 05:48:14 -0300371int mxl5005s_SetRfFreqHz(struct dvb_frontend *fe, unsigned long RfFreqHz)
Steven Toth52c99bd2008-05-01 04:57:01 -0300372{
Steven Toth85d220d2008-05-01 05:48:14 -0300373 struct mxl5005s_state *state = fe->tuner_priv;
374 u8 AgcMasterByte = state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300375 unsigned char AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
376 unsigned char ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
377 int TableLen;
378
Steven Toth85d220d2008-05-01 05:48:14 -0300379 u32 IfDivval;
Steven Toth52c99bd2008-05-01 04:57:01 -0300380 unsigned char MasterControlByte;
381
Steven Toth85d220d2008-05-01 05:48:14 -0300382 dprintk(1, "%s() freq=%ld\n", __func__, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300383
384 // Set MxL5005S tuner RF frequency according to MxL5005S tuner example code.
385
386 // Tuner RF frequency setting stage 0
387 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET) ;
388 AddrTable[0] = MASTER_CONTROL_ADDR;
Steven Toth85d220d2008-05-01 05:48:14 -0300389 ByteTable[0] |= state->config->AgcMasterByte;
Steven Toth52c99bd2008-05-01 04:57:01 -0300390
Steven Toth85d220d2008-05-01 05:48:14 -0300391 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300392
393 // Tuner RF frequency setting stage 1
Steven Toth85d220d2008-05-01 05:48:14 -0300394 MXL_TuneRF(fe, RfFreqHz);
Steven Toth52c99bd2008-05-01 04:57:01 -0300395
Steven Toth85d220d2008-05-01 05:48:14 -0300396 MXL_ControlRead(fe, IF_DIVVAL, &IfDivval);
Steven Toth52c99bd2008-05-01 04:57:01 -0300397
Steven Toth85d220d2008-05-01 05:48:14 -0300398 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 0);
399 MXL_ControlWrite(fe, SEQ_EXTPOWERUP, 1);
400 MXL_ControlWrite(fe, IF_DIVVAL, 8);
401 MXL_GetCHRegister(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300402
403 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
404 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
405 ByteTable[TableLen] = MasterControlByte | AgcMasterByte;
406 TableLen += 1;
407
Steven Toth85d220d2008-05-01 05:48:14 -0300408 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300409
410 // Wait 30 ms.
Steven Toth85d220d2008-05-01 05:48:14 -0300411 msleep(30);
Steven Toth52c99bd2008-05-01 04:57:01 -0300412
413 // Tuner RF frequency setting stage 2
Steven Toth85d220d2008-05-01 05:48:14 -0300414 MXL_ControlWrite(fe, SEQ_FSM_PULSE, 1) ;
415 MXL_ControlWrite(fe, IF_DIVVAL, IfDivval) ;
416 MXL_GetCHRegister_ZeroIF(fe, AddrTable, ByteTable, &TableLen) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300417
418 MXL_GetMasterControl(&MasterControlByte, MC_LOAD_START) ;
419 AddrTable[TableLen] = MASTER_CONTROL_ADDR ;
420 ByteTable[TableLen] = MasterControlByte | AgcMasterByte ;
421 TableLen += 1;
422
Steven Toth85d220d2008-05-01 05:48:14 -0300423 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
Steven Toth52c99bd2008-05-01 04:57:01 -0300424
Steven Toth85d220d2008-05-01 05:48:14 -0300425 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300426}
427
Steven Toth85d220d2008-05-01 05:48:14 -0300428/* Write a single byte to a single reg */
429static int mxl5005s_writereg(struct dvb_frontend *fe, u8 reg, u8 val)
Steven Toth52c99bd2008-05-01 04:57:01 -0300430{
Steven Toth85d220d2008-05-01 05:48:14 -0300431 struct mxl5005s_state *state = fe->tuner_priv;
432 u8 buf[2] = { reg, val };
433 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
434 .buf = buf, .len = 2 };
Steven Toth52c99bd2008-05-01 04:57:01 -0300435
Steven Toth85d220d2008-05-01 05:48:14 -0300436 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
437 printk(KERN_WARNING "mxl5005s I2C write failed\n");
438 return -EREMOTEIO;
Steven Toth3935c252008-05-01 05:45:44 -0300439 }
Steven Toth85d220d2008-05-01 05:48:14 -0300440 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300441}
442
Steven Toth85d220d2008-05-01 05:48:14 -0300443/* Write a word to a single reg */
444static int mxl5005s_writereg16(struct dvb_frontend *fe, u8 reg, u16 val)
Steven Toth52c99bd2008-05-01 04:57:01 -0300445{
Steven Toth85d220d2008-05-01 05:48:14 -0300446 struct mxl5005s_state *state = fe->tuner_priv;
447 u8 buf[3] = { reg, val >> 8 , val & 0xff };
448 struct i2c_msg msg = { .addr = state->config->i2c_address, .flags = 0,
449 .buf = buf, .len = 3 };
Steven Toth52c99bd2008-05-01 04:57:01 -0300450
Steven Toth85d220d2008-05-01 05:48:14 -0300451 if (i2c_transfer(state->i2c, &msg, 1) != 1) {
452 printk(KERN_WARNING "mxl5005s I2C write16 failed\n");
453 return -EREMOTEIO;
Steven Toth52c99bd2008-05-01 04:57:01 -0300454 }
Steven Toth85d220d2008-05-01 05:48:14 -0300455 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300456}
Steven Toth52c99bd2008-05-01 04:57:01 -0300457
Steven Toth85d220d2008-05-01 05:48:14 -0300458int mxl5005s_SetRegsWithTable(struct dvb_frontend *fe, u8 *pAddrTable, u8 *pByteTable, int TableLen)
Steven Toth52c99bd2008-05-01 04:57:01 -0300459{
Steven Toth85d220d2008-05-01 05:48:14 -0300460 int i, ret;
Steven Toth52c99bd2008-05-01 04:57:01 -0300461 u8 end_two_bytes_buf[]={ 0 , 0 };
Steven Toth52c99bd2008-05-01 04:57:01 -0300462
463 for( i = 0 ; i < TableLen - 1 ; i++)
464 {
Steven Toth85d220d2008-05-01 05:48:14 -0300465 ret = mxl5005s_writereg(fe, pAddrTable[i], pByteTable[i]);
466 if (!ret)
467 return ret;
Steven Toth52c99bd2008-05-01 04:57:01 -0300468 }
469
470 end_two_bytes_buf[0] = pByteTable[i];
471 end_two_bytes_buf[1] = MXL5005S_LATCH_BYTE;
472
Steven Toth85d220d2008-05-01 05:48:14 -0300473 ret = mxl5005s_writereg16(fe, pAddrTable[i], (end_two_bytes_buf[0] << 8) | end_two_bytes_buf[1]);
Steven Toth52c99bd2008-05-01 04:57:01 -0300474
Steven Toth85d220d2008-05-01 05:48:14 -0300475 return ret;
Steven Toth52c99bd2008-05-01 04:57:01 -0300476}
477
Steven Toth3935c252008-05-01 05:45:44 -0300478int mxl5005s_SetRegMaskBits(struct dvb_frontend *fe,
Steven Toth52c99bd2008-05-01 04:57:01 -0300479 unsigned char RegAddr,
480 unsigned char Msb,
481 unsigned char Lsb,
482 const unsigned char WritingValue
483 )
484{
Steven Toth52c99bd2008-05-01 04:57:01 -0300485 int i;
486
487 unsigned char Mask;
488 unsigned char Shift;
Steven Toth52c99bd2008-05-01 04:57:01 -0300489 unsigned char RegByte;
490
Steven Toth3935c252008-05-01 05:45:44 -0300491 /* Generate mask and shift according to MSB and LSB. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300492 Mask = 0;
493 for(i = Lsb; i < (unsigned char)(Msb + 1); i++)
494 Mask |= 0x1 << i;
495
496 Shift = Lsb;
497
Steven Toth3935c252008-05-01 05:45:44 -0300498 /* Get tuner register byte according to register adddress. */
Steven Toth85d220d2008-05-01 05:48:14 -0300499 MXL_RegRead(fe, RegAddr, &RegByte);
Steven Toth52c99bd2008-05-01 04:57:01 -0300500
Steven Toth3935c252008-05-01 05:45:44 -0300501 /* Reserve register byte unmask bit with mask and inlay writing value into it. */
Steven Toth52c99bd2008-05-01 04:57:01 -0300502 RegByte &= ~Mask;
503 RegByte |= (WritingValue << Shift) & Mask;
504
Steven Toth3935c252008-05-01 05:45:44 -0300505 /* Update tuner register byte table. */
Steven Toth85d220d2008-05-01 05:48:14 -0300506 MXL_RegWrite(fe, RegAddr, RegByte);
Steven Toth52c99bd2008-05-01 04:57:01 -0300507
Steven Toth3935c252008-05-01 05:45:44 -0300508 /* Write tuner register byte with writing byte. */
Steven Toth85d220d2008-05-01 05:48:14 -0300509 return mxl5005s_SetRegsWithTable(fe, &RegAddr, &RegByte, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -0300510}
511
Steven Toth52c99bd2008-05-01 04:57:01 -0300512// The following context is source code provided by MaxLinear.
Steven Toth52c99bd2008-05-01 04:57:01 -0300513// MaxLinear source code - MXL5005_Initialize.cpp
Steven Toth3935c252008-05-01 05:45:44 -0300514// DONE
515u16 MXL5005_RegisterInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300516{
Steven Toth85d220d2008-05-01 05:48:14 -0300517 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300518 state->TunerRegs_Num = TUNER_REGS_NUM ;
519// state->TunerRegs = (TunerReg_struct *) calloc( TUNER_REGS_NUM, sizeof(TunerReg_struct) ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300520
Steven Toth3935c252008-05-01 05:45:44 -0300521 state->TunerRegs[0].Reg_Num = 9 ;
522 state->TunerRegs[0].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300523
Steven Toth3935c252008-05-01 05:45:44 -0300524 state->TunerRegs[1].Reg_Num = 11 ;
525 state->TunerRegs[1].Reg_Val = 0x19 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300526
Steven Toth3935c252008-05-01 05:45:44 -0300527 state->TunerRegs[2].Reg_Num = 12 ;
528 state->TunerRegs[2].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300529
Steven Toth3935c252008-05-01 05:45:44 -0300530 state->TunerRegs[3].Reg_Num = 13 ;
531 state->TunerRegs[3].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300532
Steven Toth3935c252008-05-01 05:45:44 -0300533 state->TunerRegs[4].Reg_Num = 14 ;
534 state->TunerRegs[4].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300535
Steven Toth3935c252008-05-01 05:45:44 -0300536 state->TunerRegs[5].Reg_Num = 15 ;
537 state->TunerRegs[5].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300538
Steven Toth3935c252008-05-01 05:45:44 -0300539 state->TunerRegs[6].Reg_Num = 16 ;
540 state->TunerRegs[6].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300541
Steven Toth3935c252008-05-01 05:45:44 -0300542 state->TunerRegs[7].Reg_Num = 17 ;
543 state->TunerRegs[7].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300544
Steven Toth3935c252008-05-01 05:45:44 -0300545 state->TunerRegs[8].Reg_Num = 18 ;
546 state->TunerRegs[8].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300547
Steven Toth3935c252008-05-01 05:45:44 -0300548 state->TunerRegs[9].Reg_Num = 19 ;
549 state->TunerRegs[9].Reg_Val = 0x34 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300550
Steven Toth3935c252008-05-01 05:45:44 -0300551 state->TunerRegs[10].Reg_Num = 21 ;
552 state->TunerRegs[10].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300553
Steven Toth3935c252008-05-01 05:45:44 -0300554 state->TunerRegs[11].Reg_Num = 22 ;
555 state->TunerRegs[11].Reg_Val = 0x6B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300556
Steven Toth3935c252008-05-01 05:45:44 -0300557 state->TunerRegs[12].Reg_Num = 23 ;
558 state->TunerRegs[12].Reg_Val = 0x35 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300559
Steven Toth3935c252008-05-01 05:45:44 -0300560 state->TunerRegs[13].Reg_Num = 24 ;
561 state->TunerRegs[13].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300562
Steven Toth3935c252008-05-01 05:45:44 -0300563 state->TunerRegs[14].Reg_Num = 25 ;
564 state->TunerRegs[14].Reg_Val = 0x3E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300565
Steven Toth3935c252008-05-01 05:45:44 -0300566 state->TunerRegs[15].Reg_Num = 26 ;
567 state->TunerRegs[15].Reg_Val = 0x82 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300568
Steven Toth3935c252008-05-01 05:45:44 -0300569 state->TunerRegs[16].Reg_Num = 31 ;
570 state->TunerRegs[16].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300571
Steven Toth3935c252008-05-01 05:45:44 -0300572 state->TunerRegs[17].Reg_Num = 32 ;
573 state->TunerRegs[17].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300574
Steven Toth3935c252008-05-01 05:45:44 -0300575 state->TunerRegs[18].Reg_Num = 33 ;
576 state->TunerRegs[18].Reg_Val = 0x53 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300577
Steven Toth3935c252008-05-01 05:45:44 -0300578 state->TunerRegs[19].Reg_Num = 34 ;
579 state->TunerRegs[19].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300580
Steven Toth3935c252008-05-01 05:45:44 -0300581 state->TunerRegs[20].Reg_Num = 35 ;
582 state->TunerRegs[20].Reg_Val = 0xC9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300583
Steven Toth3935c252008-05-01 05:45:44 -0300584 state->TunerRegs[21].Reg_Num = 36 ;
585 state->TunerRegs[21].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300586
Steven Toth3935c252008-05-01 05:45:44 -0300587 state->TunerRegs[22].Reg_Num = 37 ;
588 state->TunerRegs[22].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300589
Steven Toth3935c252008-05-01 05:45:44 -0300590 state->TunerRegs[23].Reg_Num = 41 ;
591 state->TunerRegs[23].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300592
Steven Toth3935c252008-05-01 05:45:44 -0300593 state->TunerRegs[24].Reg_Num = 42 ;
594 state->TunerRegs[24].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300595
Steven Toth3935c252008-05-01 05:45:44 -0300596 state->TunerRegs[25].Reg_Num = 43 ;
597 state->TunerRegs[25].Reg_Val = 0x43 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300598
Steven Toth3935c252008-05-01 05:45:44 -0300599 state->TunerRegs[26].Reg_Num = 44 ;
600 state->TunerRegs[26].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300601
Steven Toth3935c252008-05-01 05:45:44 -0300602 state->TunerRegs[27].Reg_Num = 45 ;
603 state->TunerRegs[27].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300604
Steven Toth3935c252008-05-01 05:45:44 -0300605 state->TunerRegs[28].Reg_Num = 46 ;
606 state->TunerRegs[28].Reg_Val = 0x88 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300607
Steven Toth3935c252008-05-01 05:45:44 -0300608 state->TunerRegs[29].Reg_Num = 47 ;
609 state->TunerRegs[29].Reg_Val = 0x86 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300610
Steven Toth3935c252008-05-01 05:45:44 -0300611 state->TunerRegs[30].Reg_Num = 48 ;
612 state->TunerRegs[30].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300613
Steven Toth3935c252008-05-01 05:45:44 -0300614 state->TunerRegs[31].Reg_Num = 49 ;
615 state->TunerRegs[31].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300616
Steven Toth3935c252008-05-01 05:45:44 -0300617 state->TunerRegs[32].Reg_Num = 53 ;
618 state->TunerRegs[32].Reg_Val = 0x94 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300619
Steven Toth3935c252008-05-01 05:45:44 -0300620 state->TunerRegs[33].Reg_Num = 54 ;
621 state->TunerRegs[33].Reg_Val = 0xFA ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300622
Steven Toth3935c252008-05-01 05:45:44 -0300623 state->TunerRegs[34].Reg_Num = 55 ;
624 state->TunerRegs[34].Reg_Val = 0x92 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300625
Steven Toth3935c252008-05-01 05:45:44 -0300626 state->TunerRegs[35].Reg_Num = 56 ;
627 state->TunerRegs[35].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300628
Steven Toth3935c252008-05-01 05:45:44 -0300629 state->TunerRegs[36].Reg_Num = 57 ;
630 state->TunerRegs[36].Reg_Val = 0x41 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300631
Steven Toth3935c252008-05-01 05:45:44 -0300632 state->TunerRegs[37].Reg_Num = 58 ;
633 state->TunerRegs[37].Reg_Val = 0xDB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300634
Steven Toth3935c252008-05-01 05:45:44 -0300635 state->TunerRegs[38].Reg_Num = 59 ;
636 state->TunerRegs[38].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300637
Steven Toth3935c252008-05-01 05:45:44 -0300638 state->TunerRegs[39].Reg_Num = 60 ;
639 state->TunerRegs[39].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300640
Steven Toth3935c252008-05-01 05:45:44 -0300641 state->TunerRegs[40].Reg_Num = 61 ;
642 state->TunerRegs[40].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300643
Steven Toth3935c252008-05-01 05:45:44 -0300644 state->TunerRegs[41].Reg_Num = 62 ;
645 state->TunerRegs[41].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300646
Steven Toth3935c252008-05-01 05:45:44 -0300647 state->TunerRegs[42].Reg_Num = 65 ;
648 state->TunerRegs[42].Reg_Val = 0xF8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300649
Steven Toth3935c252008-05-01 05:45:44 -0300650 state->TunerRegs[43].Reg_Num = 66 ;
651 state->TunerRegs[43].Reg_Val = 0xE4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300652
Steven Toth3935c252008-05-01 05:45:44 -0300653 state->TunerRegs[44].Reg_Num = 67 ;
654 state->TunerRegs[44].Reg_Val = 0x90 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300655
Steven Toth3935c252008-05-01 05:45:44 -0300656 state->TunerRegs[45].Reg_Num = 68 ;
657 state->TunerRegs[45].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300658
Steven Toth3935c252008-05-01 05:45:44 -0300659 state->TunerRegs[46].Reg_Num = 69 ;
660 state->TunerRegs[46].Reg_Val = 0x01 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300661
Steven Toth3935c252008-05-01 05:45:44 -0300662 state->TunerRegs[47].Reg_Num = 70 ;
663 state->TunerRegs[47].Reg_Val = 0x50 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300664
Steven Toth3935c252008-05-01 05:45:44 -0300665 state->TunerRegs[48].Reg_Num = 71 ;
666 state->TunerRegs[48].Reg_Val = 0x06 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300667
Steven Toth3935c252008-05-01 05:45:44 -0300668 state->TunerRegs[49].Reg_Num = 72 ;
669 state->TunerRegs[49].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300670
Steven Toth3935c252008-05-01 05:45:44 -0300671 state->TunerRegs[50].Reg_Num = 73 ;
672 state->TunerRegs[50].Reg_Val = 0x20 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300673
Steven Toth3935c252008-05-01 05:45:44 -0300674 state->TunerRegs[51].Reg_Num = 76 ;
675 state->TunerRegs[51].Reg_Val = 0xBB ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300676
Steven Toth3935c252008-05-01 05:45:44 -0300677 state->TunerRegs[52].Reg_Num = 77 ;
678 state->TunerRegs[52].Reg_Val = 0x13 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300679
Steven Toth3935c252008-05-01 05:45:44 -0300680 state->TunerRegs[53].Reg_Num = 81 ;
681 state->TunerRegs[53].Reg_Val = 0x04 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300682
Steven Toth3935c252008-05-01 05:45:44 -0300683 state->TunerRegs[54].Reg_Num = 82 ;
684 state->TunerRegs[54].Reg_Val = 0x75 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300685
Steven Toth3935c252008-05-01 05:45:44 -0300686 state->TunerRegs[55].Reg_Num = 83 ;
687 state->TunerRegs[55].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300688
Steven Toth3935c252008-05-01 05:45:44 -0300689 state->TunerRegs[56].Reg_Num = 84 ;
690 state->TunerRegs[56].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300691
Steven Toth3935c252008-05-01 05:45:44 -0300692 state->TunerRegs[57].Reg_Num = 85 ;
693 state->TunerRegs[57].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300694
Steven Toth3935c252008-05-01 05:45:44 -0300695 state->TunerRegs[58].Reg_Num = 91 ;
696 state->TunerRegs[58].Reg_Val = 0x70 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300697
Steven Toth3935c252008-05-01 05:45:44 -0300698 state->TunerRegs[59].Reg_Num = 92 ;
699 state->TunerRegs[59].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300700
Steven Toth3935c252008-05-01 05:45:44 -0300701 state->TunerRegs[60].Reg_Num = 93 ;
702 state->TunerRegs[60].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300703
Steven Toth3935c252008-05-01 05:45:44 -0300704 state->TunerRegs[61].Reg_Num = 94 ;
705 state->TunerRegs[61].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300706
Steven Toth3935c252008-05-01 05:45:44 -0300707 state->TunerRegs[62].Reg_Num = 95 ;
708 state->TunerRegs[62].Reg_Val = 0x0C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300709
Steven Toth3935c252008-05-01 05:45:44 -0300710 state->TunerRegs[63].Reg_Num = 96 ;
711 state->TunerRegs[63].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300712
Steven Toth3935c252008-05-01 05:45:44 -0300713 state->TunerRegs[64].Reg_Num = 97 ;
714 state->TunerRegs[64].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300715
Steven Toth3935c252008-05-01 05:45:44 -0300716 state->TunerRegs[65].Reg_Num = 98 ;
717 state->TunerRegs[65].Reg_Val = 0xE2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300718
Steven Toth3935c252008-05-01 05:45:44 -0300719 state->TunerRegs[66].Reg_Num = 99 ;
720 state->TunerRegs[66].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300721
Steven Toth3935c252008-05-01 05:45:44 -0300722 state->TunerRegs[67].Reg_Num = 100 ;
723 state->TunerRegs[67].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300724
Steven Toth3935c252008-05-01 05:45:44 -0300725 state->TunerRegs[68].Reg_Num = 101 ;
726 state->TunerRegs[68].Reg_Val = 0x12 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300727
Steven Toth3935c252008-05-01 05:45:44 -0300728 state->TunerRegs[69].Reg_Num = 102 ;
729 state->TunerRegs[69].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300730
Steven Toth3935c252008-05-01 05:45:44 -0300731 state->TunerRegs[70].Reg_Num = 103 ;
732 state->TunerRegs[70].Reg_Val = 0x32 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300733
Steven Toth3935c252008-05-01 05:45:44 -0300734 state->TunerRegs[71].Reg_Num = 104 ;
735 state->TunerRegs[71].Reg_Val = 0xB4 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300736
Steven Toth3935c252008-05-01 05:45:44 -0300737 state->TunerRegs[72].Reg_Num = 105 ;
738 state->TunerRegs[72].Reg_Val = 0x60 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300739
Steven Toth3935c252008-05-01 05:45:44 -0300740 state->TunerRegs[73].Reg_Num = 106 ;
741 state->TunerRegs[73].Reg_Val = 0x83 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300742
Steven Toth3935c252008-05-01 05:45:44 -0300743 state->TunerRegs[74].Reg_Num = 107 ;
744 state->TunerRegs[74].Reg_Val = 0x84 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300745
Steven Toth3935c252008-05-01 05:45:44 -0300746 state->TunerRegs[75].Reg_Num = 108 ;
747 state->TunerRegs[75].Reg_Val = 0x9C ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300748
Steven Toth3935c252008-05-01 05:45:44 -0300749 state->TunerRegs[76].Reg_Num = 109 ;
750 state->TunerRegs[76].Reg_Val = 0x02 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300751
Steven Toth3935c252008-05-01 05:45:44 -0300752 state->TunerRegs[77].Reg_Num = 110 ;
753 state->TunerRegs[77].Reg_Val = 0x81 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300754
Steven Toth3935c252008-05-01 05:45:44 -0300755 state->TunerRegs[78].Reg_Num = 111 ;
756 state->TunerRegs[78].Reg_Val = 0xC0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300757
Steven Toth3935c252008-05-01 05:45:44 -0300758 state->TunerRegs[79].Reg_Num = 112 ;
759 state->TunerRegs[79].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300760
Steven Toth3935c252008-05-01 05:45:44 -0300761 state->TunerRegs[80].Reg_Num = 131 ;
762 state->TunerRegs[80].Reg_Val = 0x8A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300763
Steven Toth3935c252008-05-01 05:45:44 -0300764 state->TunerRegs[81].Reg_Num = 132 ;
765 state->TunerRegs[81].Reg_Val = 0x10 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300766
Steven Toth3935c252008-05-01 05:45:44 -0300767 state->TunerRegs[82].Reg_Num = 133 ;
768 state->TunerRegs[82].Reg_Val = 0x24 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300769
Steven Toth3935c252008-05-01 05:45:44 -0300770 state->TunerRegs[83].Reg_Num = 134 ;
771 state->TunerRegs[83].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300772
Steven Toth3935c252008-05-01 05:45:44 -0300773 state->TunerRegs[84].Reg_Num = 135 ;
774 state->TunerRegs[84].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300775
Steven Toth3935c252008-05-01 05:45:44 -0300776 state->TunerRegs[85].Reg_Num = 136 ;
777 state->TunerRegs[85].Reg_Val = 0x7E ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300778
Steven Toth3935c252008-05-01 05:45:44 -0300779 state->TunerRegs[86].Reg_Num = 137 ;
780 state->TunerRegs[86].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300781
Steven Toth3935c252008-05-01 05:45:44 -0300782 state->TunerRegs[87].Reg_Num = 138 ;
783 state->TunerRegs[87].Reg_Val = 0x38 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300784
Steven Toth3935c252008-05-01 05:45:44 -0300785 state->TunerRegs[88].Reg_Num = 146 ;
786 state->TunerRegs[88].Reg_Val = 0xF6 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300787
Steven Toth3935c252008-05-01 05:45:44 -0300788 state->TunerRegs[89].Reg_Num = 147 ;
789 state->TunerRegs[89].Reg_Val = 0x1A ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300790
Steven Toth3935c252008-05-01 05:45:44 -0300791 state->TunerRegs[90].Reg_Num = 148 ;
792 state->TunerRegs[90].Reg_Val = 0x62 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300793
Steven Toth3935c252008-05-01 05:45:44 -0300794 state->TunerRegs[91].Reg_Num = 149 ;
795 state->TunerRegs[91].Reg_Val = 0x33 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300796
Steven Toth3935c252008-05-01 05:45:44 -0300797 state->TunerRegs[92].Reg_Num = 150 ;
798 state->TunerRegs[92].Reg_Val = 0x80 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300799
Steven Toth3935c252008-05-01 05:45:44 -0300800 state->TunerRegs[93].Reg_Num = 156 ;
801 state->TunerRegs[93].Reg_Val = 0x56 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300802
Steven Toth3935c252008-05-01 05:45:44 -0300803 state->TunerRegs[94].Reg_Num = 157 ;
804 state->TunerRegs[94].Reg_Val = 0x17 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300805
Steven Toth3935c252008-05-01 05:45:44 -0300806 state->TunerRegs[95].Reg_Num = 158 ;
807 state->TunerRegs[95].Reg_Val = 0xA9 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300808
Steven Toth3935c252008-05-01 05:45:44 -0300809 state->TunerRegs[96].Reg_Num = 159 ;
810 state->TunerRegs[96].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300811
Steven Toth3935c252008-05-01 05:45:44 -0300812 state->TunerRegs[97].Reg_Num = 160 ;
813 state->TunerRegs[97].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300814
Steven Toth3935c252008-05-01 05:45:44 -0300815 state->TunerRegs[98].Reg_Num = 161 ;
816 state->TunerRegs[98].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300817
Steven Toth3935c252008-05-01 05:45:44 -0300818 state->TunerRegs[99].Reg_Num = 162 ;
819 state->TunerRegs[99].Reg_Val = 0x40 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300820
Steven Toth3935c252008-05-01 05:45:44 -0300821 state->TunerRegs[100].Reg_Num = 166 ;
822 state->TunerRegs[100].Reg_Val = 0xAE ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300823
Steven Toth3935c252008-05-01 05:45:44 -0300824 state->TunerRegs[101].Reg_Num = 167 ;
825 state->TunerRegs[101].Reg_Val = 0x1B ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300826
Steven Toth3935c252008-05-01 05:45:44 -0300827 state->TunerRegs[102].Reg_Num = 168 ;
828 state->TunerRegs[102].Reg_Val = 0xF2 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300829
Steven Toth3935c252008-05-01 05:45:44 -0300830 state->TunerRegs[103].Reg_Num = 195 ;
831 state->TunerRegs[103].Reg_Val = 0x00 ;
Steven Toth52c99bd2008-05-01 04:57:01 -0300832
833 return 0 ;
834}
835
Steven Toth3935c252008-05-01 05:45:44 -0300836// DONE
837u16 MXL5005_ControlInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -0300838{
Steven Toth85d220d2008-05-01 05:48:14 -0300839 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -0300840 state->Init_Ctrl_Num = INITCTRL_NUM;
Steven Toth52c99bd2008-05-01 04:57:01 -0300841
Steven Toth3935c252008-05-01 05:45:44 -0300842 state->Init_Ctrl[0].Ctrl_Num = DN_IQTN_AMP_CUT ;
843 state->Init_Ctrl[0].size = 1 ;
844 state->Init_Ctrl[0].addr[0] = 73;
845 state->Init_Ctrl[0].bit[0] = 7;
846 state->Init_Ctrl[0].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300847
Steven Toth3935c252008-05-01 05:45:44 -0300848 state->Init_Ctrl[1].Ctrl_Num = BB_MODE ;
849 state->Init_Ctrl[1].size = 1 ;
850 state->Init_Ctrl[1].addr[0] = 53;
851 state->Init_Ctrl[1].bit[0] = 2;
852 state->Init_Ctrl[1].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300853
Steven Toth3935c252008-05-01 05:45:44 -0300854 state->Init_Ctrl[2].Ctrl_Num = BB_BUF ;
855 state->Init_Ctrl[2].size = 2 ;
856 state->Init_Ctrl[2].addr[0] = 53;
857 state->Init_Ctrl[2].bit[0] = 1;
858 state->Init_Ctrl[2].val[0] = 0;
859 state->Init_Ctrl[2].addr[1] = 57;
860 state->Init_Ctrl[2].bit[1] = 0;
861 state->Init_Ctrl[2].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300862
Steven Toth3935c252008-05-01 05:45:44 -0300863 state->Init_Ctrl[3].Ctrl_Num = BB_BUF_OA ;
864 state->Init_Ctrl[3].size = 1 ;
865 state->Init_Ctrl[3].addr[0] = 53;
866 state->Init_Ctrl[3].bit[0] = 0;
867 state->Init_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300868
Steven Toth3935c252008-05-01 05:45:44 -0300869 state->Init_Ctrl[4].Ctrl_Num = BB_ALPF_BANDSELECT ;
870 state->Init_Ctrl[4].size = 3 ;
871 state->Init_Ctrl[4].addr[0] = 53;
872 state->Init_Ctrl[4].bit[0] = 5;
873 state->Init_Ctrl[4].val[0] = 0;
874 state->Init_Ctrl[4].addr[1] = 53;
875 state->Init_Ctrl[4].bit[1] = 6;
876 state->Init_Ctrl[4].val[1] = 0;
877 state->Init_Ctrl[4].addr[2] = 53;
878 state->Init_Ctrl[4].bit[2] = 7;
879 state->Init_Ctrl[4].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300880
Steven Toth3935c252008-05-01 05:45:44 -0300881 state->Init_Ctrl[5].Ctrl_Num = BB_IQSWAP ;
882 state->Init_Ctrl[5].size = 1 ;
883 state->Init_Ctrl[5].addr[0] = 59;
884 state->Init_Ctrl[5].bit[0] = 0;
885 state->Init_Ctrl[5].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300886
Steven Toth3935c252008-05-01 05:45:44 -0300887 state->Init_Ctrl[6].Ctrl_Num = BB_DLPF_BANDSEL ;
888 state->Init_Ctrl[6].size = 2 ;
889 state->Init_Ctrl[6].addr[0] = 53;
890 state->Init_Ctrl[6].bit[0] = 3;
891 state->Init_Ctrl[6].val[0] = 0;
892 state->Init_Ctrl[6].addr[1] = 53;
893 state->Init_Ctrl[6].bit[1] = 4;
894 state->Init_Ctrl[6].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300895
Steven Toth3935c252008-05-01 05:45:44 -0300896 state->Init_Ctrl[7].Ctrl_Num = RFSYN_CHP_GAIN ;
897 state->Init_Ctrl[7].size = 4 ;
898 state->Init_Ctrl[7].addr[0] = 22;
899 state->Init_Ctrl[7].bit[0] = 4;
900 state->Init_Ctrl[7].val[0] = 0;
901 state->Init_Ctrl[7].addr[1] = 22;
902 state->Init_Ctrl[7].bit[1] = 5;
903 state->Init_Ctrl[7].val[1] = 1;
904 state->Init_Ctrl[7].addr[2] = 22;
905 state->Init_Ctrl[7].bit[2] = 6;
906 state->Init_Ctrl[7].val[2] = 1;
907 state->Init_Ctrl[7].addr[3] = 22;
908 state->Init_Ctrl[7].bit[3] = 7;
909 state->Init_Ctrl[7].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300910
Steven Toth3935c252008-05-01 05:45:44 -0300911 state->Init_Ctrl[8].Ctrl_Num = RFSYN_EN_CHP_HIGAIN ;
912 state->Init_Ctrl[8].size = 1 ;
913 state->Init_Ctrl[8].addr[0] = 22;
914 state->Init_Ctrl[8].bit[0] = 2;
915 state->Init_Ctrl[8].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300916
Steven Toth3935c252008-05-01 05:45:44 -0300917 state->Init_Ctrl[9].Ctrl_Num = AGC_IF ;
918 state->Init_Ctrl[9].size = 4 ;
919 state->Init_Ctrl[9].addr[0] = 76;
920 state->Init_Ctrl[9].bit[0] = 0;
921 state->Init_Ctrl[9].val[0] = 1;
922 state->Init_Ctrl[9].addr[1] = 76;
923 state->Init_Ctrl[9].bit[1] = 1;
924 state->Init_Ctrl[9].val[1] = 1;
925 state->Init_Ctrl[9].addr[2] = 76;
926 state->Init_Ctrl[9].bit[2] = 2;
927 state->Init_Ctrl[9].val[2] = 0;
928 state->Init_Ctrl[9].addr[3] = 76;
929 state->Init_Ctrl[9].bit[3] = 3;
930 state->Init_Ctrl[9].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300931
Steven Toth3935c252008-05-01 05:45:44 -0300932 state->Init_Ctrl[10].Ctrl_Num = AGC_RF ;
933 state->Init_Ctrl[10].size = 4 ;
934 state->Init_Ctrl[10].addr[0] = 76;
935 state->Init_Ctrl[10].bit[0] = 4;
936 state->Init_Ctrl[10].val[0] = 1;
937 state->Init_Ctrl[10].addr[1] = 76;
938 state->Init_Ctrl[10].bit[1] = 5;
939 state->Init_Ctrl[10].val[1] = 1;
940 state->Init_Ctrl[10].addr[2] = 76;
941 state->Init_Ctrl[10].bit[2] = 6;
942 state->Init_Ctrl[10].val[2] = 0;
943 state->Init_Ctrl[10].addr[3] = 76;
944 state->Init_Ctrl[10].bit[3] = 7;
945 state->Init_Ctrl[10].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -0300946
Steven Toth3935c252008-05-01 05:45:44 -0300947 state->Init_Ctrl[11].Ctrl_Num = IF_DIVVAL ;
948 state->Init_Ctrl[11].size = 5 ;
949 state->Init_Ctrl[11].addr[0] = 43;
950 state->Init_Ctrl[11].bit[0] = 3;
951 state->Init_Ctrl[11].val[0] = 0;
952 state->Init_Ctrl[11].addr[1] = 43;
953 state->Init_Ctrl[11].bit[1] = 4;
954 state->Init_Ctrl[11].val[1] = 0;
955 state->Init_Ctrl[11].addr[2] = 43;
956 state->Init_Ctrl[11].bit[2] = 5;
957 state->Init_Ctrl[11].val[2] = 0;
958 state->Init_Ctrl[11].addr[3] = 43;
959 state->Init_Ctrl[11].bit[3] = 6;
960 state->Init_Ctrl[11].val[3] = 1;
961 state->Init_Ctrl[11].addr[4] = 43;
962 state->Init_Ctrl[11].bit[4] = 7;
963 state->Init_Ctrl[11].val[4] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300964
Steven Toth3935c252008-05-01 05:45:44 -0300965 state->Init_Ctrl[12].Ctrl_Num = IF_VCO_BIAS ;
966 state->Init_Ctrl[12].size = 6 ;
967 state->Init_Ctrl[12].addr[0] = 44;
968 state->Init_Ctrl[12].bit[0] = 2;
969 state->Init_Ctrl[12].val[0] = 0;
970 state->Init_Ctrl[12].addr[1] = 44;
971 state->Init_Ctrl[12].bit[1] = 3;
972 state->Init_Ctrl[12].val[1] = 0;
973 state->Init_Ctrl[12].addr[2] = 44;
974 state->Init_Ctrl[12].bit[2] = 4;
975 state->Init_Ctrl[12].val[2] = 0;
976 state->Init_Ctrl[12].addr[3] = 44;
977 state->Init_Ctrl[12].bit[3] = 5;
978 state->Init_Ctrl[12].val[3] = 1;
979 state->Init_Ctrl[12].addr[4] = 44;
980 state->Init_Ctrl[12].bit[4] = 6;
981 state->Init_Ctrl[12].val[4] = 0;
982 state->Init_Ctrl[12].addr[5] = 44;
983 state->Init_Ctrl[12].bit[5] = 7;
984 state->Init_Ctrl[12].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -0300985
Steven Toth3935c252008-05-01 05:45:44 -0300986 state->Init_Ctrl[13].Ctrl_Num = CHCAL_INT_MOD_IF ;
987 state->Init_Ctrl[13].size = 7 ;
988 state->Init_Ctrl[13].addr[0] = 11;
989 state->Init_Ctrl[13].bit[0] = 0;
990 state->Init_Ctrl[13].val[0] = 1;
991 state->Init_Ctrl[13].addr[1] = 11;
992 state->Init_Ctrl[13].bit[1] = 1;
993 state->Init_Ctrl[13].val[1] = 0;
994 state->Init_Ctrl[13].addr[2] = 11;
995 state->Init_Ctrl[13].bit[2] = 2;
996 state->Init_Ctrl[13].val[2] = 0;
997 state->Init_Ctrl[13].addr[3] = 11;
998 state->Init_Ctrl[13].bit[3] = 3;
999 state->Init_Ctrl[13].val[3] = 1;
1000 state->Init_Ctrl[13].addr[4] = 11;
1001 state->Init_Ctrl[13].bit[4] = 4;
1002 state->Init_Ctrl[13].val[4] = 1;
1003 state->Init_Ctrl[13].addr[5] = 11;
1004 state->Init_Ctrl[13].bit[5] = 5;
1005 state->Init_Ctrl[13].val[5] = 0;
1006 state->Init_Ctrl[13].addr[6] = 11;
1007 state->Init_Ctrl[13].bit[6] = 6;
1008 state->Init_Ctrl[13].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001009
Steven Toth3935c252008-05-01 05:45:44 -03001010 state->Init_Ctrl[14].Ctrl_Num = CHCAL_FRAC_MOD_IF ;
1011 state->Init_Ctrl[14].size = 16 ;
1012 state->Init_Ctrl[14].addr[0] = 13;
1013 state->Init_Ctrl[14].bit[0] = 0;
1014 state->Init_Ctrl[14].val[0] = 0;
1015 state->Init_Ctrl[14].addr[1] = 13;
1016 state->Init_Ctrl[14].bit[1] = 1;
1017 state->Init_Ctrl[14].val[1] = 0;
1018 state->Init_Ctrl[14].addr[2] = 13;
1019 state->Init_Ctrl[14].bit[2] = 2;
1020 state->Init_Ctrl[14].val[2] = 0;
1021 state->Init_Ctrl[14].addr[3] = 13;
1022 state->Init_Ctrl[14].bit[3] = 3;
1023 state->Init_Ctrl[14].val[3] = 0;
1024 state->Init_Ctrl[14].addr[4] = 13;
1025 state->Init_Ctrl[14].bit[4] = 4;
1026 state->Init_Ctrl[14].val[4] = 0;
1027 state->Init_Ctrl[14].addr[5] = 13;
1028 state->Init_Ctrl[14].bit[5] = 5;
1029 state->Init_Ctrl[14].val[5] = 0;
1030 state->Init_Ctrl[14].addr[6] = 13;
1031 state->Init_Ctrl[14].bit[6] = 6;
1032 state->Init_Ctrl[14].val[6] = 0;
1033 state->Init_Ctrl[14].addr[7] = 13;
1034 state->Init_Ctrl[14].bit[7] = 7;
1035 state->Init_Ctrl[14].val[7] = 0;
1036 state->Init_Ctrl[14].addr[8] = 12;
1037 state->Init_Ctrl[14].bit[8] = 0;
1038 state->Init_Ctrl[14].val[8] = 0;
1039 state->Init_Ctrl[14].addr[9] = 12;
1040 state->Init_Ctrl[14].bit[9] = 1;
1041 state->Init_Ctrl[14].val[9] = 0;
1042 state->Init_Ctrl[14].addr[10] = 12;
1043 state->Init_Ctrl[14].bit[10] = 2;
1044 state->Init_Ctrl[14].val[10] = 0;
1045 state->Init_Ctrl[14].addr[11] = 12;
1046 state->Init_Ctrl[14].bit[11] = 3;
1047 state->Init_Ctrl[14].val[11] = 0;
1048 state->Init_Ctrl[14].addr[12] = 12;
1049 state->Init_Ctrl[14].bit[12] = 4;
1050 state->Init_Ctrl[14].val[12] = 0;
1051 state->Init_Ctrl[14].addr[13] = 12;
1052 state->Init_Ctrl[14].bit[13] = 5;
1053 state->Init_Ctrl[14].val[13] = 1;
1054 state->Init_Ctrl[14].addr[14] = 12;
1055 state->Init_Ctrl[14].bit[14] = 6;
1056 state->Init_Ctrl[14].val[14] = 1;
1057 state->Init_Ctrl[14].addr[15] = 12;
1058 state->Init_Ctrl[14].bit[15] = 7;
1059 state->Init_Ctrl[14].val[15] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001060
Steven Toth3935c252008-05-01 05:45:44 -03001061 state->Init_Ctrl[15].Ctrl_Num = DRV_RES_SEL ;
1062 state->Init_Ctrl[15].size = 3 ;
1063 state->Init_Ctrl[15].addr[0] = 147;
1064 state->Init_Ctrl[15].bit[0] = 2;
1065 state->Init_Ctrl[15].val[0] = 0;
1066 state->Init_Ctrl[15].addr[1] = 147;
1067 state->Init_Ctrl[15].bit[1] = 3;
1068 state->Init_Ctrl[15].val[1] = 1;
1069 state->Init_Ctrl[15].addr[2] = 147;
1070 state->Init_Ctrl[15].bit[2] = 4;
1071 state->Init_Ctrl[15].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001072
Steven Toth3935c252008-05-01 05:45:44 -03001073 state->Init_Ctrl[16].Ctrl_Num = I_DRIVER ;
1074 state->Init_Ctrl[16].size = 2 ;
1075 state->Init_Ctrl[16].addr[0] = 147;
1076 state->Init_Ctrl[16].bit[0] = 0;
1077 state->Init_Ctrl[16].val[0] = 0;
1078 state->Init_Ctrl[16].addr[1] = 147;
1079 state->Init_Ctrl[16].bit[1] = 1;
1080 state->Init_Ctrl[16].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001081
Steven Toth3935c252008-05-01 05:45:44 -03001082 state->Init_Ctrl[17].Ctrl_Num = EN_AAF ;
1083 state->Init_Ctrl[17].size = 1 ;
1084 state->Init_Ctrl[17].addr[0] = 147;
1085 state->Init_Ctrl[17].bit[0] = 7;
1086 state->Init_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001087
Steven Toth3935c252008-05-01 05:45:44 -03001088 state->Init_Ctrl[18].Ctrl_Num = EN_3P ;
1089 state->Init_Ctrl[18].size = 1 ;
1090 state->Init_Ctrl[18].addr[0] = 147;
1091 state->Init_Ctrl[18].bit[0] = 6;
1092 state->Init_Ctrl[18].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001093
Steven Toth3935c252008-05-01 05:45:44 -03001094 state->Init_Ctrl[19].Ctrl_Num = EN_AUX_3P ;
1095 state->Init_Ctrl[19].size = 1 ;
1096 state->Init_Ctrl[19].addr[0] = 156;
1097 state->Init_Ctrl[19].bit[0] = 0;
1098 state->Init_Ctrl[19].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001099
Steven Toth3935c252008-05-01 05:45:44 -03001100 state->Init_Ctrl[20].Ctrl_Num = SEL_AAF_BAND ;
1101 state->Init_Ctrl[20].size = 1 ;
1102 state->Init_Ctrl[20].addr[0] = 147;
1103 state->Init_Ctrl[20].bit[0] = 5;
1104 state->Init_Ctrl[20].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001105
Steven Toth3935c252008-05-01 05:45:44 -03001106 state->Init_Ctrl[21].Ctrl_Num = SEQ_ENCLK16_CLK_OUT ;
1107 state->Init_Ctrl[21].size = 1 ;
1108 state->Init_Ctrl[21].addr[0] = 137;
1109 state->Init_Ctrl[21].bit[0] = 4;
1110 state->Init_Ctrl[21].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001111
Steven Toth3935c252008-05-01 05:45:44 -03001112 state->Init_Ctrl[22].Ctrl_Num = SEQ_SEL4_16B ;
1113 state->Init_Ctrl[22].size = 1 ;
1114 state->Init_Ctrl[22].addr[0] = 137;
1115 state->Init_Ctrl[22].bit[0] = 7;
1116 state->Init_Ctrl[22].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001117
Steven Toth3935c252008-05-01 05:45:44 -03001118 state->Init_Ctrl[23].Ctrl_Num = XTAL_CAPSELECT ;
1119 state->Init_Ctrl[23].size = 1 ;
1120 state->Init_Ctrl[23].addr[0] = 91;
1121 state->Init_Ctrl[23].bit[0] = 5;
1122 state->Init_Ctrl[23].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001123
Steven Toth3935c252008-05-01 05:45:44 -03001124 state->Init_Ctrl[24].Ctrl_Num = IF_SEL_DBL ;
1125 state->Init_Ctrl[24].size = 1 ;
1126 state->Init_Ctrl[24].addr[0] = 43;
1127 state->Init_Ctrl[24].bit[0] = 0;
1128 state->Init_Ctrl[24].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001129
Steven Toth3935c252008-05-01 05:45:44 -03001130 state->Init_Ctrl[25].Ctrl_Num = RFSYN_R_DIV ;
1131 state->Init_Ctrl[25].size = 2 ;
1132 state->Init_Ctrl[25].addr[0] = 22;
1133 state->Init_Ctrl[25].bit[0] = 0;
1134 state->Init_Ctrl[25].val[0] = 1;
1135 state->Init_Ctrl[25].addr[1] = 22;
1136 state->Init_Ctrl[25].bit[1] = 1;
1137 state->Init_Ctrl[25].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001138
Steven Toth3935c252008-05-01 05:45:44 -03001139 state->Init_Ctrl[26].Ctrl_Num = SEQ_EXTSYNTHCALIF ;
1140 state->Init_Ctrl[26].size = 1 ;
1141 state->Init_Ctrl[26].addr[0] = 134;
1142 state->Init_Ctrl[26].bit[0] = 2;
1143 state->Init_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001144
Steven Toth3935c252008-05-01 05:45:44 -03001145 state->Init_Ctrl[27].Ctrl_Num = SEQ_EXTDCCAL ;
1146 state->Init_Ctrl[27].size = 1 ;
1147 state->Init_Ctrl[27].addr[0] = 137;
1148 state->Init_Ctrl[27].bit[0] = 3;
1149 state->Init_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001150
Steven Toth3935c252008-05-01 05:45:44 -03001151 state->Init_Ctrl[28].Ctrl_Num = AGC_EN_RSSI ;
1152 state->Init_Ctrl[28].size = 1 ;
1153 state->Init_Ctrl[28].addr[0] = 77;
1154 state->Init_Ctrl[28].bit[0] = 7;
1155 state->Init_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001156
Steven Toth3935c252008-05-01 05:45:44 -03001157 state->Init_Ctrl[29].Ctrl_Num = RFA_ENCLKRFAGC ;
1158 state->Init_Ctrl[29].size = 1 ;
1159 state->Init_Ctrl[29].addr[0] = 166;
1160 state->Init_Ctrl[29].bit[0] = 7;
1161 state->Init_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001162
Steven Toth3935c252008-05-01 05:45:44 -03001163 state->Init_Ctrl[30].Ctrl_Num = RFA_RSSI_REFH ;
1164 state->Init_Ctrl[30].size = 3 ;
1165 state->Init_Ctrl[30].addr[0] = 166;
1166 state->Init_Ctrl[30].bit[0] = 0;
1167 state->Init_Ctrl[30].val[0] = 0;
1168 state->Init_Ctrl[30].addr[1] = 166;
1169 state->Init_Ctrl[30].bit[1] = 1;
1170 state->Init_Ctrl[30].val[1] = 1;
1171 state->Init_Ctrl[30].addr[2] = 166;
1172 state->Init_Ctrl[30].bit[2] = 2;
1173 state->Init_Ctrl[30].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001174
Steven Toth3935c252008-05-01 05:45:44 -03001175 state->Init_Ctrl[31].Ctrl_Num = RFA_RSSI_REF ;
1176 state->Init_Ctrl[31].size = 3 ;
1177 state->Init_Ctrl[31].addr[0] = 166;
1178 state->Init_Ctrl[31].bit[0] = 3;
1179 state->Init_Ctrl[31].val[0] = 1;
1180 state->Init_Ctrl[31].addr[1] = 166;
1181 state->Init_Ctrl[31].bit[1] = 4;
1182 state->Init_Ctrl[31].val[1] = 0;
1183 state->Init_Ctrl[31].addr[2] = 166;
1184 state->Init_Ctrl[31].bit[2] = 5;
1185 state->Init_Ctrl[31].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001186
Steven Toth3935c252008-05-01 05:45:44 -03001187 state->Init_Ctrl[32].Ctrl_Num = RFA_RSSI_REFL ;
1188 state->Init_Ctrl[32].size = 3 ;
1189 state->Init_Ctrl[32].addr[0] = 167;
1190 state->Init_Ctrl[32].bit[0] = 0;
1191 state->Init_Ctrl[32].val[0] = 1;
1192 state->Init_Ctrl[32].addr[1] = 167;
1193 state->Init_Ctrl[32].bit[1] = 1;
1194 state->Init_Ctrl[32].val[1] = 1;
1195 state->Init_Ctrl[32].addr[2] = 167;
1196 state->Init_Ctrl[32].bit[2] = 2;
1197 state->Init_Ctrl[32].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001198
Steven Toth3935c252008-05-01 05:45:44 -03001199 state->Init_Ctrl[33].Ctrl_Num = RFA_FLR ;
1200 state->Init_Ctrl[33].size = 4 ;
1201 state->Init_Ctrl[33].addr[0] = 168;
1202 state->Init_Ctrl[33].bit[0] = 0;
1203 state->Init_Ctrl[33].val[0] = 0;
1204 state->Init_Ctrl[33].addr[1] = 168;
1205 state->Init_Ctrl[33].bit[1] = 1;
1206 state->Init_Ctrl[33].val[1] = 1;
1207 state->Init_Ctrl[33].addr[2] = 168;
1208 state->Init_Ctrl[33].bit[2] = 2;
1209 state->Init_Ctrl[33].val[2] = 0;
1210 state->Init_Ctrl[33].addr[3] = 168;
1211 state->Init_Ctrl[33].bit[3] = 3;
1212 state->Init_Ctrl[33].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001213
Steven Toth3935c252008-05-01 05:45:44 -03001214 state->Init_Ctrl[34].Ctrl_Num = RFA_CEIL ;
1215 state->Init_Ctrl[34].size = 4 ;
1216 state->Init_Ctrl[34].addr[0] = 168;
1217 state->Init_Ctrl[34].bit[0] = 4;
1218 state->Init_Ctrl[34].val[0] = 1;
1219 state->Init_Ctrl[34].addr[1] = 168;
1220 state->Init_Ctrl[34].bit[1] = 5;
1221 state->Init_Ctrl[34].val[1] = 1;
1222 state->Init_Ctrl[34].addr[2] = 168;
1223 state->Init_Ctrl[34].bit[2] = 6;
1224 state->Init_Ctrl[34].val[2] = 1;
1225 state->Init_Ctrl[34].addr[3] = 168;
1226 state->Init_Ctrl[34].bit[3] = 7;
1227 state->Init_Ctrl[34].val[3] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001228
Steven Toth3935c252008-05-01 05:45:44 -03001229 state->Init_Ctrl[35].Ctrl_Num = SEQ_EXTIQFSMPULSE ;
1230 state->Init_Ctrl[35].size = 1 ;
1231 state->Init_Ctrl[35].addr[0] = 135;
1232 state->Init_Ctrl[35].bit[0] = 0;
1233 state->Init_Ctrl[35].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001234
Steven Toth3935c252008-05-01 05:45:44 -03001235 state->Init_Ctrl[36].Ctrl_Num = OVERRIDE_1 ;
1236 state->Init_Ctrl[36].size = 1 ;
1237 state->Init_Ctrl[36].addr[0] = 56;
1238 state->Init_Ctrl[36].bit[0] = 3;
1239 state->Init_Ctrl[36].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001240
Steven Toth3935c252008-05-01 05:45:44 -03001241 state->Init_Ctrl[37].Ctrl_Num = BB_INITSTATE_DLPF_TUNE ;
1242 state->Init_Ctrl[37].size = 7 ;
1243 state->Init_Ctrl[37].addr[0] = 59;
1244 state->Init_Ctrl[37].bit[0] = 1;
1245 state->Init_Ctrl[37].val[0] = 0;
1246 state->Init_Ctrl[37].addr[1] = 59;
1247 state->Init_Ctrl[37].bit[1] = 2;
1248 state->Init_Ctrl[37].val[1] = 0;
1249 state->Init_Ctrl[37].addr[2] = 59;
1250 state->Init_Ctrl[37].bit[2] = 3;
1251 state->Init_Ctrl[37].val[2] = 0;
1252 state->Init_Ctrl[37].addr[3] = 59;
1253 state->Init_Ctrl[37].bit[3] = 4;
1254 state->Init_Ctrl[37].val[3] = 0;
1255 state->Init_Ctrl[37].addr[4] = 59;
1256 state->Init_Ctrl[37].bit[4] = 5;
1257 state->Init_Ctrl[37].val[4] = 0;
1258 state->Init_Ctrl[37].addr[5] = 59;
1259 state->Init_Ctrl[37].bit[5] = 6;
1260 state->Init_Ctrl[37].val[5] = 0;
1261 state->Init_Ctrl[37].addr[6] = 59;
1262 state->Init_Ctrl[37].bit[6] = 7;
1263 state->Init_Ctrl[37].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001264
Steven Toth3935c252008-05-01 05:45:44 -03001265 state->Init_Ctrl[38].Ctrl_Num = TG_R_DIV ;
1266 state->Init_Ctrl[38].size = 6 ;
1267 state->Init_Ctrl[38].addr[0] = 32;
1268 state->Init_Ctrl[38].bit[0] = 2;
1269 state->Init_Ctrl[38].val[0] = 0;
1270 state->Init_Ctrl[38].addr[1] = 32;
1271 state->Init_Ctrl[38].bit[1] = 3;
1272 state->Init_Ctrl[38].val[1] = 0;
1273 state->Init_Ctrl[38].addr[2] = 32;
1274 state->Init_Ctrl[38].bit[2] = 4;
1275 state->Init_Ctrl[38].val[2] = 0;
1276 state->Init_Ctrl[38].addr[3] = 32;
1277 state->Init_Ctrl[38].bit[3] = 5;
1278 state->Init_Ctrl[38].val[3] = 0;
1279 state->Init_Ctrl[38].addr[4] = 32;
1280 state->Init_Ctrl[38].bit[4] = 6;
1281 state->Init_Ctrl[38].val[4] = 1;
1282 state->Init_Ctrl[38].addr[5] = 32;
1283 state->Init_Ctrl[38].bit[5] = 7;
1284 state->Init_Ctrl[38].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001285
Steven Toth3935c252008-05-01 05:45:44 -03001286 state->Init_Ctrl[39].Ctrl_Num = EN_CHP_LIN_B ;
1287 state->Init_Ctrl[39].size = 1 ;
1288 state->Init_Ctrl[39].addr[0] = 25;
1289 state->Init_Ctrl[39].bit[0] = 3;
1290 state->Init_Ctrl[39].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001291
1292
Steven Toth3935c252008-05-01 05:45:44 -03001293 state->CH_Ctrl_Num = CHCTRL_NUM ;
Steven Toth52c99bd2008-05-01 04:57:01 -03001294
Steven Toth3935c252008-05-01 05:45:44 -03001295 state->CH_Ctrl[0].Ctrl_Num = DN_POLY ;
1296 state->CH_Ctrl[0].size = 2 ;
1297 state->CH_Ctrl[0].addr[0] = 68;
1298 state->CH_Ctrl[0].bit[0] = 6;
1299 state->CH_Ctrl[0].val[0] = 1;
1300 state->CH_Ctrl[0].addr[1] = 68;
1301 state->CH_Ctrl[0].bit[1] = 7;
1302 state->CH_Ctrl[0].val[1] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001303
Steven Toth3935c252008-05-01 05:45:44 -03001304 state->CH_Ctrl[1].Ctrl_Num = DN_RFGAIN ;
1305 state->CH_Ctrl[1].size = 2 ;
1306 state->CH_Ctrl[1].addr[0] = 70;
1307 state->CH_Ctrl[1].bit[0] = 6;
1308 state->CH_Ctrl[1].val[0] = 1;
1309 state->CH_Ctrl[1].addr[1] = 70;
1310 state->CH_Ctrl[1].bit[1] = 7;
1311 state->CH_Ctrl[1].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001312
Steven Toth3935c252008-05-01 05:45:44 -03001313 state->CH_Ctrl[2].Ctrl_Num = DN_CAP_RFLPF ;
1314 state->CH_Ctrl[2].size = 9 ;
1315 state->CH_Ctrl[2].addr[0] = 69;
1316 state->CH_Ctrl[2].bit[0] = 5;
1317 state->CH_Ctrl[2].val[0] = 0;
1318 state->CH_Ctrl[2].addr[1] = 69;
1319 state->CH_Ctrl[2].bit[1] = 6;
1320 state->CH_Ctrl[2].val[1] = 0;
1321 state->CH_Ctrl[2].addr[2] = 69;
1322 state->CH_Ctrl[2].bit[2] = 7;
1323 state->CH_Ctrl[2].val[2] = 0;
1324 state->CH_Ctrl[2].addr[3] = 68;
1325 state->CH_Ctrl[2].bit[3] = 0;
1326 state->CH_Ctrl[2].val[3] = 0;
1327 state->CH_Ctrl[2].addr[4] = 68;
1328 state->CH_Ctrl[2].bit[4] = 1;
1329 state->CH_Ctrl[2].val[4] = 0;
1330 state->CH_Ctrl[2].addr[5] = 68;
1331 state->CH_Ctrl[2].bit[5] = 2;
1332 state->CH_Ctrl[2].val[5] = 0;
1333 state->CH_Ctrl[2].addr[6] = 68;
1334 state->CH_Ctrl[2].bit[6] = 3;
1335 state->CH_Ctrl[2].val[6] = 0;
1336 state->CH_Ctrl[2].addr[7] = 68;
1337 state->CH_Ctrl[2].bit[7] = 4;
1338 state->CH_Ctrl[2].val[7] = 0;
1339 state->CH_Ctrl[2].addr[8] = 68;
1340 state->CH_Ctrl[2].bit[8] = 5;
1341 state->CH_Ctrl[2].val[8] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001342
Steven Toth3935c252008-05-01 05:45:44 -03001343 state->CH_Ctrl[3].Ctrl_Num = DN_EN_VHFUHFBAR ;
1344 state->CH_Ctrl[3].size = 1 ;
1345 state->CH_Ctrl[3].addr[0] = 70;
1346 state->CH_Ctrl[3].bit[0] = 5;
1347 state->CH_Ctrl[3].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001348
Steven Toth3935c252008-05-01 05:45:44 -03001349 state->CH_Ctrl[4].Ctrl_Num = DN_GAIN_ADJUST ;
1350 state->CH_Ctrl[4].size = 3 ;
1351 state->CH_Ctrl[4].addr[0] = 73;
1352 state->CH_Ctrl[4].bit[0] = 4;
1353 state->CH_Ctrl[4].val[0] = 0;
1354 state->CH_Ctrl[4].addr[1] = 73;
1355 state->CH_Ctrl[4].bit[1] = 5;
1356 state->CH_Ctrl[4].val[1] = 1;
1357 state->CH_Ctrl[4].addr[2] = 73;
1358 state->CH_Ctrl[4].bit[2] = 6;
1359 state->CH_Ctrl[4].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001360
Steven Toth3935c252008-05-01 05:45:44 -03001361 state->CH_Ctrl[5].Ctrl_Num = DN_IQTNBUF_AMP ;
1362 state->CH_Ctrl[5].size = 4 ;
1363 state->CH_Ctrl[5].addr[0] = 70;
1364 state->CH_Ctrl[5].bit[0] = 0;
1365 state->CH_Ctrl[5].val[0] = 0;
1366 state->CH_Ctrl[5].addr[1] = 70;
1367 state->CH_Ctrl[5].bit[1] = 1;
1368 state->CH_Ctrl[5].val[1] = 0;
1369 state->CH_Ctrl[5].addr[2] = 70;
1370 state->CH_Ctrl[5].bit[2] = 2;
1371 state->CH_Ctrl[5].val[2] = 0;
1372 state->CH_Ctrl[5].addr[3] = 70;
1373 state->CH_Ctrl[5].bit[3] = 3;
1374 state->CH_Ctrl[5].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001375
Steven Toth3935c252008-05-01 05:45:44 -03001376 state->CH_Ctrl[6].Ctrl_Num = DN_IQTNGNBFBIAS_BST ;
1377 state->CH_Ctrl[6].size = 1 ;
1378 state->CH_Ctrl[6].addr[0] = 70;
1379 state->CH_Ctrl[6].bit[0] = 4;
1380 state->CH_Ctrl[6].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001381
Steven Toth3935c252008-05-01 05:45:44 -03001382 state->CH_Ctrl[7].Ctrl_Num = RFSYN_EN_OUTMUX ;
1383 state->CH_Ctrl[7].size = 1 ;
1384 state->CH_Ctrl[7].addr[0] = 111;
1385 state->CH_Ctrl[7].bit[0] = 4;
1386 state->CH_Ctrl[7].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001387
Steven Toth3935c252008-05-01 05:45:44 -03001388 state->CH_Ctrl[8].Ctrl_Num = RFSYN_SEL_VCO_OUT ;
1389 state->CH_Ctrl[8].size = 1 ;
1390 state->CH_Ctrl[8].addr[0] = 111;
1391 state->CH_Ctrl[8].bit[0] = 7;
1392 state->CH_Ctrl[8].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001393
Steven Toth3935c252008-05-01 05:45:44 -03001394 state->CH_Ctrl[9].Ctrl_Num = RFSYN_SEL_VCO_HI ;
1395 state->CH_Ctrl[9].size = 1 ;
1396 state->CH_Ctrl[9].addr[0] = 111;
1397 state->CH_Ctrl[9].bit[0] = 6;
1398 state->CH_Ctrl[9].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001399
Steven Toth3935c252008-05-01 05:45:44 -03001400 state->CH_Ctrl[10].Ctrl_Num = RFSYN_SEL_DIVM ;
1401 state->CH_Ctrl[10].size = 1 ;
1402 state->CH_Ctrl[10].addr[0] = 111;
1403 state->CH_Ctrl[10].bit[0] = 5;
1404 state->CH_Ctrl[10].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001405
Steven Toth3935c252008-05-01 05:45:44 -03001406 state->CH_Ctrl[11].Ctrl_Num = RFSYN_RF_DIV_BIAS ;
1407 state->CH_Ctrl[11].size = 2 ;
1408 state->CH_Ctrl[11].addr[0] = 110;
1409 state->CH_Ctrl[11].bit[0] = 0;
1410 state->CH_Ctrl[11].val[0] = 1;
1411 state->CH_Ctrl[11].addr[1] = 110;
1412 state->CH_Ctrl[11].bit[1] = 1;
1413 state->CH_Ctrl[11].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001414
Steven Toth3935c252008-05-01 05:45:44 -03001415 state->CH_Ctrl[12].Ctrl_Num = DN_SEL_FREQ ;
1416 state->CH_Ctrl[12].size = 3 ;
1417 state->CH_Ctrl[12].addr[0] = 69;
1418 state->CH_Ctrl[12].bit[0] = 2;
1419 state->CH_Ctrl[12].val[0] = 0;
1420 state->CH_Ctrl[12].addr[1] = 69;
1421 state->CH_Ctrl[12].bit[1] = 3;
1422 state->CH_Ctrl[12].val[1] = 0;
1423 state->CH_Ctrl[12].addr[2] = 69;
1424 state->CH_Ctrl[12].bit[2] = 4;
1425 state->CH_Ctrl[12].val[2] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001426
Steven Toth3935c252008-05-01 05:45:44 -03001427 state->CH_Ctrl[13].Ctrl_Num = RFSYN_VCO_BIAS ;
1428 state->CH_Ctrl[13].size = 6 ;
1429 state->CH_Ctrl[13].addr[0] = 110;
1430 state->CH_Ctrl[13].bit[0] = 2;
1431 state->CH_Ctrl[13].val[0] = 0;
1432 state->CH_Ctrl[13].addr[1] = 110;
1433 state->CH_Ctrl[13].bit[1] = 3;
1434 state->CH_Ctrl[13].val[1] = 0;
1435 state->CH_Ctrl[13].addr[2] = 110;
1436 state->CH_Ctrl[13].bit[2] = 4;
1437 state->CH_Ctrl[13].val[2] = 0;
1438 state->CH_Ctrl[13].addr[3] = 110;
1439 state->CH_Ctrl[13].bit[3] = 5;
1440 state->CH_Ctrl[13].val[3] = 0;
1441 state->CH_Ctrl[13].addr[4] = 110;
1442 state->CH_Ctrl[13].bit[4] = 6;
1443 state->CH_Ctrl[13].val[4] = 0;
1444 state->CH_Ctrl[13].addr[5] = 110;
1445 state->CH_Ctrl[13].bit[5] = 7;
1446 state->CH_Ctrl[13].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001447
Steven Toth3935c252008-05-01 05:45:44 -03001448 state->CH_Ctrl[14].Ctrl_Num = CHCAL_INT_MOD_RF ;
1449 state->CH_Ctrl[14].size = 7 ;
1450 state->CH_Ctrl[14].addr[0] = 14;
1451 state->CH_Ctrl[14].bit[0] = 0;
1452 state->CH_Ctrl[14].val[0] = 0;
1453 state->CH_Ctrl[14].addr[1] = 14;
1454 state->CH_Ctrl[14].bit[1] = 1;
1455 state->CH_Ctrl[14].val[1] = 0;
1456 state->CH_Ctrl[14].addr[2] = 14;
1457 state->CH_Ctrl[14].bit[2] = 2;
1458 state->CH_Ctrl[14].val[2] = 0;
1459 state->CH_Ctrl[14].addr[3] = 14;
1460 state->CH_Ctrl[14].bit[3] = 3;
1461 state->CH_Ctrl[14].val[3] = 0;
1462 state->CH_Ctrl[14].addr[4] = 14;
1463 state->CH_Ctrl[14].bit[4] = 4;
1464 state->CH_Ctrl[14].val[4] = 0;
1465 state->CH_Ctrl[14].addr[5] = 14;
1466 state->CH_Ctrl[14].bit[5] = 5;
1467 state->CH_Ctrl[14].val[5] = 0;
1468 state->CH_Ctrl[14].addr[6] = 14;
1469 state->CH_Ctrl[14].bit[6] = 6;
1470 state->CH_Ctrl[14].val[6] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001471
Steven Toth3935c252008-05-01 05:45:44 -03001472 state->CH_Ctrl[15].Ctrl_Num = CHCAL_FRAC_MOD_RF ;
1473 state->CH_Ctrl[15].size = 18 ;
1474 state->CH_Ctrl[15].addr[0] = 17;
1475 state->CH_Ctrl[15].bit[0] = 6;
1476 state->CH_Ctrl[15].val[0] = 0;
1477 state->CH_Ctrl[15].addr[1] = 17;
1478 state->CH_Ctrl[15].bit[1] = 7;
1479 state->CH_Ctrl[15].val[1] = 0;
1480 state->CH_Ctrl[15].addr[2] = 16;
1481 state->CH_Ctrl[15].bit[2] = 0;
1482 state->CH_Ctrl[15].val[2] = 0;
1483 state->CH_Ctrl[15].addr[3] = 16;
1484 state->CH_Ctrl[15].bit[3] = 1;
1485 state->CH_Ctrl[15].val[3] = 0;
1486 state->CH_Ctrl[15].addr[4] = 16;
1487 state->CH_Ctrl[15].bit[4] = 2;
1488 state->CH_Ctrl[15].val[4] = 0;
1489 state->CH_Ctrl[15].addr[5] = 16;
1490 state->CH_Ctrl[15].bit[5] = 3;
1491 state->CH_Ctrl[15].val[5] = 0;
1492 state->CH_Ctrl[15].addr[6] = 16;
1493 state->CH_Ctrl[15].bit[6] = 4;
1494 state->CH_Ctrl[15].val[6] = 0;
1495 state->CH_Ctrl[15].addr[7] = 16;
1496 state->CH_Ctrl[15].bit[7] = 5;
1497 state->CH_Ctrl[15].val[7] = 0;
1498 state->CH_Ctrl[15].addr[8] = 16;
1499 state->CH_Ctrl[15].bit[8] = 6;
1500 state->CH_Ctrl[15].val[8] = 0;
1501 state->CH_Ctrl[15].addr[9] = 16;
1502 state->CH_Ctrl[15].bit[9] = 7;
1503 state->CH_Ctrl[15].val[9] = 0;
1504 state->CH_Ctrl[15].addr[10] = 15;
1505 state->CH_Ctrl[15].bit[10] = 0;
1506 state->CH_Ctrl[15].val[10] = 0;
1507 state->CH_Ctrl[15].addr[11] = 15;
1508 state->CH_Ctrl[15].bit[11] = 1;
1509 state->CH_Ctrl[15].val[11] = 0;
1510 state->CH_Ctrl[15].addr[12] = 15;
1511 state->CH_Ctrl[15].bit[12] = 2;
1512 state->CH_Ctrl[15].val[12] = 0;
1513 state->CH_Ctrl[15].addr[13] = 15;
1514 state->CH_Ctrl[15].bit[13] = 3;
1515 state->CH_Ctrl[15].val[13] = 0;
1516 state->CH_Ctrl[15].addr[14] = 15;
1517 state->CH_Ctrl[15].bit[14] = 4;
1518 state->CH_Ctrl[15].val[14] = 0;
1519 state->CH_Ctrl[15].addr[15] = 15;
1520 state->CH_Ctrl[15].bit[15] = 5;
1521 state->CH_Ctrl[15].val[15] = 0;
1522 state->CH_Ctrl[15].addr[16] = 15;
1523 state->CH_Ctrl[15].bit[16] = 6;
1524 state->CH_Ctrl[15].val[16] = 1;
1525 state->CH_Ctrl[15].addr[17] = 15;
1526 state->CH_Ctrl[15].bit[17] = 7;
1527 state->CH_Ctrl[15].val[17] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001528
Steven Toth3935c252008-05-01 05:45:44 -03001529 state->CH_Ctrl[16].Ctrl_Num = RFSYN_LPF_R ;
1530 state->CH_Ctrl[16].size = 5 ;
1531 state->CH_Ctrl[16].addr[0] = 112;
1532 state->CH_Ctrl[16].bit[0] = 0;
1533 state->CH_Ctrl[16].val[0] = 0;
1534 state->CH_Ctrl[16].addr[1] = 112;
1535 state->CH_Ctrl[16].bit[1] = 1;
1536 state->CH_Ctrl[16].val[1] = 0;
1537 state->CH_Ctrl[16].addr[2] = 112;
1538 state->CH_Ctrl[16].bit[2] = 2;
1539 state->CH_Ctrl[16].val[2] = 0;
1540 state->CH_Ctrl[16].addr[3] = 112;
1541 state->CH_Ctrl[16].bit[3] = 3;
1542 state->CH_Ctrl[16].val[3] = 0;
1543 state->CH_Ctrl[16].addr[4] = 112;
1544 state->CH_Ctrl[16].bit[4] = 4;
1545 state->CH_Ctrl[16].val[4] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001546
Steven Toth3935c252008-05-01 05:45:44 -03001547 state->CH_Ctrl[17].Ctrl_Num = CHCAL_EN_INT_RF ;
1548 state->CH_Ctrl[17].size = 1 ;
1549 state->CH_Ctrl[17].addr[0] = 14;
1550 state->CH_Ctrl[17].bit[0] = 7;
1551 state->CH_Ctrl[17].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001552
Steven Toth3935c252008-05-01 05:45:44 -03001553 state->CH_Ctrl[18].Ctrl_Num = TG_LO_DIVVAL ;
1554 state->CH_Ctrl[18].size = 4 ;
1555 state->CH_Ctrl[18].addr[0] = 107;
1556 state->CH_Ctrl[18].bit[0] = 3;
1557 state->CH_Ctrl[18].val[0] = 0;
1558 state->CH_Ctrl[18].addr[1] = 107;
1559 state->CH_Ctrl[18].bit[1] = 4;
1560 state->CH_Ctrl[18].val[1] = 0;
1561 state->CH_Ctrl[18].addr[2] = 107;
1562 state->CH_Ctrl[18].bit[2] = 5;
1563 state->CH_Ctrl[18].val[2] = 0;
1564 state->CH_Ctrl[18].addr[3] = 107;
1565 state->CH_Ctrl[18].bit[3] = 6;
1566 state->CH_Ctrl[18].val[3] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001567
Steven Toth3935c252008-05-01 05:45:44 -03001568 state->CH_Ctrl[19].Ctrl_Num = TG_LO_SELVAL ;
1569 state->CH_Ctrl[19].size = 3 ;
1570 state->CH_Ctrl[19].addr[0] = 107;
1571 state->CH_Ctrl[19].bit[0] = 7;
1572 state->CH_Ctrl[19].val[0] = 1;
1573 state->CH_Ctrl[19].addr[1] = 106;
1574 state->CH_Ctrl[19].bit[1] = 0;
1575 state->CH_Ctrl[19].val[1] = 1;
1576 state->CH_Ctrl[19].addr[2] = 106;
1577 state->CH_Ctrl[19].bit[2] = 1;
1578 state->CH_Ctrl[19].val[2] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001579
Steven Toth3935c252008-05-01 05:45:44 -03001580 state->CH_Ctrl[20].Ctrl_Num = TG_DIV_VAL ;
1581 state->CH_Ctrl[20].size = 11 ;
1582 state->CH_Ctrl[20].addr[0] = 109;
1583 state->CH_Ctrl[20].bit[0] = 2;
1584 state->CH_Ctrl[20].val[0] = 0;
1585 state->CH_Ctrl[20].addr[1] = 109;
1586 state->CH_Ctrl[20].bit[1] = 3;
1587 state->CH_Ctrl[20].val[1] = 0;
1588 state->CH_Ctrl[20].addr[2] = 109;
1589 state->CH_Ctrl[20].bit[2] = 4;
1590 state->CH_Ctrl[20].val[2] = 0;
1591 state->CH_Ctrl[20].addr[3] = 109;
1592 state->CH_Ctrl[20].bit[3] = 5;
1593 state->CH_Ctrl[20].val[3] = 0;
1594 state->CH_Ctrl[20].addr[4] = 109;
1595 state->CH_Ctrl[20].bit[4] = 6;
1596 state->CH_Ctrl[20].val[4] = 0;
1597 state->CH_Ctrl[20].addr[5] = 109;
1598 state->CH_Ctrl[20].bit[5] = 7;
1599 state->CH_Ctrl[20].val[5] = 0;
1600 state->CH_Ctrl[20].addr[6] = 108;
1601 state->CH_Ctrl[20].bit[6] = 0;
1602 state->CH_Ctrl[20].val[6] = 0;
1603 state->CH_Ctrl[20].addr[7] = 108;
1604 state->CH_Ctrl[20].bit[7] = 1;
1605 state->CH_Ctrl[20].val[7] = 0;
1606 state->CH_Ctrl[20].addr[8] = 108;
1607 state->CH_Ctrl[20].bit[8] = 2;
1608 state->CH_Ctrl[20].val[8] = 1;
1609 state->CH_Ctrl[20].addr[9] = 108;
1610 state->CH_Ctrl[20].bit[9] = 3;
1611 state->CH_Ctrl[20].val[9] = 1;
1612 state->CH_Ctrl[20].addr[10] = 108;
1613 state->CH_Ctrl[20].bit[10] = 4;
1614 state->CH_Ctrl[20].val[10] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001615
Steven Toth3935c252008-05-01 05:45:44 -03001616 state->CH_Ctrl[21].Ctrl_Num = TG_VCO_BIAS ;
1617 state->CH_Ctrl[21].size = 6 ;
1618 state->CH_Ctrl[21].addr[0] = 106;
1619 state->CH_Ctrl[21].bit[0] = 2;
1620 state->CH_Ctrl[21].val[0] = 0;
1621 state->CH_Ctrl[21].addr[1] = 106;
1622 state->CH_Ctrl[21].bit[1] = 3;
1623 state->CH_Ctrl[21].val[1] = 0;
1624 state->CH_Ctrl[21].addr[2] = 106;
1625 state->CH_Ctrl[21].bit[2] = 4;
1626 state->CH_Ctrl[21].val[2] = 0;
1627 state->CH_Ctrl[21].addr[3] = 106;
1628 state->CH_Ctrl[21].bit[3] = 5;
1629 state->CH_Ctrl[21].val[3] = 0;
1630 state->CH_Ctrl[21].addr[4] = 106;
1631 state->CH_Ctrl[21].bit[4] = 6;
1632 state->CH_Ctrl[21].val[4] = 0;
1633 state->CH_Ctrl[21].addr[5] = 106;
1634 state->CH_Ctrl[21].bit[5] = 7;
1635 state->CH_Ctrl[21].val[5] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001636
Steven Toth3935c252008-05-01 05:45:44 -03001637 state->CH_Ctrl[22].Ctrl_Num = SEQ_EXTPOWERUP ;
1638 state->CH_Ctrl[22].size = 1 ;
1639 state->CH_Ctrl[22].addr[0] = 138;
1640 state->CH_Ctrl[22].bit[0] = 4;
1641 state->CH_Ctrl[22].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001642
Steven Toth3935c252008-05-01 05:45:44 -03001643 state->CH_Ctrl[23].Ctrl_Num = OVERRIDE_2 ;
1644 state->CH_Ctrl[23].size = 1 ;
1645 state->CH_Ctrl[23].addr[0] = 17;
1646 state->CH_Ctrl[23].bit[0] = 5;
1647 state->CH_Ctrl[23].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001648
Steven Toth3935c252008-05-01 05:45:44 -03001649 state->CH_Ctrl[24].Ctrl_Num = OVERRIDE_3 ;
1650 state->CH_Ctrl[24].size = 1 ;
1651 state->CH_Ctrl[24].addr[0] = 111;
1652 state->CH_Ctrl[24].bit[0] = 3;
1653 state->CH_Ctrl[24].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001654
Steven Toth3935c252008-05-01 05:45:44 -03001655 state->CH_Ctrl[25].Ctrl_Num = OVERRIDE_4 ;
1656 state->CH_Ctrl[25].size = 1 ;
1657 state->CH_Ctrl[25].addr[0] = 112;
1658 state->CH_Ctrl[25].bit[0] = 7;
1659 state->CH_Ctrl[25].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001660
Steven Toth3935c252008-05-01 05:45:44 -03001661 state->CH_Ctrl[26].Ctrl_Num = SEQ_FSM_PULSE ;
1662 state->CH_Ctrl[26].size = 1 ;
1663 state->CH_Ctrl[26].addr[0] = 136;
1664 state->CH_Ctrl[26].bit[0] = 7;
1665 state->CH_Ctrl[26].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001666
Steven Toth3935c252008-05-01 05:45:44 -03001667 state->CH_Ctrl[27].Ctrl_Num = GPIO_4B ;
1668 state->CH_Ctrl[27].size = 1 ;
1669 state->CH_Ctrl[27].addr[0] = 149;
1670 state->CH_Ctrl[27].bit[0] = 7;
1671 state->CH_Ctrl[27].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001672
Steven Toth3935c252008-05-01 05:45:44 -03001673 state->CH_Ctrl[28].Ctrl_Num = GPIO_3B ;
1674 state->CH_Ctrl[28].size = 1 ;
1675 state->CH_Ctrl[28].addr[0] = 149;
1676 state->CH_Ctrl[28].bit[0] = 6;
1677 state->CH_Ctrl[28].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001678
Steven Toth3935c252008-05-01 05:45:44 -03001679 state->CH_Ctrl[29].Ctrl_Num = GPIO_4 ;
1680 state->CH_Ctrl[29].size = 1 ;
1681 state->CH_Ctrl[29].addr[0] = 149;
1682 state->CH_Ctrl[29].bit[0] = 5;
1683 state->CH_Ctrl[29].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001684
Steven Toth3935c252008-05-01 05:45:44 -03001685 state->CH_Ctrl[30].Ctrl_Num = GPIO_3 ;
1686 state->CH_Ctrl[30].size = 1 ;
1687 state->CH_Ctrl[30].addr[0] = 149;
1688 state->CH_Ctrl[30].bit[0] = 4;
1689 state->CH_Ctrl[30].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001690
Steven Toth3935c252008-05-01 05:45:44 -03001691 state->CH_Ctrl[31].Ctrl_Num = GPIO_1B ;
1692 state->CH_Ctrl[31].size = 1 ;
1693 state->CH_Ctrl[31].addr[0] = 149;
1694 state->CH_Ctrl[31].bit[0] = 3;
1695 state->CH_Ctrl[31].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001696
Steven Toth3935c252008-05-01 05:45:44 -03001697 state->CH_Ctrl[32].Ctrl_Num = DAC_A_ENABLE ;
1698 state->CH_Ctrl[32].size = 1 ;
1699 state->CH_Ctrl[32].addr[0] = 93;
1700 state->CH_Ctrl[32].bit[0] = 1;
1701 state->CH_Ctrl[32].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001702
Steven Toth3935c252008-05-01 05:45:44 -03001703 state->CH_Ctrl[33].Ctrl_Num = DAC_B_ENABLE ;
1704 state->CH_Ctrl[33].size = 1 ;
1705 state->CH_Ctrl[33].addr[0] = 93;
1706 state->CH_Ctrl[33].bit[0] = 0;
1707 state->CH_Ctrl[33].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001708
Steven Toth3935c252008-05-01 05:45:44 -03001709 state->CH_Ctrl[34].Ctrl_Num = DAC_DIN_A ;
1710 state->CH_Ctrl[34].size = 6 ;
1711 state->CH_Ctrl[34].addr[0] = 92;
1712 state->CH_Ctrl[34].bit[0] = 2;
1713 state->CH_Ctrl[34].val[0] = 0;
1714 state->CH_Ctrl[34].addr[1] = 92;
1715 state->CH_Ctrl[34].bit[1] = 3;
1716 state->CH_Ctrl[34].val[1] = 0;
1717 state->CH_Ctrl[34].addr[2] = 92;
1718 state->CH_Ctrl[34].bit[2] = 4;
1719 state->CH_Ctrl[34].val[2] = 0;
1720 state->CH_Ctrl[34].addr[3] = 92;
1721 state->CH_Ctrl[34].bit[3] = 5;
1722 state->CH_Ctrl[34].val[3] = 0;
1723 state->CH_Ctrl[34].addr[4] = 92;
1724 state->CH_Ctrl[34].bit[4] = 6;
1725 state->CH_Ctrl[34].val[4] = 0;
1726 state->CH_Ctrl[34].addr[5] = 92;
1727 state->CH_Ctrl[34].bit[5] = 7;
1728 state->CH_Ctrl[34].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001729
Steven Toth3935c252008-05-01 05:45:44 -03001730 state->CH_Ctrl[35].Ctrl_Num = DAC_DIN_B ;
1731 state->CH_Ctrl[35].size = 6 ;
1732 state->CH_Ctrl[35].addr[0] = 93;
1733 state->CH_Ctrl[35].bit[0] = 2;
1734 state->CH_Ctrl[35].val[0] = 0;
1735 state->CH_Ctrl[35].addr[1] = 93;
1736 state->CH_Ctrl[35].bit[1] = 3;
1737 state->CH_Ctrl[35].val[1] = 0;
1738 state->CH_Ctrl[35].addr[2] = 93;
1739 state->CH_Ctrl[35].bit[2] = 4;
1740 state->CH_Ctrl[35].val[2] = 0;
1741 state->CH_Ctrl[35].addr[3] = 93;
1742 state->CH_Ctrl[35].bit[3] = 5;
1743 state->CH_Ctrl[35].val[3] = 0;
1744 state->CH_Ctrl[35].addr[4] = 93;
1745 state->CH_Ctrl[35].bit[4] = 6;
1746 state->CH_Ctrl[35].val[4] = 0;
1747 state->CH_Ctrl[35].addr[5] = 93;
1748 state->CH_Ctrl[35].bit[5] = 7;
1749 state->CH_Ctrl[35].val[5] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001750
1751#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03001752 state->CH_Ctrl[36].Ctrl_Num = RFSYN_EN_DIV ;
1753 state->CH_Ctrl[36].size = 1 ;
1754 state->CH_Ctrl[36].addr[0] = 109;
1755 state->CH_Ctrl[36].bit[0] = 1;
1756 state->CH_Ctrl[36].val[0] = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03001757
Steven Toth3935c252008-05-01 05:45:44 -03001758 state->CH_Ctrl[37].Ctrl_Num = RFSYN_DIVM ;
1759 state->CH_Ctrl[37].size = 2 ;
1760 state->CH_Ctrl[37].addr[0] = 112;
1761 state->CH_Ctrl[37].bit[0] = 5;
1762 state->CH_Ctrl[37].val[0] = 0;
1763 state->CH_Ctrl[37].addr[1] = 112;
1764 state->CH_Ctrl[37].bit[1] = 6;
1765 state->CH_Ctrl[37].val[1] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001766
Steven Toth3935c252008-05-01 05:45:44 -03001767 state->CH_Ctrl[38].Ctrl_Num = DN_BYPASS_AGC_I2C ;
1768 state->CH_Ctrl[38].size = 1 ;
1769 state->CH_Ctrl[38].addr[0] = 65;
1770 state->CH_Ctrl[38].bit[0] = 1;
1771 state->CH_Ctrl[38].val[0] = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001772#endif
1773
1774 return 0 ;
1775}
1776
Steven Toth52c99bd2008-05-01 04:57:01 -03001777// MaxLinear source code - MXL5005_c.cpp
Steven Toth52c99bd2008-05-01 04:57:01 -03001778// MXL5005.cpp : Defines the initialization routines for the DLL.
1779// 2.6.12
Steven Toth3935c252008-05-01 05:45:44 -03001780// DONE
1781void InitTunerControls(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001782{
Steven Toth3935c252008-05-01 05:45:44 -03001783 MXL5005_RegisterInit(fe);
1784 MXL5005_ControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001785#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03001786 MXL5005_MXLControlInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001787#endif
1788}
1789
Steven Toth52c99bd2008-05-01 04:57:01 -03001790///////////////////////////////////////////////////////////////////////////////
1791// //
1792// Function: MXL_ConfigTuner //
1793// //
1794// Description: Configure MXL5005Tuner structure for desired //
1795// Channel Bandwidth/Channel Frequency //
1796// //
1797// //
1798// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03001799// MXL_SynthIFLO_Calc //
Steven Toth52c99bd2008-05-01 04:57:01 -03001800// //
1801// Inputs: //
1802// Tuner_struct: structure defined at higher level //
1803// Mode: Tuner Mode (Analog/Digital) //
1804// IF_Mode: IF Mode ( Zero/Low ) //
Steven Toth3935c252008-05-01 05:45:44 -03001805// Bandwidth: Filter Channel Bandwidth (in Hz) //
Steven Toth52c99bd2008-05-01 04:57:01 -03001806// IF_out: Desired IF out Frequency (in Hz) //
1807// Fxtal: Crystal Frerquency (in Hz) //
Steven Toth3935c252008-05-01 05:45:44 -03001808// TOP: 0: Dual AGC; Value: take over point //
1809// IF_OUT_LOAD: IF out load resistor (200/300 Ohms) //
1810// CLOCK_OUT: 0: Turn off clock out; 1: turn on clock out //
1811// DIV_OUT: 0: Div-1; 1: Div-4 //
1812// CAPSELECT: 0: Disable On-chip pulling cap; 1: Enable //
1813// EN_RSSI: 0: Disable RSSI; 1: Enable RSSI //
Steven Toth52c99bd2008-05-01 04:57:01 -03001814// //
1815// Outputs: //
1816// Tuner //
1817// //
1818// Return: //
1819// 0 : Successful //
1820// > 0 : Failed //
1821// //
1822///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001823// DONE
1824u16 MXL5005_TunerConfig(struct dvb_frontend *fe,
1825 u8 Mode, /* 0: Analog Mode ; 1: Digital Mode */
1826 u8 IF_mode, /* for Analog Mode, 0: zero IF; 1: low IF */
1827 u32 Bandwidth, /* filter channel bandwidth (6, 7, 8) */
1828 u32 IF_out, /* Desired IF Out Frequency */
1829 u32 Fxtal, /* XTAL Frequency */
1830 u8 AGC_Mode, /* AGC Mode - Dual AGC: 0, Single AGC: 1 */
1831 u16 TOP, /* 0: Dual AGC; Value: take over point */
1832 u16 IF_OUT_LOAD, /* IF Out Load Resistor (200 / 300 Ohms) */
1833 u8 CLOCK_OUT, /* 0: turn off clock out; 1: turn on clock out */
1834 u8 DIV_OUT, /* 0: Div-1; 1: Div-4 */
1835 u8 CAPSELECT, /* 0: disable On-Chip pulling cap; 1: enable */
1836 u8 EN_RSSI, /* 0: disable RSSI; 1: enable RSSI */
1837 u8 Mod_Type, /* Modulation Type; */
1838 /* 0 - Default; 1 - DVB-T; 2 - ATSC; 3 - QAM; 4 - Analog Cable */
1839 u8 TF_Type /* Tracking Filter */
1840 /* 0 - Default; 1 - Off; 2 - Type C; 3 - Type C-H */
Steven Toth52c99bd2008-05-01 04:57:01 -03001841 )
1842{
Steven Toth85d220d2008-05-01 05:48:14 -03001843 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001844 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001845
Steven Toth3935c252008-05-01 05:45:44 -03001846 state->Mode = Mode;
1847 state->IF_Mode = IF_mode;
1848 state->Chan_Bandwidth = Bandwidth;
1849 state->IF_OUT = IF_out;
1850 state->Fxtal = Fxtal;
1851 state->AGC_Mode = AGC_Mode;
1852 state->TOP = TOP;
1853 state->IF_OUT_LOAD = IF_OUT_LOAD;
1854 state->CLOCK_OUT = CLOCK_OUT;
1855 state->DIV_OUT = DIV_OUT;
1856 state->CAPSELECT = CAPSELECT;
1857 state->EN_RSSI = EN_RSSI;
1858 state->Mod_Type = Mod_Type;
1859 state->TF_Type = TF_Type;
Steven Toth52c99bd2008-05-01 04:57:01 -03001860
Steven Totha8214d42008-05-01 05:02:58 -03001861 /* Initialize all the controls and registers */
Steven Toth3935c252008-05-01 05:45:44 -03001862 InitTunerControls(fe);
Steven Totha8214d42008-05-01 05:02:58 -03001863
1864 /* Synthesizer LO frequency calculation */
Steven Toth3935c252008-05-01 05:45:44 -03001865 MXL_SynthIFLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03001866
Steven Toth3935c252008-05-01 05:45:44 -03001867 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001868}
1869
1870///////////////////////////////////////////////////////////////////////////////
1871// //
1872// Function: MXL_SynthIFLO_Calc //
1873// //
1874// Description: Calculate Internal IF-LO Frequency //
1875// //
1876// Globals: //
1877// NONE //
1878// //
1879// Functions used: //
1880// NONE //
1881// //
1882// Inputs: //
1883// Tuner_struct: structure defined at higher level //
1884// //
1885// Outputs: //
1886// Tuner //
1887// //
1888// Return: //
1889// 0 : Successful //
1890// > 0 : Failed //
1891// //
1892///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001893// DONE
1894void MXL_SynthIFLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001895{
Steven Toth85d220d2008-05-01 05:48:14 -03001896 struct mxl5005s_state *state = fe->tuner_priv;
1897 if (state->Mode == 1) /* Digital Mode */
Steven Toth3935c252008-05-01 05:45:44 -03001898 state->IF_LO = state->IF_OUT;
1899 else /* Analog Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03001900 {
Steven Toth3935c252008-05-01 05:45:44 -03001901 if(state->IF_Mode == 0) /* Analog Zero IF mode */
1902 state->IF_LO = state->IF_OUT + 400000;
1903 else /* Analog Low IF mode */
1904 state->IF_LO = state->IF_OUT + state->Chan_Bandwidth/2;
Steven Toth52c99bd2008-05-01 04:57:01 -03001905 }
1906}
1907
1908///////////////////////////////////////////////////////////////////////////////
1909// //
1910// Function: MXL_SynthRFTGLO_Calc //
1911// //
1912// Description: Calculate Internal RF-LO frequency and //
1913// internal Tone-Gen(TG)-LO frequency //
1914// //
1915// Globals: //
1916// NONE //
1917// //
1918// Functions used: //
1919// NONE //
1920// //
1921// Inputs: //
1922// Tuner_struct: structure defined at higher level //
1923// //
1924// Outputs: //
1925// Tuner //
1926// //
1927// Return: //
1928// 0 : Successful //
1929// > 0 : Failed //
1930// //
1931///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001932// DONE
1933void MXL_SynthRFTGLO_Calc(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001934{
Steven Toth85d220d2008-05-01 05:48:14 -03001935 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03001936
1937 if (state->Mode == 1) /* Digital Mode */ {
Steven Toth52c99bd2008-05-01 04:57:01 -03001938 //remove 20.48MHz setting for 2.6.10
Steven Toth3935c252008-05-01 05:45:44 -03001939 state->RF_LO = state->RF_IN;
1940 state->TG_LO = state->RF_IN - 750000; //change for 2.6.6
1941 } else /* Analog Mode */ {
1942 if(state->IF_Mode == 0) /* Analog Zero IF mode */ {
1943 state->RF_LO = state->RF_IN - 400000;
1944 state->TG_LO = state->RF_IN - 1750000;
1945 } else /* Analog Low IF mode */ {
1946 state->RF_LO = state->RF_IN - state->Chan_Bandwidth/2;
1947 state->TG_LO = state->RF_IN - state->Chan_Bandwidth + 500000;
Steven Toth52c99bd2008-05-01 04:57:01 -03001948 }
1949 }
1950}
1951
1952///////////////////////////////////////////////////////////////////////////////
1953// //
1954// Function: MXL_OverwriteICDefault //
1955// //
1956// Description: Overwrite the Default Register Setting //
1957// //
1958// //
1959// Functions used: //
1960// //
1961// Inputs: //
1962// Tuner_struct: structure defined at higher level //
1963// Outputs: //
1964// Tuner //
1965// //
1966// Return: //
1967// 0 : Successful //
1968// > 0 : Failed //
1969// //
1970///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03001971// DONE
1972u16 MXL_OverwriteICDefault(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03001973{
Steven Toth3935c252008-05-01 05:45:44 -03001974 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03001975
Steven Toth3935c252008-05-01 05:45:44 -03001976 status += MXL_ControlWrite(fe, OVERRIDE_1, 1);
1977 status += MXL_ControlWrite(fe, OVERRIDE_2, 1);
1978 status += MXL_ControlWrite(fe, OVERRIDE_3, 1);
1979 status += MXL_ControlWrite(fe, OVERRIDE_4, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03001980
Steven Toth3935c252008-05-01 05:45:44 -03001981 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03001982}
1983
1984///////////////////////////////////////////////////////////////////////////////
1985// //
1986// Function: MXL_BlockInit //
1987// //
1988// Description: Tuner Initialization as a function of 'User Settings' //
1989// * User settings in Tuner strcuture must be assigned //
1990// first //
1991// //
1992// Globals: //
1993// NONE //
1994// //
1995// Functions used: //
1996// Tuner_struct: structure defined at higher level //
1997// //
1998// Inputs: //
1999// Tuner : Tuner structure defined at higher level //
2000// //
2001// Outputs: //
2002// Tuner //
2003// //
2004// Return: //
2005// 0 : Successful //
2006// > 0 : Failed //
2007// //
2008///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03002009// DONE
2010u16 MXL_BlockInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002011{
Steven Toth85d220d2008-05-01 05:48:14 -03002012 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03002013 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03002014
Steven Toth3935c252008-05-01 05:45:44 -03002015 status += MXL_OverwriteICDefault(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002016
Steven Toth3935c252008-05-01 05:45:44 -03002017 /* Downconverter Control Dig Ana */
2018 status += MXL_ControlWrite(fe, DN_IQTN_AMP_CUT, state->Mode ? 1 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002019
Steven Toth3935c252008-05-01 05:45:44 -03002020 /* Filter Control Dig Ana */
2021 status += MXL_ControlWrite(fe, BB_MODE, state->Mode ? 0 : 1);
2022 status += MXL_ControlWrite(fe, BB_BUF, state->Mode ? 3 : 2);
2023 status += MXL_ControlWrite(fe, BB_BUF_OA, state->Mode ? 1 : 0);
2024 status += MXL_ControlWrite(fe, BB_IQSWAP, state->Mode ? 0 : 1);
2025 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002026
Steven Toth3935c252008-05-01 05:45:44 -03002027 /* Initialize Low-Pass Filter */
2028 if (state->Mode) { /* Digital Mode */
2029 switch (state->Chan_Bandwidth) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002030 case 8000000:
Steven Toth3935c252008-05-01 05:45:44 -03002031 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 0);
2032 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002033 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03002034 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 2);
2035 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002036 case 6000000:
Steven Toth3935c252008-05-01 05:45:44 -03002037 status += MXL_ControlWrite(fe, BB_DLPF_BANDSEL, 3);
2038 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002039 }
Steven Toth3935c252008-05-01 05:45:44 -03002040 } else { /* Analog Mode */
2041 switch (state->Chan_Bandwidth) {
2042 case 8000000: /* Low Zero */
2043 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 0 : 3));
2044 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002045 case 7000000:
Steven Toth3935c252008-05-01 05:45:44 -03002046 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 1 : 4));
2047 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002048 case 6000000:
Steven Toth3935c252008-05-01 05:45:44 -03002049 status += MXL_ControlWrite(fe, BB_ALPF_BANDSELECT, (state->IF_Mode ? 2 : 5));
2050 break;
Steven Toth52c99bd2008-05-01 04:57:01 -03002051 }
2052 }
2053
Steven Toth3935c252008-05-01 05:45:44 -03002054 /* Charge Pump Control Dig Ana */
2055 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, state->Mode ? 5 : 8);
2056 status += MXL_ControlWrite(fe, RFSYN_EN_CHP_HIGAIN, state->Mode ? 1 : 1);
2057 status += MXL_ControlWrite(fe, EN_CHP_LIN_B, state->Mode ? 0 : 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002058
Steven Toth3935c252008-05-01 05:45:44 -03002059 /* AGC TOP Control */
2060 if (state->AGC_Mode == 0) /* Dual AGC */ {
2061 status += MXL_ControlWrite(fe, AGC_IF, 15);
2062 status += MXL_ControlWrite(fe, AGC_RF, 15);
Steven Toth52c99bd2008-05-01 04:57:01 -03002063 }
Steven Toth3935c252008-05-01 05:45:44 -03002064 else /* Single AGC Mode Dig Ana */
2065 status += MXL_ControlWrite(fe, AGC_RF, state->Mode ? 15 : 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03002066
2067
Steven Toth3935c252008-05-01 05:45:44 -03002068 if (state->TOP == 55) /* TOP == 5.5 */
2069 status += MXL_ControlWrite(fe, AGC_IF, 0x0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002070
Steven Toth3935c252008-05-01 05:45:44 -03002071 if (state->TOP == 72) /* TOP == 7.2 */
2072 status += MXL_ControlWrite(fe, AGC_IF, 0x1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002073
Steven Toth3935c252008-05-01 05:45:44 -03002074 if (state->TOP == 92) /* TOP == 9.2 */
2075 status += MXL_ControlWrite(fe, AGC_IF, 0x2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002076
Steven Toth3935c252008-05-01 05:45:44 -03002077 if (state->TOP == 110) /* TOP == 11.0 */
2078 status += MXL_ControlWrite(fe, AGC_IF, 0x3);
Steven Toth52c99bd2008-05-01 04:57:01 -03002079
Steven Toth3935c252008-05-01 05:45:44 -03002080 if (state->TOP == 129) /* TOP == 12.9 */
2081 status += MXL_ControlWrite(fe, AGC_IF, 0x4);
Steven Toth52c99bd2008-05-01 04:57:01 -03002082
Steven Toth3935c252008-05-01 05:45:44 -03002083 if (state->TOP == 147) /* TOP == 14.7 */
2084 status += MXL_ControlWrite(fe, AGC_IF, 0x5);
Steven Toth52c99bd2008-05-01 04:57:01 -03002085
Steven Toth3935c252008-05-01 05:45:44 -03002086 if (state->TOP == 168) /* TOP == 16.8 */
2087 status += MXL_ControlWrite(fe, AGC_IF, 0x6);
Steven Toth52c99bd2008-05-01 04:57:01 -03002088
Steven Toth3935c252008-05-01 05:45:44 -03002089 if (state->TOP == 194) /* TOP == 19.4 */
2090 status += MXL_ControlWrite(fe, AGC_IF, 0x7);
Steven Toth52c99bd2008-05-01 04:57:01 -03002091
Steven Toth3935c252008-05-01 05:45:44 -03002092 if (state->TOP == 212) /* TOP == 21.2 */
2093 status += MXL_ControlWrite(fe, AGC_IF, 0x9);
Steven Toth52c99bd2008-05-01 04:57:01 -03002094
Steven Toth3935c252008-05-01 05:45:44 -03002095 if (state->TOP == 232) /* TOP == 23.2 */
2096 status += MXL_ControlWrite(fe, AGC_IF, 0xA);
Steven Toth52c99bd2008-05-01 04:57:01 -03002097
Steven Toth3935c252008-05-01 05:45:44 -03002098 if (state->TOP == 252) /* TOP == 25.2 */
2099 status += MXL_ControlWrite(fe, AGC_IF, 0xB);
Steven Toth52c99bd2008-05-01 04:57:01 -03002100
Steven Toth3935c252008-05-01 05:45:44 -03002101 if (state->TOP == 271) /* TOP == 27.1 */
2102 status += MXL_ControlWrite(fe, AGC_IF, 0xC);
Steven Toth52c99bd2008-05-01 04:57:01 -03002103
Steven Toth3935c252008-05-01 05:45:44 -03002104 if (state->TOP == 292) /* TOP == 29.2 */
2105 status += MXL_ControlWrite(fe, AGC_IF, 0xD);
Steven Toth52c99bd2008-05-01 04:57:01 -03002106
Steven Toth3935c252008-05-01 05:45:44 -03002107 if (state->TOP == 317) /* TOP == 31.7 */
2108 status += MXL_ControlWrite(fe, AGC_IF, 0xE);
Steven Toth52c99bd2008-05-01 04:57:01 -03002109
Steven Toth3935c252008-05-01 05:45:44 -03002110 if (state->TOP == 349) /* TOP == 34.9 */
2111 status += MXL_ControlWrite(fe, AGC_IF, 0xF);
Steven Toth52c99bd2008-05-01 04:57:01 -03002112
Steven Toth3935c252008-05-01 05:45:44 -03002113 /* IF Synthesizer Control */
2114 status += MXL_IFSynthInit(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002115
Steven Toth3935c252008-05-01 05:45:44 -03002116 /* IF UpConverter Control */
2117 if (state->IF_OUT_LOAD == 200) {
2118 status += MXL_ControlWrite(fe, DRV_RES_SEL, 6);
2119 status += MXL_ControlWrite(fe, I_DRIVER, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002120 }
Steven Toth3935c252008-05-01 05:45:44 -03002121 if (state->IF_OUT_LOAD == 300) {
2122 status += MXL_ControlWrite(fe, DRV_RES_SEL, 4);
2123 status += MXL_ControlWrite(fe, I_DRIVER, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002124 }
2125
Steven Toth3935c252008-05-01 05:45:44 -03002126 /* Anti-Alias Filtering Control
2127 * initialise Anti-Aliasing Filter
2128 */
2129 if (state->Mode) { /* Digital Mode */
2130 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 6280000UL) {
2131 status += MXL_ControlWrite(fe, EN_AAF, 1);
2132 status += MXL_ControlWrite(fe, EN_3P, 1);
2133 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2134 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002135 }
Steven Toth3935c252008-05-01 05:45:44 -03002136 if ((state->IF_OUT == 36125000UL) || (state->IF_OUT == 36150000UL)) {
2137 status += MXL_ControlWrite(fe, EN_AAF, 1);
2138 status += MXL_ControlWrite(fe, EN_3P, 1);
2139 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2140 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002141 }
Steven Toth3935c252008-05-01 05:45:44 -03002142 if (state->IF_OUT > 36150000UL) {
2143 status += MXL_ControlWrite(fe, EN_AAF, 0);
2144 status += MXL_ControlWrite(fe, EN_3P, 1);
2145 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2146 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002147 }
Steven Toth3935c252008-05-01 05:45:44 -03002148 } else { /* Analog Mode */
2149 if (state->IF_OUT >= 4000000UL && state->IF_OUT <= 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002150 {
Steven Toth3935c252008-05-01 05:45:44 -03002151 status += MXL_ControlWrite(fe, EN_AAF, 1);
2152 status += MXL_ControlWrite(fe, EN_3P, 1);
2153 status += MXL_ControlWrite(fe, EN_AUX_3P, 1);
2154 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002155 }
Steven Toth3935c252008-05-01 05:45:44 -03002156 if (state->IF_OUT > 5000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002157 {
Steven Toth3935c252008-05-01 05:45:44 -03002158 status += MXL_ControlWrite(fe, EN_AAF, 0);
2159 status += MXL_ControlWrite(fe, EN_3P, 0);
2160 status += MXL_ControlWrite(fe, EN_AUX_3P, 0);
2161 status += MXL_ControlWrite(fe, SEL_AAF_BAND, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002162 }
2163 }
2164
Steven Toth3935c252008-05-01 05:45:44 -03002165 /* Demod Clock Out */
2166 if (state->CLOCK_OUT)
2167 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002168 else
Steven Toth3935c252008-05-01 05:45:44 -03002169 status += MXL_ControlWrite(fe, SEQ_ENCLK16_CLK_OUT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002170
Steven Toth3935c252008-05-01 05:45:44 -03002171 if (state->DIV_OUT == 1)
2172 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 1);
2173 if (state->DIV_OUT == 0)
2174 status += MXL_ControlWrite(fe, SEQ_SEL4_16B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002175
Steven Toth3935c252008-05-01 05:45:44 -03002176 /* Crystal Control */
2177 if (state->CAPSELECT)
2178 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002179 else
Steven Toth3935c252008-05-01 05:45:44 -03002180 status += MXL_ControlWrite(fe, XTAL_CAPSELECT, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002181
Steven Toth3935c252008-05-01 05:45:44 -03002182 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
2183 status += MXL_ControlWrite(fe, IF_SEL_DBL, 1);
2184 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
2185 status += MXL_ControlWrite(fe, IF_SEL_DBL, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002186
Steven Toth3935c252008-05-01 05:45:44 -03002187 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2188 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 3);
2189 if (state->Fxtal > 22000000UL && state->Fxtal <= 32000000UL)
2190 status += MXL_ControlWrite(fe, RFSYN_R_DIV, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002191
Steven Toth3935c252008-05-01 05:45:44 -03002192 /* Misc Controls */
Steven Toth85d220d2008-05-01 05:48:14 -03002193 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog LowIF mode */
Steven Toth3935c252008-05-01 05:45:44 -03002194 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002195 else
Steven Toth3935c252008-05-01 05:45:44 -03002196 status += MXL_ControlWrite(fe, SEQ_EXTIQFSMPULSE, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002197
Steven Toth3935c252008-05-01 05:45:44 -03002198 /* status += MXL_ControlRead(fe, IF_DIVVAL, &IF_DIVVAL_Val); */
Steven Toth52c99bd2008-05-01 04:57:01 -03002199
Steven Toth3935c252008-05-01 05:45:44 -03002200 /* Set TG_R_DIV */
2201 status += MXL_ControlWrite(fe, TG_R_DIV, MXL_Ceiling(state->Fxtal, 1000000));
Steven Toth52c99bd2008-05-01 04:57:01 -03002202
Steven Toth3935c252008-05-01 05:45:44 -03002203 /* Apply Default value to BB_INITSTATE_DLPF_TUNE */
Steven Toth52c99bd2008-05-01 04:57:01 -03002204
Steven Toth3935c252008-05-01 05:45:44 -03002205 /* RSSI Control */
2206 if (state->EN_RSSI)
Steven Toth52c99bd2008-05-01 04:57:01 -03002207 {
Steven Toth3935c252008-05-01 05:45:44 -03002208 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2209 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2210 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2211 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2212
2213 /* RSSI reference point */
2214 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2215 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 3);
2216 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2217
2218 /* TOP point */
2219 status += MXL_ControlWrite(fe, RFA_FLR, 0);
2220 status += MXL_ControlWrite(fe, RFA_CEIL, 12);
Steven Toth52c99bd2008-05-01 04:57:01 -03002221 }
2222
Steven Toth3935c252008-05-01 05:45:44 -03002223 /* Modulation type bit settings
2224 * Override the control values preset
2225 */
2226 if (state->Mod_Type == MXL_DVBT) /* DVB-T Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002227 {
Steven Toth3935c252008-05-01 05:45:44 -03002228 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002229
Steven Toth3935c252008-05-01 05:45:44 -03002230 /* Enable RSSI */
2231 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2232 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2233 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2234 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2235
2236 /* RSSI reference point */
2237 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2238 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2239 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2240
2241 /* TOP point */
2242 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2243 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2244 if (state->IF_OUT <= 6280000UL) /* Low IF */
2245 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2246 else /* High IF */
2247 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002248
2249 }
Steven Toth3935c252008-05-01 05:45:44 -03002250 if (state->Mod_Type == MXL_ATSC) /* ATSC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002251 {
Steven Toth85d220d2008-05-01 05:48:14 -03002252 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002253
Steven Toth3935c252008-05-01 05:45:44 -03002254 /* Enable RSSI */
2255 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2256 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2257 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2258 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002259
Steven Toth3935c252008-05-01 05:45:44 -03002260 /* RSSI reference point */
2261 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 2);
2262 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 4);
2263 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 1);
2264
2265 /* TOP point */
2266 status += MXL_ControlWrite(fe, RFA_FLR, 2);
2267 status += MXL_ControlWrite(fe, RFA_CEIL, 13);
2268 status += MXL_ControlWrite(fe, BB_INITSTATE_DLPF_TUNE, 1);
2269 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5); /* Low Zero */
2270 if (state->IF_OUT <= 6280000UL) /* Low IF */
2271 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2272 else /* High IF */
2273 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002274 }
Steven Toth3935c252008-05-01 05:45:44 -03002275 if (state->Mod_Type == MXL_QAM) /* QAM Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002276 {
Steven Toth3935c252008-05-01 05:45:44 -03002277 state->Mode = MXL_DIGITAL_MODE;
Steven Toth52c99bd2008-05-01 04:57:01 -03002278
Steven Toth3935c252008-05-01 05:45:44 -03002279 /* state->AGC_Mode = 1; */ /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002280
Steven Toth3935c252008-05-01 05:45:44 -03002281 /* Disable RSSI */ /* change here for v2.6.5 */
2282 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2283 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2284 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2285 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002286
Steven Toth3935c252008-05-01 05:45:44 -03002287 /* RSSI reference point */
2288 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2289 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2290 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2291 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3); /* change here for v2.6.5 */
Steven Toth52c99bd2008-05-01 04:57:01 -03002292
Steven Toth3935c252008-05-01 05:45:44 -03002293 if (state->IF_OUT <= 6280000UL) /* Low IF */
2294 status += MXL_ControlWrite(fe, BB_IQSWAP, 0);
2295 else /* High IF */
2296 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002297 }
Steven Toth3935c252008-05-01 05:45:44 -03002298 if (state->Mod_Type == MXL_ANALOG_CABLE) {
2299 /* Analog Cable Mode */
Steven Toth85d220d2008-05-01 05:48:14 -03002300 /* state->Mode = MXL_DIGITAL_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002301
Steven Toth3935c252008-05-01 05:45:44 -03002302 state->AGC_Mode = 1; /* Single AGC Mode */
Steven Toth52c99bd2008-05-01 04:57:01 -03002303
Steven Toth3935c252008-05-01 05:45:44 -03002304 /* Disable RSSI */
2305 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2306 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2307 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2308 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
2309 status += MXL_ControlWrite(fe, AGC_IF, 1); /* change for 2.6.3 */
2310 status += MXL_ControlWrite(fe, AGC_RF, 15);
2311 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002312 }
2313
Steven Toth3935c252008-05-01 05:45:44 -03002314 if (state->Mod_Type == MXL_ANALOG_OTA) {
2315 /* Analog OTA Terrestrial mode add for 2.6.7 */
2316 /* state->Mode = MXL_ANALOG_MODE; */
Steven Toth52c99bd2008-05-01 04:57:01 -03002317
Steven Toth3935c252008-05-01 05:45:44 -03002318 /* Enable RSSI */
2319 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2320 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2321 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1);
2322 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002323
Steven Toth3935c252008-05-01 05:45:44 -03002324 /* RSSI reference point */
2325 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5);
2326 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3);
2327 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2);
2328 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3);
2329 status += MXL_ControlWrite(fe, BB_IQSWAP, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002330 }
2331
Steven Toth3935c252008-05-01 05:45:44 -03002332 /* RSSI disable */
2333 if(state->EN_RSSI==0) {
2334 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1);
2335 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1);
2336 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0);
2337 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002338 }
2339
Steven Toth3935c252008-05-01 05:45:44 -03002340 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03002341}
2342
2343///////////////////////////////////////////////////////////////////////////////
2344// //
2345// Function: MXL_IFSynthInit //
2346// //
2347// Description: Tuner IF Synthesizer related register initialization //
2348// //
2349// Globals: //
2350// NONE //
2351// //
2352// Functions used: //
2353// Tuner_struct: structure defined at higher level //
2354// //
2355// Inputs: //
2356// Tuner : Tuner structure defined at higher level //
2357// //
2358// Outputs: //
2359// Tuner //
2360// //
2361// Return: //
2362// 0 : Successful //
2363// > 0 : Failed //
2364// //
2365///////////////////////////////////////////////////////////////////////////////
Steven Toth85d220d2008-05-01 05:48:14 -03002366u16 MXL_IFSynthInit(struct dvb_frontend *fe)
Steven Toth52c99bd2008-05-01 04:57:01 -03002367{
Steven Toth85d220d2008-05-01 05:48:14 -03002368 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03002369 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002370 // Declare Local Variables
Steven Totha8214d42008-05-01 05:02:58 -03002371 u32 Fref = 0 ;
2372 u32 Kdbl, intModVal ;
2373 u32 fracModVal ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002374 Kdbl = 2 ;
2375
Steven Toth3935c252008-05-01 05:45:44 -03002376 if (state->Fxtal >= 12000000UL && state->Fxtal <= 16000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002377 Kdbl = 2 ;
Steven Toth3935c252008-05-01 05:45:44 -03002378 if (state->Fxtal > 16000000UL && state->Fxtal <= 32000000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002379 Kdbl = 1 ;
2380
2381 //
2382 // IF Synthesizer Control
2383 //
Steven Toth85d220d2008-05-01 05:48:14 -03002384 if (state->Mode == 0 && state->IF_Mode == 1) // Analog Low IF mode
Steven Toth52c99bd2008-05-01 04:57:01 -03002385 {
Steven Toth85d220d2008-05-01 05:48:14 -03002386 if (state->IF_LO == 41000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002387 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2388 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002389 Fref = 328000000UL ;
2390 }
Steven Toth85d220d2008-05-01 05:48:14 -03002391 if (state->IF_LO == 47000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002392 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2393 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002394 Fref = 376000000UL ;
2395 }
Steven Toth85d220d2008-05-01 05:48:14 -03002396 if (state->IF_LO == 54000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002397 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2398 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002399 Fref = 324000000UL ;
2400 }
Steven Toth85d220d2008-05-01 05:48:14 -03002401 if (state->IF_LO == 60000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002402 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2403 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002404 Fref = 360000000UL ;
2405 }
Steven Toth85d220d2008-05-01 05:48:14 -03002406 if (state->IF_LO == 39250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002407 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2408 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002409 Fref = 314000000UL ;
2410 }
Steven Toth85d220d2008-05-01 05:48:14 -03002411 if (state->IF_LO == 39650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002412 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2413 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002414 Fref = 317200000UL ;
2415 }
Steven Toth85d220d2008-05-01 05:48:14 -03002416 if (state->IF_LO == 40150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002417 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2418 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002419 Fref = 321200000UL ;
2420 }
Steven Toth85d220d2008-05-01 05:48:14 -03002421 if (state->IF_LO == 40650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002422 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2423 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002424 Fref = 325200000UL ;
2425 }
2426 }
2427
Steven Toth85d220d2008-05-01 05:48:14 -03002428 if (state->Mode || (state->Mode == 0 && state->IF_Mode == 0))
Steven Toth52c99bd2008-05-01 04:57:01 -03002429 {
Steven Toth85d220d2008-05-01 05:48:14 -03002430 if (state->IF_LO == 57000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002431 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2432 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002433 Fref = 342000000UL ;
2434 }
Steven Toth85d220d2008-05-01 05:48:14 -03002435 if (state->IF_LO == 44000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002436 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2437 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002438 Fref = 352000000UL ;
2439 }
Steven Toth85d220d2008-05-01 05:48:14 -03002440 if (state->IF_LO == 43750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002441 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2442 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002443 Fref = 350000000UL ;
2444 }
Steven Toth85d220d2008-05-01 05:48:14 -03002445 if (state->IF_LO == 36650000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002446 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2447 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002448 Fref = 366500000UL ;
2449 }
Steven Toth85d220d2008-05-01 05:48:14 -03002450 if (state->IF_LO == 36150000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002451 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2452 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002453 Fref = 361500000UL ;
2454 }
Steven Toth85d220d2008-05-01 05:48:14 -03002455 if (state->IF_LO == 36000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002456 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2457 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002458 Fref = 360000000UL ;
2459 }
Steven Toth85d220d2008-05-01 05:48:14 -03002460 if (state->IF_LO == 35250000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002461 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2462 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002463 Fref = 352500000UL ;
2464 }
Steven Toth85d220d2008-05-01 05:48:14 -03002465 if (state->IF_LO == 34750000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002466 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2467 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002468 Fref = 347500000UL ;
2469 }
Steven Toth85d220d2008-05-01 05:48:14 -03002470 if (state->IF_LO == 6280000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002471 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2472 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002473 Fref = 376800000UL ;
2474 }
Steven Toth85d220d2008-05-01 05:48:14 -03002475 if (state->IF_LO == 5000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002476 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2477 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002478 Fref = 360000000UL ;
2479 }
Steven Toth85d220d2008-05-01 05:48:14 -03002480 if (state->IF_LO == 4500000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002481 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2482 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002483 Fref = 360000000UL ;
2484 }
Steven Toth85d220d2008-05-01 05:48:14 -03002485 if (state->IF_LO == 4570000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002486 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2487 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002488 Fref = 365600000UL ;
2489 }
Steven Toth85d220d2008-05-01 05:48:14 -03002490 if (state->IF_LO == 4000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002491 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2492 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002493 Fref = 360000000UL ;
2494 }
Steven Toth85d220d2008-05-01 05:48:14 -03002495 if (state->IF_LO == 57400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002496 {
Steven Toth3935c252008-05-01 05:45:44 -03002497 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x10) ;
2498 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002499 Fref = 344400000UL ;
2500 }
Steven Toth85d220d2008-05-01 05:48:14 -03002501 if (state->IF_LO == 44400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002502 {
Steven Toth3935c252008-05-01 05:45:44 -03002503 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2504 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002505 Fref = 355200000UL ;
2506 }
Steven Toth85d220d2008-05-01 05:48:14 -03002507 if (state->IF_LO == 44150000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002508 {
Steven Toth3935c252008-05-01 05:45:44 -03002509 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x08) ;
2510 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002511 Fref = 353200000UL ;
2512 }
Steven Toth85d220d2008-05-01 05:48:14 -03002513 if (state->IF_LO == 37050000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002514 {
Steven Toth3935c252008-05-01 05:45:44 -03002515 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2516 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002517 Fref = 370500000UL ;
2518 }
Steven Toth85d220d2008-05-01 05:48:14 -03002519 if (state->IF_LO == 36550000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002520 {
Steven Toth3935c252008-05-01 05:45:44 -03002521 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2522 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002523 Fref = 365500000UL ;
2524 }
Steven Toth85d220d2008-05-01 05:48:14 -03002525 if (state->IF_LO == 36125000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002526 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x04) ;
2527 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002528 Fref = 361250000UL ;
2529 }
Steven Toth85d220d2008-05-01 05:48:14 -03002530 if (state->IF_LO == 6000000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002531 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2532 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002533 Fref = 360000000UL ;
2534 }
Steven Toth85d220d2008-05-01 05:48:14 -03002535 if (state->IF_LO == 5400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002536 {
Steven Toth3935c252008-05-01 05:45:44 -03002537 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2538 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002539 Fref = 324000000UL ;
2540 }
Steven Toth85d220d2008-05-01 05:48:14 -03002541 if (state->IF_LO == 5380000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002542 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x07) ;
2543 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x0C) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002544 Fref = 322800000UL ;
2545 }
Steven Toth85d220d2008-05-01 05:48:14 -03002546 if (state->IF_LO == 5200000UL) {
Steven Toth3935c252008-05-01 05:45:44 -03002547 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2548 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002549 Fref = 374400000UL ;
2550 }
Steven Toth85d220d2008-05-01 05:48:14 -03002551 if (state->IF_LO == 4900000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002552 {
Steven Toth3935c252008-05-01 05:45:44 -03002553 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x09) ;
2554 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002555 Fref = 352800000UL ;
2556 }
Steven Toth85d220d2008-05-01 05:48:14 -03002557 if (state->IF_LO == 4400000UL)
Steven Toth52c99bd2008-05-01 04:57:01 -03002558 {
Steven Toth3935c252008-05-01 05:45:44 -03002559 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x06) ;
2560 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002561 Fref = 352000000UL ;
2562 }
Steven Toth85d220d2008-05-01 05:48:14 -03002563 if (state->IF_LO == 4063000UL) //add for 2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03002564 {
Steven Toth3935c252008-05-01 05:45:44 -03002565 status += MXL_ControlWrite(fe, IF_DIVVAL, 0x05) ;
2566 status += MXL_ControlWrite(fe, IF_VCO_BIAS, 0x08) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002567 Fref = 365670000UL ;
2568 }
2569 }
2570 // CHCAL_INT_MOD_IF
2571 // CHCAL_FRAC_MOD_IF
Steven Toth3935c252008-05-01 05:45:44 -03002572 intModVal = Fref / (state->Fxtal * Kdbl/2) ;
2573 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_IF, intModVal ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002574
Steven Toth3935c252008-05-01 05:45:44 -03002575 fracModVal = (2<<15)*(Fref/1000 - (state->Fxtal/1000 * Kdbl/2) * intModVal);
2576 fracModVal = fracModVal / ((state->Fxtal * Kdbl/2)/1000) ;
2577 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_IF, fracModVal) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002578
Steven Toth52c99bd2008-05-01 04:57:01 -03002579 return status ;
2580}
2581
2582///////////////////////////////////////////////////////////////////////////////
2583// //
2584// Function: MXL_GetXtalInt //
2585// //
Steven Totha8214d42008-05-01 05:02:58 -03002586// Description: return the Crystal Integration Value for //
2587// TG_VCO_BIAS calculation //
Steven Toth52c99bd2008-05-01 04:57:01 -03002588// //
2589// Globals: //
2590// NONE //
2591// //
2592// Functions used: //
Steven Totha8214d42008-05-01 05:02:58 -03002593// NONE //
Steven Toth52c99bd2008-05-01 04:57:01 -03002594// //
2595// Inputs: //
2596// Crystal Frequency Value in Hz //
2597// //
2598// Outputs: //
2599// Calculated Crystal Frequency Integration Value //
2600// //
2601// Return: //
2602// 0 : Successful //
2603// > 0 : Failed //
2604// //
2605///////////////////////////////////////////////////////////////////////////////
Steven Totha8214d42008-05-01 05:02:58 -03002606u32 MXL_GetXtalInt(u32 Xtal_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002607{
2608 if ((Xtal_Freq % 1000000) == 0)
2609 return (Xtal_Freq / 10000) ;
2610 else
2611 return (((Xtal_Freq / 1000000) + 1)*100) ;
2612}
2613
2614///////////////////////////////////////////////////////////////////////////////
2615// //
2616// Function: MXL5005_TuneRF //
2617// //
2618// Description: Set control names to tune to requested RF_IN frequency //
2619// //
2620// Globals: //
2621// None //
2622// //
2623// Functions used: //
2624// MXL_SynthRFTGLO_Calc //
2625// MXL5005_ControlWrite //
Steven Toth3935c252008-05-01 05:45:44 -03002626// MXL_GetXtalInt //
Steven Toth52c99bd2008-05-01 04:57:01 -03002627// //
2628// Inputs: //
2629// Tuner : Tuner structure defined at higher level //
2630// //
2631// Outputs: //
2632// Tuner //
2633// //
2634// Return: //
2635// 0 : Successful //
2636// 1 : Unsuccessful //
2637///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03002638u16 MXL_TuneRF(struct dvb_frontend *fe, u32 RF_Freq)
Steven Toth52c99bd2008-05-01 04:57:01 -03002639{
Steven Toth85d220d2008-05-01 05:48:14 -03002640 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03002641 // Declare Local Variables
Steven Toth3935c252008-05-01 05:45:44 -03002642 u16 status = 0;
2643 u32 divider_val, E3, E4, E5, E5A;
2644 u32 Fmax, Fmin, FmaxBin, FminBin;
Steven Totha8214d42008-05-01 05:02:58 -03002645 u32 Kdbl_RF = 2;
Steven Toth3935c252008-05-01 05:45:44 -03002646 u32 tg_divval;
2647 u32 tg_lo;
2648 u32 Xtal_Int;
Steven Toth52c99bd2008-05-01 04:57:01 -03002649
Steven Totha8214d42008-05-01 05:02:58 -03002650 u32 Fref_TG;
2651 u32 Fvco;
2652// u32 temp;
Steven Toth52c99bd2008-05-01 04:57:01 -03002653
2654
Steven Toth3935c252008-05-01 05:45:44 -03002655 Xtal_Int = MXL_GetXtalInt(state->Fxtal);
Steven Toth52c99bd2008-05-01 04:57:01 -03002656
Steven Toth3935c252008-05-01 05:45:44 -03002657 state->RF_IN = RF_Freq;
Steven Toth52c99bd2008-05-01 04:57:01 -03002658
Steven Toth3935c252008-05-01 05:45:44 -03002659 MXL_SynthRFTGLO_Calc(fe);
Steven Toth52c99bd2008-05-01 04:57:01 -03002660
Steven Toth3935c252008-05-01 05:45:44 -03002661 if (state->Fxtal >= 12000000UL && state->Fxtal <= 22000000UL)
2662 Kdbl_RF = 2;
2663 if (state->Fxtal > 22000000 && state->Fxtal <= 32000000)
2664 Kdbl_RF = 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03002665
2666 //
2667 // Downconverter Controls
2668 //
2669 // Look-Up Table Implementation for:
2670 // DN_POLY
2671 // DN_RFGAIN
2672 // DN_CAP_RFLPF
2673 // DN_EN_VHFUHFBAR
2674 // DN_GAIN_ADJUST
2675 // Change the boundary reference from RF_IN to RF_LO
Steven Toth3935c252008-05-01 05:45:44 -03002676 if (state->RF_LO < 40000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002677 return -1;
2678 }
Steven Toth3935c252008-05-01 05:45:44 -03002679 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002680 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002681 status += MXL_ControlWrite(fe, DN_POLY, 2);
2682 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2683 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 423);
2684 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2685 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002686 }
Steven Toth3935c252008-05-01 05:45:44 -03002687 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002688 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002689 status += MXL_ControlWrite(fe, DN_POLY, 3);
2690 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2691 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 222);
2692 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2693 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002694 }
Steven Toth3935c252008-05-01 05:45:44 -03002695 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002696 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002697 status += MXL_ControlWrite(fe, DN_POLY, 3);
2698 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2699 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 147);
2700 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2701 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002702 }
Steven Toth3935c252008-05-01 05:45:44 -03002703 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002704 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002705 status += MXL_ControlWrite(fe, DN_POLY, 3);
2706 status += MXL_ControlWrite(fe, DN_RFGAIN, 3);
2707 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 9);
2708 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1);
2709 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 2);
Steven Toth52c99bd2008-05-01 04:57:01 -03002710 }
Steven Toth3935c252008-05-01 05:45:44 -03002711 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002712 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002713 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2714 status += MXL_ControlWrite(fe, DN_RFGAIN, 3) ;
2715 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2716 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 1) ;
2717 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002718 }
Steven Toth3935c252008-05-01 05:45:44 -03002719 if (state->RF_LO > 300000000UL && state->RF_LO <= 650000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002720 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002721 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2722 status += MXL_ControlWrite(fe, DN_RFGAIN, 1) ;
2723 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2724 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2725 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002726 }
Steven Toth3935c252008-05-01 05:45:44 -03002727 if (state->RF_LO > 650000000UL && state->RF_LO <= 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002728 // Look-Up Table implementation
Steven Toth3935c252008-05-01 05:45:44 -03002729 status += MXL_ControlWrite(fe, DN_POLY, 3) ;
2730 status += MXL_ControlWrite(fe, DN_RFGAIN, 2) ;
2731 status += MXL_ControlWrite(fe, DN_CAP_RFLPF, 0) ;
2732 status += MXL_ControlWrite(fe, DN_EN_VHFUHFBAR, 0) ;
2733 status += MXL_ControlWrite(fe, DN_GAIN_ADJUST, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002734 }
Steven Toth3935c252008-05-01 05:45:44 -03002735 if (state->RF_LO > 900000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03002736 return -1;
2737 }
2738 // DN_IQTNBUF_AMP
2739 // DN_IQTNGNBFBIAS_BST
Steven Toth3935c252008-05-01 05:45:44 -03002740 if (state->RF_LO >= 40000000UL && state->RF_LO <= 75000000UL) {
2741 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2742 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002743 }
Steven Toth3935c252008-05-01 05:45:44 -03002744 if (state->RF_LO > 75000000UL && state->RF_LO <= 100000000UL) {
2745 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2746 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002747 }
Steven Toth3935c252008-05-01 05:45:44 -03002748 if (state->RF_LO > 100000000UL && state->RF_LO <= 150000000UL) {
2749 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2750 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002751 }
Steven Toth3935c252008-05-01 05:45:44 -03002752 if (state->RF_LO > 150000000UL && state->RF_LO <= 200000000UL) {
2753 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2754 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002755 }
Steven Toth3935c252008-05-01 05:45:44 -03002756 if (state->RF_LO > 200000000UL && state->RF_LO <= 300000000UL) {
2757 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2758 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002759 }
Steven Toth3935c252008-05-01 05:45:44 -03002760 if (state->RF_LO > 300000000UL && state->RF_LO <= 400000000UL) {
2761 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2762 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002763 }
Steven Toth3935c252008-05-01 05:45:44 -03002764 if (state->RF_LO > 400000000UL && state->RF_LO <= 450000000UL) {
2765 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2766 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002767 }
Steven Toth3935c252008-05-01 05:45:44 -03002768 if (state->RF_LO > 450000000UL && state->RF_LO <= 500000000UL) {
2769 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2770 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002771 }
Steven Toth3935c252008-05-01 05:45:44 -03002772 if (state->RF_LO > 500000000UL && state->RF_LO <= 550000000UL) {
2773 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2774 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002775 }
Steven Toth3935c252008-05-01 05:45:44 -03002776 if (state->RF_LO > 550000000UL && state->RF_LO <= 600000000UL) {
2777 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2778 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002779 }
Steven Toth3935c252008-05-01 05:45:44 -03002780 if (state->RF_LO > 600000000UL && state->RF_LO <= 650000000UL) {
2781 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2782 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002783 }
Steven Toth3935c252008-05-01 05:45:44 -03002784 if (state->RF_LO > 650000000UL && state->RF_LO <= 700000000UL) {
2785 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2786 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002787 }
Steven Toth3935c252008-05-01 05:45:44 -03002788 if (state->RF_LO > 700000000UL && state->RF_LO <= 750000000UL) {
2789 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2790 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002791 }
Steven Toth3935c252008-05-01 05:45:44 -03002792 if (state->RF_LO > 750000000UL && state->RF_LO <= 800000000UL) {
2793 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 1);
2794 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03002795 }
Steven Toth3935c252008-05-01 05:45:44 -03002796 if (state->RF_LO > 800000000UL && state->RF_LO <= 850000000UL) {
2797 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2798 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002799 }
Steven Toth3935c252008-05-01 05:45:44 -03002800 if (state->RF_LO > 850000000UL && state->RF_LO <= 900000000UL) {
2801 status += MXL_ControlWrite(fe, DN_IQTNBUF_AMP, 10);
2802 status += MXL_ControlWrite(fe, DN_IQTNGNBFBIAS_BST, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002803 }
2804
2805 //
2806 // Set RF Synth and LO Path Control
2807 //
2808 // Look-Up table implementation for:
2809 // RFSYN_EN_OUTMUX
2810 // RFSYN_SEL_VCO_OUT
2811 // RFSYN_SEL_VCO_HI
2812 // RFSYN_SEL_DIVM
2813 // RFSYN_RF_DIV_BIAS
2814 // DN_SEL_FREQ
2815 //
2816 // Set divider_val, Fmax, Fmix to use in Equations
2817 FminBin = 28000000UL ;
2818 FmaxBin = 42500000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002819 if (state->RF_LO >= 40000000UL && state->RF_LO <= FmaxBin) {
2820 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2821 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2822 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
2823 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2824 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2825 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002826 divider_val = 64 ;
2827 Fmax = FmaxBin ;
2828 Fmin = FminBin ;
2829 }
2830 FminBin = 42500000UL ;
2831 FmaxBin = 56000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002832 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2833 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1);
2834 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0);
2835 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
2836 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
2837 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
2838 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002839 divider_val = 64 ;
2840 Fmax = FmaxBin ;
2841 Fmin = FminBin ;
2842 }
2843 FminBin = 56000000UL ;
2844 FmaxBin = 85000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002845 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2846 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2847 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2848 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2849 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2850 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2851 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002852 divider_val = 32 ;
2853 Fmax = FmaxBin ;
2854 Fmin = FminBin ;
2855 }
2856 FminBin = 85000000UL ;
2857 FmaxBin = 112000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002858 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2859 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2860 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2861 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2862 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2863 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2864 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002865 divider_val = 32 ;
2866 Fmax = FmaxBin ;
2867 Fmin = FminBin ;
2868 }
2869 FminBin = 112000000UL ;
2870 FmaxBin = 170000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002871 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2872 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2873 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2874 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2875 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2876 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2877 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002878 divider_val = 16 ;
2879 Fmax = FmaxBin ;
2880 Fmin = FminBin ;
2881 }
2882 FminBin = 170000000UL ;
2883 FmaxBin = 225000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002884 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2885 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2886 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2887 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2888 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2889 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2890 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002891 divider_val = 16 ;
2892 Fmax = FmaxBin ;
2893 Fmin = FminBin ;
2894 }
2895 FminBin = 225000000UL ;
2896 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002897 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2898 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2899 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2900 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2901 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2902 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2903 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002904 divider_val = 8 ;
2905 Fmax = 340000000UL ;
2906 Fmin = FminBin ;
2907 }
2908 FminBin = 300000000UL ;
2909 FmaxBin = 340000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002910 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2911 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2912 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2913 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2914 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2915 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2916 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002917 divider_val = 8 ;
2918 Fmax = FmaxBin ;
2919 Fmin = 225000000UL ;
2920 }
2921 FminBin = 340000000UL ;
2922 FmaxBin = 450000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002923 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2924 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 1) ;
2925 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 0) ;
2926 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2927 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0) ;
2928 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 2) ;
2929 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002930 divider_val = 8 ;
2931 Fmax = FmaxBin ;
2932 Fmin = FminBin ;
2933 }
2934 FminBin = 450000000UL ;
2935 FmaxBin = 680000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002936 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2937 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2938 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2939 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0) ;
2940 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2941 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2942 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002943 divider_val = 4 ;
2944 Fmax = FmaxBin ;
2945 Fmin = FminBin ;
2946 }
2947 FminBin = 680000000UL ;
2948 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03002949 if (state->RF_LO > FminBin && state->RF_LO <= FmaxBin) {
2950 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0) ;
2951 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1) ;
2952 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1) ;
2953 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 1) ;
2954 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1) ;
2955 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002956 divider_val = 4 ;
2957 Fmax = FmaxBin ;
2958 Fmin = FminBin ;
2959 }
2960
2961 // CHCAL_INT_MOD_RF
2962 // CHCAL_FRAC_MOD_RF
2963 // RFSYN_LPF_R
2964 // CHCAL_EN_INT_RF
2965
2966 // Equation E3
2967 // RFSYN_VCO_BIAS
Steven Toth3935c252008-05-01 05:45:44 -03002968 E3 = (((Fmax-state->RF_LO)/1000)*32)/((Fmax-Fmin)/1000) + 8 ;
2969 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, E3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002970
2971 // Equation E4
2972 // CHCAL_INT_MOD_RF
Steven Toth3935c252008-05-01 05:45:44 -03002973 E4 = (state->RF_LO*divider_val/1000)/(2*state->Fxtal*Kdbl_RF/1000) ;
2974 MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, E4) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002975
2976 // Equation E5
2977 // CHCAL_FRAC_MOD_RF
2978 // CHCAL_EN_INT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002979 E5 = ((2<<17)*(state->RF_LO/10000*divider_val - (E4*(2*state->Fxtal*Kdbl_RF)/10000)))/(2*state->Fxtal*Kdbl_RF/10000) ;
2980 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002981
2982 // Equation E5A
2983 // RFSYN_LPF_R
Steven Toth3935c252008-05-01 05:45:44 -03002984 E5A = (((Fmax - state->RF_LO)/1000)*4/((Fmax-Fmin)/1000)) + 1 ;
2985 status += MXL_ControlWrite(fe, RFSYN_LPF_R, E5A) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002986
2987 // Euqation E5B
2988 // CHCAL_EN_INIT_RF
Steven Toth3935c252008-05-01 05:45:44 -03002989 status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, ((E5 == 0) ? 1 : 0));
Steven Toth52c99bd2008-05-01 04:57:01 -03002990 //if (E5 == 0)
Steven Toth3935c252008-05-01 05:45:44 -03002991 // status += MXL_ControlWrite(fe, CHCAL_EN_INT_RF, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03002992 //else
Steven Toth3935c252008-05-01 05:45:44 -03002993 // status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, E5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03002994
2995 //
2996 // Set TG Synth
2997 //
2998 // Look-Up table implementation for:
2999 // TG_LO_DIVVAL
3000 // TG_LO_SELVAL
3001 //
3002 // Set divider_val, Fmax, Fmix to use in Equations
Steven Toth3935c252008-05-01 05:45:44 -03003003 if (state->TG_LO < 33000000UL) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003004 return -1;
3005 }
3006 FminBin = 33000000UL ;
3007 FmaxBin = 50000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003008 if (state->TG_LO >= FminBin && state->TG_LO <= FmaxBin) {
3009 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x6) ;
3010 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003011 divider_val = 36 ;
3012 Fmax = FmaxBin ;
3013 Fmin = FminBin ;
3014 }
3015 FminBin = 50000000UL ;
3016 FmaxBin = 67000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003017 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3018 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x1) ;
3019 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003020 divider_val = 24 ;
3021 Fmax = FmaxBin ;
3022 Fmin = FminBin ;
3023 }
3024 FminBin = 67000000UL ;
3025 FmaxBin = 100000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003026 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3027 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0xC) ;
3028 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003029 divider_val = 18 ;
3030 Fmax = FmaxBin ;
3031 Fmin = FminBin ;
3032 }
3033 FminBin = 100000000UL ;
3034 FmaxBin = 150000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003035 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3036 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3037 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003038 divider_val = 12 ;
3039 Fmax = FmaxBin ;
3040 Fmin = FminBin ;
3041 }
3042 FminBin = 150000000UL ;
3043 FmaxBin = 200000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003044 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3045 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3046 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003047 divider_val = 8 ;
3048 Fmax = FmaxBin ;
3049 Fmin = FminBin ;
3050 }
3051 FminBin = 200000000UL ;
3052 FmaxBin = 300000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003053 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3054 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3055 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003056 divider_val = 6 ;
3057 Fmax = FmaxBin ;
3058 Fmin = FminBin ;
3059 }
3060 FminBin = 300000000UL ;
3061 FmaxBin = 400000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003062 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3063 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3064 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003065 divider_val = 4 ;
3066 Fmax = FmaxBin ;
3067 Fmin = FminBin ;
3068 }
3069 FminBin = 400000000UL ;
3070 FmaxBin = 600000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003071 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3072 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x8) ;
3073 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003074 divider_val = 3 ;
3075 Fmax = FmaxBin ;
3076 Fmin = FminBin ;
3077 }
3078 FminBin = 600000000UL ;
3079 FmaxBin = 900000000UL ;
Steven Toth3935c252008-05-01 05:45:44 -03003080 if (state->TG_LO > FminBin && state->TG_LO <= FmaxBin) {
3081 status += MXL_ControlWrite(fe, TG_LO_DIVVAL, 0x0) ;
3082 status += MXL_ControlWrite(fe, TG_LO_SELVAL, 0x7) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003083 divider_val = 2 ;
3084 Fmax = FmaxBin ;
3085 Fmin = FminBin ;
3086 }
3087
3088 // TG_DIV_VAL
Steven Toth3935c252008-05-01 05:45:44 -03003089 tg_divval = (state->TG_LO*divider_val/100000)
3090 *(MXL_Ceiling(state->Fxtal,1000000) * 100) / (state->Fxtal/1000) ;
3091 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003092
Steven Toth3935c252008-05-01 05:45:44 -03003093 if (state->TG_LO > 600000000UL)
3094 status += MXL_ControlWrite(fe, TG_DIV_VAL, tg_divval + 1 ) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003095
3096 Fmax = 1800000000UL ;
3097 Fmin = 1200000000UL ;
3098
3099
3100
3101 // to prevent overflow of 32 bit unsigned integer, use following equation. Edit for v2.6.4
Steven Toth3935c252008-05-01 05:45:44 -03003102 Fref_TG = (state->Fxtal/1000)/ MXL_Ceiling(state->Fxtal, 1000000) ; // Fref_TF = Fref_TG*1000
Steven Toth52c99bd2008-05-01 04:57:01 -03003103
Steven Toth3935c252008-05-01 05:45:44 -03003104 Fvco = (state->TG_LO/10000) * divider_val * Fref_TG; //Fvco = Fvco/10
Steven Toth52c99bd2008-05-01 04:57:01 -03003105
3106 tg_lo = (((Fmax/10 - Fvco)/100)*32) / ((Fmax-Fmin)/1000)+8;
3107
3108 //below equation is same as above but much harder to debug.
Steven Toth3935c252008-05-01 05:45:44 -03003109 //tg_lo = ( ((Fmax/10000 * Xtal_Int)/100) - ((state->TG_LO/10000)*divider_val*(state->Fxtal/10000)/100) )*32/((Fmax-Fmin)/10000 * Xtal_Int/100) + 8 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003110
3111
Steven Toth3935c252008-05-01 05:45:44 -03003112 status += MXL_ControlWrite(fe, TG_VCO_BIAS , tg_lo) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003113
3114
3115
3116 //add for 2.6.5
3117 //Special setting for QAM
Steven Toth3935c252008-05-01 05:45:44 -03003118 if(state->Mod_Type == MXL_QAM)
Steven Toth52c99bd2008-05-01 04:57:01 -03003119 {
Steven Toth3935c252008-05-01 05:45:44 -03003120 if(state->RF_IN < 680000000)
3121 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003122 else
Steven Toth3935c252008-05-01 05:45:44 -03003123 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003124 }
3125
3126
3127 //remove 20.48MHz setting for 2.6.10
3128
3129 //
3130 // Off Chip Tracking Filter Control
3131 //
Steven Toth85d220d2008-05-01 05:48:14 -03003132 if (state->TF_Type == MXL_TF_OFF) // Tracking Filter Off State; turn off all the banks
Steven Toth52c99bd2008-05-01 04:57:01 -03003133 {
Steven Toth3935c252008-05-01 05:45:44 -03003134 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
3135 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003136
Steven Toth3935c252008-05-01 05:45:44 -03003137 status += MXL_SetGPIO(fe, 3, 1) ; // turn off Bank 1
3138 status += MXL_SetGPIO(fe, 1, 1) ; // turn off Bank 2
3139 status += MXL_SetGPIO(fe, 4, 1) ; // turn off Bank 3
Steven Toth52c99bd2008-05-01 04:57:01 -03003140 }
3141
Steven Toth85d220d2008-05-01 05:48:14 -03003142 if (state->TF_Type == MXL_TF_C) // Tracking Filter type C
Steven Toth52c99bd2008-05-01 04:57:01 -03003143 {
Steven Toth3935c252008-05-01 05:45:44 -03003144 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ;
3145 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003146
Steven Toth3935c252008-05-01 05:45:44 -03003147 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003148 {
3149
Steven Toth3935c252008-05-01 05:45:44 -03003150 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3151 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3152 status += MXL_SetGPIO(fe, 3, 0) ; // Bank1 On
3153 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3154 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003155 }
Steven Toth3935c252008-05-01 05:45:44 -03003156 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003157 {
Steven Toth3935c252008-05-01 05:45:44 -03003158 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3159 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3160 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3161 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3162 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003163 }
Steven Toth3935c252008-05-01 05:45:44 -03003164 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003165 {
Steven Toth3935c252008-05-01 05:45:44 -03003166 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3167 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3168 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3169 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3170 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003171 }
Steven Toth3935c252008-05-01 05:45:44 -03003172 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003173 {
Steven Toth3935c252008-05-01 05:45:44 -03003174 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3175 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3176 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3177 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3178 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003179 }
Steven Toth3935c252008-05-01 05:45:44 -03003180 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003181 {
Steven Toth3935c252008-05-01 05:45:44 -03003182 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3183 status += MXL_ControlWrite(fe, DAC_DIN_B, 29) ;
3184 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3185 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3186 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003187 }
Steven Toth3935c252008-05-01 05:45:44 -03003188 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003189 {
Steven Toth3935c252008-05-01 05:45:44 -03003190 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3191 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3192 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3193 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3194 status += MXL_SetGPIO(fe, 4, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003195 }
Steven Toth3935c252008-05-01 05:45:44 -03003196 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003197 {
Steven Toth3935c252008-05-01 05:45:44 -03003198 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3199 status += MXL_ControlWrite(fe, DAC_DIN_B, 16) ;
3200 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3201 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3202 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003203 }
Steven Toth3935c252008-05-01 05:45:44 -03003204 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003205 {
Steven Toth3935c252008-05-01 05:45:44 -03003206 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3207 status += MXL_ControlWrite(fe, DAC_DIN_B, 7) ;
3208 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3209 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3210 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003211 }
Steven Toth3935c252008-05-01 05:45:44 -03003212 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003213 {
Steven Toth3935c252008-05-01 05:45:44 -03003214 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3215 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
3216 status += MXL_SetGPIO(fe, 3, 1) ; // Bank1 Off
3217 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3218 status += MXL_SetGPIO(fe, 4, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003219 }
3220 }
3221
Steven Toth85d220d2008-05-01 05:48:14 -03003222 if (state->TF_Type == MXL_TF_C_H) // Tracking Filter type C-H for Hauppauge only
Steven Toth52c99bd2008-05-01 04:57:01 -03003223 {
Steven Toth3935c252008-05-01 05:45:44 -03003224 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003225
Steven Toth3935c252008-05-01 05:45:44 -03003226 if (state->RF_IN >= 43000000 && state->RF_IN < 150000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003227 {
3228
Steven Toth3935c252008-05-01 05:45:44 -03003229 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3230 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3231 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3232 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003233 }
Steven Toth3935c252008-05-01 05:45:44 -03003234 if (state->RF_IN >= 150000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003235 {
Steven Toth3935c252008-05-01 05:45:44 -03003236 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3237 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3238 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3239 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003240 }
Steven Toth3935c252008-05-01 05:45:44 -03003241 if (state->RF_IN >= 280000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003242 {
Steven Toth3935c252008-05-01 05:45:44 -03003243 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3244 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3245 status += MXL_SetGPIO(fe, 3, 0) ; // Bank2 On
3246 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003247 }
Steven Toth3935c252008-05-01 05:45:44 -03003248 if (state->RF_IN >= 360000000 && state->RF_IN < 560000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003249 {
Steven Toth3935c252008-05-01 05:45:44 -03003250 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3251 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3252 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3253 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003254 }
Steven Toth3935c252008-05-01 05:45:44 -03003255 if (state->RF_IN >= 560000000 && state->RF_IN < 580000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003256 {
Steven Toth3935c252008-05-01 05:45:44 -03003257 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3258 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3259 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3260 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003261 }
Steven Toth3935c252008-05-01 05:45:44 -03003262 if (state->RF_IN >= 580000000 && state->RF_IN < 630000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003263 {
Steven Toth3935c252008-05-01 05:45:44 -03003264 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3265 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3266 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3267 status += MXL_SetGPIO(fe, 1, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003268 }
Steven Toth3935c252008-05-01 05:45:44 -03003269 if (state->RF_IN >= 630000000 && state->RF_IN < 700000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003270 {
Steven Toth3935c252008-05-01 05:45:44 -03003271 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3272 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3273 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3274 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003275 }
Steven Toth3935c252008-05-01 05:45:44 -03003276 if (state->RF_IN >= 700000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003277 {
Steven Toth3935c252008-05-01 05:45:44 -03003278 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3279 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3280 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3281 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003282 }
Steven Toth3935c252008-05-01 05:45:44 -03003283 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003284 {
Steven Toth3935c252008-05-01 05:45:44 -03003285 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3286 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3287 status += MXL_SetGPIO(fe, 3, 1) ; // Bank2 Off
3288 status += MXL_SetGPIO(fe, 1, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003289 }
3290 }
3291
Steven Toth85d220d2008-05-01 05:48:14 -03003292 if (state->TF_Type == MXL_TF_D) // Tracking Filter type D
Steven Toth52c99bd2008-05-01 04:57:01 -03003293 {
Steven Toth3935c252008-05-01 05:45:44 -03003294 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003295
Steven Toth3935c252008-05-01 05:45:44 -03003296 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003297 {
3298
Steven Toth3935c252008-05-01 05:45:44 -03003299 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3300 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3301 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3302 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003303 }
Steven Toth3935c252008-05-01 05:45:44 -03003304 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003305 {
Steven Toth3935c252008-05-01 05:45:44 -03003306 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3307 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3308 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3309 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003310 }
Steven Toth3935c252008-05-01 05:45:44 -03003311 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003312 {
Steven Toth3935c252008-05-01 05:45:44 -03003313 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3314 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3315 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3316 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003317 }
Steven Toth3935c252008-05-01 05:45:44 -03003318 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003319 {
Steven Toth3935c252008-05-01 05:45:44 -03003320 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3321 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3322 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3323 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003324 }
Steven Toth3935c252008-05-01 05:45:44 -03003325 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003326 {
Steven Toth3935c252008-05-01 05:45:44 -03003327 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3328 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3329 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3330 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003331 }
Steven Toth3935c252008-05-01 05:45:44 -03003332 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003333 {
Steven Toth3935c252008-05-01 05:45:44 -03003334 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3335 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3336 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3337 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003338 }
Steven Toth3935c252008-05-01 05:45:44 -03003339 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003340 {
Steven Toth3935c252008-05-01 05:45:44 -03003341 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3342 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3343 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3344 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003345 }
3346 }
3347
3348
Steven Toth85d220d2008-05-01 05:48:14 -03003349 if (state->TF_Type == MXL_TF_D_L) // Tracking Filter type D-L for Lumanate ONLY change for 2.6.3
Steven Toth52c99bd2008-05-01 04:57:01 -03003350 {
Steven Toth3935c252008-05-01 05:45:44 -03003351 status += MXL_ControlWrite(fe, DAC_DIN_A, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003352
Steven Totha8214d42008-05-01 05:02:58 -03003353 // if UHF and terrestrial => Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003354 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003355 {
3356 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003357 status += MXL_SetGPIO(fe, 3, 1) ;
3358 status += MXL_SetGPIO(fe, 1, 1) ;
3359 status += MXL_SetGPIO(fe, 4, 1) ;
3360 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003361
Steven Toth3935c252008-05-01 05:45:44 -03003362 status += MXL_ControlWrite(fe, AGC_IF, 10) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003363 }
3364
3365 else // if VHF or cable => Turn on Tracking Filter
3366 {
Steven Toth3935c252008-05-01 05:45:44 -03003367 if (state->RF_IN >= 43000000 && state->RF_IN < 140000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003368 {
3369
Steven Toth3935c252008-05-01 05:45:44 -03003370 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3371 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3372 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3373 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003374 }
Steven Toth3935c252008-05-01 05:45:44 -03003375 if (state->RF_IN >= 140000000 && state->RF_IN < 240000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003376 {
Steven Toth3935c252008-05-01 05:45:44 -03003377 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3378 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3379 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3380 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003381 }
Steven Toth3935c252008-05-01 05:45:44 -03003382 if (state->RF_IN >= 240000000 && state->RF_IN < 340000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003383 {
Steven Toth3935c252008-05-01 05:45:44 -03003384 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3385 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3386 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 On
3387 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003388 }
Steven Toth3935c252008-05-01 05:45:44 -03003389 if (state->RF_IN >= 340000000 && state->RF_IN < 430000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003390 {
Steven Toth3935c252008-05-01 05:45:44 -03003391 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 Off
3392 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3393 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3394 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003395 }
Steven Toth3935c252008-05-01 05:45:44 -03003396 if (state->RF_IN >= 430000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003397 {
Steven Toth3935c252008-05-01 05:45:44 -03003398 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 Off
3399 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3400 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3401 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003402 }
Steven Toth3935c252008-05-01 05:45:44 -03003403 if (state->RF_IN >= 470000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003404 {
Steven Toth3935c252008-05-01 05:45:44 -03003405 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3406 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3407 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3408 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003409 }
Steven Toth3935c252008-05-01 05:45:44 -03003410 if (state->RF_IN >= 570000000 && state->RF_IN < 620000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003411 {
Steven Toth3935c252008-05-01 05:45:44 -03003412 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 0) ; // Bank4 On
3413 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3414 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3415 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Offq
Steven Toth52c99bd2008-05-01 04:57:01 -03003416 }
Steven Toth3935c252008-05-01 05:45:44 -03003417 if (state->RF_IN >= 620000000 && state->RF_IN < 760000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003418 {
Steven Toth3935c252008-05-01 05:45:44 -03003419 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3420 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 Off
3421 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3422 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003423 }
Steven Toth3935c252008-05-01 05:45:44 -03003424 if (state->RF_IN >= 760000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003425 {
Steven Toth3935c252008-05-01 05:45:44 -03003426 status += MXL_ControlWrite(fe, DAC_A_ENABLE, 1) ; // Bank4 On
3427 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3428 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3429 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003430 }
3431 }
3432 }
3433
Steven Toth85d220d2008-05-01 05:48:14 -03003434 if (state->TF_Type == MXL_TF_E) // Tracking Filter type E
Steven Toth52c99bd2008-05-01 04:57:01 -03003435 {
Steven Toth3935c252008-05-01 05:45:44 -03003436 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003437
Steven Toth3935c252008-05-01 05:45:44 -03003438 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003439 {
3440
Steven Toth3935c252008-05-01 05:45:44 -03003441 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3442 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3443 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3444 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003445 }
Steven Toth3935c252008-05-01 05:45:44 -03003446 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003447 {
Steven Toth3935c252008-05-01 05:45:44 -03003448 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3449 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3450 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3451 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003452 }
Steven Toth3935c252008-05-01 05:45:44 -03003453 if (state->RF_IN >= 250000000 && state->RF_IN < 310000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003454 {
Steven Toth3935c252008-05-01 05:45:44 -03003455 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3456 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3457 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3458 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003459 }
Steven Toth3935c252008-05-01 05:45:44 -03003460 if (state->RF_IN >= 310000000 && state->RF_IN < 360000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003461 {
Steven Toth3935c252008-05-01 05:45:44 -03003462 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3463 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3464 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3465 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003466 }
Steven Toth3935c252008-05-01 05:45:44 -03003467 if (state->RF_IN >= 360000000 && state->RF_IN < 470000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003468 {
Steven Toth3935c252008-05-01 05:45:44 -03003469 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3470 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3471 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3472 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003473 }
Steven Toth3935c252008-05-01 05:45:44 -03003474 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003475 {
Steven Toth3935c252008-05-01 05:45:44 -03003476 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3477 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3478 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3479 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003480 }
Steven Toth3935c252008-05-01 05:45:44 -03003481 if (state->RF_IN >= 640000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003482 {
Steven Toth3935c252008-05-01 05:45:44 -03003483 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3484 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3485 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3486 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003487 }
3488 }
3489
Steven Toth85d220d2008-05-01 05:48:14 -03003490 if (state->TF_Type == MXL_TF_F) // Tracking Filter type F
Steven Toth52c99bd2008-05-01 04:57:01 -03003491 {
Steven Toth3935c252008-05-01 05:45:44 -03003492 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003493
Steven Toth3935c252008-05-01 05:45:44 -03003494 if (state->RF_IN >= 43000000 && state->RF_IN < 160000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003495 {
3496
Steven Toth3935c252008-05-01 05:45:44 -03003497 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3498 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3499 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3500 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003501 }
Steven Toth3935c252008-05-01 05:45:44 -03003502 if (state->RF_IN >= 160000000 && state->RF_IN < 210000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003503 {
Steven Toth3935c252008-05-01 05:45:44 -03003504 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3505 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3506 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3507 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003508 }
Steven Toth3935c252008-05-01 05:45:44 -03003509 if (state->RF_IN >= 210000000 && state->RF_IN < 300000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003510 {
Steven Toth3935c252008-05-01 05:45:44 -03003511 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3512 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3513 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3514 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003515 }
Steven Toth3935c252008-05-01 05:45:44 -03003516 if (state->RF_IN >= 300000000 && state->RF_IN < 390000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003517 {
Steven Toth3935c252008-05-01 05:45:44 -03003518 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3519 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3520 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3521 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003522 }
Steven Toth3935c252008-05-01 05:45:44 -03003523 if (state->RF_IN >= 390000000 && state->RF_IN < 515000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003524 {
Steven Toth3935c252008-05-01 05:45:44 -03003525 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3526 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3527 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3528 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003529 }
Steven Toth3935c252008-05-01 05:45:44 -03003530 if (state->RF_IN >= 515000000 && state->RF_IN < 650000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003531 {
Steven Toth3935c252008-05-01 05:45:44 -03003532 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3533 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3534 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3535 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003536 }
Steven Toth3935c252008-05-01 05:45:44 -03003537 if (state->RF_IN >= 650000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003538 {
Steven Toth3935c252008-05-01 05:45:44 -03003539 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3540 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3541 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3542 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003543 }
3544 }
3545
Steven Toth85d220d2008-05-01 05:48:14 -03003546 if (state->TF_Type == MXL_TF_E_2) // Tracking Filter type E_2
Steven Toth52c99bd2008-05-01 04:57:01 -03003547 {
Steven Toth3935c252008-05-01 05:45:44 -03003548 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003549
Steven Toth3935c252008-05-01 05:45:44 -03003550 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003551 {
3552
Steven Toth3935c252008-05-01 05:45:44 -03003553 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3554 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3555 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3556 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003557 }
Steven Toth3935c252008-05-01 05:45:44 -03003558 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003559 {
Steven Toth3935c252008-05-01 05:45:44 -03003560 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3561 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3562 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3563 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003564 }
Steven Toth3935c252008-05-01 05:45:44 -03003565 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003566 {
Steven Toth3935c252008-05-01 05:45:44 -03003567 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3568 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3569 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3570 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003571 }
Steven Toth3935c252008-05-01 05:45:44 -03003572 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003573 {
Steven Toth3935c252008-05-01 05:45:44 -03003574 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3575 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3576 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3577 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003578 }
Steven Toth3935c252008-05-01 05:45:44 -03003579 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003580 {
Steven Toth3935c252008-05-01 05:45:44 -03003581 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3582 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3583 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3584 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003585 }
Steven Toth3935c252008-05-01 05:45:44 -03003586 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003587 {
Steven Toth3935c252008-05-01 05:45:44 -03003588 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3589 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3590 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3591 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003592 }
Steven Toth3935c252008-05-01 05:45:44 -03003593 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003594 {
Steven Toth3935c252008-05-01 05:45:44 -03003595 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3596 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3597 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3598 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003599 }
3600 }
3601
Steven Toth85d220d2008-05-01 05:48:14 -03003602 if (state->TF_Type == MXL_TF_G) // Tracking Filter type G add for v2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03003603 {
Steven Toth3935c252008-05-01 05:45:44 -03003604 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003605
Steven Toth3935c252008-05-01 05:45:44 -03003606 if (state->RF_IN >= 50000000 && state->RF_IN < 190000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003607 {
3608
Steven Toth3935c252008-05-01 05:45:44 -03003609 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3610 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3611 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3612 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003613 }
Steven Toth3935c252008-05-01 05:45:44 -03003614 if (state->RF_IN >= 190000000 && state->RF_IN < 280000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003615 {
Steven Toth3935c252008-05-01 05:45:44 -03003616 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3617 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3618 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3619 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003620 }
Steven Toth3935c252008-05-01 05:45:44 -03003621 if (state->RF_IN >= 280000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003622 {
Steven Toth3935c252008-05-01 05:45:44 -03003623 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3624 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3625 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3626 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003627 }
Steven Toth3935c252008-05-01 05:45:44 -03003628 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003629 {
Steven Toth3935c252008-05-01 05:45:44 -03003630 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3631 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3632 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3633 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003634 }
Steven Toth3935c252008-05-01 05:45:44 -03003635 if (state->RF_IN >= 400000000 && state->RF_IN < 470000000) //modified for 2.6.11
Steven Toth52c99bd2008-05-01 04:57:01 -03003636 {
Steven Toth3935c252008-05-01 05:45:44 -03003637 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3638 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 On
3639 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 Off
3640 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003641 }
Steven Toth3935c252008-05-01 05:45:44 -03003642 if (state->RF_IN >= 470000000 && state->RF_IN < 640000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003643 {
Steven Toth3935c252008-05-01 05:45:44 -03003644 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3645 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3646 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3647 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003648 }
Steven Toth3935c252008-05-01 05:45:44 -03003649 if (state->RF_IN >= 640000000 && state->RF_IN < 820000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003650 {
Steven Toth3935c252008-05-01 05:45:44 -03003651 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3652 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3653 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3654 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003655 }
Steven Toth3935c252008-05-01 05:45:44 -03003656 if (state->RF_IN >= 820000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003657 {
Steven Toth3935c252008-05-01 05:45:44 -03003658 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3659 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3660 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3661 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003662 }
3663 }
3664
Steven Toth85d220d2008-05-01 05:48:14 -03003665 if (state->TF_Type == MXL_TF_E_NA) // Tracking Filter type E-NA for Empia ONLY change for 2.6.8
Steven Toth52c99bd2008-05-01 04:57:01 -03003666 {
Steven Toth3935c252008-05-01 05:45:44 -03003667 status += MXL_ControlWrite(fe, DAC_DIN_B, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003668
Steven Totha8214d42008-05-01 05:02:58 -03003669 // if UHF and terrestrial=> Turn off Tracking Filter
Steven Toth3935c252008-05-01 05:45:44 -03003670 if (state->RF_IN >= 471000000 && (state->RF_IN - 471000000)%6000000 != 0)
Steven Toth52c99bd2008-05-01 04:57:01 -03003671 {
3672 // Turn off all the banks
Steven Toth3935c252008-05-01 05:45:44 -03003673 status += MXL_SetGPIO(fe, 3, 1) ;
3674 status += MXL_SetGPIO(fe, 1, 1) ;
3675 status += MXL_SetGPIO(fe, 4, 1) ;
3676 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003677
3678 //2.6.12
3679 //Turn on RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003680 status += MXL_ControlWrite(fe, SEQ_EXTSYNTHCALIF, 1) ;
3681 status += MXL_ControlWrite(fe, SEQ_EXTDCCAL, 1) ;
3682 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 1) ;
3683 status += MXL_ControlWrite(fe, RFA_ENCLKRFAGC, 1) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003684
3685 // RSSI reference point
Steven Toth3935c252008-05-01 05:45:44 -03003686 status += MXL_ControlWrite(fe, RFA_RSSI_REFH, 5) ;
3687 status += MXL_ControlWrite(fe, RFA_RSSI_REF, 3) ;
3688 status += MXL_ControlWrite(fe, RFA_RSSI_REFL, 2) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003689
3690
Steven Toth3935c252008-05-01 05:45:44 -03003691 //status += MXL_ControlWrite(fe, AGC_IF, 10) ; //doesn't matter since RSSI is turn on
Steven Toth52c99bd2008-05-01 04:57:01 -03003692
3693 //following parameter is from analog OTA mode, can be change to seek better performance
Steven Toth3935c252008-05-01 05:45:44 -03003694 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 3) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003695 }
3696
3697 else //if VHF or Cable => Turn on Tracking Filter
3698 {
3699 //2.6.12
3700 //Turn off RSSI
Steven Toth3935c252008-05-01 05:45:44 -03003701 status += MXL_ControlWrite(fe, AGC_EN_RSSI, 0) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003702
3703 //change back from above condition
Steven Toth3935c252008-05-01 05:45:44 -03003704 status += MXL_ControlWrite(fe, RFSYN_CHP_GAIN, 5) ;
Steven Toth52c99bd2008-05-01 04:57:01 -03003705
3706
Steven Toth3935c252008-05-01 05:45:44 -03003707 if (state->RF_IN >= 43000000 && state->RF_IN < 174000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003708 {
3709
Steven Toth3935c252008-05-01 05:45:44 -03003710 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3711 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3712 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3713 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003714 }
Steven Toth3935c252008-05-01 05:45:44 -03003715 if (state->RF_IN >= 174000000 && state->RF_IN < 250000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003716 {
Steven Toth3935c252008-05-01 05:45:44 -03003717 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3718 status += MXL_SetGPIO(fe, 4, 0) ; // Bank1 On
3719 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3720 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003721 }
Steven Toth3935c252008-05-01 05:45:44 -03003722 if (state->RF_IN >= 250000000 && state->RF_IN < 350000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003723 {
Steven Toth3935c252008-05-01 05:45:44 -03003724 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3725 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3726 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3727 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003728 }
Steven Toth3935c252008-05-01 05:45:44 -03003729 if (state->RF_IN >= 350000000 && state->RF_IN < 400000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003730 {
Steven Toth3935c252008-05-01 05:45:44 -03003731 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3732 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3733 status += MXL_SetGPIO(fe, 1, 0) ; // Bank2 On
3734 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003735 }
Steven Toth3935c252008-05-01 05:45:44 -03003736 if (state->RF_IN >= 400000000 && state->RF_IN < 570000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003737 {
Steven Toth3935c252008-05-01 05:45:44 -03003738 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 0) ; // Bank4 Off
3739 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3740 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3741 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003742 }
Steven Toth3935c252008-05-01 05:45:44 -03003743 if (state->RF_IN >= 570000000 && state->RF_IN < 770000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003744 {
Steven Toth3935c252008-05-01 05:45:44 -03003745 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3746 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3747 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3748 status += MXL_SetGPIO(fe, 3, 0) ; // Bank3 On
Steven Toth52c99bd2008-05-01 04:57:01 -03003749 }
Steven Toth3935c252008-05-01 05:45:44 -03003750 if (state->RF_IN >= 770000000 && state->RF_IN <= 900000000)
Steven Toth52c99bd2008-05-01 04:57:01 -03003751 {
Steven Toth3935c252008-05-01 05:45:44 -03003752 status += MXL_ControlWrite(fe, DAC_B_ENABLE, 1) ; // Bank4 On
3753 status += MXL_SetGPIO(fe, 4, 1) ; // Bank1 Off
3754 status += MXL_SetGPIO(fe, 1, 1) ; // Bank2 Off
3755 status += MXL_SetGPIO(fe, 3, 1) ; // Bank3 Off
Steven Toth52c99bd2008-05-01 04:57:01 -03003756 }
3757 }
3758 }
3759 return status ;
3760}
3761
Steven Toth3935c252008-05-01 05:45:44 -03003762// DONE
3763u16 MXL_SetGPIO(struct dvb_frontend *fe, u8 GPIO_Num, u8 GPIO_Val)
Steven Toth52c99bd2008-05-01 04:57:01 -03003764{
Steven Toth3935c252008-05-01 05:45:44 -03003765 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003766
3767 if (GPIO_Num == 1)
Steven Toth3935c252008-05-01 05:45:44 -03003768 status += MXL_ControlWrite(fe, GPIO_1B, GPIO_Val ? 0 : 1);
3769
3770 /* GPIO2 is not available */
3771
3772 if (GPIO_Num == 3) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003773 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003774 status += MXL_ControlWrite(fe, GPIO_3, 0);
3775 status += MXL_ControlWrite(fe, GPIO_3B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003776 }
3777 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003778 status += MXL_ControlWrite(fe, GPIO_3, 1);
3779 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003780 }
Steven Toth3935c252008-05-01 05:45:44 -03003781 if (GPIO_Val == 3) { /* tri-state */
3782 status += MXL_ControlWrite(fe, GPIO_3, 0);
3783 status += MXL_ControlWrite(fe, GPIO_3B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003784 }
3785 }
Steven Toth3935c252008-05-01 05:45:44 -03003786 if (GPIO_Num == 4) {
Steven Toth52c99bd2008-05-01 04:57:01 -03003787 if (GPIO_Val == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03003788 status += MXL_ControlWrite(fe, GPIO_4, 0);
3789 status += MXL_ControlWrite(fe, GPIO_4B, 0);
Steven Toth52c99bd2008-05-01 04:57:01 -03003790 }
3791 if (GPIO_Val == 0) {
Steven Toth3935c252008-05-01 05:45:44 -03003792 status += MXL_ControlWrite(fe, GPIO_4, 1);
3793 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003794 }
Steven Toth3935c252008-05-01 05:45:44 -03003795 if (GPIO_Val == 3) { /* tri-state */
3796 status += MXL_ControlWrite(fe, GPIO_4, 0);
3797 status += MXL_ControlWrite(fe, GPIO_4B, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03003798 }
3799 }
3800
Steven Toth3935c252008-05-01 05:45:44 -03003801 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003802}
3803
3804///////////////////////////////////////////////////////////////////////////////
3805// //
3806// Function: MXL_ControlWrite //
3807// //
3808// Description: Update control name value //
3809// //
3810// Globals: //
3811// NONE //
3812// //
3813// Functions used: //
3814// MXL_ControlWrite( Tuner, controlName, value, Group ) //
3815// //
3816// Inputs: //
3817// Tuner : Tuner structure //
3818// ControlName : Control name to be updated //
3819// value : Value to be written //
3820// //
3821// Outputs: //
3822// Tuner : Tuner structure defined at higher level //
3823// //
3824// Return: //
3825// 0 : Successful write //
3826// >0 : Value exceed maximum allowed for control number //
3827// //
3828///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003829// DONE
3830u16 MXL_ControlWrite(struct dvb_frontend *fe, u16 ControlNum, u32 value)
Steven Toth52c99bd2008-05-01 04:57:01 -03003831{
Steven Toth3935c252008-05-01 05:45:44 -03003832 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003833
Steven Toth3935c252008-05-01 05:45:44 -03003834 /* Will write ALL Matching Control Name */
Steven Toth85d220d2008-05-01 05:48:14 -03003835 status += MXL_ControlWrite_Group(fe, ControlNum, value, 1); /* Write Matching INIT Control */
3836 status += MXL_ControlWrite_Group(fe, ControlNum, value, 2); /* Write Matching CH Control */
Steven Toth3935c252008-05-01 05:45:44 -03003837#ifdef _MXL_INTERNAL
Steven Toth85d220d2008-05-01 05:48:14 -03003838 status += MXL_ControlWrite_Group(fe, ControlNum, value, 3); /* Write Matching MXL Control */
Steven Toth3935c252008-05-01 05:45:44 -03003839#endif
3840 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03003841}
3842
3843///////////////////////////////////////////////////////////////////////////////
3844// //
3845// Function: MXL_ControlWrite //
3846// //
3847// Description: Update control name value //
3848// //
3849// Globals: //
3850// NONE //
3851// //
3852// Functions used: //
3853// strcmp //
3854// //
3855// Inputs: //
3856// Tuner_struct: structure defined at higher level //
3857// ControlName : Control Name //
3858// value : Value Assigned to Control Name //
3859// controlGroup : Control Register Group //
3860// //
3861// Outputs: //
3862// NONE //
3863// //
3864// Return: //
3865// 0 : Successful write //
3866// 1 : Value exceed maximum allowed for control name //
3867// 2 : Control name not found //
3868// //
3869///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003870// DONE
3871u16 MXL_ControlWrite_Group(struct dvb_frontend *fe, u16 controlNum, u32 value, u16 controlGroup)
Steven Toth52c99bd2008-05-01 04:57:01 -03003872{
Steven Toth85d220d2008-05-01 05:48:14 -03003873 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth3935c252008-05-01 05:45:44 -03003874 u16 i, j, k;
3875 u32 highLimit;
3876 u32 ctrlVal;
Steven Toth52c99bd2008-05-01 04:57:01 -03003877
Steven Toth3935c252008-05-01 05:45:44 -03003878 if (controlGroup == 1) /* Initial Control */ {
3879
3880 for (i = 0; i < state->Init_Ctrl_Num; i++) {
3881
3882 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
3883
3884 highLimit = 1 << state->Init_Ctrl[i].size;
3885 if (value < highLimit) {
3886 for (j = 0; j < state->Init_Ctrl[i].size; j++) {
3887 state->Init_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3888 MXL_RegWriteBit(fe, (u8)(state->Init_Ctrl[i].addr[j]),
3889 (u8)(state->Init_Ctrl[i].bit[j]),
3890 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003891 }
Steven Toth3935c252008-05-01 05:45:44 -03003892 ctrlVal = 0;
3893 for (k = 0; k < state->Init_Ctrl[i].size; k++)
3894 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003895 }
3896 else
Steven Toth3935c252008-05-01 05:45:44 -03003897 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003898 }
3899 }
3900 }
Steven Toth3935c252008-05-01 05:45:44 -03003901 if (controlGroup == 2) /* Chan change Control */ {
3902
3903 for (i = 0; i < state->CH_Ctrl_Num; i++) {
3904
3905 if (controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
3906
3907 highLimit = 1 << state->CH_Ctrl[i].size;
3908 if (value < highLimit) {
3909 for (j = 0; j < state->CH_Ctrl[i].size; j++) {
3910 state->CH_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3911 MXL_RegWriteBit(fe, (u8)(state->CH_Ctrl[i].addr[j]),
3912 (u8)(state->CH_Ctrl[i].bit[j]),
3913 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003914 }
Steven Toth3935c252008-05-01 05:45:44 -03003915 ctrlVal = 0;
3916 for (k = 0; k < state->CH_Ctrl[i].size; k++)
3917 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003918 }
3919 else
Steven Toth3935c252008-05-01 05:45:44 -03003920 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003921 }
3922 }
3923 }
3924#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03003925 if (controlGroup == 3) /* Maxlinear Control */ {
3926
3927 for (i = 0; i < state->MXL_Ctrl_Num; i++) {
3928
3929 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
3930
3931 highLimit = (1 << state->MXL_Ctrl[i].size) ;
3932 if (value < highLimit) {
3933 for (j = 0; j < state->MXL_Ctrl[i].size; j++) {
3934 state->MXL_Ctrl[i].val[j] = (u8)((value >> j) & 0x01);
3935 MXL_RegWriteBit(fe, (u8)(state->MXL_Ctrl[i].addr[j]),
3936 (u8)(state->MXL_Ctrl[i].bit[j]),
3937 (u8)((value>>j) & 0x01) );
Steven Toth52c99bd2008-05-01 04:57:01 -03003938 }
Steven Toth3935c252008-05-01 05:45:44 -03003939 ctrlVal = 0;
3940 for(k = 0; k < state->MXL_Ctrl[i].size; k++)
3941 ctrlVal += state->MXL_Ctrl[i].val[k] * (1 << k);
Steven Toth52c99bd2008-05-01 04:57:01 -03003942 }
3943 else
Steven Toth3935c252008-05-01 05:45:44 -03003944 return -1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003945 }
3946 }
3947 }
3948#endif
Steven Toth3935c252008-05-01 05:45:44 -03003949 return 0 ; /* successful return */
Steven Toth52c99bd2008-05-01 04:57:01 -03003950}
3951
3952///////////////////////////////////////////////////////////////////////////////
3953// //
3954// Function: MXL_RegWrite //
3955// //
3956// Description: Update tuner register value //
3957// //
3958// Globals: //
3959// NONE //
3960// //
3961// Functions used: //
3962// NONE //
3963// //
3964// Inputs: //
3965// Tuner_struct: structure defined at higher level //
3966// RegNum : Register address to be assigned a value //
3967// RegVal : Register value to write //
3968// //
3969// Outputs: //
3970// NONE //
3971// //
3972// Return: //
3973// 0 : Successful write //
3974// -1 : Invalid Register Address //
3975// //
3976///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03003977// DONE
3978u16 MXL_RegWrite(struct dvb_frontend *fe, u8 RegNum, u8 RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03003979{
Steven Toth85d220d2008-05-01 05:48:14 -03003980 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03003981 int i ;
3982
Steven Toth3935c252008-05-01 05:45:44 -03003983 for (i = 0; i < 104; i++) {
3984 if (RegNum == state->TunerRegs[i].Reg_Num) {
3985 state->TunerRegs[i].Reg_Val = RegVal;
3986 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03003987 }
3988 }
3989
Steven Toth3935c252008-05-01 05:45:44 -03003990 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03003991}
3992
3993///////////////////////////////////////////////////////////////////////////////
3994// //
3995// Function: MXL_RegRead //
3996// //
3997// Description: Retrieve tuner register value //
3998// //
3999// Globals: //
4000// NONE //
4001// //
4002// Functions used: //
4003// NONE //
4004// //
4005// Inputs: //
4006// Tuner_struct: structure defined at higher level //
4007// RegNum : Register address to be assigned a value //
4008// //
4009// Outputs: //
4010// RegVal : Retrieved register value //
4011// //
4012// Return: //
4013// 0 : Successful read //
4014// -1 : Invalid Register Address //
4015// //
4016///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004017// DONE
4018u16 MXL_RegRead(struct dvb_frontend *fe, u8 RegNum, u8 *RegVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03004019{
Steven Toth85d220d2008-05-01 05:48:14 -03004020 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03004021 int i ;
4022
Steven Toth3935c252008-05-01 05:45:44 -03004023 for (i = 0; i < 104; i++) {
4024 if (RegNum == state->TunerRegs[i].Reg_Num ) {
4025 *RegVal = (u8)(state->TunerRegs[i].Reg_Val);
4026 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004027 }
4028 }
4029
Steven Toth3935c252008-05-01 05:45:44 -03004030 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004031}
4032
4033///////////////////////////////////////////////////////////////////////////////
4034// //
4035// Function: MXL_ControlRead //
4036// //
4037// Description: Retrieve the control value based on the control name //
4038// //
4039// Globals: //
4040// NONE //
4041// //
4042// Inputs: //
4043// Tuner_struct : structure defined at higher level //
4044// ControlName : Control Name //
4045// //
4046// Outputs: //
4047// value : returned control value //
4048// //
4049// Return: //
4050// 0 : Successful read //
4051// -1 : Invalid control name //
4052// //
4053///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004054// DONE
Steven Toth85d220d2008-05-01 05:48:14 -03004055u16 MXL_ControlRead(struct dvb_frontend *fe, u16 controlNum, u32 *value)
Steven Toth52c99bd2008-05-01 04:57:01 -03004056{
Steven Toth85d220d2008-05-01 05:48:14 -03004057 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004058 u32 ctrlVal ;
4059 u16 i, k ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004060
Steven Toth3935c252008-05-01 05:45:44 -03004061 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
4062
4063 if (controlNum == state->Init_Ctrl[i].Ctrl_Num) {
4064
4065 ctrlVal = 0;
4066 for (k = 0; k < state->Init_Ctrl[i].size; k++)
4067 ctrlVal += state->Init_Ctrl[i].val[k] * (1 << k);
4068 *value = ctrlVal;
4069 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004070 }
4071 }
Steven Toth3935c252008-05-01 05:45:44 -03004072
4073 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
4074
4075 if (controlNum == state->CH_Ctrl[i].Ctrl_Num) {
4076
4077 ctrlVal = 0;
4078 for (k = 0; k < state->CH_Ctrl[i].size; k++)
4079 ctrlVal += state->CH_Ctrl[i].val[k] * (1 << k);
4080 *value = ctrlVal;
4081 return 0;
4082
Steven Toth52c99bd2008-05-01 04:57:01 -03004083 }
4084 }
4085
4086#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004087 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
4088
4089 if (controlNum == state->MXL_Ctrl[i].Ctrl_Num) {
4090
4091 ctrlVal = 0;
4092 for (k = 0; k < state->MXL_Ctrl[i].size; k++)
4093 ctrlVal += state->MXL_Ctrl[i].val[k] * (1<<k);
4094 *value = ctrlVal;
4095 return 0;
4096
Steven Toth52c99bd2008-05-01 04:57:01 -03004097 }
4098 }
4099#endif
Steven Toth3935c252008-05-01 05:45:44 -03004100 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004101}
4102
4103///////////////////////////////////////////////////////////////////////////////
4104// //
4105// Function: MXL_ControlRegRead //
4106// //
4107// Description: Retrieve the register addresses and count related to a //
Steven Totha8214d42008-05-01 05:02:58 -03004108// a specific control name //
Steven Toth52c99bd2008-05-01 04:57:01 -03004109// //
4110// Globals: //
4111// NONE //
4112// //
4113// Inputs: //
4114// Tuner_struct : structure defined at higher level //
4115// ControlName : Control Name //
4116// //
4117// Outputs: //
4118// RegNum : returned register address array //
Steven Totha8214d42008-05-01 05:02:58 -03004119// count : returned register count related to a control //
Steven Toth52c99bd2008-05-01 04:57:01 -03004120// //
4121// Return: //
4122// 0 : Successful read //
4123// -1 : Invalid control name //
4124// //
4125///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004126// DONE
4127u16 MXL_ControlRegRead(struct dvb_frontend *fe, u16 controlNum, u8 *RegNum, int * count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004128{
Steven Toth85d220d2008-05-01 05:48:14 -03004129 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004130 u16 i, j, k ;
4131 u16 Count ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004132
Steven Toth3935c252008-05-01 05:45:44 -03004133 for (i = 0; i < state->Init_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004134
Steven Toth3935c252008-05-01 05:45:44 -03004135 if ( controlNum == state->Init_Ctrl[i].Ctrl_Num ) {
4136
4137 Count = 1;
4138 RegNum[0] = (u8)(state->Init_Ctrl[i].addr[0]);
4139
4140 for (k = 1; k < state->Init_Ctrl[i].size; k++) {
4141
4142 for (j = 0; j < Count; j++) {
4143
4144 if (state->Init_Ctrl[i].addr[k] != RegNum[j]) {
4145
4146 Count ++;
4147 RegNum[Count-1] = (u8)(state->Init_Ctrl[i].addr[k]);
4148
Steven Toth52c99bd2008-05-01 04:57:01 -03004149 }
4150 }
4151
4152 }
Steven Toth3935c252008-05-01 05:45:44 -03004153 *count = Count;
4154 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004155 }
4156 }
Steven Toth3935c252008-05-01 05:45:44 -03004157 for (i = 0; i < state->CH_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004158
Steven Toth3935c252008-05-01 05:45:44 -03004159 if ( controlNum == state->CH_Ctrl[i].Ctrl_Num ) {
4160
4161 Count = 1;
4162 RegNum[0] = (u8)(state->CH_Ctrl[i].addr[0]);
4163
4164 for (k = 1; k < state->CH_Ctrl[i].size; k++) {
4165
4166 for (j= 0; j<Count; j++) {
4167
4168 if (state->CH_Ctrl[i].addr[k] != RegNum[j]) {
4169
4170 Count ++;
4171 RegNum[Count-1] = (u8)(state->CH_Ctrl[i].addr[k]);
4172
Steven Toth52c99bd2008-05-01 04:57:01 -03004173 }
4174 }
4175 }
Steven Toth3935c252008-05-01 05:45:44 -03004176 *count = Count;
4177 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004178 }
4179 }
4180#ifdef _MXL_INTERNAL
Steven Toth3935c252008-05-01 05:45:44 -03004181 for (i = 0; i < state->MXL_Ctrl_Num ; i++) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004182
Steven Toth3935c252008-05-01 05:45:44 -03004183 if ( controlNum == state->MXL_Ctrl[i].Ctrl_Num ) {
4184
4185 Count = 1;
4186 RegNum[0] = (u8)(state->MXL_Ctrl[i].addr[0]);
4187
4188 for (k = 1; k < state->MXL_Ctrl[i].size; k++) {
4189
4190 for (j = 0; j<Count; j++) {
4191
4192 if (state->MXL_Ctrl[i].addr[k] != RegNum[j]) {
4193
4194 Count ++;
4195 RegNum[Count-1] = (u8)state->MXL_Ctrl[i].addr[k];
4196
Steven Toth52c99bd2008-05-01 04:57:01 -03004197 }
4198 }
4199 }
Steven Toth3935c252008-05-01 05:45:44 -03004200 *count = Count;
4201 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004202 }
4203 }
4204#endif
Steven Toth3935c252008-05-01 05:45:44 -03004205 *count = 0;
4206 return 1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004207}
4208
4209///////////////////////////////////////////////////////////////////////////////
4210// //
4211// Function: MXL_RegWriteBit //
4212// //
4213// Description: Write a register for specified register address, //
4214// register bit and register bit value //
4215// //
4216// Globals: //
4217// NONE //
4218// //
4219// Inputs: //
4220// Tuner_struct : structure defined at higher level //
4221// address : register address //
Steven Toth3935c252008-05-01 05:45:44 -03004222// bit : register bit number //
Steven Totha8214d42008-05-01 05:02:58 -03004223// bitVal : register bit value //
Steven Toth52c99bd2008-05-01 04:57:01 -03004224// //
4225// Outputs: //
4226// NONE //
4227// //
4228// Return: //
4229// NONE //
4230// //
4231///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004232// DONE
4233void MXL_RegWriteBit(struct dvb_frontend *fe, u8 address, u8 bit, u8 bitVal)
Steven Toth52c99bd2008-05-01 04:57:01 -03004234{
Steven Toth85d220d2008-05-01 05:48:14 -03004235 struct mxl5005s_state *state = fe->tuner_priv;
Steven Toth52c99bd2008-05-01 04:57:01 -03004236 int i ;
4237
Steven Totha8214d42008-05-01 05:02:58 -03004238 const u8 AND_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004239 0xFE, 0xFD, 0xFB, 0xF7,
4240 0xEF, 0xDF, 0xBF, 0x7F } ;
4241
Steven Totha8214d42008-05-01 05:02:58 -03004242 const u8 OR_MAP[8] = {
Steven Toth52c99bd2008-05-01 04:57:01 -03004243 0x01, 0x02, 0x04, 0x08,
4244 0x10, 0x20, 0x40, 0x80 } ;
4245
Steven Toth3935c252008-05-01 05:45:44 -03004246 for (i = 0; i < state->TunerRegs_Num; i++) {
4247 if (state->TunerRegs[i].Reg_Num == address) {
Steven Toth52c99bd2008-05-01 04:57:01 -03004248 if (bitVal)
Steven Toth3935c252008-05-01 05:45:44 -03004249 state->TunerRegs[i].Reg_Val |= OR_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004250 else
Steven Toth3935c252008-05-01 05:45:44 -03004251 state->TunerRegs[i].Reg_Val &= AND_MAP[bit];
Steven Toth52c99bd2008-05-01 04:57:01 -03004252 break ;
4253 }
4254 }
Steven Toth3935c252008-05-01 05:45:44 -03004255}
Steven Toth52c99bd2008-05-01 04:57:01 -03004256
4257///////////////////////////////////////////////////////////////////////////////
4258// //
4259// Function: MXL_Ceiling //
4260// //
4261// Description: Complete to closest increment of resolution //
4262// //
4263// Globals: //
4264// NONE //
4265// //
4266// Functions used: //
4267// NONE //
4268// //
4269// Inputs: //
4270// value : Input number to compute //
4271// resolution : Increment step //
4272// //
4273// Outputs: //
4274// NONE //
4275// //
4276// Return: //
4277// Computed value //
4278// //
4279///////////////////////////////////////////////////////////////////////////////
Steven Toth3935c252008-05-01 05:45:44 -03004280// DONE
4281u32 MXL_Ceiling(u32 value, u32 resolution)
Steven Toth52c99bd2008-05-01 04:57:01 -03004282{
Steven Toth3935c252008-05-01 05:45:44 -03004283 return (value/resolution + (value % resolution > 0 ? 1 : 0));
4284}
Steven Toth52c99bd2008-05-01 04:57:01 -03004285
4286//
4287// Retrieve the Initialzation Registers
4288//
Steven Toth3935c252008-05-01 05:45:44 -03004289// DONE
4290u16 MXL_GetInitRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004291{
Steven Totha8214d42008-05-01 05:02:58 -03004292 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004293 int i ;
4294
Steven Toth3935c252008-05-01 05:45:44 -03004295 u8 RegAddr[] = {
4296 11, 12, 13, 22, 32, 43, 44, 53, 56, 59, 73,
4297 76, 77, 91, 134, 135, 137, 147,
4298 156, 166, 167, 168, 25 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004299
Steven Toth3935c252008-05-01 05:45:44 -03004300 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004301
Steven Toth3935c252008-05-01 05:45:44 -03004302 status += MXL_BlockInit(fe);
4303
4304 for (i = 0 ; i < *count; i++) {
4305 RegNum[i] = RegAddr[i];
4306 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004307 }
4308
Steven Toth3935c252008-05-01 05:45:44 -03004309 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004310}
4311
Steven Toth3935c252008-05-01 05:45:44 -03004312// DONE
4313u16 MXL_GetCHRegister(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004314{
Steven Totha8214d42008-05-01 05:02:58 -03004315 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004316 int i ;
4317
4318//add 77, 166, 167, 168 register for 2.6.12
4319#ifdef _MXL_PRODUCTION
Steven Totha8214d42008-05-01 05:02:58 -03004320 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 65, 68, 69, 70, 73, 92, 93, 106,
4321 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004322#else
Steven Totha8214d42008-05-01 05:02:58 -03004323 u8 RegAddr[] = {14, 15, 16, 17, 22, 43, 68, 69, 70, 73, 92, 93, 106,
4324 107, 108, 109, 110, 111, 112, 136, 138, 149, 77, 166, 167, 168 } ;
4325 //u8 RegAddr[171];
Steven Toth52c99bd2008-05-01 04:57:01 -03004326 //for (i=0; i<=170; i++)
4327 // RegAddr[i] = i;
4328#endif
4329
Steven Toth3935c252008-05-01 05:45:44 -03004330 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004331
Steven Toth3935c252008-05-01 05:45:44 -03004332 for (i = 0 ; i < *count; i++) {
4333 RegNum[i] = RegAddr[i];
4334 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004335 }
4336
Steven Toth3935c252008-05-01 05:45:44 -03004337 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004338}
4339
Steven Toth3935c252008-05-01 05:45:44 -03004340// DONE
4341u16 MXL_GetCHRegister_ZeroIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004342{
Steven Toth3935c252008-05-01 05:45:44 -03004343 u16 status = 0;
4344 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004345
Steven Toth3935c252008-05-01 05:45:44 -03004346 u8 RegAddr[] = {43, 136};
Steven Toth52c99bd2008-05-01 04:57:01 -03004347
Steven Toth3935c252008-05-01 05:45:44 -03004348 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004349
Steven Toth3935c252008-05-01 05:45:44 -03004350 for (i = 0; i < *count; i++) {
4351 RegNum[i] = RegAddr[i];
4352 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004353 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004354
Steven Toth3935c252008-05-01 05:45:44 -03004355 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004356}
4357
Steven Toth3935c252008-05-01 05:45:44 -03004358// DONE
4359u16 MXL_GetCHRegister_LowIF(struct dvb_frontend *fe, u8 * RegNum, u8 *RegVal, int *count)
Steven Toth52c99bd2008-05-01 04:57:01 -03004360{
Steven Toth3935c252008-05-01 05:45:44 -03004361 u16 status = 0;
4362 int i;
Steven Toth52c99bd2008-05-01 04:57:01 -03004363
Steven Toth3935c252008-05-01 05:45:44 -03004364 u8 RegAddr[] = { 138 };
Steven Toth52c99bd2008-05-01 04:57:01 -03004365
Steven Toth3935c252008-05-01 05:45:44 -03004366 *count = sizeof(RegAddr) / sizeof(u8);
Steven Toth52c99bd2008-05-01 04:57:01 -03004367
Steven Toth3935c252008-05-01 05:45:44 -03004368 for (i = 0; i < *count; i++) {
4369 RegNum[i] = RegAddr[i];
4370 status += MXL_RegRead(fe, RegNum[i], &RegVal[i]);
Steven Toth52c99bd2008-05-01 04:57:01 -03004371 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004372
Steven Toth3935c252008-05-01 05:45:44 -03004373 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004374}
4375
Steven Toth3935c252008-05-01 05:45:44 -03004376// DONE
Steven Totha8214d42008-05-01 05:02:58 -03004377u16 MXL_GetMasterControl(u8 *MasterReg, int state)
Steven Toth52c99bd2008-05-01 04:57:01 -03004378{
Steven Toth3935c252008-05-01 05:45:44 -03004379 if (state == 1) /* Load_Start */
4380 *MasterReg = 0xF3;
4381 if (state == 2) /* Power_Down */
4382 *MasterReg = 0x41;
4383 if (state == 3) /* Synth_Reset */
4384 *MasterReg = 0xB1;
4385 if (state == 4) /* Seq_Off */
4386 *MasterReg = 0xF1;
Steven Toth52c99bd2008-05-01 04:57:01 -03004387
Steven Toth3935c252008-05-01 05:45:44 -03004388 return 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004389}
4390
4391#ifdef _MXL_PRODUCTION
Steven Toth3935c252008-05-01 05:45:44 -03004392u16 MXL_VCORange_Test(struct dvb_frontend *fe, int VCO_Range)
Steven Toth52c99bd2008-05-01 04:57:01 -03004393{
Steven Toth85d220d2008-05-01 05:48:14 -03004394 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004395 u16 status = 0 ;
Steven Toth52c99bd2008-05-01 04:57:01 -03004396
Steven Totha8214d42008-05-01 05:02:58 -03004397 if (VCO_Range == 1) {
Steven Toth3935c252008-05-01 05:45:44 -03004398 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4399 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4400 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4401 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4402 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4403 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4404 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4405 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4406 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4407 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4408 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4409 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 180224);
Steven Totha8214d42008-05-01 05:02:58 -03004410 }
Steven Toth3935c252008-05-01 05:45:44 -03004411 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4412 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4413 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4414 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4415 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 222822);
Steven Totha8214d42008-05-01 05:02:58 -03004416 }
Steven Toth3935c252008-05-01 05:45:44 -03004417 if (state->Mode == 1) /* Digital Mode */ {
4418 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4419 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4420 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 56);
4421 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 229376);
Steven Totha8214d42008-05-01 05:02:58 -03004422 }
4423 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004424
Steven Totha8214d42008-05-01 05:02:58 -03004425 if (VCO_Range == 2) {
Steven Toth3935c252008-05-01 05:45:44 -03004426 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4427 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4428 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4429 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4430 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4431 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4432 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4433 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4434 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4435 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4436 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4437 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4438 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4439 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4440 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004441 }
Steven Toth3935c252008-05-01 05:45:44 -03004442 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4443 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4444 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4445 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4446 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004447 }
Steven Toth3935c252008-05-01 05:45:44 -03004448 if (state->Mode == 1) /* Digital Mode */ {
4449 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 1);
4450 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4451 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 41);
4452 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 16384);
Steven Totha8214d42008-05-01 05:02:58 -03004453 }
4454 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004455
Steven Totha8214d42008-05-01 05:02:58 -03004456 if (VCO_Range == 3) {
Steven Toth3935c252008-05-01 05:45:44 -03004457 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4458 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4459 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4460 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4461 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4462 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4463 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4464 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4465 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4466 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4467 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4468 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4469 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4470 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4471 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004472 }
Steven Toth3935c252008-05-01 05:45:44 -03004473 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4474 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4475 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4476 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 44);
4477 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 173670);
Steven Totha8214d42008-05-01 05:02:58 -03004478 }
Steven Toth3935c252008-05-01 05:45:44 -03004479 if (state->Mode == 1) /* Digital Mode */ {
4480 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4481 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 8);
4482 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 42);
4483 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 245760);
Steven Totha8214d42008-05-01 05:02:58 -03004484 }
4485 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004486
Steven Totha8214d42008-05-01 05:02:58 -03004487 if (VCO_Range == 4) {
Steven Toth3935c252008-05-01 05:45:44 -03004488 status += MXL_ControlWrite(fe, RFSYN_EN_DIV, 1);
4489 status += MXL_ControlWrite(fe, RFSYN_EN_OUTMUX, 0);
4490 status += MXL_ControlWrite(fe, RFSYN_SEL_DIVM, 0);
4491 status += MXL_ControlWrite(fe, RFSYN_DIVM, 1);
4492 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_OUT, 1);
4493 status += MXL_ControlWrite(fe, RFSYN_RF_DIV_BIAS, 1);
4494 status += MXL_ControlWrite(fe, DN_SEL_FREQ, 0);
4495 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4496 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4497 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4498 if (state->Mode == 0 && state->IF_Mode == 1) /* Analog Low IF Mode */ {
4499 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4500 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4501 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4502 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004503 }
Steven Toth3935c252008-05-01 05:45:44 -03004504 if (state->Mode == 0 && state->IF_Mode == 0) /* Analog Zero IF Mode */ {
4505 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4506 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4507 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4508 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 206438);
Steven Totha8214d42008-05-01 05:02:58 -03004509 }
Steven Toth3935c252008-05-01 05:45:44 -03004510 if (state->Mode == 1) /* Digital Mode */ {
4511 status += MXL_ControlWrite(fe, RFSYN_SEL_VCO_HI, 0);
4512 status += MXL_ControlWrite(fe, RFSYN_VCO_BIAS, 40);
4513 status += MXL_ControlWrite(fe, CHCAL_INT_MOD_RF, 27);
4514 status += MXL_ControlWrite(fe, CHCAL_FRAC_MOD_RF, 212992);
Steven Totha8214d42008-05-01 05:02:58 -03004515 }
4516 }
Steven Toth52c99bd2008-05-01 04:57:01 -03004517
Steven Totha8214d42008-05-01 05:02:58 -03004518 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004519}
4520
Steven Toth3935c252008-05-01 05:45:44 -03004521// DONE
4522u16 MXL_Hystersis_Test(struct dvb_frontend *fe, int Hystersis)
Steven Toth52c99bd2008-05-01 04:57:01 -03004523{
Steven Toth85d220d2008-05-01 05:48:14 -03004524 struct mxl5005s_state *state = fe->tuner_priv;
Steven Totha8214d42008-05-01 05:02:58 -03004525 u16 status = 0;
Steven Toth52c99bd2008-05-01 04:57:01 -03004526
4527 if (Hystersis == 1)
Steven Toth3935c252008-05-01 05:45:44 -03004528 status += MXL_ControlWrite(fe, DN_BYPASS_AGC_I2C, 1);
Steven Toth52c99bd2008-05-01 04:57:01 -03004529
Steven Totha8214d42008-05-01 05:02:58 -03004530 return status;
Steven Toth52c99bd2008-05-01 04:57:01 -03004531}
Steven Totha8214d42008-05-01 05:02:58 -03004532
Steven Toth52c99bd2008-05-01 04:57:01 -03004533#endif
4534
Steven Toth85d220d2008-05-01 05:48:14 -03004535/* Linux driver related functions */
4536
4537
4538int mxl5005s_init2(struct dvb_frontend *fe)
4539{
4540 int MxlModMode;
4541 int MxlIfMode;
4542 unsigned long MxlBandwitdh;
4543 unsigned long MxlIfFreqHz;
4544 unsigned long MxlCrystalFreqHz;
4545 int MxlAgcMode;
4546 unsigned short MxlTop;
4547 unsigned short MxlIfOutputLoad;
4548 int MxlClockOut;
4549 int MxlDivOut;
4550 int MxlCapSel;
4551 int MxlRssiOnOff;
4552 unsigned char MxlStandard;
4553 unsigned char MxlTfType;
4554
4555 /* Set MxL5005S parameters. */
4556 MxlModMode = MXL_DIGITAL_MODE;
4557 MxlIfMode = MXL_ZERO_IF;
4558// steve
4559 //MxlBandwitdh = MXL5005S_BANDWIDTH_8MHZ;
4560 //MxlIfFreqHz = IF_FREQ_4570000HZ;
4561 MxlBandwitdh = MXL5005S_BANDWIDTH_6MHZ; // config
4562 MxlIfFreqHz = IF_FREQ_5380000HZ; // config
4563 MxlCrystalFreqHz = CRYSTAL_FREQ_16000000HZ; // config
4564 MxlAgcMode = MXL_SINGLE_AGC;
4565 MxlTop = MXL5005S_TOP_25P2;
4566 MxlIfOutputLoad = MXL5005S_IF_OUTPUT_LOAD_200_OHM;
4567 MxlClockOut = MXL_CLOCK_OUT_DISABLE;
4568 MxlDivOut = MXL_DIV_OUT_4;
4569 MxlCapSel = MXL_CAP_SEL_ENABLE;
4570 MxlRssiOnOff = MXL_RSSI_ENABLE; // config
4571 MxlTfType = MXL_TF_C_H; // config
4572
4573 MxlStandard = MXL_ATSC; // config
4574
4575 // TODO: this is bad, it trashes other configs
4576 // Set MxL5005S extra module.
4577 //pExtra->AgcMasterByte = (MxlAgcMode == MXL_DUAL_AGC) ? 0x4 : 0x0;
4578
4579 MXL5005_TunerConfig(
4580 fe,
4581 (unsigned char)MxlModMode,
4582 (unsigned char)MxlIfMode,
4583 MxlBandwitdh,
4584 MxlIfFreqHz,
4585 MxlCrystalFreqHz,
4586 (unsigned char)MxlAgcMode,
4587 MxlTop,
4588 MxlIfOutputLoad,
4589 (unsigned char)MxlClockOut,
4590 (unsigned char)MxlDivOut,
4591 (unsigned char)MxlCapSel,
4592 (unsigned char)MxlRssiOnOff,
4593 MxlStandard, MxlTfType);
4594
4595 return 0;
4596}
4597
4598static int mxl5005s_set_params(struct dvb_frontend *fe,
4599 struct dvb_frontend_parameters *params)
4600{
4601 u32 freq;
4602 u32 bw;
4603
4604 if (fe->ops.info.type == FE_OFDM)
4605 bw = params->u.ofdm.bandwidth;
4606 else
4607 bw = MXL5005S_BANDWIDTH_6MHZ;
4608
4609 freq = params->frequency; /* Hz */
4610 dprintk(1, "%s() freq=%d bw=%d\n", __func__, freq, bw);
4611
4612 return mxl5005s_SetRfFreqHz(fe, freq);
4613}
4614
4615static int mxl5005s_get_frequency(struct dvb_frontend *fe, u32 *frequency)
4616{
4617 struct mxl5005s_state *state = fe->tuner_priv;
4618 dprintk(1, "%s()\n", __func__);
4619
4620 *frequency = state->RF_IN;
4621
4622 return 0;
4623}
4624
4625static int mxl5005s_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
4626{
4627 struct mxl5005s_state *state = fe->tuner_priv;
4628 dprintk(1, "%s()\n", __func__);
4629
4630 *bandwidth = state->Chan_Bandwidth;
4631
4632 return 0;
4633}
4634
4635static int mxl5005s_get_status(struct dvb_frontend *fe, u32 *status)
4636{
4637 dprintk(1, "%s()\n", __func__);
4638
4639 *status = 0;
4640 // *status = TUNER_STATUS_LOCKED;
4641
4642 return 0;
4643}
4644
4645static int mxl5005s_init(struct dvb_frontend *fe)
4646{
4647 struct mxl5005s_state *state = fe->tuner_priv;
4648 u8 AddrTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4649 u8 ByteTable[MXL5005S_REG_WRITING_TABLE_LEN_MAX];
4650 int TableLen;
4651
4652 dprintk(1, "%s()\n", __func__);
4653
4654 /* Initialize MxL5005S tuner according to MxL5005S tuner example code. */
4655
4656 /* Tuner initialization stage 0 */
4657 MXL_GetMasterControl(ByteTable, MC_SYNTH_RESET);
4658 AddrTable[0] = MASTER_CONTROL_ADDR;
4659 ByteTable[0] |= state->config->AgcMasterByte;
4660
4661 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, 1);
4662
4663 /* Tuner initialization stage 1 */
4664 MXL_GetInitRegister(fe, AddrTable, ByteTable, &TableLen);
4665
4666 mxl5005s_SetRegsWithTable(fe, AddrTable, ByteTable, TableLen);
4667
4668 return mxl5005s_init2(fe);
4669}
4670
4671static int mxl5005s_release(struct dvb_frontend *fe)
4672{
4673 dprintk(1, "%s()\n", __func__);
4674 kfree(fe->tuner_priv);
4675 fe->tuner_priv = NULL;
4676 return 0;
4677}
4678
4679static const struct dvb_tuner_ops mxl5005s_tuner_ops = {
4680 .info = {
4681 .name = "MaxLinear MXL5005S",
4682 .frequency_min = 48000000,
4683 .frequency_max = 860000000,
4684 .frequency_step = 50000,
4685 },
4686
4687 .release = mxl5005s_release,
4688 .init = mxl5005s_init,
4689
4690 .set_params = mxl5005s_set_params,
4691 .get_frequency = mxl5005s_get_frequency,
4692 .get_bandwidth = mxl5005s_get_bandwidth,
4693 .get_status = mxl5005s_get_status
4694};
4695
4696struct dvb_frontend *mxl5005s_attach(struct dvb_frontend *fe,
4697 struct i2c_adapter *i2c,
4698 struct mxl5005s_config *config)
4699{
4700 struct mxl5005s_state *state = NULL;
4701 dprintk(1, "%s()\n", __func__);
4702
4703 state = kzalloc(sizeof(struct mxl5005s_state), GFP_KERNEL);
4704 if (state == NULL)
4705 return NULL;
4706
4707 state->frontend = fe;
4708 state->config = config;
4709 state->i2c = i2c;
4710
4711 printk(KERN_INFO "MXL5005S: Attached at address 0x%02x\n", config->i2c_address);
4712
4713 memcpy(&fe->ops.tuner_ops, &mxl5005s_tuner_ops, sizeof(struct dvb_tuner_ops));
4714
4715 fe->tuner_priv = state;
4716 return fe;
4717}
4718EXPORT_SYMBOL(mxl5005s_attach);
4719
4720MODULE_DESCRIPTION("MaxLinear MXL5005S silicon tuner driver");
4721MODULE_AUTHOR("Jan Hoogenraad");
4722MODULE_AUTHOR("Barnaby Shearer");
4723MODULE_AUTHOR("Andy Hasper");
4724MODULE_AUTHOR("Steven Toth");
4725MODULE_LICENSE("GPL");