Andrew de Quincey wrote:
Hi, we're starting to see cards which require more complex tuner code
(especially with the new Silicon Tuners).. so much so that it begins to make
sense to write these as their own standalone modules. I've been thinking how
to incorporate these into the frontend structure. Attached is a first
attempt.
As you can see, I have added some more ops to the frontend_ops structure and a
tuner_priv field to the dvb_frontend structure. The idea being that when
creating the frontend (pretend its stv0299 for the moment) for a card, you do
the following:
dvb_frontend *fe = stv0299_attach();
acomplextuner_attach(fe);
So the stv0299 initalises the dvb_frontend first and fills out the ops
function pointers. Then the tuner is attached, and fills out yet more
function pointers (perhaps even overriding some of the demod ones) depending
on precisely how the hardware is wired. The card driver can then override
functions if it wants to (e.g. for DISEQC).
The tuner can control the demodulator's i2c switch (if present) using the
i2c_gate_ctrl function pointer present in the ops structure (usually filled
out by the demod attach function).
The frontend loop will be modified as well - instead of just calling
set_frontend(), it will call tuner_set() beforehand as well.
Finally, if we do this, I would remove all the pll_set()/pll_init() function
pointers in the demodulator config structures in favour of this method. I
would however create a wrapper "simpletuner" so that we can continue with
minimal code for the "simple" PLLs - theres no point in complicating these
beasts.
Anyway, let me know what you think.. as I said this is a first attempt, so
anything can be changed.
------------------------------------------------------------------------
diff -r 2b05b5271ae1 linux/drivers/media/dvb/dvb-core/dvb_frontend.h
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Thu Apr 13 12:29:04 2006 -0400
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Thu Apr 13 21:57:06 2006 +0100
@@ -86,6 +86,13 @@ struct dvb_frontend_ops {
int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
+
+ int (*tuner_release)(struct dvb_frontend *fe);
+ int (*tuner_init)(struct dvb_frontend *fe);
+ int (*tuner_sleep)(struct dvb_frontend *fe);
+ int (*tuner_set)(struct dvb_frontend *fe, struct dvb_frontend_parameters* params);
+ int (*tuner_get)(struct dvb_frontend *fe, struct dvb_frontend_parameters* params);
+ int (*tuner_poll)(struct dvb_frontend *fe);
};
#define MAX_EVENT 8
@@ -102,6 +109,7 @@ struct dvb_frontend {
struct dvb_frontend {
struct dvb_frontend_ops* ops;
struct dvb_adapter *dvb;
+ void* tuner_priv;
Looks nice, Already started using that one .. :-)
_______________________________________________
linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb