Thoughts about supporting more complex tuners

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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;
 	void* demodulator_priv;
 	void* frontend_priv;
 	void* misc_priv;
_______________________________________________

linux-dvb@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/linux-dvb

[Index of Archives]     [Linux Media]     [Video 4 Linux]     [Asterisk]     [Samba]     [Xorg]     [Xfree86]     [Linux USB]

  Powered by Linux