[linux-dvb] RFC: merge dvb_tuner_ops & tuner-core second try
Markus Rechberger
mrechberger at gmail.com
Tue Feb 27 23:02:19 CET 2007
On 2/27/07, Marcel Siegert <mws at linuxtv.org> wrote:
> On Tuesday 27 February 2007, Markus Rechberger wrote:
> > Hi guys,
> >
> > since I really want to get that xc3028 story done I propose to add
> > some changes to the dvb framework which would allow to support loading
> > tuner modules from v4l and dvb without having a real dependency of
> > each other.
> > The interface I aim at uses almost the same structure as dvb_tuner_ops.
> >
> > So to point it out more clearly:
> >
> > I'd like to replace or modify:
> > struct dvb_tuner_ops {
> >
> > struct dvb_tuner_info info;
> >
> > int (*release)(struct dvb_frontend *fe);
> > int (*init)(struct dvb_frontend *fe);
> > int (*sleep)(struct dvb_frontend *fe);
> >
> > /** This is for simple PLLs - set all parameters in one go. */
> > int (*set_params)(struct dvb_frontend *fe, struct
> > dvb_frontend_parameters *p);
> >
> > /** This is support for demods like the mt352 - fills out the
> > supplied buffer with what to write. */
> > int (*calc_regs)(struct dvb_frontend *fe, struct
> > dvb_frontend_parameters *p, u8 *buf, int buf_len);
> >
> > int (*get_frequency)(struct dvb_frontend *fe, u32 *frequency);
> > int (*get_bandwidth)(struct dvb_frontend *fe, u32 *bandwidth);
> >
> > #define TUNER_STATUS_LOCKED 1
> > int (*get_status)(struct dvb_frontend *fe, u32 *status);
> >
> > /** These are provided seperately from set_params in order to
> > facilitate silicon
> > * tuners which require sophisticated tuning loops,
> > controlling each parameter seperately. */
> > int (*set_frequency)(struct dvb_frontend *fe, u32 frequency);
> > int (*set_bandwidth)(struct dvb_frontend *fe, u32 bandwidth);
> > };
> >
> > with:
> > struct v4l_dvb_tuner {
> > /* wrapper */
> > void *priv; /* some privat data for internal use */
> > void *dev; /* v4l private data for tuner-core */
> > struct dvb_frontend *fe; /* dvb_frontend, for dvb only
> > drivers, internal use */
> >
> > int (*ioctl)(struct v4l_dvb_tuner *dev, int cmd, int arg);
> > struct tuner_info info;
> > int (*release)(struct v4l_dvb_tuner *dev);
> > int (*init)(struct v4l_dvb_tuner *dev);
> > int (*sleep)(struct v4l_dvb_tuner *dev);
> >
> > /** This is for simple PLLs - set all parameters in one go. */
> > int (*set_params)(struct v4l_dvb_tuner *dev, struct
> > tuner_parameters *p);
> >
> > /** This is support for demods like the mt352 - fills out the
> > supplied buffer with what to write. */
> > int (*calc_regs)(struct v4l_dvb_tuner *dev, struct
> > tuner_parameters *p, u8 *buf, int buf_len);
> >
> > int (*get_frequency)(struct v4l_dvb_tuner *dev, u32 *frequency);
> > int (*get_bandwidth)(struct v4l_dvb_tuner *dev, u32 *bandwidth);
> >
> > #define TUNER_STATUS_LOCKED 1
> > int (*get_status)(struct v4l_dvb_tuner *dev, u32 *status);
> >
> > /** These are provided seperately from set_params in order to
> > facilitate silicon
> > * tuners which require sophisticated tuning loops,
> > controlling each parameter seperately. */
> > int (*set_frequency)(struct v4l_dvb_tuner *dev, u32 frequency);
> > int (*set_bandwidth)(struct v4l_dvb_tuner *dev, u32 bandwidth);
> >
> > int (*set_mode)(struct v4l_dvb_tuner *dev, struct
> > tuner_parameters *params);
> > };
> >
> > tuner_parameters is an extended version of dvb_frontend_params
> >
> > struct dvb_frontend_parameters {
> > __u32 frequency; /* (absolute) frequency in Hz for
> QAM/OFDM/ATSC */
> > /* intermediate frequency in kHz for QPSK */
> > fe_spectral_inversion_t inversion;
> > union {
> > struct dvb_qpsk_parameters qpsk;
> > struct dvb_qam_parameters qam;
> > struct dvb_ofdm_parameters ofdm;
> > struct dvb_vsb_parameters vsb;
> > } u;
> > };
> >
> > vs:
> >
> > struct tuner_parameters {
> > __u32 frequency; /* (absolute) frequency in Hz for
> QAM/OFDM/ATSC */
> > /* intermediate frequency in kHz for QPSK */
> > enum v4l2_tuner_type type;
> > v4l2_std_id std;
> > fe_spectral_inversion_t inversion;
> > union {
> > struct dvb_qpsk_parameters qpsk;
> > struct dvb_qam_parameters qam;
> > struct dvb_ofdm_parameters ofdm;
> > struct dvb_vsb_parameters vsb;
> > } u;
> > };
> >
> > for not breaking userspace we can use an internal converter for that
> > format just like:
> > #define V4L_OPS(i) ({ \
> > struct tuner_parameters __o; \
> > __o.frequency = i->frequency; \
> > __o.inversion = i->inversion; \
> > ....
> > &__o; \
> > })
> >
> > this seems to be a good approach for hybrid devices
> > dvb only silicon tuners could still access dvb_frontend internally,
> > hybrid tuners have to avoid this since the structure since it wouldn't
> > be fully initialized.
> > So what do you guys think about that?
> >
> > I already have some code which does this and it works fine.
> > So I'm looking for some feedback/suggestions here
> >
> > thanks,
> > Markus
> >
> > _______________________________________________
> > linux-dvb mailing list
> > linux-dvb at linuxtv.org
> > http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb
> >
> hi,
>
> as already told on irc (summary of one hour talk)
>
> i am against this patch as this sort of thing could be implemented in the
> same way
> like e.g. saa7134
>
> this implements your changes to be unneccessary.
>
> best regards
> marcel
>
>
Marcel you never had a look at the saa7134 so please only write about
things you really know about.
You mean lines like:
/* setup tuner buffer */
tuner_buf[0] = (tuner_frequency >> 8) & 0x7f;
tuner_buf[1] = tuner_frequency & 0xff;
tuner_buf[2] = 0xca;
tuner_buf[3] = (cp << 5) | (filter << 3) | band;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1);
if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
printk("%s/dvb: could not write to tuner at addr:
0x%02x\n",dev->name, addr << 1);
return -EIO;
}
msleep(1);
return 0;
}
in saa7134-dvb.c .. then I say no thanks.
thanks,
Markus
More information about the linux-dvb
mailing list