/* * NOTICE: * This driver is incomplete and lacks init/config of the chips, * as the necessary info is not disclosed. * Other features like get_if_frequency() are missing as well. * It assumes that users of this driver (such as a PCI bridge of * DTV receiver cards) properly init and configure the chip * via I2C *before* calling this driver's init() function. * * Currently, PT3 driver is the only one that uses this driver, * and contains init/config code in its firmware. * Thus some part of the code might be dependent on PT3 specific config.
*/
state = fe->tuner_priv;
ret = reg_write(state, 0x14, 0x01); if (ret < 0) return ret;
usleep_range(1000, 2000);
ret = reg_read(state, 0x18, &rf_in1); if (ret == 0)
ret = reg_read(state, 0x19, &rf_in2); if (ret == 0)
ret = reg_read(state, 0xd6, &rf_off1); if (ret == 0)
ret = reg_read(state, 0xd7, &rf_off2); if (ret != 0) return ret;
struct reg_val tune1[] = {
{ 0x11, 0x40 }, /* RF frequency L (placeholder) */
{ 0x12, 0x0e }, /* RF frequency H (placeholder) */
{ 0x13, 0x01 } /* start tune */
};
struct mxl301rf_state *state;
u32 freq;
u16 f;
u32 tmp, div; int i, ret;
state = fe->tuner_priv;
freq = fe->dtv_property_cache.frequency;
/* spur shift function (for analog) */ for (i = 0; i < ARRAY_SIZE(shf_tab); i++) { if (freq >= (shf_tab[i].freq - shf_tab[i].ofst_th) * 1000 &&
freq <= (shf_tab[i].freq + shf_tab[i].ofst_th) * 1000) {
tune0[5].val = shf_tab[i].shf_val;
tune0[6].val = 0xa0 | shf_tab[i].shf_dir; break;
}
}
ret = raw_write(state, (u8 *) tune0, sizeof(tune0)); if (ret < 0) goto failed;
usleep_range(3000, 4000);
/* convert freq to 10.6 fixed point float [MHz] */
f = freq / 1000000;
tmp = freq % 1000000;
div = 1000000; for (i = 0; i < 6; i++) {
f <<= 1;
div >>= 1; if (tmp > div) {
tmp -= div;
f |= 1;
}
} if (tmp > 7812)
f++;
tune1[0].val = f & 0xff;
tune1[1].val = f >> 8;
ret = raw_write(state, (u8 *) tune1, sizeof(tune1)); if (ret < 0) goto failed;
msleep(31);
ret = reg_write(state, 0x1a, 0x0d); if (ret < 0) goto failed;
ret = raw_write(state, (u8 *) set_idac, sizeof(set_idac)); if (ret < 0) goto failed; return 0;
staticint mxl301rf_sleep(struct dvb_frontend *fe)
{ struct mxl301rf_state *state; int ret;
state = fe->tuner_priv;
ret = raw_write(state, (u8 *)standby_data, sizeof(standby_data)); if (ret < 0)
dev_warn(&state->i2c->dev, "(%s) failed. [adap%d-fe%d]\n",
__func__, fe->dvb->num, fe->id); return ret;
}
/* init sequence is not public. * the parent must have init'ed the device. * just wake up here.
*/ staticint mxl301rf_init(struct dvb_frontend *fe)
{ struct mxl301rf_state *state; 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.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.