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 *status
|= FE_HAS_CARRIER
| FE_HAS_SIGNAL
;
373 *status
|= FE_HAS_VITERBI
;
375 *status
|= FE_HAS_LOCK
;
376 dprintk("stv0288 has locked\n");
382 static int stv0288_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
384 struct stv0288_state
*state
= fe
->demodulator_priv
;
386 if (state
->errmode
!= STATUS_BER
)
388 *ber
= (stv0288_readreg(state
, 0x26) << 8) |
389 stv0288_readreg(state
, 0x27);
390 dprintk("stv0288_read_ber %d\n", *ber
);
396 static int stv0288_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
398 struct stv0288_state
*state
= fe
->demodulator_priv
;
400 s32 signal
= 0xffff - ((stv0288_readreg(state
, 0x10) << 8));
403 signal
= signal
* 5 / 4;
404 *strength
= (signal
> 0xffff) ? 0xffff : (signal
< 0) ? 0 : signal
;
405 dprintk("stv0288_read_signal_strength %d\n", *strength
);
409 static int stv0288_sleep(struct dvb_frontend
*fe
)
411 struct stv0288_state
*state
= fe
->demodulator_priv
;
413 stv0288_writeregI(state
, 0x41, 0x84);
414 state
->initialised
= 0;
418 static int stv0288_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
420 struct stv0288_state
*state
= fe
->demodulator_priv
;
422 s32 xsnr
= 0xffff - ((stv0288_readreg(state
, 0x2d) << 8)
423 | stv0288_readreg(state
, 0x2e));
424 xsnr
= 3 * (xsnr
- 0xa100);
425 *snr
= (xsnr
> 0xffff) ? 0xffff : (xsnr
< 0) ? 0 : xsnr
;
426 dprintk("stv0288_read_snr %d\n", *snr
);
431 static int stv0288_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
433 struct stv0288_state
*state
= fe
->demodulator_priv
;
435 if (state
->errmode
!= STATUS_BER
)
437 *ucblocks
= (stv0288_readreg(state
, 0x26) << 8) |
438 stv0288_readreg(state
, 0x27);
439 dprintk("stv0288_read_ber %d\n", *ucblocks
);
444 static int stv0288_set_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
446 dprintk("%s(..)\n", __func__
);
450 static int stv0288_get_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
452 dprintk("%s(..)\n", __func__
);
456 static int stv0288_set_frontend(struct dvb_frontend
*fe
,
457 struct dvb_frontend_parameters
*dfp
)
459 struct stv0288_state
*state
= fe
->demodulator_priv
;
460 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
463 unsigned char tda
[3];
465 dprintk("%s : FE_SET_FRONTEND\n", __func__
);
467 if (c
->delivery_system
!= SYS_DVBS
) {
468 dprintk("%s: unsupported delivery "
469 "system selected (%d)\n",
470 __func__
, c
->delivery_system
);
474 if (state
->config
->set_ts_params
)
475 state
->config
->set_ts_params(fe
, 0);
477 /* only frequency & symbol_rate are used for tuner*/
478 dfp
->frequency
= c
->frequency
;
479 dfp
->u
.qpsk
.symbol_rate
= c
->symbol_rate
;
480 if (fe
->ops
.tuner_ops
.set_params
) {
481 fe
->ops
.tuner_ops
.set_params(fe
, dfp
);
482 if (fe
->ops
.i2c_gate_ctrl
)
483 fe
->ops
.i2c_gate_ctrl(fe
, 0);
487 stv0288_set_symbolrate(fe
, c
->symbol_rate
);
488 /* Carrier lock control register */
489 stv0288_writeregI(state
, 0x15, 0xc5);
491 tda
[0] = 0x2b; /* CFRM */
492 tda
[2] = 0x0; /* CFRL */
493 for (tm
= -6; tm
< 7;) {
495 if (stv0288_readreg(state
, 0x24) & 0x8)
501 tda
[1] = (unsigned char)tm
;
502 stv0288_writeregI(state
, 0x2b, tda
[1]);
503 stv0288_writeregI(state
, 0x2c, tda
[2]);
507 state
->tuner_frequency
= c
->frequency
;
508 state
->fec_inner
= FEC_AUTO
;
509 state
->symbol_rate
= c
->symbol_rate
;
514 static int stv0288_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
516 struct stv0288_state
*state
= fe
->demodulator_priv
;
519 stv0288_writeregI(state
, 0x01, 0xb5);
521 stv0288_writeregI(state
, 0x01, 0x35);
528 static void stv0288_release(struct dvb_frontend
*fe
)
530 struct stv0288_state
*state
= fe
->demodulator_priv
;
534 static struct dvb_frontend_ops stv0288_ops
= {
537 .name
= "ST STV0288 DVB-S",
539 .frequency_min
= 950000,
540 .frequency_max
= 2150000,
541 .frequency_stepsize
= 1000, /* kHz for QPSK frontends */
542 .frequency_tolerance
= 0,
543 .symbol_rate_min
= 1000000,
544 .symbol_rate_max
= 45000000,
545 .symbol_rate_tolerance
= 500, /* ppm */
546 .caps
= FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
547 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
|
552 .release
= stv0288_release
,
553 .init
= stv0288_init
,
554 .sleep
= stv0288_sleep
,
555 .write
= stv0288_write
,
556 .i2c_gate_ctrl
= stv0288_i2c_gate_ctrl
,
557 .read_status
= stv0288_read_status
,
558 .read_ber
= stv0288_read_ber
,
559 .read_signal_strength
= stv0288_read_signal_strength
,
560 .read_snr
= stv0288_read_snr
,
561 .read_ucblocks
= stv0288_read_ucblocks
,
562 .diseqc_send_master_cmd
= stv0288_send_diseqc_msg
,
563 .diseqc_send_burst
= stv0288_send_diseqc_burst
,
564 .set_tone
= stv0288_set_tone
,
565 .set_voltage
= stv0288_set_voltage
,
567 .set_property
= stv0288_set_property
,
568 .get_property
= stv0288_get_property
,
569 .set_frontend
= stv0288_set_frontend
,
572 struct dvb_frontend
*stv0288_attach(const struct stv0288_config
*config
,
573 struct i2c_adapter
*i2c
)
575 struct stv0288_state
*state
= NULL
;
578 /* allocate memory for the internal state */
579 state
= kzalloc(sizeof(struct stv0288_state
), GFP_KERNEL
);
583 /* setup the state */
584 state
->config
= config
;
586 state
->initialised
= 0;
587 state
->tuner_frequency
= 0;
588 state
->symbol_rate
= 0;
589 state
->fec_inner
= 0;
590 state
->errmode
= STATUS_BER
;
592 stv0288_writeregI(state
, 0x41, 0x04);
594 id
= stv0288_readreg(state
, 0x00);
595 dprintk("stv0288 id %x\n", id
);
597 /* register 0x00 contains 0x11 for STV0288 */
601 /* create dvb_frontend */
602 memcpy(&state
->frontend
.ops
, &stv0288_ops
,
603 sizeof(struct dvb_frontend_ops
));
604 state
->frontend
.demodulator_priv
= state
;
605 return &state
->frontend
;
612 EXPORT_SYMBOL(stv0288_attach
);
614 module_param(debug_legacy_dish_switch
, int, 0444);
615 MODULE_PARM_DESC(debug_legacy_dish_switch
,
616 "Enable timing analysis for Dish Network legacy switches");
618 module_param(debug
, int, 0644);
619 MODULE_PARM_DESC(debug
, "Turn on/off frontend debugging (default:off).");
621 MODULE_DESCRIPTION("ST STV0288 DVB Demodulator driver");
622 MODULE_AUTHOR("Georg Acher, Bob Liu, Igor liplianin");
623 MODULE_LICENSE("GPL");