[linux-dvb] [PATCH/RFC] add dvb-s2 support to frontend.h and
dvb_frontend.[h|c]
Alan Nisota
alannisota at gmail.com
Sun Apr 23 01:50:12 CEST 2006
Here is a modified version of Marcel's DVB-S2 patch. I made the
following changes:
removed #defines for QPSK, QAM_16, etc and added them back into the
fe_modulation enum. This was needed for backwards compatibility, as
the #define was conflicting with mythtv (which had a method called
QPSK)
implemented the union in dvb_frontend_parameters_new as static (as per
my previous mail). This made it much easier to implement support for
DVB-S2 in mythtv
reinitialize driver to legacy mode when the fronetend is opened (for
write), as otherwise, a legacy app could not access the frontend if an
updated app had called SET_STANDARD in the past.
filled out the implementation in dvb_frontend.c
I have implemented the DVB-S2 driver for the genpix-8psk board (will
post it imminently), and have the necessary patch for mythtv available
too.
Signed off by Alan Nisota <alannisota at gmail.com>
diff -r 436e56df57d3 linux/drivers/media/dvb/dvb-core/dvb_frontend.c
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Thu Apr 13
18:50:22 2006 -0300
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.c Sat Apr 22
13:38:01 2006 -0700
@@ -94,6 +94,7 @@ struct dvb_frontend_private {
/* thread/frontend values */
struct dvb_device *dvbdev;
struct dvb_frontend_parameters parameters;
+ struct dvb_frontend_parameters_new parameters_new;
struct dvb_fe_events events;
struct semaphore sem;
struct list_head list_head;
@@ -109,6 +110,8 @@ struct dvb_frontend_private {
int tone;
int voltage;
+ int current_standard_set;
+ fe_type_t current_standard;
/* swzigzag values */
unsigned int state;
unsigned int bending;
@@ -255,12 +258,23 @@ static int dvb_frontend_swzigzag_autotun
int autoinversion;
int ready = 0;
struct dvb_frontend_private *fepriv = fe->frontend_priv;
- int original_inversion = fepriv->parameters.inversion;
- u32 original_frequency = fepriv->parameters.frequency;
+ int original_inversion;
+ u32 original_frequency;
+
+ if (fepriv->current_standard_set) {
+ original_inversion = fepriv->parameters_new.inversion;
+ original_frequency = fepriv->parameters_new.frequency;
+ } else {
+ original_inversion = fepriv->parameters.inversion;
+ original_frequency = fepriv->parameters.frequency;
+ }
/* are we using autoinversion? */
autoinversion = ((!(fe->ops->info.caps & FE_CAN_INVERSION_AUTO)) &&
- (fepriv->parameters.inversion == INVERSION_AUTO));
+ ((fepriv->current_standard_set &&
+ fepriv->parameters_new.inversion == INVERSION_AUTO) ||
+ (! fepriv->current_standard_set &&
+ fepriv->parameters.inversion == INVERSION_AUTO)));
/* setup parameters correctly */
while(!ready) {
@@ -326,14 +340,24 @@ static int dvb_frontend_swzigzag_autotun
fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
/* set the frontend itself */
- fepriv->parameters.frequency += fepriv->lnb_drift;
- if (autoinversion)
- fepriv->parameters.inversion = fepriv->inversion;
- if (fe->ops->set_frontend)
- fe->ops->set_frontend(fe, &fepriv->parameters);
-
- fepriv->parameters.frequency = original_frequency;
- fepriv->parameters.inversion = original_inversion;
+ if (fepriv->current_standard_set) {
+ fepriv->parameters_new.frequency += fepriv->lnb_drift;
+ if (autoinversion)
+ fepriv->parameters_new.inversion = fepriv->inversion;
+ if (fe->ops->set_frontend2)
+ fe->ops->set_frontend2(fe, &fepriv->parameters_new);
+ fepriv->parameters_new.frequency = original_frequency;
+ fepriv->parameters_new.inversion = original_inversion;
+ } else {
+ fepriv->parameters.frequency += fepriv->lnb_drift;
+ if (autoinversion)
+ fepriv->parameters.inversion = fepriv->inversion;
+ if (fe->ops->set_frontend)
+ fe->ops->set_frontend(fe, &fepriv->parameters);
+
+ fepriv->parameters.frequency = original_frequency;
+ fepriv->parameters.inversion = original_inversion;
+ }
fepriv->auto_sub_step++;
return 0;
@@ -354,8 +378,13 @@ static void dvb_frontend_swzigzag(struct
/* in SCAN mode, we just set the frontend when asked and leave it alone */
if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
if (fepriv->state & FESTATE_RETUNE) {
- if (fe->ops->set_frontend)
- fe->ops->set_frontend(fe, &fepriv->parameters);
+ if (fepriv->current_standard_set) {
+ if (fe->ops->set_frontend2)
+ fe->ops->set_frontend2(fe, &fepriv->parameters_new);
+ } else {
+ if (fe->ops->set_frontend)
+ fe->ops->set_frontend(fe, &fepriv->parameters);
+ }
fepriv->state = FESTATE_TUNED;
}
fepriv->delay = 3*HZ;
@@ -921,18 +950,21 @@ static int dvb_frontend_ioctl(struct ino
/* default values */
switch(fe->ops->info.type) {
case FE_QPSK:
+ case FE_DVB_S:
fepriv->min_delay = HZ/20;
fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
break;
case FE_QAM:
+ case FE_DVB_C:
fepriv->min_delay = HZ/20;
fepriv->step_size = 0; /* no zigzag */
fepriv->max_drift = 0;
break;
case FE_OFDM:
+ case FE_DVB_T:
fepriv->min_delay = HZ/20;
fepriv->step_size = fe->ops->info.frequency_stepsize * 2;
fepriv->max_drift = (fe->ops->info.frequency_stepsize * 2) + 1;
@@ -940,6 +972,9 @@ static int dvb_frontend_ioctl(struct ino
case FE_ATSC:
printk("dvb-core: FE_ATSC not handled yet.\n");
break;
+ case FE_DVB_S2:
+ printk("dvb-core: ERROR FE_DVB_S2 is handled via FE_SET_FRONTEND2.\n");
+ break;
}
}
if (dvb_override_tune_delay > 0)
@@ -952,6 +987,101 @@ static int dvb_frontend_ioctl(struct ino
err = 0;
break;
}
+ case FE_SET_FRONTEND2: {
+ struct dvb_frontend_tune_settings fetunesettings;
+ struct dvb_frontend_parameters_new *castedparg;
+
+ if (!fepriv->current_standard_set) {
+ err = -EINVAL;
+ break;
+ }
+
+ castedparg = (struct dvb_frontend_parameters_new *)parg;
+ memcpy (&fepriv->parameters_new, parg,
+ sizeof (struct dvb_frontend_parameters_new));
+
+ memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
+
+ /* be sure struct union pointer is set - even if it is NULL */
+ fetunesettings.parameters_new.u = castedparg->u;
+
+ /* force auto frequency inversion if requested */
+ if (dvb_force_auto_inversion) {
+ fepriv->parameters_new.inversion = INVERSION_AUTO;
+ fetunesettings.parameters_new.inversion = INVERSION_AUTO;
+ }
+ if (fe->ops->info.type == FE_DVB_T || fe->ops->info.type == FE_OFDM) {
+ /* without hierachical coding code_rate_LP is irrelevant,
+ * so we tolerate the otherwise invalid FEC_NONE setting */
+ if (fepriv->parameters_new.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
+ fepriv->parameters_new.u.ofdm.code_rate_LP == FEC_NONE)
+ fepriv->parameters_new.u.ofdm.code_rate_LP = FEC_AUTO;
+ }
+
+ /* get frontend-specific tuning settings */
+ if (fe->ops->get_tune_settings && (fe->ops->get_tune_settings(fe,
&fetunesettings) == 0)) {
+ fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
+ fepriv->max_drift = fetunesettings.max_drift;
+ fepriv->step_size = fetunesettings.step_size;
+ } else {
+ /* default values */
+ switch(fe->ops->info.type) {
+ case FE_DVB_S:
+ case FE_QPSK:
+ if (fepriv->current_standard != FE_DVB_S) {
+ err = -EINVAL;
+ break;
+ }
+ fepriv->min_delay = HZ/20;
+ fepriv->step_size = fepriv->parameters_new.u.qpsk.symbol_rate / 16000;
+ fepriv->max_drift = fepriv->parameters_new.u.qpsk.symbol_rate / 2000;
+ break;
+ case FE_DVB_C:
+ case FE_QAM:
+ if (fepriv->current_standard != FE_DVB_C) {
+ err = -EINVAL;
+ break;
+ }
+ fepriv->min_delay = HZ/20;
+ fepriv->step_size = 0; /* no zigzag */
+ fepriv->max_drift = 0;
+ break;
+ case FE_DVB_T:
+ case FE_OFDM:
+ if (fepriv->current_standard != FE_DVB_T) {
+ err = -EINVAL;
+ break;
+ }
+ fepriv->min_delay = HZ/20;
+ fepriv->step_size = fe->ops->info.frequency_stepsize * 2;
+ fepriv->max_drift = (fe->ops->info.frequency_stepsize * 2) + 1;
+ break;
+ case FE_ATSC:
+ printk("dvb-core: FE_ATSC not handled yet.\n");
+ break;
+ case FE_DVB_S2:
+ if (fepriv->current_standard != FE_DVB_S2) {
+ err = -EINVAL;
+ break;
+ }
+ fepriv->min_delay = HZ/20;
+ fepriv->step_size = fepriv->parameters_new.u.qpsk2.symbol_rate / 16000;
+ fepriv->max_drift = fepriv->parameters_new.u.qpsk2.symbol_rate / 2000;
+ break;
+
+ }
+ }
+ if (dvb_override_tune_delay > 0)
+ fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
+
+ fepriv->state = FESTATE_RETUNE;
+ dvb_frontend_wakeup(fe);
+ dvb_frontend_add_event(fe, 0);
+ fepriv->status = 0;
+ err = 0;
+ /* if previously used delete old tuning params */
+ break;
+ }
case FE_GET_EVENT:
err = dvb_frontend_get_event (fe, parg, file->f_flags);
@@ -963,6 +1093,48 @@ static int dvb_frontend_ioctl(struct ino
err = fe->ops->get_frontend(fe, (struct dvb_frontend_parameters*) parg);
}
break;
+ case FE_GET_FRONTEND2:
+ if (!fepriv->current_standard) {
+ err = -EINVAL;
+ break;
+ }
+ if (fe->ops->get_frontend2) {
+ memcpy (parg, &fepriv->parameters_new, sizeof (struct
dvb_frontend_parameters_new));
+ err = fe->ops->get_frontend2(fe, (struct
dvb_frontend_parameters_new*) parg);
+ }
+ break;
+
+ case FE_SET_STANDARD:
+ /*
+ * current_standard_set and current_standard are reset
+ * this prevents user from ignoring return value and
+ * if current_standard would be kept as fallback, users may
+ * supply corrupted tuning data.
+ * if the new standard isn't supported no FE_SET_FRONTEND2
+ * is possible. it will return EINVAL
+ */
+ fepriv->current_standard_set = 0;
+ fepriv->current_standard = 0;
+ {
+ fe_type_t fetype = (fe_type_t) parg;
+ if (fetype != FE_DVB_S && fetype != FE_DVB_C && fetype != FE_DVB_T
&& fetype != FE_DVB_S2 && fetype != FE_ATSC) {
+ err = -EINVAL;
+ } else if (fe->ops->set_standard) {
+ err = fe->ops->set_standard(fe, fetype);
+ if (!err) {
+ fepriv->current_standard_set = 1;
+ fepriv->current_standard = fetype;
+ }
+ }
+ }
+ break;
+
+ case FE_GET_EXTENDED_INFO: {
+ struct dvb_fe_caps_extended* info = parg;
+ memcpy(info, &fe->ops->extended_info, sizeof(struct dvb_fe_caps_extended));
+ err = 0;
+ break;
+ }
case FE_SET_FRONTEND_TUNE_MODE:
fepriv->tune_mode_flags = (unsigned long) parg;
@@ -1013,6 +1185,10 @@ static int dvb_frontend_open(struct inod
fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
fepriv->tone = -1;
fepriv->voltage = -1;
+ fepriv->current_standard_set = 0;
+ fepriv->current_standard = 0;
+ if (fe->ops->set_standard)
+ fe->ops->set_standard(fe, 0);
}
return ret;
diff -r 436e56df57d3 linux/drivers/media/dvb/dvb-core/dvb_frontend.h
--- a/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Thu Apr 13
18:50:22 2006 -0300
+++ b/linux/drivers/media/dvb/dvb-core/dvb_frontend.h Sat Apr 22
13:38:01 2006 -0700
@@ -45,6 +45,7 @@ struct dvb_frontend_tune_settings {
int step_size;
int max_drift;
struct dvb_frontend_parameters parameters;
+ struct dvb_frontend_parameters_new parameters_new;
};
struct dvb_frontend;
@@ -52,6 +53,7 @@ struct dvb_frontend_ops {
struct dvb_frontend_ops {
struct dvb_frontend_info info;
+ struct dvb_fe_caps_extended extended_info;
void (*release)(struct dvb_frontend* fe);
@@ -86,6 +88,10 @@ 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 (*set_standard)(struct dvb_frontend* fe, fe_type_t type);
+ int (*get_extended_info)(struct dvb_frontend* fe, struct
dvb_fe_caps_extended* extendedinfo);
+ int (*set_frontend2)(struct dvb_frontend* fe, struct
dvb_frontend_parameters_new* params);
+ int (*get_frontend2)(struct dvb_frontend* fe, struct
dvb_frontend_parameters_new* params);
};
#define MAX_EVENT 8
diff -r 436e56df57d3 linux/include/linux/dvb/frontend.h
--- a/linux/include/linux/dvb/frontend.h Thu Apr 13 18:50:22 2006 -0300
+++ b/linux/include/linux/dvb/frontend.h Sat Apr 22 13:38:01 2006 -0700
@@ -28,14 +28,23 @@
#include <asm/types.h>
-
+/**
+ * Usage of fe_type_t enumerations:
+ * Don't use FE_QPSK, FE_QAM, FE_OFDM any longer in new applications.
+ * If the FE_HAS_EXTENDED_INFO is set within the fe_caps,
+ * applications should ignore the fe_type_t returned by the FE_GET_INFO ioctl.
+ *
+ */
typedef enum fe_type {
- FE_QPSK,
- FE_QAM,
- FE_OFDM,
- FE_ATSC
+ FE_QPSK = 0,
+ FE_QAM = 1,
+ FE_OFDM = 2,
+ FE_ATSC = 3,
+ FE_DVB_S = (1 << 2),
+ FE_DVB_C = (1 << 3),
+ FE_DVB_T = (1 << 4),
+ FE_DVB_S2 = (1 << 5),
} fe_type_t;
-
typedef enum fe_caps {
FE_IS_STUPID = 0,
@@ -62,11 +71,11 @@ typedef enum fe_caps {
FE_CAN_HIERARCHY_AUTO = 0x100000,
FE_CAN_8VSB = 0x200000,
FE_CAN_16VSB = 0x400000,
+ FE_HAS_EXTENDED_INFO = 0x10000000,
FE_NEEDS_BENDING = 0x20000000, // not supported anymore, don't use
(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;
-
struct dvb_frontend_info {
char name[128];
@@ -82,7 +91,6 @@ struct dvb_frontend_info {
fe_caps_t caps;
};
-
/**
* Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for
* the meaning of this struct...
@@ -126,9 +134,9 @@ typedef enum fe_status {
FE_HAS_SYNC = 0x08, /* found sync bytes */
FE_HAS_LOCK = 0x10, /* everything's working... */
FE_TIMEDOUT = 0x20, /* no lock within the last ~2 seconds */
- FE_REINIT = 0x40 /* frontend was reinitialized, */
-} fe_status_t; /* application is recommended to reset */
- /* DiSEqC, tone and parameters */
+ FE_REINIT = 0x40 /* legacy cruft, do not use */
+} fe_status_t;
+
typedef enum fe_spectral_inversion {
INVERSION_OFF,
@@ -147,21 +155,45 @@ typedef enum fe_code_rate {
FEC_6_7,
FEC_7_8,
FEC_8_9,
- FEC_AUTO
+ FEC_AUTO,
+ FEC_3_5,
+ FEC_9_10
} fe_code_rate_t;
typedef enum fe_modulation {
- QPSK,
- QAM_16,
- QAM_32,
- QAM_64,
- QAM_128,
- QAM_256,
- QAM_AUTO,
- VSB_8,
- VSB_16
+ MOD_QPSK = 0,
+ QPSK = 0,
+ MOD_QAM_16 = 1,
+ QAM_16 = 1,
+ MOD_QAM_32 = 2,
+ QAM_32 = 2,
+ MOD_QAM_64 = 3,
+ QAM_64 = 3,
+ MOD_QAM_128 = 4,
+ QAM_128 = 4,
+ MOD_QAM_256 = 5,
+ QAM_256 = 5,
+ MOD_QAM_AUTO = 6,
+ QAM_AUTO = 6,
+ MOD_8VSB = 7,
+ VSB_8 = 7,
+ MOD_16VSB = 8,
+ VSB_16 = 8,
+ MOD_2VSB = 9,
+ MOD_4VSB = 10,
+ MOD_BPSK = 11,
+ MOD_16APSK = 12,
+ MOD_32APSK = 13,
+ MOD_8PSK = 14,
+ MOD_16PSK = 15,
} fe_modulation_t;
+
+typedef enum fe_rolloff_factor {
+ ROLLOFF_ALPHA_0_35,
+ ROLLOFF_ALPHA_0_25,
+ ROLLOFF_ALPHA_0_20
+} fe_rolloff_factor_t;
typedef enum fe_transmit_mode {
TRANSMISSION_MODE_2K,
@@ -194,23 +226,34 @@ typedef enum fe_hierarchy {
HIERARCHY_AUTO
} fe_hierarchy_t;
-
-struct dvb_qpsk_parameters {
- __u32 symbol_rate; /* symbol rate in Symbols per second */
+/**
+ * this struct will be filled by the FE_GET_EXTENDED_INFO ioctl.
+ * it is a extension to the normal frontend capabilities and provided
+ * if the dvb_fe_info.caps is having the FE_HAS_EXTENDED_INFO bit set.
+ */
+struct dvb_fe_caps_extended {
+ __u32 fecs; /* supported fecs */
+ __u32 modulations; /* supported modulations */
+ __u32 standards; /* supported frontend_types */
+};
+
+
+struct dvb_dvbs_parameters {
+ __u32 symbol_rate; /* symbol rate in symbols per second */
fe_code_rate_t fec_inner; /* forward error correction (see above) */
};
-struct dvb_qam_parameters {
- __u32 symbol_rate; /* symbol rate in Symbols per second */
+struct dvb_dvbc_parameters {
+ __u32 symbol_rate; /* symbol rate in symbols per second */
fe_code_rate_t fec_inner; /* forward error correction (see above) */
fe_modulation_t modulation; /* modulation type (see above) */
};
-struct dvb_vsb_parameters {
+struct dvb_atsc_parameters {
fe_modulation_t modulation; /* modulation type (see above) */
};
-struct dvb_ofdm_parameters {
+struct dvb_dvbt_parameters {
fe_bandwidth_t bandwidth;
fe_code_rate_t code_rate_HP; /* high priority stream code rate */
fe_code_rate_t code_rate_LP; /* low priority stream code rate */
@@ -220,25 +263,75 @@ struct dvb_ofdm_parameters {
fe_hierarchy_t hierarchy_information;
};
-
+struct dvb_dvbs2_parameters {
+ __u32 symbol_rate; /* symbol rate in symbols per second */
+ fe_code_rate_t fec_inner; /* forward error correction (see above) */
+ fe_modulation_t modulation; /* modulation type (see above) */
+ fe_rolloff_factor_t rolloff_factor; /* rolloff factor needed for dvb-s2 */
+};
+
+/* The following structure is used to allocate enough space in the union
+ for future expansion.
+*/
+struct dvb_private_parameters {
+ __u32 priv[64];
+};
+
+#define dvb_qpsk_parameters dvb_dvbs_parameters
+#define dvb_qam_parameters dvb_dvbc_parameters
+#define dvb_ofdm_parameters dvb_dvbt_parameters
+#define dvb_vsb_parameters dvb_atsc_parameters
+
+/* just kept for backwards binary compatibility
+ * deprecated for usage in actual applications
+ */
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;
+ struct dvb_dvbs_parameters qpsk;
+ struct dvb_dvbc_parameters qam;
+ struct dvb_dvbt_parameters ofdm;
+ struct dvb_atsc_parameters vsb;
} u;
-};
-
+};// __attribute((__deprecated__));
+
+typedef union {
+ struct dvb_dvbs_parameters qpsk;
+ struct dvb_dvbc_parameters qam;
+ struct dvb_dvbt_parameters ofdm;
+ struct dvb_atsc_parameters vsb;
+ struct dvb_dvbs2_parameters qpsk2;
+ struct dvb_private_parameters priv;
+} frontend_parameters_union;
+
+struct dvb_frontend_parameters_new {
+ __u32 frequency; /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
+ /* intermediate frequency in kHz for QPSK */
+ fe_spectral_inversion_t inversion;
+ frontend_parameters_union u;
+};
+
+/**
+ * Important:
+ * FE_GET_EVENT and struct dvb_frontend_event
+ * are deprecated due to:
+ * FE_GET_EVENT is a mis-designed ioctl
+ * informations within dvb_frontend_event will
+ * always return stale information.
+ * Applications should:
+ * - open the frontend device with O_NONBLOCK
+ * - poll() for events
+ * - FE_GET_EVENT all pending events to clear the POLLPRI status,
+ * and throw them away
+ * - FE_READ_STATUS etc. to get current information
+ */
struct dvb_frontend_event {
fe_status_t status;
struct dvb_frontend_parameters parameters;
-};
-
+}; // __attribute((__deprecated__));
/**
* When set, this flag will disable any zigzagging or other "normal" tuning
@@ -267,9 +360,36 @@ struct dvb_frontend_event {
#define FE_READ_SNR _IOR('o', 72, __u16)
#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
+#define FE_SET_FRONTEND2 _IOW('o', 84, struct dvb_frontend_parameters_new)
+#define FE_GET_FRONTEND2 _IOR('o', 85, struct dvb_frontend_parameters_new)
+
+/**
+ * next two IOCTLs are deprecated for further use in applications
+ */
#define FE_SET_FRONTEND _IOW('o', 76, struct dvb_frontend_parameters)
#define FE_GET_FRONTEND _IOR('o', 77, struct dvb_frontend_parameters)
+
+
#define FE_SET_FRONTEND_TUNE_MODE _IO('o', 81) /* unsigned int */
+
+/**
+ * use to set the FE_STANDARD - if a tuner supports more than one type.
+ * e.g. DVB-C/T or DVB-S/S2 combi frontends. after FE_SET_STANDARD was set,
+ * the drivers has to make sure still to reflect the standards available,
+ * but capabilities should be adjusted to the selected standard
+ */
+#define FE_SET_STANDARD _IO('o', 82) /* fe_type_t */
+
+/**
+ * used to query the extended frontend capabilities (see above for details)
+ */
+#define FE_GET_EXTENDED_INFO _IOR('o', 83, struct dvb_fe_caps_extended)
+
+/**
+ * FE_GET_EVENT is deprecated for applications.
+ * you should use FE_READ_STATUS and if needed the FE_GET_FRONTEND_NEW
+ * IOCTLs.
+ */
#define FE_GET_EVENT _IOR('o', 78, struct dvb_frontend_event)
#define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */
More information about the linux-dvb
mailing list