--- v4l-dvb/linux/drivers/media/dvb/frontends/ves1820.c 2006-06-30 19:59:10.000000000 +0400 +++ mp-bc1/linux/drivers/media/dvb/frontends/ves1820.c 2006-07-23 11:41:15.000000000 +0400 @@ -219,9 +219,10 @@ static int ves1820_set_parameters(struct if (real_qam < 0 || real_qam > 4) return -EINVAL; - if (fe->ops.tuner_ops.set_params) { - fe->ops.tuner_ops.set_params(fe, p); - if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 0); + if (fe->ops.tuner_ops.set_params_compat) { + fe->ops.tuner_ops.set_params_compat(fe, p); + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 0); } ves1820_set_symbolrate(state, p->u.qam.symbol_rate); @@ -237,6 +238,62 @@ static int ves1820_set_parameters(struct return 0; } +static int ves1820_set_params(struct dvb_frontend* fe, + struct dvbfe_params *p) +{ + struct ves1820_state* state = fe->demodulator_priv; + + if (fe->ops.tuner_ops.set_params) { + fe->ops.tuner_ops.set_params(fe, p); + if (fe->ops.i2c_gate_ctrl) + fe->ops.i2c_gate_ctrl(fe, 0); + } + + ves1820_set_symbolrate(state, p->delsys.dvbc.symbol_rate); + ves1820_writereg(state, 0x34, state->pwm); + + switch (p->delsys.dvbc.modulation) { + case DVBFE_MOD_QAM16: + ves1820_writereg(state, 0x01, 140); + ves1820_writereg(state, 0x05, 135); + ves1820_writereg(state, 0x08, 162); + ves1820_writereg(state, 0x09, 145); + ves1820_setup_reg0(state, 0x00, p->inversion); + break; + case DVBFE_MOD_QAM32: + ves1820_writereg(state, 0x01, 140); + ves1820_writereg(state, 0x05, 100); + ves1820_writereg(state, 0x08, 116); + ves1820_writereg(state, 0x09, 150); + ves1820_setup_reg0(state, 0x04, p->inversion); + break; + case DVBFE_MOD_QAM64: + ves1820_writereg(state, 0x01, 106); + ves1820_writereg(state, 0x05, 70); + ves1820_writereg(state, 0x08, 67); + ves1820_writereg(state, 0x09, 106); + ves1820_setup_reg0(state, 0x08, p->inversion); + break; + case DVBFE_MOD_QAM128: + ves1820_writereg(state, 0x01, 100); + ves1820_writereg(state, 0x05, 54); + ves1820_writereg(state, 0x08, 52); + ves1820_writereg(state, 0x09, 126); + ves1820_setup_reg0(state, 0x0c, p->inversion); + case DVBFE_MOD_QAM256: + ves1820_writereg(state, 0x01, 92); + ves1820_writereg(state, 0x05, 38); + ves1820_writereg(state, 0x08, 35); + ves1820_writereg(state, 0x09, 107); + ves1820_setup_reg0(state, 0x10, p->inversion); + break; + default: + return -EINVAL; + } + ves1820_writereg(state, 2, ves1820_inittab[2] | (state->config->selagc ? 0x08 : 0)); + return 0; +} + static int ves1820_read_status(struct dvb_frontend* fe, fe_status_t* status) { struct ves1820_state* state = fe->demodulator_priv; @@ -341,6 +398,54 @@ static int ves1820_get_frontend(struct d return 0; } +static int ves1820_get_params(struct dvb_frontend* fe, + struct dvbfe_params *p) +{ + struct ves1820_state* state = fe->demodulator_priv; + int sync; + s8 afc = 0; + u32 modulation; + + sync = ves1820_readreg(state, 0x11); + afc = ves1820_readreg(state, 0x19); + if (verbose) { + /* AFC only valid when carrier has been recovered */ + printk(sync & 2 ? "ves1820: AFC (%d) %dHz\n" : + "ves1820: [AFC (%d) %dHz]\n", afc, -((s32) p->delsys.dvbc.symbol_rate * afc) >> 10); + } + + if (!state->config->invert) { + p->inversion = (state->reg0 & 0x20) ? INVERSION_ON : INVERSION_OFF; + } else { + p->inversion = (!(state->reg0 & 0x20)) ? INVERSION_ON : INVERSION_OFF; + } + + modulation = (state->reg0 >> 2) & 7; + switch (modulation) { + case 0: + p->delsys.dvbc.modulation = DVBFE_MOD_QAM16; + break; + case 1: + p->delsys.dvbc.modulation = DVBFE_MOD_QAM32; + break; + case 2: + p->delsys.dvbc.modulation = DVBFE_MOD_QAM64; + break; + case 3: + p->delsys.dvbc.modulation = DVBFE_MOD_QAM128; + break; + case 4: + p->delsys.dvbc.modulation = DVBFE_MOD_QAM256; + break; + } + + p->frequency = ((p->frequency + 31250) / 62500) * 62500; + if (sync & 2) + p->frequency -= ((s32) p->delsys.dvbc.symbol_rate * afc) >> 10; + + return 0; +} + static int ves1820_sleep(struct dvb_frontend* fe) { struct ves1820_state* state = fe->demodulator_priv; @@ -405,6 +510,32 @@ error: return NULL; } +static struct dvbfe_info dvbc_info = { + .name = "VLSI VES1820 DVB-C", + .delivery = DVBFE_DELSYS_DVBC, + .delsys = { + .dvbc.modulation = DVBFE_MOD_QAM16 | DVBFE_MOD_QAM32 | + DVBFE_MOD_QAM64 | DVBFE_MOD_QAM128 | + DVBFE_MOD_QAM256 + }, + + .frequency_step = 62500, +}; + +static int ves1820_get_info(struct dvb_frontend *fe, struct dvbfe_info *fe_info) +{ + memcpy(fe_info, &dvbc_info, sizeof (dvbc_info)); + + return 0; +} + +static int ves1820_get_delsys(struct dvb_frontend *fe, enum dvbfe_delsys *fe_delsys) +{ + *fe_delsys = DVBFE_DELSYS_DVBC; + + return 0; +} + static struct dvb_frontend_ops ves1820_ops = { .info = { @@ -435,6 +566,11 @@ static struct dvb_frontend_ops ves1820_o .read_signal_strength = ves1820_read_signal_strength, .read_snr = ves1820_read_snr, .read_ucblocks = ves1820_read_ucblocks, + + .set_params = ves1820_set_params, + .get_params = ves1820_get_params, + .get_info = ves1820_get_info, + .get_delsys = ves1820_get_delsys, }; module_param(verbose, int, 0644);
_______________________________________________ linux-dvb@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb