2 Driver for ST STV0288 demodulator
3 Copyright (C) 2006 Georg Acher, BayCom GmbH, acher (at) baycom (dot) de
5 Copyright (C) 2008 TurboSight.com, Bob Liu <bob@turbosight.com>
6 Copyright (C) 2008 Igor M. Liplianin <liplianin@me.by>
7 Removed stb6000 specific tuner code and revised some
9 2010-09-01 Josef Pavlik <josef@pavlik.it>
10 Fixed diseqc_msg, diseqc_burst and set_tone problems
12 This program is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #include <linux/init.h>
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/string.h>
32 #include <linux/slab.h>
33 #include <linux/jiffies.h>
34 #include <asm/div64.h>
36 #include "dvb_frontend.h"
39 struct stv0288_state
{
40 struct i2c_adapter
*i2c
;
41 const struct stv0288_config
*config
;
42 struct dvb_frontend frontend
;
47 fe_code_rate_t fec_inner
;
52 #define STATUS_UCBLOCKS 1
55 static int debug_legacy_dish_switch
;
56 #define dprintk(args...) \
59 printk(KERN_DEBUG "stv0288: " args); \
63 static int stv0288_writeregI(struct stv0288_state
*state
, u8 reg
, u8 data
)
66 u8 buf
[] = { reg
, data
};
67 struct i2c_msg msg
= {
68 .addr
= state
->config
->demod_address
,
74 ret
= i2c_transfer(state
->i2c
, &msg
, 1);
77 dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, "
78 "ret == %i)\n", __func__
, reg
, data
, ret
);
80 return (ret
!= 1) ? -EREMOTEIO
: 0;
83 static int stv0288_write(struct dvb_frontend
*fe
, const u8 buf
[], int len
)
85 struct stv0288_state
*state
= fe
->demodulator_priv
;
90 return stv0288_writeregI(state
, buf
[0], buf
[1]);
93 static u8
stv0288_readreg(struct stv0288_state
*state
, u8 reg
)
98 struct i2c_msg msg
[] = {
100 .addr
= state
->config
->demod_address
,
105 .addr
= state
->config
->demod_address
,
112 ret
= i2c_transfer(state
->i2c
, msg
, 2);
115 dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
121 static int stv0288_set_symbolrate(struct dvb_frontend
*fe
, u32 srate
)
123 struct stv0288_state
*state
= fe
->demodulator_priv
;
127 if ((srate
< 1000000) || (srate
> 45000000))
130 temp
= (unsigned int)srate
/ 1000;
135 b
[0] = (unsigned char)((temp
>> 12) & 0xff);
136 b
[1] = (unsigned char)((temp
>> 4) & 0xff);
137 b
[2] = (unsigned char)((temp
<< 4) & 0xf0);
138 stv0288_writeregI(state
, 0x28, 0x80); /* SFRH */
139 stv0288_writeregI(state
, 0x29, 0); /* SFRM */
140 stv0288_writeregI(state
, 0x2a, 0); /* SFRL */
142 stv0288_writeregI(state
, 0x28, b
[0]);
143 stv0288_writeregI(state
, 0x29, b
[1]);
144 stv0288_writeregI(state
, 0x2a, b
[2]);
145 dprintk("stv0288: stv0288_set_symbolrate\n");
150 static int stv0288_send_diseqc_msg(struct dvb_frontend
*fe
,
151 struct dvb_diseqc_master_cmd
*m
)
153 struct stv0288_state
*state
= fe
->demodulator_priv
;
157 dprintk("%s\n", __func__
);
159 stv0288_writeregI(state
, 0x09, 0);
161 stv0288_writeregI(state
, 0x05, 0x12);/* modulated mode, single shot */
163 for (i
= 0; i
< m
->msg_len
; i
++) {
164 if (stv0288_writeregI(state
, 0x06, m
->msg
[i
]))
167 msleep(m
->msg_len
*12);
171 static int stv0288_send_diseqc_burst(struct dvb_frontend
*fe
,
172 fe_sec_mini_cmd_t burst
)
174 struct stv0288_state
*state
= fe
->demodulator_priv
;
176 dprintk("%s\n", __func__
);
178 if (stv0288_writeregI(state
, 0x05, 0x03))/* burst mode, single shot */
181 if (stv0288_writeregI(state
, 0x06, burst
== SEC_MINI_A
? 0x00 : 0xff))
185 if (stv0288_writeregI(state
, 0x05, 0x12))
191 static int stv0288_set_tone(struct dvb_frontend
*fe
, fe_sec_tone_mode_t tone
)
193 struct stv0288_state
*state
= fe
->demodulator_priv
;
197 if (stv0288_writeregI(state
, 0x05, 0x10))/* cont carrier */
202 if (stv0288_writeregI(state
, 0x05, 0x12))/* burst mode off*/
212 static u8 stv0288_inittab
[] = {
321 static int stv0288_set_voltage(struct dvb_frontend
*fe
, fe_sec_voltage_t volt
)
323 dprintk("%s: %s\n", __func__
,
324 volt
== SEC_VOLTAGE_13
? "SEC_VOLTAGE_13" :
325 volt
== SEC_VOLTAGE_18
? "SEC_VOLTAGE_18" : "??");
330 static int stv0288_init(struct dvb_frontend
*fe
)
332 struct stv0288_state
*state
= fe
->demodulator_priv
;
337 dprintk("stv0288: init chip\n");
338 stv0288_writeregI(state
, 0x41, 0x04);
341 /* we have default inittab */
342 if (state
->config
->inittab
== NULL
) {
343 for (i
= 0; !(stv0288_inittab
[i
] == 0xff &&
344 stv0288_inittab
[i
+ 1] == 0xff); i
+= 2)
345 stv0288_writeregI(state
, stv0288_inittab
[i
],
346 stv0288_inittab
[i
+ 1]);
348 for (i
= 0; ; i
+= 2) {
349 reg
= state
->config
->inittab
[i
];
350 val
= state
->config
->inittab
[i
+1];
351 if (reg
== 0xff && val
== 0xff)
353 stv0288_writeregI(state
, reg
, val
);
359 static int stv0288_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
361 struct stv0288_state
*state
= fe
->demodulator_priv
;
363 u8 sync
= stv0288_readreg(state
, 0x24);
367 dprintk("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __func__
, sync
);
371 if ((sync
& 0x08) == 0x08) {
372 *status
|= FE_HAS_LOCK
;
373 dprintk("stv0288 has locked\n");
379 static int stv0288_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
381 struct stv0288_state
*state
= fe
->demodulator_priv
;
383 if (state
->errmode
!= STATUS_BER
)
385 *ber
= (stv0288_readreg(state
, 0x26) << 8) |
386 stv0288_readreg(state
, 0x27);
387 dprintk("stv0288_read_ber %d\n", *ber
);
393 static int stv0288_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
395 struct stv0288_state
*state
= fe
->demodulator_priv
;
397 s32 signal
= 0xffff - ((stv0288_readreg(state
, 0x10) << 8));
400 signal
= signal
* 5 / 4;
401 *strength
= (signal
> 0xffff) ? 0xffff : (signal
< 0) ? 0 : signal
;
402 dprintk("stv0288_read_signal_strength %d\n", *strength
);
406 static int stv0288_sleep(struct dvb_frontend
*fe
)
408 struct stv0288_state
*state
= fe
->demodulator_priv
;
410 stv0288_writeregI(state
, 0x41, 0x84);
411 state
->initialised
= 0;
415 static int stv0288_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
417 struct stv0288_state
*state
= fe
->demodulator_priv
;
419 s32 xsnr
= 0xffff - ((stv0288_readreg(state
, 0x2d) << 8)
420 | stv0288_readreg(state
, 0x2e));
421 xsnr
= 3 * (xsnr
- 0xa100);
422 *snr
= (xsnr
> 0xffff) ? 0xffff : (xsnr
< 0) ? 0 : xsnr
;
423 dprintk("stv0288_read_snr %d\n", *snr
);
428 static int stv0288_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
430 struct stv0288_state
*state
= fe
->demodulator_priv
;
432 if (state
->errmode
!= STATUS_BER
)
434 *ucblocks
= (stv0288_readreg(state
, 0x26) << 8) |
435 stv0288_readreg(state
, 0x27);
436 dprintk("stv0288_read_ber %d\n", *ucblocks
);
441 static int stv0288_set_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
443 dprintk("%s(..)\n", __func__
);
447 static int stv0288_get_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
449 dprintk("%s(..)\n", __func__
);
453 static int stv0288_set_frontend(struct dvb_frontend
*fe
,
454 struct dvb_frontend_parameters
*dfp
)
456 struct stv0288_state
*state
= fe
->demodulator_priv
;
457 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
460 unsigned char tda
[3];
462 dprintk("%s : FE_SET_FRONTEND\n", __func__
);
464 if (c
->delivery_system
!= SYS_DVBS
) {
465 dprintk("%s: unsupported delivery "
466 "system selected (%d)\n",
467 __func__
, c
->delivery_system
);
471 if (state
->config
->set_ts_params
)
472 state
->config
->set_ts_params(fe
, 0);
474 /* only frequency & symbol_rate are used for tuner*/
475 dfp
->frequency
= c
->frequency
;
476 dfp
->u
.qpsk
.symbol_rate
= c
->symbol_rate
;
477 if (fe
->ops
.tuner_ops
.set_params
) {
478 fe
->ops
.tuner_ops
.set_params(fe
, dfp
);
479 if (fe
->ops
.i2c_gate_ctrl
)
480 fe
->ops
.i2c_gate_ctrl(fe
, 0);
484 stv0288_set_symbolrate(fe
, c
->symbol_rate
);
485 /* Carrier lock control register */
486 stv0288_writeregI(state
, 0x15, 0xc5);
488 tda
[0] = 0x2b; /* CFRM */
489 tda
[2] = 0x0; /* CFRL */
490 for (tm
= -6; tm
< 7;) {
492 if (stv0288_readreg(state
, 0x24) & 0x8)
498 tda
[1] = (unsigned char)tm
;
499 stv0288_writeregI(state
, 0x2b, tda
[1]);
500 stv0288_writeregI(state
, 0x2c, tda
[2]);
504 state
->tuner_frequency
= c
->frequency
;
505 state
->fec_inner
= FEC_AUTO
;
506 state
->symbol_rate
= c
->symbol_rate
;
511 static int stv0288_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
513 struct stv0288_state
*state
= fe
->demodulator_priv
;
516 stv0288_writeregI(state
, 0x01, 0xb5);
518 stv0288_writeregI(state
, 0x01, 0x35);
525 static void stv0288_release(struct dvb_frontend
*fe
)
527 struct stv0288_state
*state
= fe
->demodulator_priv
;
531 static struct dvb_frontend_ops stv0288_ops
= {
534 .name
= "ST STV0288 DVB-S",
536 .frequency_min
= 950000,
537 .frequency_max
= 2150000,
538 .frequency_stepsize
= 1000, /* kHz for QPSK frontends */
539 .frequency_tolerance
= 0,
540 .symbol_rate_min
= 1000000,
541 .symbol_rate_max
= 45000000,
542 .symbol_rate_tolerance
= 500, /* ppm */
543 .caps
= FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
544 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
|
549 .release
= stv0288_release
,
550 .init
= stv0288_init
,
551 .sleep
= stv0288_sleep
,
552 .write
= stv0288_write
,
553 .i2c_gate_ctrl
= stv0288_i2c_gate_ctrl
,
554 .read_status
= stv0288_read_status
,
555 .read_ber
= stv0288_read_ber
,
556 .read_signal_strength
= stv0288_read_signal_strength
,
557 .read_snr
= stv0288_read_snr
,
558 .read_ucblocks
= stv0288_read_ucblocks
,
559 .diseqc_send_master_cmd
= stv0288_send_diseqc_msg
,
560 .diseqc_send_burst
= stv0288_send_diseqc_burst
,
561 .set_tone
= stv0288_set_tone
,
562 .set_voltage
= stv0288_set_voltage
,
564 .set_property
= stv0288_set_property
,
565 .get_property
= stv0288_get_property
,
566 .set_frontend
= stv0288_set_frontend
,
569 struct dvb_frontend
*stv0288_attach(const struct stv0288_config
*config
,
570 struct i2c_adapter
*i2c
)
572 struct stv0288_state
*state
= NULL
;
575 /* allocate memory for the internal state */
576 state
= kzalloc(sizeof(struct stv0288_state
), GFP_KERNEL
);
580 /* setup the state */
581 state
->config
= config
;
583 state
->initialised
= 0;
584 state
->tuner_frequency
= 0;
585 state
->symbol_rate
= 0;
586 state
->fec_inner
= 0;
587 state
->errmode
= STATUS_BER
;
589 stv0288_writeregI(state
, 0x41, 0x04);
591 id
= stv0288_readreg(state
, 0x00);
592 dprintk("stv0288 id %x\n", id
);
594 /* register 0x00 contains 0x11 for STV0288 */
598 /* create dvb_frontend */
599 memcpy(&state
->frontend
.ops
, &stv0288_ops
,
600 sizeof(struct dvb_frontend_ops
));
601 state
->frontend
.demodulator_priv
= state
;
602 return &state
->frontend
;
609 EXPORT_SYMBOL(stv0288_attach
);
611 module_param(debug_legacy_dish_switch
, int, 0444);
612 MODULE_PARM_DESC(debug_legacy_dish_switch
,
613 "Enable timing analysis for Dish Network legacy switches");
615 module_param(debug
, int, 0644);
616 MODULE_PARM_DESC(debug
, "Turn on/off frontend debugging (default:off).");
618 MODULE_DESCRIPTION("ST STV0288 DVB Demodulator driver");
619 MODULE_AUTHOR("Georg Acher, Bob Liu, Igor liplianin");
620 MODULE_LICENSE("GPL");