#define dprintk(args...) \ do { \ if (debug) \
printk(args); \
} while (0)
/* as of March 2009 current DS3000 firmware version is 1.78 */ /* DS3000 FW v1.78 MD5: a32d17910c4f370073f9346e71d34b80 */ #define DS3000_DEFAULT_FIRMWARE "dvb-fe-ds3000.fw"
staticint ds3000_firmware_ondemand(struct dvb_frontend *fe)
{ struct ds3000_state *state = fe->demodulator_priv; conststruct firmware *fw; int ret = 0;
dprintk("%s()\n", __func__);
ret = ds3000_readreg(state, 0xb2); if (ret < 0) return ret;
/* Load firmware */ /* request the firmware, this will block until someone uploads it */
printk(KERN_INFO "%s: Waiting for firmware upload (%s)...\n", __func__,
DS3000_DEFAULT_FIRMWARE);
ret = request_firmware(&fw, DS3000_DEFAULT_FIRMWARE,
state->i2c->dev.parent);
printk(KERN_INFO "%s: Waiting for firmware upload(2)...\n", __func__); if (ret) {
printk(KERN_ERR "%s: No firmware uploaded (timeout or file not found?)\n",
__func__); return ret;
}
ret = ds3000_load_firmware(fe, fw); if (ret)
printk("%s: Writing firmware to device failed\n", __func__);
/* Begin the firmware load process */
ds3000_writereg(state, 0xb2, 0x01); /* write the entire firmware */
ret = ds3000_writeFW(state, 0xb0, fw->data, fw->size);
ds3000_writereg(state, 0xb2, 0x00);
switch (c->delivery_system) { case SYS_DVBS: /* set the number of bytes checked during
BER estimation */
ds3000_writereg(state, 0xf9, 0x04); /* read BER estimation status */
data = ds3000_readreg(state, 0xf8); /* check if BER estimation is ready */ if ((data & 0x10) == 0) { /* this is the number of error bits, to calculate the bit error rate
divide to 8388608 */
*ber = (ds3000_readreg(state, 0xf7) << 8) |
ds3000_readreg(state, 0xf6); /* start counting error bits */ /* need to be set twice
otherwise it fails sometimes */
data |= 0x10;
ds3000_writereg(state, 0xf8, data);
ds3000_writereg(state, 0xf8, data);
} else /* used to indicate that BER estimation
is not ready, i.e. BER is unknown */
*ber = 0xffffffff; break; case SYS_DVBS2: /* read the number of LPDC decoded frames */
lpdc_frames = (ds3000_readreg(state, 0xd7) << 16) |
(ds3000_readreg(state, 0xd6) << 8) |
ds3000_readreg(state, 0xd5); /* read the number of packets with bad CRC */
ber_reading = (ds3000_readreg(state, 0xf8) << 8) |
ds3000_readreg(state, 0xf7); if (lpdc_frames > 750) { /* clear LPDC frame counters */
ds3000_writereg(state, 0xd1, 0x01); /* clear bad packets counter */
ds3000_writereg(state, 0xf9, 0x01); /* enable bad packets counter */
ds3000_writereg(state, 0xf9, 0x00); /* enable LPDC frame counters */
ds3000_writereg(state, 0xd1, 0x00);
*ber = ber_reading;
} else /* used to indicate that BER estimation is not ready,
i.e. BER is unknown */
*ber = 0xffffffff; break; default: return -EINVAL;
}
data = ds3000_readreg(state, 0xa2);
data &= ~0xc0;
ds3000_writereg(state, 0xa2, data);
switch (tone) { case SEC_TONE_ON:
dprintk("%s: setting tone on\n", __func__);
data = ds3000_readreg(state, 0xa1);
data &= ~0x43;
data |= 0x04;
ds3000_writereg(state, 0xa1, data); break; case SEC_TONE_OFF:
dprintk("%s: setting tone off\n", __func__);
data = ds3000_readreg(state, 0xa2);
data |= 0x80;
ds3000_writereg(state, 0xa2, data); break;
}
/* Dump DiSEqC message */
dprintk("%s(", __func__); for (i = 0 ; i < d->msg_len;) {
dprintk("0x%02x", d->msg[i]); if (++i < d->msg_len)
dprintk(", ");
}
/* enable DiSEqC message send pin */
data = ds3000_readreg(state, 0xa2);
data &= ~0xc0;
ds3000_writereg(state, 0xa2, data);
/* DiSEqC message */ for (i = 0; i < d->msg_len; i++)
ds3000_writereg(state, 0xa3 + i, d->msg[i]);
data = ds3000_readreg(state, 0xa1); /* clear DiSEqC message length and status,
enable DiSEqC message send */
data &= ~0xf8; /* set DiSEqC mode, modulation active during 33 pulses,
set DiSEqC message length */
data |= ((d->msg_len - 1) << 3) | 0x07;
ds3000_writereg(state, 0xa1, data);
/* wait up to 150ms for DiSEqC transmission to complete */ for (i = 0; i < 15; i++) {
data = ds3000_readreg(state, 0xa1); if ((data & 0x40) == 0) break;
msleep(10);
}
/* DiSEqC timeout after 150ms */ if (i == 15) {
data = ds3000_readreg(state, 0xa1);
data &= ~0x80;
data |= 0x40;
ds3000_writereg(state, 0xa1, data);
data = ds3000_readreg(state, 0xa2);
data &= ~0xc0;
data |= 0x80;
ds3000_writereg(state, 0xa2, data);
return -ETIMEDOUT;
}
data = ds3000_readreg(state, 0xa2);
data &= ~0xc0;
data |= 0x80;
ds3000_writereg(state, 0xa2, data);
/* check if the demod is present */
ret = ds3000_readreg(state, 0x00) & 0xfe; if (ret != 0xe0) {
kfree(state);
printk(KERN_ERR "Invalid probe, probably not a DS3000\n"); return NULL;
}
/* * Some devices like T480 starts with voltage on. Be sure * to turn voltage off during init, as this can otherwise * interfere with Unicable SCR systems.
*/
ds3000_set_voltage(&state->frontend, SEC_VOLTAGE_OFF); return &state->frontend;
}
EXPORT_SYMBOL_GPL(ds3000_attach);
switch (c->delivery_system) { case SYS_DVBS: /* initialise the demod in DVB-S mode */ for (i = 0; i < sizeof(ds3000_dvbs_init_tab); i += 2)
ds3000_writereg(state,
ds3000_dvbs_init_tab[i],
ds3000_dvbs_init_tab[i + 1]);
value = ds3000_readreg(state, 0xfe);
value &= 0xc0;
value |= 0x1b;
ds3000_writereg(state, 0xfe, value); break; case SYS_DVBS2: /* initialise the demod in DVB-S2 mode */ for (i = 0; i < sizeof(ds3000_dvbs2_init_tab); i += 2)
ds3000_writereg(state,
ds3000_dvbs2_init_tab[i],
ds3000_dvbs2_init_tab[i + 1]); if (c->symbol_rate >= 30000000)
ds3000_writereg(state, 0xfe, 0x54); else
ds3000_writereg(state, 0xfe, 0x98); break; default: return -EINVAL;
}
/* * Initialise or wake up device * * Power config will reset and load initial firmware if required
*/ staticint ds3000_initfe(struct dvb_frontend *fe)
{ struct ds3000_state *state = fe->demodulator_priv; int ret;
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.2Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.