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
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <linux/init.h>
27 #include <linux/kernel.h>
28 #include <linux/module.h>
29 #include <linux/string.h>
30 #include <linux/slab.h>
31 #include <linux/jiffies.h>
32 #include <asm/div64.h>
34 #include "dvb_frontend.h"
37 struct stv0288_state
{
38 struct i2c_adapter
*i2c
;
39 const struct stv0288_config
*config
;
40 struct dvb_frontend frontend
;
45 fe_code_rate_t fec_inner
;
50 #define STATUS_UCBLOCKS 1
53 static int debug_legacy_dish_switch
;
54 #define dprintk(args...) \
57 printk(KERN_DEBUG "stv0288: " args); \
61 static int stv0288_writeregI(struct stv0288_state
*state
, u8 reg
, u8 data
)
64 u8 buf
[] = { reg
, data
};
65 struct i2c_msg msg
= {
66 .addr
= state
->config
->demod_address
,
72 ret
= i2c_transfer(state
->i2c
, &msg
, 1);
75 dprintk("%s: writereg error (reg == 0x%02x, val == 0x%02x, "
76 "ret == %i)\n", __func__
, reg
, data
, ret
);
78 return (ret
!= 1) ? -EREMOTEIO
: 0;
81 static int stv0288_write(struct dvb_frontend
*fe
, u8
*buf
, int len
)
83 struct stv0288_state
*state
= fe
->demodulator_priv
;
88 return stv0288_writeregI(state
, buf
[0], buf
[1]);
91 static u8
stv0288_readreg(struct stv0288_state
*state
, u8 reg
)
96 struct i2c_msg msg
[] = {
98 .addr
= state
->config
->demod_address
,
103 .addr
= state
->config
->demod_address
,
110 ret
= i2c_transfer(state
->i2c
, msg
, 2);
113 dprintk("%s: readreg error (reg == 0x%02x, ret == %i)\n",
119 static int stv0288_set_symbolrate(struct dvb_frontend
*fe
, u32 srate
)
121 struct stv0288_state
*state
= fe
->demodulator_priv
;
125 if ((srate
< 1000000) || (srate
> 45000000))
128 temp
= (unsigned int)srate
/ 1000;
133 b
[0] = (unsigned char)((temp
>> 12) & 0xff);
134 b
[1] = (unsigned char)((temp
>> 4) & 0xff);
135 b
[2] = (unsigned char)((temp
<< 4) & 0xf0);
136 stv0288_writeregI(state
, 0x28, 0x80); /* SFRH */
137 stv0288_writeregI(state
, 0x29, 0); /* SFRM */
138 stv0288_writeregI(state
, 0x2a, 0); /* SFRL */
140 stv0288_writeregI(state
, 0x28, b
[0]);
141 stv0288_writeregI(state
, 0x29, b
[1]);
142 stv0288_writeregI(state
, 0x2a, b
[2]);
143 dprintk("stv0288: stv0288_set_symbolrate\n");
148 static int stv0288_send_diseqc_msg(struct dvb_frontend
*fe
,
149 struct dvb_diseqc_master_cmd
*m
)
151 struct stv0288_state
*state
= fe
->demodulator_priv
;
155 dprintk("%s\n", __func__
);
157 stv0288_writeregI(state
, 0x09, 0);
159 stv0288_writeregI(state
, 0x05, 0x16);
161 for (i
= 0; i
< m
->msg_len
; i
++) {
162 if (stv0288_writeregI(state
, 0x06, m
->msg
[i
]))
170 static int stv0288_send_diseqc_burst(struct dvb_frontend
*fe
,
171 fe_sec_mini_cmd_t burst
)
173 struct stv0288_state
*state
= fe
->demodulator_priv
;
175 dprintk("%s\n", __func__
);
177 if (stv0288_writeregI(state
, 0x05, 0x16))/* burst mode */
180 if (stv0288_writeregI(state
, 0x06, burst
== SEC_MINI_A
? 0x00 : 0xff))
183 if (stv0288_writeregI(state
, 0x06, 0x12))
189 static int stv0288_set_tone(struct dvb_frontend
*fe
, fe_sec_tone_mode_t tone
)
191 struct stv0288_state
*state
= fe
->demodulator_priv
;
195 if (stv0288_writeregI(state
, 0x05, 0x10))/* burst mode */
197 return stv0288_writeregI(state
, 0x06, 0xff);
200 if (stv0288_writeregI(state
, 0x05, 0x13))/* burst mode */
202 return stv0288_writeregI(state
, 0x06, 0x00);
209 static u8 stv0288_inittab
[] = {
318 static int stv0288_set_voltage(struct dvb_frontend
*fe
, fe_sec_voltage_t volt
)
320 dprintk("%s: %s\n", __func__
,
321 volt
== SEC_VOLTAGE_13
? "SEC_VOLTAGE_13" :
322 volt
== SEC_VOLTAGE_18
? "SEC_VOLTAGE_18" : "??");
327 static int stv0288_init(struct dvb_frontend
*fe
)
329 struct stv0288_state
*state
= fe
->demodulator_priv
;
334 dprintk("stv0288: init chip\n");
335 stv0288_writeregI(state
, 0x41, 0x04);
338 /* we have default inittab */
339 if (state
->config
->inittab
== NULL
) {
340 for (i
= 0; !(stv0288_inittab
[i
] == 0xff &&
341 stv0288_inittab
[i
+ 1] == 0xff); i
+= 2)
342 stv0288_writeregI(state
, stv0288_inittab
[i
],
343 stv0288_inittab
[i
+ 1]);
345 for (i
= 0; ; i
+= 2) {
346 reg
= state
->config
->inittab
[i
];
347 val
= state
->config
->inittab
[i
+1];
348 if (reg
== 0xff && val
== 0xff)
350 stv0288_writeregI(state
, reg
, val
);
356 static int stv0288_read_status(struct dvb_frontend
*fe
, fe_status_t
*status
)
358 struct stv0288_state
*state
= fe
->demodulator_priv
;
360 u8 sync
= stv0288_readreg(state
, 0x24);
364 dprintk("%s : FE_READ_STATUS : VSTATUS: 0x%02x\n", __func__
, sync
);
368 if ((sync
& 0x08) == 0x08) {
369 *status
|= FE_HAS_LOCK
;
370 dprintk("stv0288 has locked\n");
376 static int stv0288_read_ber(struct dvb_frontend
*fe
, u32
*ber
)
378 struct stv0288_state
*state
= fe
->demodulator_priv
;
380 if (state
->errmode
!= STATUS_BER
)
382 *ber
= (stv0288_readreg(state
, 0x26) << 8) |
383 stv0288_readreg(state
, 0x27);
384 dprintk("stv0288_read_ber %d\n", *ber
);
390 static int stv0288_read_signal_strength(struct dvb_frontend
*fe
, u16
*strength
)
392 struct stv0288_state
*state
= fe
->demodulator_priv
;
394 s32 signal
= 0xffff - ((stv0288_readreg(state
, 0x10) << 8));
397 signal
= signal
* 5 / 4;
398 *strength
= (signal
> 0xffff) ? 0xffff : (signal
< 0) ? 0 : signal
;
399 dprintk("stv0288_read_signal_strength %d\n", *strength
);
403 static int stv0288_sleep(struct dvb_frontend
*fe
)
405 struct stv0288_state
*state
= fe
->demodulator_priv
;
407 stv0288_writeregI(state
, 0x41, 0x84);
408 state
->initialised
= 0;
412 static int stv0288_read_snr(struct dvb_frontend
*fe
, u16
*snr
)
414 struct stv0288_state
*state
= fe
->demodulator_priv
;
416 s32 xsnr
= 0xffff - ((stv0288_readreg(state
, 0x2d) << 8)
417 | stv0288_readreg(state
, 0x2e));
418 xsnr
= 3 * (xsnr
- 0xa100);
419 *snr
= (xsnr
> 0xffff) ? 0xffff : (xsnr
< 0) ? 0 : xsnr
;
420 dprintk("stv0288_read_snr %d\n", *snr
);
425 static int stv0288_read_ucblocks(struct dvb_frontend
*fe
, u32
*ucblocks
)
427 struct stv0288_state
*state
= fe
->demodulator_priv
;
429 if (state
->errmode
!= STATUS_BER
)
431 *ucblocks
= (stv0288_readreg(state
, 0x26) << 8) |
432 stv0288_readreg(state
, 0x27);
433 dprintk("stv0288_read_ber %d\n", *ucblocks
);
438 static int stv0288_set_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
440 dprintk("%s(..)\n", __func__
);
444 static int stv0288_get_property(struct dvb_frontend
*fe
, struct dtv_property
*p
)
446 dprintk("%s(..)\n", __func__
);
450 static int stv0288_set_frontend(struct dvb_frontend
*fe
,
451 struct dvb_frontend_parameters
*dfp
)
453 struct stv0288_state
*state
= fe
->demodulator_priv
;
454 struct dtv_frontend_properties
*c
= &fe
->dtv_property_cache
;
457 unsigned char tda
[3];
459 dprintk("%s : FE_SET_FRONTEND\n", __func__
);
461 if (c
->delivery_system
!= SYS_DVBS
) {
462 dprintk("%s: unsupported delivery "
463 "system selected (%d)\n",
464 __func__
, c
->delivery_system
);
468 if (state
->config
->set_ts_params
)
469 state
->config
->set_ts_params(fe
, 0);
471 /* only frequency & symbol_rate are used for tuner*/
472 dfp
->frequency
= c
->frequency
;
473 dfp
->u
.qpsk
.symbol_rate
= c
->symbol_rate
;
474 if (fe
->ops
.tuner_ops
.set_params
) {
475 fe
->ops
.tuner_ops
.set_params(fe
, dfp
);
476 if (fe
->ops
.i2c_gate_ctrl
)
477 fe
->ops
.i2c_gate_ctrl(fe
, 0);
481 stv0288_set_symbolrate(fe
, c
->symbol_rate
);
482 /* Carrier lock control register */
483 stv0288_writeregI(state
, 0x15, 0xc5);
485 tda
[0] = 0x2b; /* CFRM */
486 tda
[2] = 0x0; /* CFRL */
487 for (tm
= -6; tm
< 7;) {
489 if (stv0288_readreg(state
, 0x24) & 0x80)
495 tda
[1] = (unsigned char)tm
;
496 stv0288_writeregI(state
, 0x2b, tda
[1]);
497 stv0288_writeregI(state
, 0x2c, tda
[2]);
501 state
->tuner_frequency
= c
->frequency
;
502 state
->fec_inner
= FEC_AUTO
;
503 state
->symbol_rate
= c
->symbol_rate
;
508 static int stv0288_i2c_gate_ctrl(struct dvb_frontend
*fe
, int enable
)
510 struct stv0288_state
*state
= fe
->demodulator_priv
;
513 stv0288_writeregI(state
, 0x01, 0xb5);
515 stv0288_writeregI(state
, 0x01, 0x35);
522 static void stv0288_release(struct dvb_frontend
*fe
)
524 struct stv0288_state
*state
= fe
->demodulator_priv
;
528 static struct dvb_frontend_ops stv0288_ops
= {
531 .name
= "ST STV0288 DVB-S",
533 .frequency_min
= 950000,
534 .frequency_max
= 2150000,
535 .frequency_stepsize
= 1000, /* kHz for QPSK frontends */
536 .frequency_tolerance
= 0,
537 .symbol_rate_min
= 1000000,
538 .symbol_rate_max
= 45000000,
539 .symbol_rate_tolerance
= 500, /* ppm */
540 .caps
= FE_CAN_FEC_1_2
| FE_CAN_FEC_2_3
| FE_CAN_FEC_3_4
|
541 FE_CAN_FEC_5_6
| FE_CAN_FEC_7_8
|
546 .release
= stv0288_release
,
547 .init
= stv0288_init
,
548 .sleep
= stv0288_sleep
,
549 .write
= stv0288_write
,
550 .i2c_gate_ctrl
= stv0288_i2c_gate_ctrl
,
551 .read_status
= stv0288_read_status
,
552 .read_ber
= stv0288_read_ber
,
553 .read_signal_strength
= stv0288_read_signal_strength
,
554 .read_snr
= stv0288_read_snr
,
555 .read_ucblocks
= stv0288_read_ucblocks
,
556 .diseqc_send_master_cmd
= stv0288_send_diseqc_msg
,
557 .diseqc_send_burst
= stv0288_send_diseqc_burst
,
558 .set_tone
= stv0288_set_tone
,
559 .set_voltage
= stv0288_set_voltage
,
561 .set_property
= stv0288_set_property
,
562 .get_property
= stv0288_get_property
,
563 .set_frontend
= stv0288_set_frontend
,
566 struct dvb_frontend
*stv0288_attach(const struct stv0288_config
*config
,
567 struct i2c_adapter
*i2c
)
569 struct stv0288_state
*state
= NULL
;
572 /* allocate memory for the internal state */
573 state
= kmalloc(sizeof(struct stv0288_state
), GFP_KERNEL
);
577 /* setup the state */
578 state
->config
= config
;
580 state
->initialised
= 0;
581 state
->tuner_frequency
= 0;
582 state
->symbol_rate
= 0;
583 state
->fec_inner
= 0;
584 state
->errmode
= STATUS_BER
;
586 stv0288_writeregI(state
, 0x41, 0x04);
588 id
= stv0288_readreg(state
, 0x00);
589 dprintk("stv0288 id %x\n", id
);
591 /* register 0x00 contains 0x11 for STV0288 */
595 /* create dvb_frontend */
596 memcpy(&state
->frontend
.ops
, &stv0288_ops
,
597 sizeof(struct dvb_frontend_ops
));
598 state
->frontend
.demodulator_priv
= state
;
599 return &state
->frontend
;
606 EXPORT_SYMBOL(stv0288_attach
);
608 module_param(debug_legacy_dish_switch
, int, 0444);
609 MODULE_PARM_DESC(debug_legacy_dish_switch
,
610 "Enable timing analysis for Dish Network legacy switches");
612 module_param(debug
, int, 0644);
613 MODULE_PARM_DESC(debug
, "Turn on/off frontend debugging (default:off).");
615 MODULE_DESCRIPTION("ST STV0288 DVB Demodulator driver");
616 MODULE_AUTHOR("Georg Acher, Bob Liu, Igor liplianin");
617 MODULE_LICENSE("GPL");