2 Driver for Spase SP8870 demodulator
4 Copyright (C) 1999 Juergen Peitz
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
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.
23 * This driver needs external firmware. Please use the command
24 * "<kerneldir>/scripts/get_dvb_firmware alps_tdlb7" to
25 * download/extract it, and then copy it to /usr/lib/hotplug/firmware
26 * or /lib/firmware (depending on configuration of firmware hotplug).
28 #define SP8870_DEFAULT_FIRMWARE "dvb-fe-sp8870.fw"
30 #include <linux/init.h>
31 #include <linux/module.h>
32 #include <linux/device.h>
33 #include <linux/firmware.h>
34 #include <linux/delay.h>
35 #include <linux/string.h>
36 #include <linux/slab.h>
38 #include <media/dvb_frontend.h>
44 struct i2c_adapter* i2c;
46 const struct sp8870_config* config;
48 struct dvb_frontend frontend;
50 /* demodulator private data */
55 #define dprintk(args...) \
57 if (debug) printk(KERN_DEBUG "sp8870: " args); \
60 /* firmware size for sp8870 */
61 #define SP8870_FIRMWARE_SIZE 16382
63 /* starting point for firmware in file 'Sc_main.mc' */
64 #define SP8870_FIRMWARE_OFFSET 0x0A
66 static int sp8870_writereg (struct sp8870_state* state, u16 reg, u16 data)
68 u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
69 struct i2c_msg msg = { .addr = state->config->demod_address, .flags = 0, .buf = buf, .len = 4 };
72 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
73 dprintk ("%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __func__, err, reg, data);
80 static int sp8870_readreg (struct sp8870_state* state, u16 reg)
83 u8 b0 [] = { reg >> 8 , reg & 0xff };
85 struct i2c_msg msg [] = { { .addr = state->config->demod_address, .flags = 0, .buf = b0, .len = 2 },
86 { .addr = state->config->demod_address, .flags = I2C_M_RD, .buf = b1, .len = 2 } };
88 ret = i2c_transfer (state->i2c, msg, 2);
91 dprintk("%s: readreg error (ret == %i)\n", __func__, ret);
95 return (b1[0] << 8 | b1[1]);
98 static int sp8870_firmware_upload (struct sp8870_state* state, const struct firmware *fw)
101 const char *fw_buf = fw->data;
107 dprintk ("%s: ...\n", __func__);
109 if (fw->size < SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET)
112 // system controller stop
113 sp8870_writereg(state, 0x0F00, 0x0000);
115 // instruction RAM register hiword
116 sp8870_writereg(state, 0x8F08, ((SP8870_FIRMWARE_SIZE / 2) & 0xFFFF));
118 // instruction RAM MWR
119 sp8870_writereg(state, 0x8F0A, ((SP8870_FIRMWARE_SIZE / 2) >> 16));
121 // do firmware upload
122 fw_pos = SP8870_FIRMWARE_OFFSET;
123 while (fw_pos < SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET){
124 tx_len = (fw_pos <= SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET - 252) ? 252 : SP8870_FIRMWARE_SIZE + SP8870_FIRMWARE_OFFSET - fw_pos;
125 // write register 0xCF0A
128 memcpy(&tx_buf[2], fw_buf + fw_pos, tx_len);
129 msg.addr = state->config->demod_address;
132 msg.len = tx_len + 2;
133 if ((err = i2c_transfer (state->i2c, &msg, 1)) != 1) {
134 printk("%s: firmware upload failed!\n", __func__);
135 printk ("%s: i2c error (err == %i)\n", __func__, err);
141 dprintk ("%s: done!\n", __func__);
145 static void sp8870_microcontroller_stop (struct sp8870_state* state)
147 sp8870_writereg(state, 0x0F08, 0x000);
148 sp8870_writereg(state, 0x0F09, 0x000);
150 // microcontroller STOP
151 sp8870_writereg(state, 0x0F00, 0x000);
154 static void sp8870_microcontroller_start (struct sp8870_state* state)
156 sp8870_writereg(state, 0x0F08, 0x000);
157 sp8870_writereg(state, 0x0F09, 0x000);
159 // microcontroller START
160 sp8870_writereg(state, 0x0F00, 0x001);
161 // not documented but if we don't read 0x0D01 out here
162 // we don't get a correct data valid signal
163 sp8870_readreg(state, 0x0D01);
166 static int sp8870_read_data_valid_signal(struct sp8870_state* state)
168 return (sp8870_readreg(state, 0x0D02) > 0);
171 static int configure_reg0xc05 (struct dtv_frontend_properties *p, u16 *reg0xc05)
173 int known_parameters = 1;
177 switch (p->modulation) {
181 *reg0xc05 |= (1 << 10);
184 *reg0xc05 |= (2 << 10);
187 known_parameters = 0;
193 switch (p->hierarchy) {
197 *reg0xc05 |= (1 << 7);
200 *reg0xc05 |= (2 << 7);
203 *reg0xc05 |= (3 << 7);
206 known_parameters = 0;
212 switch (p->code_rate_HP) {
216 *reg0xc05 |= (1 << 3);
219 *reg0xc05 |= (2 << 3);
222 *reg0xc05 |= (3 << 3);
225 *reg0xc05 |= (4 << 3);
228 known_parameters = 0;
234 if (known_parameters)
235 *reg0xc05 |= (2 << 1); /* use specified parameters */
237 *reg0xc05 |= (1 << 1); /* enable autoprobing */
242 static int sp8870_wake_up(struct sp8870_state* state)
244 // enable TS output and interface pins
245 return sp8870_writereg(state, 0xC18, 0x00D);
248 static int sp8870_set_frontend_parameters(struct dvb_frontend *fe)
250 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
251 struct sp8870_state* state = fe->demodulator_priv;
255 if ((err = configure_reg0xc05(p, ®0xc05)))
258 // system controller stop
259 sp8870_microcontroller_stop(state);
261 // set tuner parameters
262 if (fe->ops.tuner_ops.set_params) {
263 fe->ops.tuner_ops.set_params(fe);
264 if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0);
267 // sample rate correction bit [23..17]
268 sp8870_writereg(state, 0x0319, 0x000A);
270 // sample rate correction bit [16..0]
271 sp8870_writereg(state, 0x031A, 0x0AAB);
273 // integer carrier offset
274 sp8870_writereg(state, 0x0309, 0x0400);
276 // fractional carrier offset
277 sp8870_writereg(state, 0x030A, 0x0000);
279 // filter for 6/7/8 Mhz channel
280 if (p->bandwidth_hz == 6000000)
281 sp8870_writereg(state, 0x0311, 0x0002);
282 else if (p->bandwidth_hz == 7000000)
283 sp8870_writereg(state, 0x0311, 0x0001);
285 sp8870_writereg(state, 0x0311, 0x0000);
287 // scan order: 2k first = 0x0000, 8k first = 0x0001
288 if (p->transmission_mode == TRANSMISSION_MODE_2K)
289 sp8870_writereg(state, 0x0338, 0x0000);
291 sp8870_writereg(state, 0x0338, 0x0001);
293 sp8870_writereg(state, 0xc05, reg0xc05);
295 // read status reg in order to clear pending irqs
296 err = sp8870_readreg(state, 0x200);
300 // system controller start
301 sp8870_microcontroller_start(state);
306 static int sp8870_init (struct dvb_frontend* fe)
308 struct sp8870_state* state = fe->demodulator_priv;
309 const struct firmware *fw = NULL;
311 sp8870_wake_up(state);
312 if (state->initialised) return 0;
313 state->initialised = 1;
315 dprintk ("%s\n", __func__);
318 /* request the firmware, this will block until someone uploads it */
319 printk("sp8870: waiting for firmware upload (%s)...\n", SP8870_DEFAULT_FIRMWARE);
320 if (state->config->request_firmware(fe, &fw, SP8870_DEFAULT_FIRMWARE)) {
321 printk("sp8870: no firmware upload (timeout or file not found?)\n");
325 if (sp8870_firmware_upload(state, fw)) {
326 printk("sp8870: writing firmware to device failed\n");
327 release_firmware(fw);
330 release_firmware(fw);
331 printk("sp8870: firmware upload complete\n");
333 /* enable TS output and interface pins */
334 sp8870_writereg(state, 0xc18, 0x00d);
336 // system controller stop
337 sp8870_microcontroller_stop(state);
340 sp8870_writereg(state, 0x0301, 0x0003);
342 // Reed Solomon parity bytes passed to output
343 sp8870_writereg(state, 0x0C13, 0x0001);
345 // MPEG clock is suppressed if no valid data
346 sp8870_writereg(state, 0x0C14, 0x0001);
348 /* bit 0x010: enable data valid signal */
349 sp8870_writereg(state, 0x0D00, 0x010);
350 sp8870_writereg(state, 0x0D01, 0x000);
355 static int sp8870_read_status(struct dvb_frontend *fe,
356 enum fe_status *fe_status)
358 struct sp8870_state* state = fe->demodulator_priv;
364 status = sp8870_readreg (state, 0x0200);
368 signal = sp8870_readreg (state, 0x0303);
373 *fe_status |= FE_HAS_SIGNAL;
375 *fe_status |= FE_HAS_SYNC;
377 *fe_status |= FE_HAS_LOCK | FE_HAS_CARRIER | FE_HAS_VITERBI;
382 static int sp8870_read_ber (struct dvb_frontend* fe, u32 * ber)
384 struct sp8870_state* state = fe->demodulator_priv;
390 ret = sp8870_readreg(state, 0xC08);
396 ret = sp8870_readreg(state, 0xC07);
409 static int sp8870_read_signal_strength(struct dvb_frontend* fe, u16 * signal)
411 struct sp8870_state* state = fe->demodulator_priv;
417 ret = sp8870_readreg (state, 0x306);
423 ret = sp8870_readreg (state, 0x303);
430 *signal = 0xFFFF - tmp;
435 static int sp8870_read_uncorrected_blocks (struct dvb_frontend* fe, u32* ublocks)
437 struct sp8870_state* state = fe->demodulator_priv;
442 ret = sp8870_readreg(state, 0xC0C);
454 /* number of trials to recover from lockup */
456 /* maximum checks for data valid signal */
457 #define MAXCHECKS 100
459 /* only for debugging: counter for detected lockups */
461 /* only for debugging: counter for channel switches */
464 static int sp8870_set_frontend(struct dvb_frontend *fe)
466 struct dtv_frontend_properties *p = &fe->dtv_property_cache;
467 struct sp8870_state* state = fe->demodulator_priv;
470 The firmware of the sp8870 sometimes locks up after setting frontend parameters.
471 We try to detect this by checking the data valid signal.
472 If it is not set after MAXCHECKS we try to recover the lockup by setting
473 the frontend parameters again.
481 dprintk("%s: frequency = %i\n", __func__, p->frequency);
483 for (trials = 1; trials <= MAXTRIALS; trials++) {
485 err = sp8870_set_frontend_parameters(fe);
489 for (check_count = 0; check_count < MAXCHECKS; check_count++) {
490 // valid = ((sp8870_readreg(i2c, 0x0200) & 4) == 0);
491 valid = sp8870_read_data_valid_signal(state);
493 dprintk("%s: delay = %i usec\n",
494 __func__, check_count * 10);
504 printk("%s: firmware crash!!!!!!\n", __func__);
511 printk("%s: firmware lockup!!!\n", __func__);
512 printk("%s: recovered after %i trial(s))\n", __func__, trials - 1);
517 printk("%s: switches = %i lockups = %i\n", __func__, switches, lockups);
523 static int sp8870_sleep(struct dvb_frontend* fe)
525 struct sp8870_state* state = fe->demodulator_priv;
527 // tristate TS output and disable interface pins
528 return sp8870_writereg(state, 0xC18, 0x000);
531 static int sp8870_get_tune_settings(struct dvb_frontend* fe, struct dvb_frontend_tune_settings* fesettings)
533 fesettings->min_delay_ms = 350;
534 fesettings->step_size = 0;
535 fesettings->max_drift = 0;
539 static int sp8870_i2c_gate_ctrl(struct dvb_frontend* fe, int enable)
541 struct sp8870_state* state = fe->demodulator_priv;
544 return sp8870_writereg(state, 0x206, 0x001);
546 return sp8870_writereg(state, 0x206, 0x000);
550 static void sp8870_release(struct dvb_frontend* fe)
552 struct sp8870_state* state = fe->demodulator_priv;
556 static const struct dvb_frontend_ops sp8870_ops;
558 struct dvb_frontend* sp8870_attach(const struct sp8870_config* config,
559 struct i2c_adapter* i2c)
561 struct sp8870_state* state = NULL;
563 /* allocate memory for the internal state */
564 state = kzalloc(sizeof(struct sp8870_state), GFP_KERNEL);
565 if (state == NULL) goto error;
567 /* setup the state */
568 state->config = config;
570 state->initialised = 0;
572 /* check if the demod is there */
573 if (sp8870_readreg(state, 0x0200) < 0) goto error;
575 /* create dvb_frontend */
576 memcpy(&state->frontend.ops, &sp8870_ops, sizeof(struct dvb_frontend_ops));
577 state->frontend.demodulator_priv = state;
578 return &state->frontend;
585 static const struct dvb_frontend_ops sp8870_ops = {
586 .delsys = { SYS_DVBT },
588 .name = "Spase SP8870 DVB-T",
589 .frequency_min_hz = 470 * MHz,
590 .frequency_max_hz = 860 * MHz,
591 .frequency_stepsize_hz = 166666,
592 .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
593 FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 |
594 FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
595 FE_CAN_QPSK | FE_CAN_QAM_16 |
596 FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
597 FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER
600 .release = sp8870_release,
603 .sleep = sp8870_sleep,
604 .i2c_gate_ctrl = sp8870_i2c_gate_ctrl,
606 .set_frontend = sp8870_set_frontend,
607 .get_tune_settings = sp8870_get_tune_settings,
609 .read_status = sp8870_read_status,
610 .read_ber = sp8870_read_ber,
611 .read_signal_strength = sp8870_read_signal_strength,
612 .read_ucblocks = sp8870_read_uncorrected_blocks,
615 module_param(debug, int, 0644);
616 MODULE_PARM_DESC(debug, "Turn on/off frontend debugging (default:off).");
618 MODULE_DESCRIPTION("Spase SP8870 DVB-T Demodulator driver");
619 MODULE_AUTHOR("Juergen Peitz");
620 MODULE_LICENSE("GPL");
622 EXPORT_SYMBOL(sp8870_attach);