Mailing List archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[linux-dvb] dvb-kernel frontend experimental patch v2
Hi, this new version of the patch has all the previous features as well as:
* Removed unnecessary second tune from stv0299.c
* Fix non-PHILIPS_SU1278_TSA_TT cards in stv0299.c
* Removed the FE_RESET/FE_POLL stuff; no longer needed.
* Andreas Share's ves1x93 improvements (which is why FE_RESET/FE_POLL can go)
Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dvb_frontend.c,v
retrieving revision 1.70
diff -a -u -b -r1.70 dvb_frontend.c
--- linux/drivers/media/dvb/dvb-core/dvb_frontend.c 1 Mar 2004 19:11:18 -0000 1.70
+++ linux/drivers/media/dvb/dvb-core/dvb_frontend.c 9 Mar 2004 00:52:04 -0000
@@ -46,8 +46,8 @@
#define FESTATE_TUNED 16
#define FESTATE_ZIGZAG_FAST 32
#define FESTATE_ZIGZAG_SLOW 64
-#define FESTATE_CLEAN_SETUP 128
-#define FESTATE_SEARCHING (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
+#define FESTATE_DISEQC 128
+#define FESTATE_WAITFORLOCK (FESTATE_TUNING_FAST | FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW | FESTATE_DISEQC)
#define FESTATE_SEARCHING_FAST (FESTATE_TUNING_FAST | FESTATE_ZIGZAG_FAST)
#define FESTATE_SEARCHING_SLOW (FESTATE_TUNING_SLOW | FESTATE_ZIGZAG_SLOW)
#define FESTATE_LOSTLOCK (FESTATE_ZIGZAG_FAST | FESTATE_ZIGZAG_SLOW)
@@ -59,8 +59,8 @@
* FESTATE_TUNED. The frontend has successfully locked on.
* FESTATE_ZIGZAG_FAST. The lock has been lost, and a fast zigzag has been initiated to try and regain it.
* FESTATE_ZIGZAG_SLOW. The lock has been lost. Fast zigzag has been failed, so we're trying again, but slower.
- * FESTATE_CLEAN_SETUP. Used for certain dodgy tuners which need special massaging to lock.
- * FESTATE_SEARCHING. When we're searching for a signal using a zigzag scan of any sort.
+ * FESTATE_DISEQC. A DISEQC command has just been issued.
+ * FESTATE_WAITFORLOCK. When we're waiting for a lock.
* FESTATE_SEARCHING_FAST. When we're searching for a signal using a fast zigzag scan.
* FESTATE_SEARCHING_SLOW. When we're searching for a signal using a slow zigzag scan.
* FESTATE_LOSTLOCK. When the lock has been lost, and we're searching it again.
@@ -69,7 +69,10 @@
static int dvb_frontend_debug = 0;
static int dvb_shutdown_timeout = 5;
-static int dvb_frequency_bending = 1;
+static int dvb_override_frequency_bending = 0;
+static int dvb_force_auto_inversion = 0;
+
+static int do_frequency_bending = 0;
#define dprintk if (dvb_frontend_debug) printk
@@ -103,6 +106,8 @@
int auto_count;
int started_auto_count;
int min_delay;
+ int max_drift;
+ int step_size;
int exit;
fe_status_t status;
};
@@ -357,8 +362,6 @@
*/
static int dvb_frontend_autotune(struct dvb_frontend_data *fe)
{
- int stepsize;
- int maxdrift;
int autoinversion;
int ready = 0;
int wrapped = 0;
@@ -367,41 +370,14 @@
dprintk ("%s\n", __FUNCTION__);
- // choose step size for zigzag scan
- switch(fe->info->type) {
- case FE_QPSK:
- if (fe->parameters.u.qpsk.symbol_rate < 10000000) {
- stepsize = fe->parameters.u.qpsk.symbol_rate / 32000;
- maxdrift = 5000;
- } else {
- stepsize = fe->parameters.u.qpsk.symbol_rate / 16000;
- maxdrift = fe->parameters.u.qpsk.symbol_rate / 2000;
- }
- break;
-
- case FE_QAM:
- stepsize = 1;
- maxdrift = 0; // don't want any zigzagging under DVB-C frontends
- break;
-
- case FE_OFDM:
- stepsize = fe->info->frequency_stepsize * 2;
- maxdrift = (fe->info->frequency_stepsize * 2) + 1;
- break;
-
- default:
- printk("Unknown frontend type %i\n", fe->info->type);
- return 0;
- }
-
// are we using autoinversion?
autoinversion = ((!(fe->info->caps & FE_CAN_INVERSION_AUTO)) && (fe->parameters.inversion == INVERSION_AUTO));
// setup parameters correctly
while(!ready) {
// wrap the count if we've reached the maximum drift
- fe->lnb_drift = (fe->auto_count / 4) * stepsize;
- if (fe->lnb_drift >= maxdrift) {
+ fe->lnb_drift = (fe->auto_count / 4) * fe->step_size;
+ if (fe->lnb_drift > fe->max_drift) {
fe->auto_count = 0;
fe->lnb_drift = 0;
wrapped = 1;
@@ -442,8 +418,8 @@
if (!ready) fe->auto_count++;
}
- // perform frequency bending if enabled
- if (dvb_frequency_bending)
+ // perform frequency bending if necessary
+ if ((dvb_override_frequency_bending != 1) && do_frequency_bending)
dvb_bend_frequency(fe, 0);
// set the frontend itself
@@ -453,9 +429,6 @@
fe->parameters.frequency = original_frequency;
fe->parameters.inversion = original_inversion;
- // reset frontend IRQ bits to clean error stats
- dvb_frontend_internal_ioctl (&fe->frontend, FE_RESET, NULL);
-
// if we've hit where we started from, indicate a complete iteration has occurred
fe->auto_count++;
if ((fe->auto_count == fe->started_auto_count) || (fe->started_auto_count==0 && wrapped)) return 1;
@@ -483,7 +456,7 @@
unsigned long timeout;
char name [15];
int quality = 0, delay = 3*HZ;
- int clean_setup_count = 0;
+ int poll_valid = 0;
fe_status_t s;
dprintk ("%s\n", __FUNCTION__);
@@ -521,7 +494,7 @@
dvb_frontend_add_event (fe, s);
// if we're not tuned, and we have a lock, move to the TUNED state
- if ((fe->state & FESTATE_SEARCHING) && (s & FE_HAS_LOCK)) {
+ if ((fe->state & FESTATE_WAITFORLOCK) && (s & FE_HAS_LOCK)) {
update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
fe->state = FESTATE_TUNED;
@@ -547,9 +520,18 @@
}
}
- // don't actually do anything if we're in the LOSTLOCK state
- // and the frontend can recover automatically
- if ((fe->state & FESTATE_LOSTLOCK) && (fe->info->caps & FE_CAN_RECOVER)) {
+ // don't actually do anything if we're in the LOSTLOCK state, the frontend is set to
+ // FE_CAN_RECOVER, and the max_drift is 0
+ if ((fe->state & FESTATE_LOSTLOCK) &&
+ (fe->info->caps & FE_CAN_RECOVER) && (fe->max_drift == 0)) {
+ update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
+ continue;
+ }
+
+ // don't do anything if we're in the DISEQC state, since this might be someone
+ // with a motorized dish controlled by DISEQC. If its actually a re-tune, there will
+ // be a SET_FRONTEND soon enough.
+ if (fe->state & FESTATE_DISEQC) {
update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
continue;
}
@@ -560,26 +542,23 @@
fe->inversion = INVERSION_OFF;
fe->auto_count = 0;
fe->started_auto_count = 0;
- clean_setup_count = 0;
+ poll_valid = 0;
}
// fast zigzag.
if ((fe->state & FESTATE_SEARCHING_FAST) || (fe->state & FESTATE_RETUNE)) {
delay = fe->min_delay;
+ // peform a tune
+ poll_valid = 1;
+ if (dvb_frontend_autotune(fe)) {
// OK, if we've run out of trials at the fast speed. Drop back to
// slow for the _next_ attempt
- if (dvb_frontend_autotune(fe)) {
fe->state = FESTATE_SEARCHING_SLOW;
fe->started_auto_count = fe->auto_count;
continue;
}
- // enter clean setup state after the first tune if necessary. yeuch
- if ((!(fe->info->caps & FE_CAN_CLEAN_SETUP)) && (clean_setup_count == 0)) {
- fe->state = FESTATE_CLEAN_SETUP;
- }
-
// if we've just retuned, enter the ZIGZAG_FAST state. This ensures
// we cannot return from an FE_SET_FRONTEND before the retune occurs.
if (fe->state & FESTATE_RETUNE) {
@@ -589,20 +568,11 @@
// slow zigzag
if (fe->state & FESTATE_SEARCHING_SLOW) {
+ // perform tuning
+ poll_valid = 1;
update_delay(&quality, &delay, fe->min_delay, s & FE_HAS_LOCK);
dvb_frontend_autotune(fe);
}
-
- // clean setup
- if (fe->state & FESTATE_CLEAN_SETUP) {
- if ((clean_setup_count < 10) && (!(s & FE_HAS_LOCK))) {
- dvb_frontend_internal_ioctl(&fe->frontend, FE_RESET, NULL);
- } else {
- // return to tuning state
- fe->state = FESTATE_TUNING_FAST;
- }
- clean_setup_count++;
- }
};
if (dvb_shutdown_timeout)
@@ -713,8 +683,8 @@
{
struct dvb_device *dvbdev = file->private_data;
struct dvb_frontend_data *fe = dvbdev->priv;
+ struct dvb_frontend_tune_settings fetunesettings;
int err = 0;
- int delay_ms;
dprintk ("%s\n", __FUNCTION__);
@@ -731,7 +701,7 @@
if (fe->status)
dvb_call_frontend_notifiers (fe, 0);
dvb_frontend_internal_ioctl (&fe->frontend, cmd, parg);
- fe->state = FESTATE_IDLE;
+ fe->state = FESTATE_DISEQC;
break;
case FE_SET_FRONTEND:
@@ -740,20 +710,40 @@
memcpy (&fe->parameters, parg,
sizeof (struct dvb_frontend_parameters));
- delay_ms = dvb_frontend_internal_ioctl(&fe->frontend, FE_GETMINDELAY, &fe->parameters);
- if (delay_ms >= 0) fe->min_delay = (delay_ms * HZ) / 1000;
- else {
+ memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
+ memcpy(&fetunesettings.parameters, parg,
+ sizeof (struct dvb_frontend_parameters));
+
+ // force auto frequency inversion if requested
+ if (dvb_force_auto_inversion) {
+ fe->parameters.inversion = INVERSION_AUTO;
+ fetunesettings.parameters.inversion = INVERSION_AUTO;
+ }
+
+ // get frontend-specific tuning settings
+ if (dvb_frontend_internal_ioctl(&fe->frontend, FE_GET_TUNE_SETTINGS, &fetunesettings) == 0) {
+ fe->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
+ fe->max_drift = fetunesettings.max_drift;
+ fe->step_size = fetunesettings.step_size;
+ } else {
+ // default values
switch(fe->info->type) {
case FE_QPSK:
fe->min_delay = HZ/20; // default mindelay of 50ms
+ fe->step_size = fe->parameters.u.qpsk.symbol_rate / 16000;
+ fe->max_drift = fe->parameters.u.qpsk.symbol_rate / 2000;
break;
case FE_QAM:
fe->min_delay = HZ/20; // default mindelay of 50ms
+ fe->step_size = 0;
+ fe->max_drift = 0; // don't want any zigzagging under DVB-C frontends
break;
case FE_OFDM:
- fe->min_delay = HZ/10; // default mindelay of 100ms
+ fe->min_delay = HZ/20; // default mindelay of 50ms
+ fe->step_size = fe->info->frequency_stepsize * 2;
+ fe->max_drift = (fe->info->frequency_stepsize * 2) + 1;
break;
}
}
@@ -1128,6 +1118,9 @@
dvb_register_device (i2c->adapter, &fe->dvbdev, &dvbdev_template,
fe, DVB_DEVICE_FRONTEND);
+ if ((info->caps & FE_NEEDS_BENDING) || (dvb_override_frequency_bending == 2))
+ do_frequency_bending = 1;
+
up (&frontend_mutex);
return 0;
@@ -1165,7 +1158,10 @@
MODULE_PARM(dvb_frontend_debug,"i");
MODULE_PARM(dvb_shutdown_timeout,"i");
-MODULE_PARM(dvb_frequency_bending,"i");
+MODULE_PARM(dvb_override_frequency_bending,"i");
+MODULE_PARM(dvb_force_auto_inversion,"i");
+
MODULE_PARM_DESC(dvb_frontend_debug, "enable verbose debug messages");
MODULE_PARM_DESC(dvb_shutdown_timeout, "wait <shutdown_timeout> seconds after close() before suspending hardware");
-MODULE_PARM_DESC(dvb_frequency_bending, "0: disable frequency bending, 1: enable (default)");
+MODULE_PARM_DESC(dvb_override_frequency_bending, "0: normal (default), 1: never use frequency bending, 2: always use frequency bending");
+MODULE_PARM_DESC(dvb_force_auto_inversion, "0: normal (default), 1: INVERSION_AUTO forced always");
Index: linux/drivers/media/dvb/dvb-core/dvb_frontend.h
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/dvb-core/dvb_frontend.h,v
retrieving revision 1.9
diff -a -u -b -r1.9 dvb_frontend.h
--- linux/drivers/media/dvb/dvb-core/dvb_frontend.h 27 Feb 2004 03:32:53 -0000 1.9
+++ linux/drivers/media/dvb/dvb-core/dvb_frontend.h 9 Mar 2004 00:52:04 -0000
@@ -56,15 +56,25 @@
void *data; /* can be used by hardware module... */
};
+struct dvb_frontend_tune_settings {
+ int min_delay_ms;
+ int step_size;
+ int max_drift;
+ struct dvb_frontend_parameters parameters;
+};
+
/**
* private frontend command ioctl's.
* keep them in sync with the public ones defined in linux/dvb/frontend.h
+ *
+ * FE_SLEEP. Ioctl used to put frontend into a low power mode.
+ * FE_INIT. Ioctl used to initialise the frontend.
+ * FE_GET_TUNE_SETTINGS. Get the frontend-specific tuning loop settings for the supplied set of parameters.
*/
#define FE_SLEEP _IO('v', 80)
#define FE_INIT _IO('v', 81)
-#define FE_RESET _IO('v', 82)
-#define FE_GETMINDELAY _IOW('v', 83, struct dvb_frontend_parameters)
+#define FE_GET_TUNE_SETTINGS _IOWR('v', 83, struct dvb_frontend_tune_settings)
extern int
Index: linux/drivers/media/dvb/frontends/alps_tdlb7.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/alps_tdlb7.c,v
retrieving revision 1.16
diff -a -u -b -r1.16 alps_tdlb7.c
--- linux/drivers/media/dvb/frontends/alps_tdlb7.c 29 Jan 2004 20:42:31 -0000 1.16
+++ linux/drivers/media/dvb/frontends/alps_tdlb7.c 9 Mar 2004 00:52:06 -0000
@@ -636,9 +636,6 @@
case FE_SET_FRONTEND:
return sp8870_set_frontend(i2c, (struct dvb_frontend_parameters*) arg);
- case FE_RESET:
- return -EOPNOTSUPP;
-
case FE_GET_FRONTEND: // FIXME: read known values back from Hardware...
return -EOPNOTSUPP;
@@ -653,6 +650,15 @@
}
break;
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
+ }
+
default:
return -EOPNOTSUPP;
};
Index: linux/drivers/media/dvb/frontends/alps_tdmb7.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/alps_tdmb7.c,v
retrieving revision 1.23
diff -a -u -b -r1.23 alps_tdmb7.c
--- linux/drivers/media/dvb/frontends/alps_tdmb7.c 29 Jan 2004 20:42:31 -0000 1.23
+++ linux/drivers/media/dvb/frontends/alps_tdmb7.c 9 Mar 2004 00:52:06 -0000
@@ -50,7 +50,7 @@
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
- FE_CAN_CLEAN_SETUP | FE_CAN_RECOVER
+ FE_CAN_RECOVER
};
@@ -390,8 +390,14 @@
case FE_INIT:
return cx22700_init (i2c);
- case FE_RESET:
- break;
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
+ }
default:
return -EOPNOTSUPP;
Index: linux/drivers/media/dvb/frontends/at76c651.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/at76c651.c,v
retrieving revision 1.14
diff -a -u -b -r1.14 at76c651.c
--- linux/drivers/media/dvb/frontends/at76c651.c 20 Dec 2003 22:22:19 -0000 1.14
+++ linux/drivers/media/dvb/frontends/at76c651.c 9 Mar 2004 00:52:06 -0000
@@ -71,9 +71,7 @@
FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 | FE_CAN_QAM_128 |
- FE_CAN_QAM_256 /* | FE_CAN_QAM_512 | FE_CAN_QAM_1024 */ |
- FE_CAN_RECOVER | FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
-
+ FE_CAN_MUTE_TS | FE_CAN_QAM_256 | FE_CAN_RECOVER
};
#if ! defined(__powerpc__)
@@ -360,6 +358,7 @@
at76c651_set_symbolrate(i2c, p->u.qam.symbol_rate);
at76c651_set_inversion(i2c, p->inversion);
at76c651_set_auto_config(i2c);
+ at76c651_reset(i2c);
return 0;
@@ -460,8 +459,14 @@
case FE_INIT:
return at76c651_set_defaults(fe->i2c);
- case FE_RESET:
- return at76c651_reset(fe->i2c);
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
+ }
default:
return -ENOIOCTLCMD;
Index: linux/drivers/media/dvb/frontends/cx24110.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/cx24110.c,v
retrieving revision 1.12
diff -a -u -b -r1.12 cx24110.c
--- linux/drivers/media/dvb/frontends/cx24110.c 9 Dec 2003 06:08:29 -0000 1.12
+++ linux/drivers/media/dvb/frontends/cx24110.c 9 Mar 2004 00:52:07 -0000
@@ -59,8 +59,7 @@
.caps = FE_CAN_INVERSION_AUTO |
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK |
- FE_CAN_CLEAN_SETUP
+ FE_CAN_QPSK
};
/* fixme: are these values correct? especially ..._tolerance and caps */
@@ -621,11 +620,6 @@
case FE_INIT:
return cx24110_init (i2c);
- case FE_RESET:
-/* no idea what to do for this call */
-/* fixme (medium): fill me in */
- break;
-
case FE_SET_TONE:
return cx24110_writereg(i2c,0x76,(cx24110_readreg(i2c,0x76)&~0x10)|((((fe_sec_tone_mode_t) arg)==SEC_TONE_ON)?0x10:0));
case FE_SET_VOLTAGE:
Index: linux/drivers/media/dvb/frontends/dst.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/dst.c,v
retrieving revision 1.12
diff -a -u -b -r1.12 dst.c
--- linux/drivers/media/dvb/frontends/dst.c 3 Feb 2004 23:10:10 -0000 1.12
+++ linux/drivers/media/dvb/frontends/dst.c 9 Mar 2004 00:52:07 -0000
@@ -963,7 +963,6 @@
{FE_GET_FRONTEND, "FE_GET_FRONTEND:" },
{FE_SLEEP, "FE_SLEEP:" },
{FE_INIT, "FE_INIT:" },
- {FE_RESET, "FE_RESET:" },
{FE_SET_TONE, "FE_SET_TONE:" },
{FE_SET_VOLTAGE, "FE_SET_VOLTAGE:" },
};
@@ -1091,9 +1090,6 @@
dst_init(dst);
break;
- case FE_RESET:
- break;
-
case FE_DISEQC_SEND_MASTER_CMD:
{
struct dvb_diseqc_master_cmd *cmd = (struct dvb_diseqc_master_cmd *)arg;
Index: linux/drivers/media/dvb/frontends/dvb_dummy_fe.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/dvb_dummy_fe.c,v
retrieving revision 1.5
diff -a -u -b -r1.5 dvb_dummy_fe.c
--- linux/drivers/media/dvb/frontends/dvb_dummy_fe.c 8 Oct 2003 23:12:46 -0000 1.5
+++ linux/drivers/media/dvb/frontends/dvb_dummy_fe.c 9 Mar 2004 00:52:07 -0000
@@ -62,8 +62,7 @@
#endif
.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
FE_CAN_QAM_128 | FE_CAN_QAM_256 |
- FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
- FE_CAN_CLEAN_SETUP
+ FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO
};
static struct dvb_frontend_info dvb_t_dummyfe_info = {
@@ -157,9 +156,6 @@
case FE_INIT:
return 0;
- case FE_RESET:
- return 0;
-
case FE_SET_TONE:
return -EOPNOTSUPP;
Index: linux/drivers/media/dvb/frontends/grundig_29504-401.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/grundig_29504-401.c,v
retrieving revision 1.21
diff -a -u -b -r1.21 grundig_29504-401.c
--- linux/drivers/media/dvb/frontends/grundig_29504-401.c 3 Mar 2004 14:34:58 -0000 1.21
+++ linux/drivers/media/dvb/frontends/grundig_29504-401.c 9 Mar 2004 00:52:08 -0000
@@ -48,7 +48,7 @@
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
- FE_CAN_MUTE_TS /*| FE_CAN_CLEAN_SETUP*/
+ FE_CAN_MUTE_TS
};
Index: linux/drivers/media/dvb/frontends/grundig_29504-491.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/grundig_29504-491.c,v
retrieving revision 1.15
diff -a -u -b -r1.15 grundig_29504-491.c
--- linux/drivers/media/dvb/frontends/grundig_29504-491.c 8 Oct 2003 23:12:46 -0000 1.15
+++ linux/drivers/media/dvb/frontends/grundig_29504-491.c 9 Mar 2004 00:52:08 -0000
@@ -52,8 +52,7 @@
FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK |
- FE_CAN_MUTE_TS | FE_CAN_CLEAN_SETUP
+ FE_CAN_QPSK | FE_CAN_MUTE_TS
};
@@ -398,11 +397,6 @@
tda8083_writereg (i2c, 0x00, 0x04);
break;
- case FE_RESET:
- tda8083_writereg (i2c, 0x00, 0x3c);
- tda8083_writereg (i2c, 0x00, 0x04);
- break;
-
case FE_DISEQC_SEND_MASTER_CMD:
return tda8083_send_diseqc_msg (i2c, arg);
Index: linux/drivers/media/dvb/frontends/mt312.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/mt312.c,v
retrieving revision 1.13
diff -a -u -b -r1.13 mt312.c
--- linux/drivers/media/dvb/frontends/mt312.c 20 Dec 2003 22:22:19 -0000 1.13
+++ linux/drivers/media/dvb/frontends/mt312.c 9 Mar 2004 00:52:09 -0000
@@ -66,8 +66,8 @@
.caps =
FE_CAN_INVERSION_AUTO | FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 |
FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
- FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_RECOVER |
- FE_CAN_CLEAN_SETUP | FE_CAN_MUTE_TS
+ FE_CAN_FEC_AUTO | FE_CAN_QPSK | FE_CAN_MUTE_TS |
+ FE_CAN_RECOVER
};
static int mt312_read(struct dvb_i2c_bus *i2c,
@@ -570,6 +570,8 @@
if ((ret = mt312_write(i2c, SYM_RATE_H, buf, sizeof(buf))) < 0)
return ret;
+ mt312_reset(i2c, 0);
+
return 0;
}
@@ -756,8 +758,14 @@
else
return mt312_init(i2c, (long) fe->data, (u8) 60);
- case FE_RESET:
- return mt312_reset(i2c, 0);
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
+ }
default:
return -ENOIOCTLCMD;
Index: linux/drivers/media/dvb/frontends/mt352.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/mt352.c,v
retrieving revision 1.1
diff -a -u -b -r1.1 mt352.c
--- linux/drivers/media/dvb/frontends/mt352.c 5 Mar 2004 16:43:49 -0000 1.1
+++ linux/drivers/media/dvb/frontends/mt352.c 9 Mar 2004 00:52:09 -0000
@@ -60,7 +60,7 @@
FE_CAN_FEC_3_4 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
- FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER | FE_CAN_CLEAN_SETUP |
+ FE_CAN_HIERARCHY_AUTO | FE_CAN_RECOVER |
FE_CAN_MUTE_TS
};
Index: linux/drivers/media/dvb/frontends/nxt6000.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/nxt6000.c,v
retrieving revision 1.17
diff -a -u -b -r1.17 nxt6000.c
--- linux/drivers/media/dvb/frontends/nxt6000.c 29 Jan 2004 18:09:51 -0000 1.17
+++ linux/drivers/media/dvb/frontends/nxt6000.c 9 Mar 2004 00:52:10 -0000
@@ -52,7 +52,12 @@
.symbol_rate_max = 9360000, /* FIXME */
.symbol_rate_tolerance = 4000,
.notifier_delay = 0,
- .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 | FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO | FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO | FE_CAN_HIERARCHY_AUTO,
+ .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
+ FE_CAN_FEC_4_5 | FE_CAN_FEC_5_6 | FE_CAN_FEC_6_7 |
+ FE_CAN_FEC_7_8 | FE_CAN_FEC_8_9 | FE_CAN_FEC_AUTO |
+ FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_QAM_AUTO |
+ FE_CAN_TRANSMISSION_MODE_AUTO | FE_CAN_GUARD_INTERVAL_AUTO |
+ FE_CAN_HIERARCHY_AUTO,
};
struct nxt6000_config {
@@ -657,9 +662,6 @@
nxt6000_setup(fe);
break;
- case FE_RESET:
- break;
-
case FE_SET_FRONTEND:
{
struct nxt6000_config *nxt = FE2NXT(fe);
Index: linux/drivers/media/dvb/frontends/sp887x.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/sp887x.c,v
retrieving revision 1.10
diff -a -u -b -r1.10 sp887x.c
--- linux/drivers/media/dvb/frontends/sp887x.c 2 Mar 2004 10:11:34 -0000 1.10
+++ linux/drivers/media/dvb/frontends/sp887x.c 9 Mar 2004 00:52:10 -0000
@@ -64,7 +64,8 @@
.frequency_stepsize = 166666,
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | FE_CAN_FEC_AUTO |
- FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 | FE_CAN_RECOVER
+ FE_CAN_QPSK | FE_CAN_QAM_16 | FE_CAN_QAM_64 |
+ FE_CAN_RECOVER
};
static int errno;
@@ -632,6 +633,15 @@
sp887x_writereg(fe, 0xc18, 0x00d);
break;
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ fesettings->step_size = 0;
+ fesettings->max_drift = 0;
+ return 0;
+ }
+
default:
return -EOPNOTSUPP;
};
Index: linux/drivers/media/dvb/frontends/stv0299.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/stv0299.c,v
retrieving revision 1.37
diff -a -u -b -r1.37 stv0299.c
--- linux/drivers/media/dvb/frontends/stv0299.c 27 Feb 2004 09:54:49 -0000 1.37
+++ linux/drivers/media/dvb/frontends/stv0299.c 9 Mar 2004 00:52:12 -0000
@@ -96,8 +96,7 @@
.caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 |
FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 |
FE_CAN_QPSK |
- FE_CAN_FEC_AUTO |
- FE_CAN_CLEAN_SETUP
+ FE_CAN_FEC_AUTO
};
@@ -368,8 +367,13 @@
if ((freq < 950000) || (freq > 2150000)) return -EINVAL;
+ if (ftype == PHILIPS_SU1278_TSA_TT) {
divisor = 500;
regcode = 2;
+ } else {
+ divisor = 1000;
+ regcode = 1;
+ }
// setup frequency divisor
div = (freq + (divisor - 1)) / divisor; // round correctly
@@ -979,21 +983,6 @@
return srate;
}
-static int stv0299_check_inversion (struct dvb_i2c_bus *i2c)
-{
- dprintk ("%s\n", __FUNCTION__);
-
- if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
- dvb_delay(30);
- if ((stv0299_readreg (i2c, 0x1b) & 0x98) != 0x98) {
- u8 val = stv0299_readreg (i2c, 0x0c);
- return stv0299_writereg (i2c, 0x0c, val ^ 0x01);
- }
- }
-
- return 0;
-}
-
static int uni0299_ioctl (struct dvb_frontend *fe, unsigned int cmd, void *arg)
{
struct dvb_i2c_bus *i2c = fe->i2c;
@@ -1093,14 +1082,13 @@
} else if (p->inversion == INVERSION_ON) {
stv0299_writereg(i2c, 0x0c, stv0299_readreg(i2c, 0x0c) | 1);
} else {
- // temporary hack until the new dvb_frontend.c becomes mainline
- stv0299_check_inversion(i2c);
-
-// printk("stv0299 does not support auto-inversion\n");
-// return -EINVAL;
+ printk("stv0299 does not support auto-inversion\n");
+ return -EINVAL;
}
- if (state->tuner_type == PHILIPS_SU1278_TSA_TT) {
+ switch(state->tuner_type) {
+ case PHILIPS_SU1278_TSA_TT:
+ {
/* check if we should do a finetune */
int frequency_delta = p->frequency - state->tuner_frequency;
int minmax = p->u.qpsk.symbol_rate / 2000;
@@ -1118,10 +1106,7 @@
// now set them as we want
stv0299_writereg (i2c, 0x22, Drot_freq >> 8);
stv0299_writereg (i2c, 0x23, Drot_freq);
- break;
- }
- }
-
+ } else {
/* A "normal" tune is requested */
stv0299_writereg (i2c, 0x32, 0x80);
stv0299_writereg (i2c, 0x22, 0x00);
@@ -1130,10 +1115,19 @@
stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, state->tuner_type);
stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
- dvb_delay(50);
+ }
+ break;
+ }
+
+ default:
+ stv0299_set_FEC (i2c, p->u.qpsk.fec_inner);
+ stv0299_set_symbolrate (i2c, p->u.qpsk.symbol_rate, state->tuner_type);
stv0299_writereg (i2c, 0x22, 0x00);
stv0299_writereg (i2c, 0x23, 0x00);
- pll_set_tv_freq (i2c, p->frequency, state->tuner_type, p->u.qpsk.symbol_rate);
+ stv0299_readreg (i2c, 0x23);
+ stv0299_writereg (i2c, 0x12, 0xb9);
+ break;
+ }
state->tuner_frequency = p->frequency;
state->fec_inner = p->u.qpsk.fec_inner;
@@ -1172,6 +1166,8 @@
break;
case FE_INIT:
+ switch(state->tuner_type) {
+ case PHILIPS_SU1278_TSA_TT:
state->tuner_frequency = 0;
if (!state->initialised) {
state->initialised = 1;
@@ -1179,6 +1175,11 @@
}
break;
+ default:
+ return stv0299_init (i2c, state->tuner_type);
+ }
+ break;
+
case FE_DISEQC_SEND_MASTER_CMD:
return stv0299_send_diseqc_msg (i2c, arg);
@@ -1191,6 +1192,20 @@
case FE_SET_VOLTAGE:
return stv0299_set_voltage (i2c, (fe_sec_voltage_t) arg);
+ case FE_GET_TUNE_SETTINGS:
+ {
+ struct dvb_frontend_tune_settings* fesettings = (struct dvb_frontend_tune_settings*) arg;
+ fesettings->min_delay_ms = 50;
+ if (fesettings->parameters.u.qpsk.symbol_rate < 10000000) {
+ fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 32000;
+ fesettings->max_drift = 5000;
+ } else {
+ fesettings->step_size = fesettings->parameters.u.qpsk.symbol_rate / 16000;
+ fesettings->max_drift = fesettings->parameters.u.qpsk.symbol_rate / 2000;
+ }
+ return 0;
+ }
+
default:
return -EOPNOTSUPP;
};
Index: linux/drivers/media/dvb/frontends/ves1820.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/ves1820.c,v
retrieving revision 1.41
diff -a -u -b -r1.41 ves1820.c
--- linux/drivers/media/dvb/frontends/ves1820.c 1 Mar 2004 22:54:14 -0000 1.41
+++ linux/drivers/media/dvb/frontends/ves1820.c 9 Mar 2004 00:52:12 -0000
@@ -111,8 +111,7 @@
#endif
.caps = FE_CAN_QAM_16 | FE_CAN_QAM_32 | FE_CAN_QAM_64 |
FE_CAN_QAM_128 | FE_CAN_QAM_256 |
- FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO |
- FE_CAN_CLEAN_SETUP
+ FE_CAN_FEC_AUTO | FE_CAN_INVERSION_AUTO,
};
Index: linux/drivers/media/dvb/frontends/ves1x93.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/frontends/ves1x93.c,v
retrieving revision 1.4
diff -a -u -b -r1.4 ves1x93.c
--- linux/drivers/media/dvb/frontends/ves1x93.c 16 Jan 2004 14:34:05 -0000 1.4
+++ linux/drivers/media/dvb/frontends/ves1x93.c 9 Mar 2004 00:52:12 -0000
@@ -67,10 +67,10 @@
*/
static u8 init_1893_tab [] = {
- 0x01, 0xa4, 0x35, 0x81, 0x2a, 0x0d, 0x55, 0xc4,
+ 0x01, 0xa4, 0x35, 0x80, 0x2a, 0x0b, 0x55, 0xc4,
0x09, 0x69, 0x00, 0x86, 0x4c, 0x28, 0x7f, 0x00,
0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x80, 0x00, 0x31, 0xb0, 0x14, 0x00, 0xdc, 0x00,
+ 0x80, 0x00, 0x21, 0xb0, 0x14, 0x00, 0xdc, 0x00,
0x81, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x55, 0x00, 0x00, 0x7f, 0x00
@@ -247,8 +247,16 @@
{
ves1x93_writereg (i2c, 0, init_1x93_tab[0] & 0xfe);
ves1x93_writereg (i2c, 0, init_1x93_tab[0]);
+ dvb_delay(5);
+ return 0;
+}
+
+static int ves1x93_init_aquire (struct dvb_i2c_bus *i2c)
+{
ves1x93_writereg (i2c, 3, 0x00);
- return ves1x93_writereg (i2c, 3, init_1x93_tab[3]);
+ ves1x93_writereg (i2c, 3, init_1x93_tab[3]);
+ dvb_delay(5);
+ return 0;
}
@@ -308,6 +316,12 @@
u32 tmp;
u32 XIN, FIN;
+ u8 sync = ves1x93_readreg (i2c, 0x0e);
+ if (!(sync & 1)){
+ dprintk("No signal");
+ return -1;
+ }
+
dprintk("%s: srate == %d\n", __FUNCTION__, (unsigned int) srate);
switch (board_type) {
@@ -403,6 +417,35 @@
}
+static int ves1x93_afc (struct dvb_i2c_bus *i2c, u32 freq, u32 srate)
+{
+ int afc;
+
+ u8 sync = ves1x93_readreg (i2c, 0x0e);
+
+ if (!(sync & 8)){
+ dprintk("No sync");
+ return -1;
+ }
+
+ afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;
+ afc = (afc * (int)(srate/1000/8))/16;
+
+ if (afc |= 0){
+
+ freq -= afc;
+
+ tuner_set_tv_freq (i2c, freq, 0);
+
+ ves1x93_init_aquire (i2c);
+
+ afc = ((int)((ves1x93_readreg (i2c, 0x0a) << 1) & 0xff))/2;
+ afc = (afc * (int)(srate/1000/8))/16;
+ }
+
+ return 0;
+}
+
static int ves1x93_set_voltage (struct dvb_i2c_bus *i2c, fe_sec_voltage_t voltage)
{
switch (voltage) {
@@ -497,6 +540,7 @@
ves1x93_set_inversion (i2c, p->inversion);
ves1x93_set_fec (i2c, p->u.qpsk.fec_inner);
ves1x93_set_symbolrate (i2c, p->u.qpsk.symbol_rate);
+ ves1x93_afc (i2c, p->frequency, p->u.qpsk.symbol_rate);
break;
}
@@ -530,9 +574,6 @@
case FE_INIT:
return ves1x93_init (i2c);
- case FE_RESET:
- return ves1x93_clr_bit (i2c);
-
case FE_SET_TONE:
return -EOPNOTSUPP; /* the ves1893 can generate the 22k */
/* let's implement this when we have */
Index: linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c,v
retrieving revision 1.43
diff -a -u -b -r1.43 ttusb_dec.c
--- linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c 29 Feb 2004 12:25:30 -0000 1.43
+++ linux/drivers/media/dvb/ttusb-dec/ttusb_dec.c 9 Mar 2004 00:52:14 -0000
@@ -1586,10 +1586,6 @@
dprintk("%s: FE_INIT\n", __FUNCTION__);
break;
- case FE_RESET:
- dprintk("%s: FE_RESET\n", __FUNCTION__);
- break;
-
default:
dprintk("%s: unknown IOCTL (0x%X)\n", __FUNCTION__, cmd);
return -EINVAL;
@@ -1701,10 +1697,6 @@
dprintk("%s: FE_INIT\n", __FUNCTION__);
break;
- case FE_RESET:
- dprintk("%s: FE_RESET\n", __FUNCTION__);
- break;
-
case FE_DISEQC_SEND_MASTER_CMD:
dprintk("%s: FE_DISEQC_SEND_MASTER_CMD\n", __FUNCTION__);
break;
Index: linux/include/linux/dvb/frontend.h
===================================================================
RCS file: /cvs/linuxtv/dvb-kernel/linux/include/linux/dvb/frontend.h,v
retrieving revision 1.10
diff -a -u -b -r1.10 frontend.h
--- linux/include/linux/dvb/frontend.h 8 May 2003 13:50:13 -0000 1.10
+++ linux/include/linux/dvb/frontend.h 9 Mar 2004 00:52:14 -0000
@@ -59,9 +59,9 @@
FE_CAN_BANDWIDTH_AUTO = 0x40000,
FE_CAN_GUARD_INTERVAL_AUTO = 0x80000,
FE_CAN_HIERARCHY_AUTO = 0x100000,
- FE_CAN_RECOVER = 0x20000000,
- FE_CAN_CLEAN_SETUP = 0x40000000,
- FE_CAN_MUTE_TS = 0x80000000
+ FE_NEEDS_BENDING = 0x20000000, // frontend requires frequency bending
+ FE_CAN_RECOVER = 0x40000000, // frontend can recover from a cable unplug automatically
+ FE_CAN_MUTE_TS = 0x80000000 // frontend can stop spurious TS data output
} fe_caps_t;
Home |
Main Index |
Thread Index