28 #define SP8870_DEFAULT_FIRMWARE "dvb-fe-sp8870.fw"
31 #include <linux/module.h>
32 #include <linux/device.h>
35 #include <linux/string.h>
36 #include <linux/slab.h>
55 #define dprintk(args...) \
57 if (debug) printk(KERN_DEBUG "sp8870: " args); \
61 #define SP8870_FIRMWARE_SIZE 16382
64 #define SP8870_FIRMWARE_OFFSET 0x0A
68 u8 buf [] = { reg >> 8, reg & 0xff, data >> 8, data & 0xff };
73 dprintk (
"%s: writereg error (err == %i, reg == 0x%02x, data == 0x%02x)\n", __func__, err, reg, data);
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 } };
91 dprintk(
"%s: readreg error (ret == %i)\n", __func__, ret);
95 return (b1[0] << 8 | b1[1]);
101 const char *fw_buf = fw->
data;
107 dprintk (
"%s: ...\n", __func__);
113 sp8870_writereg(state, 0x0F00, 0x0000);
128 memcpy(&tx_buf[2], fw_buf + fw_pos, tx_len);
132 msg.
len = tx_len + 2;
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);
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);
160 sp8870_writereg(state, 0x0F00, 0x001);
163 sp8870_readreg(state, 0x0D01);
166 static int sp8870_read_data_valid_signal(
struct sp8870_state* state)
168 return (sp8870_readreg(state, 0x0D02) > 0);
173 int known_parameters = 1;
181 *reg0xc05 |= (1 << 10);
184 *reg0xc05 |= (2 << 10);
187 known_parameters = 0;
197 *reg0xc05 |= (1 << 7);
200 *reg0xc05 |= (2 << 7);
203 *reg0xc05 |= (3 << 7);
206 known_parameters = 0;
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);
237 *reg0xc05 |= (1 << 1);
245 return sp8870_writereg(state, 0xC18, 0x00D);
248 static int sp8870_set_frontend_parameters(
struct dvb_frontend *fe)
255 if ((err = configure_reg0xc05(p, ®0xc05)))
259 sp8870_microcontroller_stop(state);
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);
268 sp8870_writereg(state, 0x0319, 0x000A);
271 sp8870_writereg(state, 0x031A, 0x0AAB);
274 sp8870_writereg(state, 0x0309, 0x0400);
277 sp8870_writereg(state, 0x030A, 0x0000);
281 sp8870_writereg(state, 0x0311, 0x0002);
283 sp8870_writereg(state, 0x0311, 0x0001);
285 sp8870_writereg(state, 0x0311, 0x0000);
289 sp8870_writereg(state, 0x0338, 0x0000);
291 sp8870_writereg(state, 0x0338, 0x0001);
293 sp8870_writereg(state, 0xc05, reg0xc05);
296 sp8870_readreg(state, 0x200);
299 sp8870_microcontroller_start(state);
309 sp8870_wake_up(state);
319 printk(
"sp8870: no firmware upload (timeout or file not found?)\n");
323 if (sp8870_firmware_upload(state, fw)) {
324 printk(
"sp8870: writing firmware to device failed\n");
329 printk(
"sp8870: firmware upload complete\n");
332 sp8870_writereg(state, 0xc18, 0x00d);
335 sp8870_microcontroller_stop(state);
338 sp8870_writereg(state, 0x0301, 0x0003);
341 sp8870_writereg(state, 0x0C13, 0x0001);
344 sp8870_writereg(state, 0x0C14, 0x0001);
347 sp8870_writereg(state, 0x0D00, 0x010);
348 sp8870_writereg(state, 0x0D01, 0x000);
361 status = sp8870_readreg (state, 0x0200);
365 signal = sp8870_readreg (state, 0x0303);
387 ret = sp8870_readreg(state, 0xC08);
393 ret = sp8870_readreg(state, 0xC07);
407 static int sp8870_read_signal_strength(
struct dvb_frontend* fe,
u16 * signal)
415 ret = sp8870_readreg (state, 0x306);
421 ret = sp8870_readreg (state, 0x303);
428 *signal = 0xFFFF -
tmp;
433 static int sp8870_read_uncorrected_blocks (
struct dvb_frontend* fe,
u32* ublocks)
440 ret = sp8870_readreg(state, 0xC0C);
455 #define MAXCHECKS 100
481 for (trials = 1; trials <=
MAXTRIALS; trials++) {
483 err = sp8870_set_frontend_parameters(fe);
487 for (check_count = 0; check_count <
MAXCHECKS; check_count++) {
489 valid = sp8870_read_data_valid_signal(state);
491 dprintk(
"%s: delay = %i usec\n",
492 __func__, check_count * 10);
502 printk(
"%s: firmware crash!!!!!!\n", __func__);
509 printk(
"%s: firmware lockup!!!\n", __func__);
510 printk(
"%s: recovered after %i trial(s))\n", __func__, trials - 1);
515 printk(
"%s: switches = %i lockups = %i\n", __func__, switches, lockups);
526 return sp8870_writereg(state, 0xC18, 0x000);
542 return sp8870_writereg(state, 0x206, 0x001);
544 return sp8870_writereg(state, 0x206, 0x000);
571 if (sp8870_readreg(state, 0x0200) < 0)
goto error;
586 .name =
"Spase SP8870 DVB-T",
587 .frequency_min = 470000000,
588 .frequency_max = 860000000,
589 .frequency_stepsize = 166666,
598 .release = sp8870_release,
601 .sleep = sp8870_sleep,
602 .i2c_gate_ctrl = sp8870_i2c_gate_ctrl,
604 .set_frontend = sp8870_set_frontend,
605 .get_tune_settings = sp8870_get_tune_settings,
607 .read_status = sp8870_read_status,
608 .read_ber = sp8870_read_ber,
609 .read_signal_strength = sp8870_read_signal_strength,
610 .read_ucblocks = sp8870_read_uncorrected_blocks,