blob: bc17e29b54d14de1982d7c5f9bf4fe586bb83c17 [file] [log] [blame]
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001/*
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03002 Montage Technology DS3000 - DVBS/S2 Demodulator driver
3 Copyright (C) 2009-2012 Konstantin Dimitrov <kosio.dimitrov@gmail.com>
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03004
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03005 Copyright (C) 2009-2012 TurboSight.com
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03006
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include <linux/slab.h>
23#include <linux/kernel.h>
24#include <linux/module.h>
25#include <linux/moduleparam.h>
26#include <linux/init.h>
27#include <linux/firmware.h>
28
29#include "dvb_frontend.h"
Konstantin Dimitrov73f0af42012-12-23 19:25:38 -030030#include "ts2020.h"
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -030031#include "ds3000.h"
32
33static int debug;
34
35#define dprintk(args...) \
36 do { \
37 if (debug) \
38 printk(args); \
39 } while (0)
40
41/* as of March 2009 current DS3000 firmware version is 1.78 */
42/* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */
43#define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
44
45#define DS3000_SAMPLE_RATE 96000 /* in kHz */
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -030046
47/* Register values to initialise the demod in DVB-S mode */
48static u8 ds3000_dvbs_init_tab[] = {
49 0x23, 0x05,
50 0x08, 0x03,
51 0x0c, 0x00,
52 0x21, 0x54,
53 0x25, 0x82,
54 0x27, 0x31,
55 0x30, 0x08,
56 0x31, 0x40,
57 0x32, 0x32,
58 0x33, 0x35,
59 0x35, 0xff,
60 0x3a, 0x00,
61 0x37, 0x10,
62 0x38, 0x10,
63 0x39, 0x02,
64 0x42, 0x60,
65 0x4a, 0x40,
66 0x4b, 0x04,
67 0x4d, 0x91,
68 0x5d, 0xc8,
69 0x50, 0x77,
70 0x51, 0x77,
71 0x52, 0x36,
72 0x53, 0x36,
73 0x56, 0x01,
74 0x63, 0x43,
75 0x64, 0x30,
76 0x65, 0x40,
77 0x68, 0x26,
78 0x69, 0x4c,
79 0x70, 0x20,
80 0x71, 0x70,
81 0x72, 0x04,
82 0x73, 0x00,
83 0x70, 0x40,
84 0x71, 0x70,
85 0x72, 0x04,
86 0x73, 0x00,
87 0x70, 0x60,
88 0x71, 0x70,
89 0x72, 0x04,
90 0x73, 0x00,
91 0x70, 0x80,
92 0x71, 0x70,
93 0x72, 0x04,
94 0x73, 0x00,
95 0x70, 0xa0,
96 0x71, 0x70,
97 0x72, 0x04,
98 0x73, 0x00,
99 0x70, 0x1f,
100 0x76, 0x00,
101 0x77, 0xd1,
102 0x78, 0x0c,
103 0x79, 0x80,
104 0x7f, 0x04,
105 0x7c, 0x00,
106 0x80, 0x86,
107 0x81, 0xa6,
108 0x85, 0x04,
109 0xcd, 0xf4,
110 0x90, 0x33,
111 0xa0, 0x44,
112 0xc0, 0x18,
113 0xc3, 0x10,
114 0xc4, 0x08,
115 0xc5, 0x80,
116 0xc6, 0x80,
117 0xc7, 0x0a,
118 0xc8, 0x1a,
119 0xc9, 0x80,
120 0xfe, 0x92,
121 0xe0, 0xf8,
122 0xe6, 0x8b,
123 0xd0, 0x40,
124 0xf8, 0x20,
125 0xfa, 0x0f,
126 0xfd, 0x20,
127 0xad, 0x20,
128 0xae, 0x07,
129 0xb8, 0x00,
130};
131
132/* Register values to initialise the demod in DVB-S2 mode */
133static u8 ds3000_dvbs2_init_tab[] = {
134 0x23, 0x0f,
135 0x08, 0x07,
136 0x0c, 0x00,
137 0x21, 0x54,
138 0x25, 0x82,
139 0x27, 0x31,
140 0x30, 0x08,
141 0x31, 0x32,
142 0x32, 0x32,
143 0x33, 0x35,
144 0x35, 0xff,
145 0x3a, 0x00,
146 0x37, 0x10,
147 0x38, 0x10,
148 0x39, 0x02,
149 0x42, 0x60,
150 0x4a, 0x80,
151 0x4b, 0x04,
152 0x4d, 0x81,
153 0x5d, 0x88,
154 0x50, 0x36,
155 0x51, 0x36,
156 0x52, 0x36,
157 0x53, 0x36,
158 0x63, 0x60,
159 0x64, 0x10,
160 0x65, 0x10,
161 0x68, 0x04,
162 0x69, 0x29,
163 0x70, 0x20,
164 0x71, 0x70,
165 0x72, 0x04,
166 0x73, 0x00,
167 0x70, 0x40,
168 0x71, 0x70,
169 0x72, 0x04,
170 0x73, 0x00,
171 0x70, 0x60,
172 0x71, 0x70,
173 0x72, 0x04,
174 0x73, 0x00,
175 0x70, 0x80,
176 0x71, 0x70,
177 0x72, 0x04,
178 0x73, 0x00,
179 0x70, 0xa0,
180 0x71, 0x70,
181 0x72, 0x04,
182 0x73, 0x00,
183 0x70, 0x1f,
184 0xa0, 0x44,
185 0xc0, 0x08,
186 0xc1, 0x10,
187 0xc2, 0x08,
188 0xc3, 0x10,
189 0xc4, 0x08,
190 0xc5, 0xf0,
191 0xc6, 0xf0,
192 0xc7, 0x0a,
193 0xc8, 0x1a,
194 0xc9, 0x80,
195 0xca, 0x23,
196 0xcb, 0x24,
197 0xce, 0x74,
198 0x90, 0x03,
199 0x76, 0x80,
200 0x77, 0x42,
201 0x78, 0x0a,
202 0x79, 0x80,
203 0xad, 0x40,
204 0xae, 0x07,
205 0x7f, 0xd4,
206 0x7c, 0x00,
207 0x80, 0xa8,
208 0x81, 0xda,
209 0x7c, 0x01,
210 0x80, 0xda,
211 0x81, 0xec,
212 0x7c, 0x02,
213 0x80, 0xca,
214 0x81, 0xeb,
215 0x7c, 0x03,
216 0x80, 0xba,
217 0x81, 0xdb,
218 0x85, 0x08,
219 0x86, 0x00,
220 0x87, 0x02,
221 0x89, 0x80,
222 0x8b, 0x44,
223 0x8c, 0xaa,
224 0x8a, 0x10,
225 0xba, 0x00,
226 0xf5, 0x04,
227 0xfe, 0x44,
228 0xd2, 0x32,
229 0xb8, 0x00,
230};
231
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300232struct ds3000_state {
233 struct i2c_adapter *i2c;
234 const struct ds3000_config *config;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300235 struct dvb_frontend frontend;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300236 /* previous uncorrected block counter for DVB-S2 */
237 u16 prevUCBS2;
238};
239
240static int ds3000_writereg(struct ds3000_state *state, int reg, int data)
241{
242 u8 buf[] = { reg, data };
243 struct i2c_msg msg = { .addr = state->config->demod_address,
244 .flags = 0, .buf = buf, .len = 2 };
245 int err;
246
247 dprintk("%s: write reg 0x%02x, value 0x%02x\n", __func__, reg, data);
248
249 err = i2c_transfer(state->i2c, &msg, 1);
250 if (err != 1) {
251 printk(KERN_ERR "%s: writereg error(err == %i, reg == 0x%02x,"
252 " value == 0x%02x)\n", __func__, err, reg, data);
253 return -EREMOTEIO;
254 }
255
256 return 0;
257}
258
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -0300259static int ds3000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable)
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300260{
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -0300261 struct ds3000_state *state = fe->demodulator_priv;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300262
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -0300263 if (enable)
264 ds3000_writereg(state, 0x03, 0x12);
265 else
266 ds3000_writereg(state, 0x03, 0x02);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300267
268 return 0;
269}
270
271/* I2C write for 8k firmware load */
272static int ds3000_writeFW(struct ds3000_state *state, int reg,
273 const u8 *data, u16 len)
274{
275 int i, ret = -EREMOTEIO;
276 struct i2c_msg msg;
277 u8 *buf;
278
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300279 buf = kmalloc(33, GFP_KERNEL);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300280 if (buf == NULL) {
281 printk(KERN_ERR "Unable to kmalloc\n");
282 ret = -ENOMEM;
283 goto error;
284 }
285
286 *(buf) = reg;
287
288 msg.addr = state->config->demod_address;
289 msg.flags = 0;
290 msg.buf = buf;
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300291 msg.len = 33;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300292
Igor M. Liplianincaa687c2011-02-01 19:40:25 -0300293 for (i = 0; i < len; i += 32) {
294 memcpy(buf + 1, data + i, 32);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300295
296 dprintk("%s: write reg 0x%02x, len = %d\n", __func__, reg, len);
297
298 ret = i2c_transfer(state->i2c, &msg, 1);
299 if (ret != 1) {
300 printk(KERN_ERR "%s: write error(err == %i, "
301 "reg == 0x%02x\n", __func__, ret, reg);
302 ret = -EREMOTEIO;
303 }
304 }
305
306error:
307 kfree(buf);
308
309 return ret;
310}
311
312static int ds3000_readreg(struct ds3000_state *state, u8 reg)
313{
314 int ret;
315 u8 b0[] = { reg };
316 u8 b1[] = { 0 };
317 struct i2c_msg msg[] = {
318 {
319 .addr = state->config->demod_address,
320 .flags = 0,
321 .buf = b0,
322 .len = 1
323 }, {
324 .addr = state->config->demod_address,
325 .flags = I2C_M_RD,
326 .buf = b1,
327 .len = 1
328 }
329 };
330
331 ret = i2c_transfer(state->i2c, msg, 2);
332
333 if (ret != 2) {
334 printk(KERN_ERR "%s: reg=0x%x(error=%d)\n", __func__, reg, ret);
335 return ret;
336 }
337
338 dprintk("%s: read reg 0x%02x, value 0x%02x\n", __func__, reg, b1[0]);
339
340 return b1[0];
341}
342
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300343static int ds3000_load_firmware(struct dvb_frontend *fe,
344 const struct firmware *fw);
345
346static int ds3000_firmware_ondemand(struct dvb_frontend *fe)
347{
348 struct ds3000_state *state = fe->demodulator_priv;
349 const struct firmware *fw;
350 int ret = 0;
351
352 dprintk("%s()\n", __func__);
353
Rémi Cardona034351f2012-09-28 08:59:31 -0300354 ret = ds3000_readreg(state, 0xb2);
355 if (ret < 0)
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300356 return ret;
357
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300358 /* Load firmware */
359 /* request the firmware, this will block until someone uploads it */
360 printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
361 DS3000_DEFAULT_FIRMWARE);
362 ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
363 state->i2c->dev.parent);
364 printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__);
365 if (ret) {
366 printk(KERN_ERR "%s: No firmware uploaded (timeout or file not "
367 "found?)\n", __func__);
368 return ret;
369 }
370
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300371 ret = ds3000_load_firmware(fe, fw);
372 if (ret)
373 printk("%s: Writing firmware to device failed\n", __func__);
374
375 release_firmware(fw);
376
377 dprintk("%s: Firmware upload %s\n", __func__,
378 ret == 0 ? "complete" : "failed");
379
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300380 return ret;
381}
382
383static int ds3000_load_firmware(struct dvb_frontend *fe,
384 const struct firmware *fw)
385{
386 struct ds3000_state *state = fe->demodulator_priv;
387
388 dprintk("%s\n", __func__);
389 dprintk("Firmware is %zu bytes (%02x %02x .. %02x %02x)\n",
390 fw->size,
391 fw->data[0],
392 fw->data[1],
393 fw->data[fw->size - 2],
394 fw->data[fw->size - 1]);
395
396 /* Begin the firmware load process */
397 ds3000_writereg(state, 0xb2, 0x01);
398 /* write the entire firmware */
399 ds3000_writeFW(state, 0xb0, fw->data, fw->size);
400 ds3000_writereg(state, 0xb2, 0x00);
401
402 return 0;
403}
404
Igor M. Liplianind2ffc442011-02-25 18:41:22 -0300405static int ds3000_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
406{
407 struct ds3000_state *state = fe->demodulator_priv;
408 u8 data;
409
410 dprintk("%s(%d)\n", __func__, voltage);
411
412 data = ds3000_readreg(state, 0xa2);
413 data |= 0x03; /* bit0 V/H, bit1 off/on */
414
415 switch (voltage) {
416 case SEC_VOLTAGE_18:
417 data &= ~0x03;
418 break;
419 case SEC_VOLTAGE_13:
420 data &= ~0x03;
421 data |= 0x01;
422 break;
423 case SEC_VOLTAGE_OFF:
424 break;
425 }
426
427 ds3000_writereg(state, 0xa2, data);
428
429 return 0;
430}
431
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300432static int ds3000_read_status(struct dvb_frontend *fe, fe_status_t* status)
433{
434 struct ds3000_state *state = fe->demodulator_priv;
435 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
436 int lock;
437
438 *status = 0;
439
440 switch (c->delivery_system) {
441 case SYS_DVBS:
442 lock = ds3000_readreg(state, 0xd1);
443 if ((lock & 0x07) == 0x07)
444 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
445 FE_HAS_VITERBI | FE_HAS_SYNC |
446 FE_HAS_LOCK;
447
448 break;
449 case SYS_DVBS2:
450 lock = ds3000_readreg(state, 0x0d);
451 if ((lock & 0x8f) == 0x8f)
452 *status = FE_HAS_SIGNAL | FE_HAS_CARRIER |
453 FE_HAS_VITERBI | FE_HAS_SYNC |
454 FE_HAS_LOCK;
455
456 break;
457 default:
458 return 1;
459 }
460
461 dprintk("%s: status = 0x%02x\n", __func__, lock);
462
463 return 0;
464}
465
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300466/* read DS3000 BER value */
467static int ds3000_read_ber(struct dvb_frontend *fe, u32* ber)
468{
469 struct ds3000_state *state = fe->demodulator_priv;
470 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
471 u8 data;
472 u32 ber_reading, lpdc_frames;
473
474 dprintk("%s()\n", __func__);
475
476 switch (c->delivery_system) {
477 case SYS_DVBS:
478 /* set the number of bytes checked during
479 BER estimation */
480 ds3000_writereg(state, 0xf9, 0x04);
481 /* read BER estimation status */
482 data = ds3000_readreg(state, 0xf8);
483 /* check if BER estimation is ready */
484 if ((data & 0x10) == 0) {
485 /* this is the number of error bits,
486 to calculate the bit error rate
487 divide to 8388608 */
488 *ber = (ds3000_readreg(state, 0xf7) << 8) |
489 ds3000_readreg(state, 0xf6);
490 /* start counting error bits */
491 /* need to be set twice
492 otherwise it fails sometimes */
493 data |= 0x10;
494 ds3000_writereg(state, 0xf8, data);
495 ds3000_writereg(state, 0xf8, data);
496 } else
497 /* used to indicate that BER estimation
498 is not ready, i.e. BER is unknown */
499 *ber = 0xffffffff;
500 break;
501 case SYS_DVBS2:
502 /* read the number of LPDC decoded frames */
503 lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
504 (ds3000_readreg(state, 0xd6) << 8) |
505 ds3000_readreg(state, 0xd5);
506 /* read the number of packets with bad CRC */
507 ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
508 ds3000_readreg(state, 0xf7);
509 if (lpdc_frames > 750) {
510 /* clear LPDC frame counters */
511 ds3000_writereg(state, 0xd1, 0x01);
512 /* clear bad packets counter */
513 ds3000_writereg(state, 0xf9, 0x01);
514 /* enable bad packets counter */
515 ds3000_writereg(state, 0xf9, 0x00);
516 /* enable LPDC frame counters */
517 ds3000_writereg(state, 0xd1, 0x00);
518 *ber = ber_reading;
519 } else
520 /* used to indicate that BER estimation is not ready,
521 i.e. BER is unknown */
522 *ber = 0xffffffff;
523 break;
524 default:
525 return 1;
526 }
527
528 return 0;
529}
530
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300531/* calculate DS3000 snr value in dB */
532static int ds3000_read_snr(struct dvb_frontend *fe, u16 *snr)
533{
534 struct ds3000_state *state = fe->demodulator_priv;
535 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
536 u8 snr_reading, snr_value;
537 u32 dvbs2_signal_reading, dvbs2_noise_reading, tmp;
538 static const u16 dvbs_snr_tab[] = { /* 20 x Table (rounded up) */
539 0x0000, 0x1b13, 0x2aea, 0x3627, 0x3ede, 0x45fe, 0x4c03,
540 0x513a, 0x55d4, 0x59f2, 0x5dab, 0x6111, 0x6431, 0x6717,
541 0x69c9, 0x6c4e, 0x6eac, 0x70e8, 0x7304, 0x7505
542 };
543 static const u16 dvbs2_snr_tab[] = { /* 80 x Table (rounded up) */
544 0x0000, 0x0bc2, 0x12a3, 0x1785, 0x1b4e, 0x1e65, 0x2103,
545 0x2347, 0x2546, 0x2710, 0x28ae, 0x2a28, 0x2b83, 0x2cc5,
546 0x2df1, 0x2f09, 0x3010, 0x3109, 0x31f4, 0x32d2, 0x33a6,
547 0x3470, 0x3531, 0x35ea, 0x369b, 0x3746, 0x37ea, 0x3888,
548 0x3920, 0x39b3, 0x3a42, 0x3acc, 0x3b51, 0x3bd3, 0x3c51,
549 0x3ccb, 0x3d42, 0x3db6, 0x3e27, 0x3e95, 0x3f00, 0x3f68,
550 0x3fcf, 0x4033, 0x4094, 0x40f4, 0x4151, 0x41ac, 0x4206,
551 0x425e, 0x42b4, 0x4308, 0x435b, 0x43ac, 0x43fc, 0x444a,
552 0x4497, 0x44e2, 0x452d, 0x4576, 0x45bd, 0x4604, 0x4649,
553 0x468e, 0x46d1, 0x4713, 0x4755, 0x4795, 0x47d4, 0x4813,
554 0x4851, 0x488d, 0x48c9, 0x4904, 0x493f, 0x4978, 0x49b1,
555 0x49e9, 0x4a20, 0x4a57
556 };
557
558 dprintk("%s()\n", __func__);
559
560 switch (c->delivery_system) {
561 case SYS_DVBS:
562 snr_reading = ds3000_readreg(state, 0xff);
563 snr_reading /= 8;
564 if (snr_reading == 0)
565 *snr = 0x0000;
566 else {
567 if (snr_reading > 20)
568 snr_reading = 20;
569 snr_value = dvbs_snr_tab[snr_reading - 1] * 10 / 23026;
570 /* cook the value to be suitable for szap-s2
571 human readable output */
572 *snr = snr_value * 8 * 655;
573 }
574 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
575 snr_reading, *snr);
576 break;
577 case SYS_DVBS2:
578 dvbs2_noise_reading = (ds3000_readreg(state, 0x8c) & 0x3f) +
579 (ds3000_readreg(state, 0x8d) << 4);
580 dvbs2_signal_reading = ds3000_readreg(state, 0x8e);
581 tmp = dvbs2_signal_reading * dvbs2_signal_reading >> 1;
Nicolas Noirbent450df222010-03-22 14:54:43 -0300582 if (tmp == 0) {
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300583 *snr = 0x0000;
584 return 0;
585 }
586 if (dvbs2_noise_reading == 0) {
587 snr_value = 0x0013;
588 /* cook the value to be suitable for szap-s2
589 human readable output */
590 *snr = 0xffff;
591 return 0;
592 }
593 if (tmp > dvbs2_noise_reading) {
594 snr_reading = tmp / dvbs2_noise_reading;
595 if (snr_reading > 80)
596 snr_reading = 80;
597 snr_value = dvbs2_snr_tab[snr_reading - 1] / 1000;
598 /* cook the value to be suitable for szap-s2
599 human readable output */
600 *snr = snr_value * 5 * 655;
601 } else {
602 snr_reading = dvbs2_noise_reading / tmp;
603 if (snr_reading > 80)
604 snr_reading = 80;
605 *snr = -(dvbs2_snr_tab[snr_reading] / 1000);
606 }
607 dprintk("%s: raw / cooked = 0x%02x / 0x%04x\n", __func__,
608 snr_reading, *snr);
609 break;
610 default:
611 return 1;
612 }
613
614 return 0;
615}
616
617/* read DS3000 uncorrected blocks */
618static int ds3000_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks)
619{
620 struct ds3000_state *state = fe->demodulator_priv;
621 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
622 u8 data;
623 u16 _ucblocks;
624
625 dprintk("%s()\n", __func__);
626
627 switch (c->delivery_system) {
628 case SYS_DVBS:
629 *ucblocks = (ds3000_readreg(state, 0xf5) << 8) |
630 ds3000_readreg(state, 0xf4);
631 data = ds3000_readreg(state, 0xf8);
632 /* clear packet counters */
633 data &= ~0x20;
634 ds3000_writereg(state, 0xf8, data);
635 /* enable packet counters */
636 data |= 0x20;
637 ds3000_writereg(state, 0xf8, data);
638 break;
639 case SYS_DVBS2:
640 _ucblocks = (ds3000_readreg(state, 0xe2) << 8) |
641 ds3000_readreg(state, 0xe1);
642 if (_ucblocks > state->prevUCBS2)
643 *ucblocks = _ucblocks - state->prevUCBS2;
644 else
645 *ucblocks = state->prevUCBS2 - _ucblocks;
646 state->prevUCBS2 = _ucblocks;
647 break;
648 default:
649 return 1;
650 }
651
652 return 0;
653}
654
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300655static int ds3000_set_tone(struct dvb_frontend *fe, fe_sec_tone_mode_t tone)
656{
657 struct ds3000_state *state = fe->demodulator_priv;
658 u8 data;
659
660 dprintk("%s(%d)\n", __func__, tone);
661 if ((tone != SEC_TONE_ON) && (tone != SEC_TONE_OFF)) {
662 printk(KERN_ERR "%s: Invalid, tone=%d\n", __func__, tone);
663 return -EINVAL;
664 }
665
666 data = ds3000_readreg(state, 0xa2);
667 data &= ~0xc0;
668 ds3000_writereg(state, 0xa2, data);
669
670 switch (tone) {
671 case SEC_TONE_ON:
672 dprintk("%s: setting tone on\n", __func__);
673 data = ds3000_readreg(state, 0xa1);
674 data &= ~0x43;
675 data |= 0x04;
676 ds3000_writereg(state, 0xa1, data);
677 break;
678 case SEC_TONE_OFF:
679 dprintk("%s: setting tone off\n", __func__);
680 data = ds3000_readreg(state, 0xa2);
681 data |= 0x80;
682 ds3000_writereg(state, 0xa2, data);
683 break;
684 }
685
686 return 0;
687}
688
689static int ds3000_send_diseqc_msg(struct dvb_frontend *fe,
690 struct dvb_diseqc_master_cmd *d)
691{
692 struct ds3000_state *state = fe->demodulator_priv;
693 int i;
694 u8 data;
695
696 /* Dump DiSEqC message */
697 dprintk("%s(", __func__);
698 for (i = 0 ; i < d->msg_len;) {
699 dprintk("0x%02x", d->msg[i]);
700 if (++i < d->msg_len)
701 dprintk(", ");
702 }
703
704 /* enable DiSEqC message send pin */
705 data = ds3000_readreg(state, 0xa2);
706 data &= ~0xc0;
707 ds3000_writereg(state, 0xa2, data);
708
709 /* DiSEqC message */
710 for (i = 0; i < d->msg_len; i++)
711 ds3000_writereg(state, 0xa3 + i, d->msg[i]);
712
713 data = ds3000_readreg(state, 0xa1);
714 /* clear DiSEqC message length and status,
715 enable DiSEqC message send */
716 data &= ~0xf8;
717 /* set DiSEqC mode, modulation active during 33 pulses,
718 set DiSEqC message length */
719 data |= ((d->msg_len - 1) << 3) | 0x07;
720 ds3000_writereg(state, 0xa1, data);
721
722 /* wait up to 150ms for DiSEqC transmission to complete */
723 for (i = 0; i < 15; i++) {
724 data = ds3000_readreg(state, 0xa1);
725 if ((data & 0x40) == 0)
726 break;
727 msleep(10);
728 }
729
730 /* DiSEqC timeout after 150ms */
731 if (i == 15) {
732 data = ds3000_readreg(state, 0xa1);
733 data &= ~0x80;
734 data |= 0x40;
735 ds3000_writereg(state, 0xa1, data);
736
737 data = ds3000_readreg(state, 0xa2);
738 data &= ~0xc0;
739 data |= 0x80;
740 ds3000_writereg(state, 0xa2, data);
741
742 return 1;
743 }
744
745 data = ds3000_readreg(state, 0xa2);
746 data &= ~0xc0;
747 data |= 0x80;
748 ds3000_writereg(state, 0xa2, data);
749
750 return 0;
751}
752
753/* Send DiSEqC burst */
754static int ds3000_diseqc_send_burst(struct dvb_frontend *fe,
755 fe_sec_mini_cmd_t burst)
756{
757 struct ds3000_state *state = fe->demodulator_priv;
758 int i;
759 u8 data;
760
761 dprintk("%s()\n", __func__);
762
763 data = ds3000_readreg(state, 0xa2);
764 data &= ~0xc0;
765 ds3000_writereg(state, 0xa2, data);
766
767 /* DiSEqC burst */
768 if (burst == SEC_MINI_A)
769 /* Unmodulated tone burst */
770 ds3000_writereg(state, 0xa1, 0x02);
771 else if (burst == SEC_MINI_B)
772 /* Modulated tone burst */
773 ds3000_writereg(state, 0xa1, 0x01);
774 else
775 return -EINVAL;
776
777 msleep(13);
778 for (i = 0; i < 5; i++) {
779 data = ds3000_readreg(state, 0xa1);
780 if ((data & 0x40) == 0)
781 break;
782 msleep(1);
783 }
784
785 if (i == 5) {
786 data = ds3000_readreg(state, 0xa1);
787 data &= ~0x80;
788 data |= 0x40;
789 ds3000_writereg(state, 0xa1, data);
790
791 data = ds3000_readreg(state, 0xa2);
792 data &= ~0xc0;
793 data |= 0x80;
794 ds3000_writereg(state, 0xa2, data);
795
796 return 1;
797 }
798
799 data = ds3000_readreg(state, 0xa2);
800 data &= ~0xc0;
801 data |= 0x80;
802 ds3000_writereg(state, 0xa2, data);
803
804 return 0;
805}
806
807static void ds3000_release(struct dvb_frontend *fe)
808{
809 struct ds3000_state *state = fe->demodulator_priv;
810 dprintk("%s\n", __func__);
811 kfree(state);
812}
813
814static struct dvb_frontend_ops ds3000_ops;
815
816struct dvb_frontend *ds3000_attach(const struct ds3000_config *config,
817 struct i2c_adapter *i2c)
818{
819 struct ds3000_state *state = NULL;
820 int ret;
821
822 dprintk("%s\n", __func__);
823
824 /* allocate memory for the internal state */
Julia Lawall2ef17c92010-05-13 16:59:15 -0300825 state = kzalloc(sizeof(struct ds3000_state), GFP_KERNEL);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300826 if (state == NULL) {
827 printk(KERN_ERR "Unable to kmalloc\n");
828 goto error2;
829 }
830
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300831 state->config = config;
832 state->i2c = i2c;
833 state->prevUCBS2 = 0;
834
835 /* check if the demod is present */
836 ret = ds3000_readreg(state, 0x00) & 0xfe;
837 if (ret != 0xe0) {
838 printk(KERN_ERR "Invalid probe, probably not a DS3000\n");
839 goto error3;
840 }
841
842 printk(KERN_INFO "DS3000 chip version: %d.%d attached.\n",
843 ds3000_readreg(state, 0x02),
844 ds3000_readreg(state, 0x01));
845
846 memcpy(&state->frontend.ops, &ds3000_ops,
847 sizeof(struct dvb_frontend_ops));
848 state->frontend.demodulator_priv = state;
849 return &state->frontend;
850
851error3:
852 kfree(state);
853error2:
854 return NULL;
855}
856EXPORT_SYMBOL(ds3000_attach);
857
Igor M. Liplianina5bf8342011-02-25 18:41:24 -0300858static int ds3000_set_carrier_offset(struct dvb_frontend *fe,
859 s32 carrier_offset_khz)
860{
861 struct ds3000_state *state = fe->demodulator_priv;
862 s32 tmp;
863
864 tmp = carrier_offset_khz;
865 tmp *= 65536;
866 tmp = (2 * tmp + DS3000_SAMPLE_RATE) / (2 * DS3000_SAMPLE_RATE);
867
868 if (tmp < 0)
869 tmp += 65536;
870
871 ds3000_writereg(state, 0x5f, tmp >> 8);
872 ds3000_writereg(state, 0x5e, tmp & 0xff);
873
874 return 0;
875}
876
Mauro Carvalho Chehab9fe33012011-12-26 10:03:29 -0300877static int ds3000_set_frontend(struct dvb_frontend *fe)
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300878{
879 struct ds3000_state *state = fe->demodulator_priv;
880 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
881
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300882 int i;
Igor M. Liplianindcc8a122011-02-25 18:41:24 -0300883 fe_status_t status;
Igor M. Liplianina5bf8342011-02-25 18:41:24 -0300884 s32 offset_khz;
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -0300885 u32 frequency;
886 u16 value;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300887
888 dprintk("%s() ", __func__);
889
Igor M. Liplianin0cb73632011-02-25 18:41:24 -0300890 if (state->config->set_ts_params)
891 state->config->set_ts_params(fe, 0);
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300892 /* Tune */
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -0300893 if (fe->ops.tuner_ops.set_params)
894 fe->ops.tuner_ops.set_params(fe);
Igor M. Liplianina5bf8342011-02-25 18:41:24 -0300895
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300896 /* ds3000 global reset */
897 ds3000_writereg(state, 0x07, 0x80);
898 ds3000_writereg(state, 0x07, 0x00);
899 /* ds3000 build-in uC reset */
900 ds3000_writereg(state, 0xb2, 0x01);
901 /* ds3000 software reset */
902 ds3000_writereg(state, 0x00, 0x01);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300903
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300904 switch (c->delivery_system) {
905 case SYS_DVBS:
906 /* initialise the demod in DVB-S mode */
907 for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
908 ds3000_writereg(state,
909 ds3000_dvbs_init_tab[i],
910 ds3000_dvbs_init_tab[i + 1]);
911 value = ds3000_readreg(state, 0xfe);
912 value &= 0xc0;
913 value |= 0x1b;
914 ds3000_writereg(state, 0xfe, value);
915 break;
916 case SYS_DVBS2:
917 /* initialise the demod in DVB-S2 mode */
918 for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
919 ds3000_writereg(state,
920 ds3000_dvbs2_init_tab[i],
921 ds3000_dvbs2_init_tab[i + 1]);
Igor M. Liplianin7b134e82012-05-11 11:45:42 -0300922 if (c->symbol_rate >= 30000000)
923 ds3000_writereg(state, 0xfe, 0x54);
924 else
925 ds3000_writereg(state, 0xfe, 0x98);
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300926 break;
927 default:
928 return 1;
929 }
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300930
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300931 /* enable 27MHz clock output */
932 ds3000_writereg(state, 0x29, 0x80);
933 /* enable ac coupling */
934 ds3000_writereg(state, 0x25, 0x8a);
935
936 /* enhance symbol rate performance */
Igor M. Liplianincb8f74d2011-02-25 18:41:24 -0300937 if ((c->symbol_rate / 1000) <= 5000) {
938 value = 29777 / (c->symbol_rate / 1000) + 1;
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300939 if (value % 2 != 0)
940 value++;
941 ds3000_writereg(state, 0xc3, 0x0d);
942 ds3000_writereg(state, 0xc8, value);
943 ds3000_writereg(state, 0xc4, 0x10);
944 ds3000_writereg(state, 0xc7, 0x0e);
Igor M. Liplianincb8f74d2011-02-25 18:41:24 -0300945 } else if ((c->symbol_rate / 1000) <= 10000) {
946 value = 92166 / (c->symbol_rate / 1000) + 1;
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300947 if (value % 2 != 0)
948 value++;
949 ds3000_writereg(state, 0xc3, 0x07);
950 ds3000_writereg(state, 0xc8, value);
951 ds3000_writereg(state, 0xc4, 0x09);
952 ds3000_writereg(state, 0xc7, 0x12);
Igor M. Liplianincb8f74d2011-02-25 18:41:24 -0300953 } else if ((c->symbol_rate / 1000) <= 20000) {
954 value = 64516 / (c->symbol_rate / 1000) + 1;
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300955 ds3000_writereg(state, 0xc3, value);
956 ds3000_writereg(state, 0xc8, 0x0e);
957 ds3000_writereg(state, 0xc4, 0x07);
958 ds3000_writereg(state, 0xc7, 0x18);
959 } else {
Igor M. Liplianincb8f74d2011-02-25 18:41:24 -0300960 value = 129032 / (c->symbol_rate / 1000) + 1;
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300961 ds3000_writereg(state, 0xc3, value);
962 ds3000_writereg(state, 0xc8, 0x0a);
963 ds3000_writereg(state, 0xc4, 0x05);
964 ds3000_writereg(state, 0xc7, 0x24);
965 }
966
967 /* normalized symbol rate rounded to the closest integer */
Igor M. Liplianincb8f74d2011-02-25 18:41:24 -0300968 value = (((c->symbol_rate / 1000) << 16) +
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300969 (DS3000_SAMPLE_RATE / 2)) / DS3000_SAMPLE_RATE;
970 ds3000_writereg(state, 0x61, value & 0x00ff);
971 ds3000_writereg(state, 0x62, (value & 0xff00) >> 8);
972
973 /* co-channel interference cancellation disabled */
974 ds3000_writereg(state, 0x56, 0x00);
975
976 /* equalizer disabled */
977 ds3000_writereg(state, 0x76, 0x00);
978
979 /*ds3000_writereg(state, 0x08, 0x03);
980 ds3000_writereg(state, 0xfd, 0x22);
981 ds3000_writereg(state, 0x08, 0x07);
982 ds3000_writereg(state, 0xfd, 0x42);
983 ds3000_writereg(state, 0x08, 0x07);*/
984
985 if (state->config->ci_mode) {
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300986 switch (c->delivery_system) {
987 case SYS_DVBS:
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -0300988 default:
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300989 ds3000_writereg(state, 0xfd, 0x80);
990 break;
991 case SYS_DVBS2:
992 ds3000_writereg(state, 0xfd, 0x01);
Igor M. Liplianind2ffc442011-02-25 18:41:22 -0300993 break;
Igor M. Liplianind2ffc442011-02-25 18:41:22 -0300994 }
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300995 }
Igor M. Liplianind2ffc442011-02-25 18:41:22 -0300996
Igor M. Liplianin18a73f32011-02-25 18:41:23 -0300997 /* ds3000 out of software reset */
998 ds3000_writereg(state, 0x00, 0x00);
999 /* start ds3000 build-in uC */
1000 ds3000_writereg(state, 0xb2, 0x00);
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001001
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03001002 if (fe->ops.tuner_ops.get_frequency) {
1003 fe->ops.tuner_ops.get_frequency(fe, &frequency);
1004 offset_khz = frequency - c->frequency;
1005 ds3000_set_carrier_offset(fe, offset_khz);
1006 }
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001007
Igor M. Liplianin18a73f32011-02-25 18:41:23 -03001008 for (i = 0; i < 30 ; i++) {
1009 ds3000_read_status(fe, &status);
Dan Carpenter3a9888f2012-01-17 03:28:51 -03001010 if (status & FE_HAS_LOCK)
Igor M. Liplianin18a73f32011-02-25 18:41:23 -03001011 break;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001012
Igor M. Liplianin18a73f32011-02-25 18:41:23 -03001013 msleep(10);
1014 }
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001015
Igor M. Liplianin18a73f32011-02-25 18:41:23 -03001016 return 0;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001017}
1018
Igor M. Liplianindcc8a122011-02-25 18:41:24 -03001019static int ds3000_tune(struct dvb_frontend *fe,
Mauro Carvalho Chehab7e072222011-12-26 17:48:33 -03001020 bool re_tune,
Igor M. Liplianin738e8ff2011-02-27 17:29:55 -03001021 unsigned int mode_flags,
1022 unsigned int *delay,
1023 fe_status_t *status)
Igor M. Liplianindcc8a122011-02-25 18:41:24 -03001024{
Mauro Carvalho Chehab7e072222011-12-26 17:48:33 -03001025 if (re_tune) {
Mauro Carvalho Chehab9fe33012011-12-26 10:03:29 -03001026 int ret = ds3000_set_frontend(fe);
Igor M. Liplianin738e8ff2011-02-27 17:29:55 -03001027 if (ret)
1028 return ret;
1029 }
1030
1031 *delay = HZ / 5;
1032
1033 return ds3000_read_status(fe, status);
Igor M. Liplianindcc8a122011-02-25 18:41:24 -03001034}
1035
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001036static enum dvbfe_algo ds3000_get_algo(struct dvb_frontend *fe)
1037{
1038 dprintk("%s()\n", __func__);
Igor M. Liplianindcc8a122011-02-25 18:41:24 -03001039 return DVBFE_ALGO_HW;
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001040}
1041
1042/*
1043 * Initialise or wake up device
1044 *
1045 * Power config will reset and load initial firmware if required
1046 */
1047static int ds3000_initfe(struct dvb_frontend *fe)
1048{
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001049 struct ds3000_state *state = fe->demodulator_priv;
1050 int ret;
1051
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001052 dprintk("%s()\n", __func__);
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001053 /* hard reset */
1054 ds3000_writereg(state, 0x08, 0x01 | ds3000_readreg(state, 0x08));
1055 msleep(1);
1056
Igor M. Liplianinb9bf2ea2011-02-01 19:40:36 -03001057 /* Load the firmware if required */
1058 ret = ds3000_firmware_ondemand(fe);
1059 if (ret != 0) {
1060 printk(KERN_ERR "%s: Unable initialize firmware\n", __func__);
1061 return ret;
1062 }
Igor M. Liplianina0ea298d52011-02-01 19:40:03 -03001063
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001064 return 0;
1065}
1066
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001067static struct dvb_frontend_ops ds3000_ops = {
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03001068 .delsys = { SYS_DVBS, SYS_DVBS2 },
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001069 .info = {
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03001070 .name = "Montage Technology DS3000",
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001071 .frequency_min = 950000,
1072 .frequency_max = 2150000,
1073 .frequency_stepsize = 1011, /* kHz for QPSK frontends */
1074 .frequency_tolerance = 5000,
1075 .symbol_rate_min = 1000000,
1076 .symbol_rate_max = 45000000,
1077 .caps = FE_CAN_INVERSION_AUTO |
1078 FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
1079 FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
1080 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
1081 FE_CAN_2G_MODULATION |
1082 FE_CAN_QPSK | FE_CAN_RECOVER
1083 },
1084
1085 .release = ds3000_release,
1086
1087 .init = ds3000_initfe,
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03001088 .i2c_gate_ctrl = ds3000_i2c_gate_ctrl,
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001089 .read_status = ds3000_read_status,
1090 .read_ber = ds3000_read_ber,
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001091 .read_snr = ds3000_read_snr,
1092 .read_ucblocks = ds3000_read_ucblocks,
Igor M. Liplianind2ffc442011-02-25 18:41:22 -03001093 .set_voltage = ds3000_set_voltage,
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001094 .set_tone = ds3000_set_tone,
1095 .diseqc_send_master_cmd = ds3000_send_diseqc_msg,
1096 .diseqc_send_burst = ds3000_diseqc_send_burst,
1097 .get_frontend_algo = ds3000_get_algo,
1098
Mauro Carvalho Chehab9fe33012011-12-26 10:03:29 -03001099 .set_frontend = ds3000_set_frontend,
Igor M. Liplianindcc8a122011-02-25 18:41:24 -03001100 .tune = ds3000_tune,
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001101};
1102
1103module_param(debug, int, 0644);
1104MODULE_PARM_DESC(debug, "Activates frontend debugging (default:0)");
1105
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001106MODULE_DESCRIPTION("DVB Frontend module for Montage Technology "
Konstantin Dimitrovc1965ea2012-12-23 19:25:09 -03001107 "DS3000 hardware");
1108MODULE_AUTHOR("Konstantin Dimitrov <kosio.dimitrov@gmail.com>");
Igor M. Liplianin09ea33e2009-11-24 20:16:04 -03001109MODULE_LICENSE("GPL");
Rémi Cardonafeadd7d2012-09-28 08:59:26 -03001110MODULE_FIRMWARE(DS3000_DEFAULT_FIRMWARE);