Ticket #2762: dvb-hg-dvbs2.diff

File dvb-hg-dvbs2.diff, 20.3 KB (added by Mark.Buechler@…, 14 years ago)

1 of 2 dvbs2 patches for LinuxDVB 062306

  • linux/drivers/media/dvb/dvb-core/dvb_frontend.c

    old new  
    9494   /* thread/frontend values */
    9595   struct dvb_device *dvbdev;
    9696   struct dvb_frontend_parameters parameters;
     97   struct dvb_frontend_parameters_new parameters_new;
    9798   struct dvb_fe_events events;
    9899   struct semaphore sem;
    99100   struct list_head list_head;
     
    109110   int tone;
    110111   int voltage;
    111112
     113   int current_standard_set;
     114   fe_type_t current_standard;
    112115   /* swzigzag values */
    113116   unsigned int state;
    114117   unsigned int bending;
     
    263266   int original_inversion = fepriv->parameters.inversion;
    264267   u32 original_frequency = fepriv->parameters.frequency;
    265268
     269    if (fepriv->current_standard_set) {
     270       original_inversion = fepriv->parameters_new.inversion;
     271       original_frequency = fepriv->parameters_new.frequency;
     272        }
     273
    266274   /* are we using autoinversion? */
    267275   autoinversion = ((!(fe->ops.info.caps & FE_CAN_INVERSION_AUTO)) &&
    268           (fepriv->parameters.inversion == INVERSION_AUTO));
     276       ((fepriv->current_standard_set &&
     277         fepriv->parameters_new.inversion == INVERSION_AUTO) ||
     278        (! fepriv->current_standard_set &&
     279          fepriv->parameters.inversion == INVERSION_AUTO)));
    269280
    270281   /* setup parameters correctly */
    271282   while(!ready) {
     
    331342      fepriv->auto_step, fepriv->auto_sub_step, fepriv->started_auto_step);
    332343
    333344   /* set the frontend itself */
    334    fepriv->parameters.frequency += fepriv->lnb_drift;
    335    if (autoinversion)
    336       fepriv->parameters.inversion = fepriv->inversion;
    337    if (fe->ops.set_frontend)
    338       fe->ops.set_frontend(fe, &fepriv->parameters);
     345   if (fepriv->current_standard_set) {
     346      fepriv->parameters_new.frequency += fepriv->lnb_drift;
     347      if (autoinversion)
     348         fepriv->parameters_new.inversion = fepriv->inversion;
     349      if (fe->ops.set_frontend2)
     350         fe->ops.set_frontend2(fe, &fepriv->parameters_new);
     351      fepriv->parameters_new.frequency = original_frequency;
     352      fepriv->parameters_new.inversion = original_inversion;
     353   } else {
     354      fepriv->parameters.frequency += fepriv->lnb_drift;
     355      if (autoinversion)
     356         fepriv->parameters.inversion = fepriv->inversion;
     357      if (fe->ops.set_frontend)
     358         fe->ops.set_frontend(fe, &fepriv->parameters);
    339359
    340    fepriv->parameters.frequency = original_frequency;
    341    fepriv->parameters.inversion = original_inversion;
     360      fepriv->parameters.frequency = original_frequency;
     361      fepriv->parameters.inversion = original_inversion;
     362   }
    342363
    343364   fepriv->auto_sub_step++;
    344365   return 0;
     
    359380   /* in SCAN mode, we just set the frontend when asked and leave it alone */
    360381   if (fepriv->tune_mode_flags & FE_TUNE_MODE_ONESHOT) {
    361382      if (fepriv->state & FESTATE_RETUNE) {
    362          if (fe->ops.set_frontend)
    363             fe->ops.set_frontend(fe, &fepriv->parameters);
     383         if (fepriv->current_standard_set) {
     384            if (fe->ops.set_frontend2)
     385               fe->ops.set_frontend2(fe, &fepriv->parameters_new);
     386         } else {
     387            if (fe->ops.set_frontend)
     388               fe->ops.set_frontend(fe, &fepriv->parameters);
     389         }
    364390         fepriv->state = FESTATE_TUNED;
    365391      }
    366392      fepriv->delay = 3*HZ;
     
    931957         /* default values */
    932958         switch(fe->ops.info.type) {
    933959         case FE_QPSK:
     960         case FE_DVB_S:
    934961            fepriv->min_delay = HZ/20;
    935962            fepriv->step_size = fepriv->parameters.u.qpsk.symbol_rate / 16000;
    936963            fepriv->max_drift = fepriv->parameters.u.qpsk.symbol_rate / 2000;
    937964            break;
    938965
    939966         case FE_QAM:
     967         case FE_DVB_C:
    940968            fepriv->min_delay = HZ/20;
    941969            fepriv->step_size = 0; /* no zigzag */
    942970            fepriv->max_drift = 0;
    943971            break;
    944972
    945973         case FE_OFDM:
     974         case FE_DVB_T:
    946975            fepriv->min_delay = HZ/20;
    947976            fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
    948977            fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
     
    950979         case FE_ATSC:
    951980            printk("dvb-core: FE_ATSC not handled yet.\n");
    952981            break;
     982         case FE_DVB_S2:
     983            printk("dvb-core: ERROR FE_DVB_S2 is handled via FE_SET_FRONTEND2.\n");
     984            break;
    953985         }
    954986      }
    955987      if (dvb_override_tune_delay > 0)
     
    962994      err = 0;
    963995      break;
    964996   }
     997   case FE_SET_FRONTEND2: {
     998      struct dvb_frontend_tune_settings fetunesettings;
     999      struct dvb_frontend_parameters_new *castedparg;
     1000
     1001      if (!fepriv->current_standard_set) {
     1002         err = -EINVAL;
     1003         break;
     1004      }
     1005
     1006      castedparg = (struct dvb_frontend_parameters_new *)parg;
     1007      memcpy (&fepriv->parameters_new, parg,
     1008          sizeof (struct dvb_frontend_parameters_new));
     1009
     1010      memset(&fetunesettings, 0, sizeof(struct dvb_frontend_tune_settings));
     1011
     1012      /* be sure struct union pointer is set - even if it is NULL */
     1013      fetunesettings.parameters_new.u = castedparg->u;
     1014
     1015      /* force auto frequency inversion if requested */
     1016      if (dvb_force_auto_inversion) {
     1017         fepriv->parameters_new.inversion = INVERSION_AUTO;
     1018         fetunesettings.parameters_new.inversion = INVERSION_AUTO;
     1019      }
     1020      if (fe->ops.info.type == FE_DVB_T || fe->ops.info.type == FE_OFDM) {
     1021         /* without hierachical coding code_rate_LP is irrelevant,
     1022         * so we tolerate the otherwise invalid FEC_NONE setting */
     1023         if (fepriv->parameters_new.u.ofdm.hierarchy_information == HIERARCHY_NONE &&
     1024                   fepriv->parameters_new.u.ofdm.code_rate_LP == FEC_NONE)
     1025            fepriv->parameters_new.u.ofdm.code_rate_LP = FEC_AUTO;
     1026      }
     1027
     1028      /* get frontend-specific tuning settings */
     1029      if (fe->ops.get_tune_settings && (fe->ops.get_tune_settings(fe, &fetunesettings) == 0)) {
     1030         fepriv->min_delay = (fetunesettings.min_delay_ms * HZ) / 1000;
     1031         fepriv->max_drift = fetunesettings.max_drift;
     1032         fepriv->step_size = fetunesettings.step_size;
     1033      } else {
     1034         /* default values */
     1035         switch(fe->ops.info.type) {
     1036         case FE_DVB_S:
     1037         case FE_QPSK:
     1038            if (fepriv->current_standard != FE_DVB_S) {
     1039               err = -EINVAL;
     1040               break;
     1041            }
     1042            fepriv->min_delay = HZ/20;
     1043            fepriv->step_size = fepriv->parameters_new.u.qpsk.symbol_rate / 16000;
     1044            fepriv->max_drift = fepriv->parameters_new.u.qpsk.symbol_rate / 2000;
     1045            break;
     1046         case FE_DVB_C:
     1047         case FE_QAM:
     1048            if (fepriv->current_standard != FE_DVB_C) {
     1049               err = -EINVAL;
     1050               break;
     1051            }
     1052            fepriv->min_delay = HZ/20;
     1053            fepriv->step_size = 0; /* no zigzag */
     1054            fepriv->max_drift = 0;
     1055            break;
     1056         case FE_DVB_T:
     1057         case FE_OFDM:
     1058            if (fepriv->current_standard != FE_DVB_T) {
     1059               err = -EINVAL;
     1060               break;
     1061            }
     1062            fepriv->min_delay = HZ/20;
     1063            fepriv->step_size = fe->ops.info.frequency_stepsize * 2;
     1064            fepriv->max_drift = (fe->ops.info.frequency_stepsize * 2) + 1;
     1065            break;
     1066         case FE_ATSC:
     1067            printk("dvb-core: FE_ATSC not handled yet.\n");
     1068            break;
     1069         case FE_DVB_S2:
     1070            if (fepriv->current_standard != FE_DVB_S2) {
     1071               err = -EINVAL;
     1072               break;
     1073            }
     1074            fepriv->min_delay = HZ/20;
     1075            fepriv->step_size = fepriv->parameters_new.u.qpsk2.symbol_rate / 16000;
     1076            fepriv->max_drift = fepriv->parameters_new.u.qpsk2.symbol_rate / 2000;
     1077            break;
     1078
     1079         }
     1080      }
     1081      if (dvb_override_tune_delay > 0)
     1082         fepriv->min_delay = (dvb_override_tune_delay * HZ) / 1000;
     1083
     1084      fepriv->state = FESTATE_RETUNE;
     1085      dvb_frontend_wakeup(fe);
     1086      dvb_frontend_add_event(fe, 0);
     1087      fepriv->status = 0;
     1088      err = 0;
     1089      /* if previously used delete old tuning params */
     1090      break;
     1091   }
    9651092
    9661093   case FE_GET_EVENT:
    9671094      err = dvb_frontend_get_event (fe, parg, file->f_flags);
     
    9731100         err = fe->ops.get_frontend(fe, (struct dvb_frontend_parameters*) parg);
    9741101      }
    9751102      break;
     1103   case FE_GET_FRONTEND2:
     1104      if (!fepriv->current_standard) {
     1105         err = -EINVAL;
     1106         break;
     1107      }
     1108      if (fe->ops.get_frontend2) {
     1109         memcpy (parg, &fepriv->parameters_new, sizeof (struct dvb_frontend_parameters_new));
     1110         err = fe->ops.get_frontend2(fe, (struct dvb_frontend_parameters_new*) parg);
     1111      }
     1112      break;
     1113
     1114   case FE_SET_STANDARD:
     1115      /*
     1116      * current_standard_set and current_standard are reset
     1117      * this prevents user from ignoring return value and
     1118      * if current_standard would be kept as fallback, users may
     1119      * supply corrupted tuning data.
     1120      * if the new standard isn't supported no FE_SET_FRONTEND2
     1121      * is possible. it will return EINVAL
     1122      */
     1123      fepriv->current_standard_set = 0;
     1124      fepriv->current_standard = 0;
     1125      {
     1126         fe_type_t fetype = (fe_type_t) parg;
     1127         if (fetype != FE_DVB_S && fetype != FE_DVB_C && fetype != FE_DVB_T && fetype != FE_DVB_S2 && fetype != FE_ATSC) {
     1128            err = -EINVAL;
     1129            if (fe->ops.set_standard)
     1130               fe->ops.set_standard(fe, 0);
     1131         } else if (fe->ops.set_standard) {
     1132            err = fe->ops.set_standard(fe, fetype);
     1133            if (!err) {
     1134               fepriv->current_standard_set = 1;
     1135               fepriv->current_standard = fetype;
     1136            }
     1137         }
     1138      }
     1139      break;
     1140
     1141   case FE_GET_EXTENDED_INFO: {
     1142      struct dvb_fe_caps_extended* info = parg;
     1143      memcpy(info, &fe->ops.extended_info, sizeof(struct dvb_fe_caps_extended));
     1144      err = 0;
     1145      break;
     1146   }
    9761147
    9771148   case FE_SET_FRONTEND_TUNE_MODE:
    9781149      fepriv->tune_mode_flags = (unsigned long) parg;
     
    10231194      fepriv->tune_mode_flags &= ~FE_TUNE_MODE_ONESHOT;
    10241195      fepriv->tone = -1;
    10251196      fepriv->voltage = -1;
     1197      fepriv->current_standard_set = 0;
     1198      fepriv->current_standard = 0;
     1199      if (fe->ops.set_standard)
     1200         fe->ops.set_standard(fe, 0);
    10261201   }
    10271202
    10281203   return ret;
  • linux/drivers/media/dvb/dvb-core/dvb_frontend.h

    old new  
    4545   int step_size;
    4646   int max_drift;
    4747   struct dvb_frontend_parameters parameters;
     48   struct dvb_frontend_parameters_new parameters_new;
    4849};
    4950
    5051struct dvb_frontend;
     
    9091struct dvb_frontend_ops {
    9192
    9293   struct dvb_frontend_info info;
     94   struct dvb_fe_caps_extended extended_info;
    9395
    9496   void (*release)(struct dvb_frontend* fe);
    9597
     
    124126   int (*enable_high_lnb_voltage)(struct dvb_frontend* fe, long arg);
    125127   int (*dishnetwork_send_legacy_command)(struct dvb_frontend* fe, unsigned long cmd);
    126128   int (*i2c_gate_ctrl)(struct dvb_frontend* fe, int enable);
     129    int (*set_standard)(struct dvb_frontend* fe, fe_type_t type);
     130    int (*get_extended_info)(struct dvb_frontend* fe, struct dvb_fe_caps_extended* extendedinfo);
     131    int (*set_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params);
     132    int (*get_frontend2)(struct dvb_frontend* fe, struct dvb_frontend_parameters_new* params);
    127133
    128134   struct dvb_tuner_ops tuner_ops;
    129135};
  • linux/include/linux/dvb/frontend.h

    old new  
    2828
    2929#include <asm/types.h>
    3030
    31 
     31/**
     32 * Usage of fe_type_t enumerations:
     33 * Don't use FE_QPSK, FE_QAM, FE_OFDM any longer in new applications.
     34 * If the FE_HAS_EXTENDED_INFO is set within the fe_caps,
     35 * applications should ignore the fe_type_t returned by the FE_GET_INFO ioctl.
     36 *
     37 */
    3238typedef enum fe_type {
    33    FE_QPSK,
    34    FE_QAM,
    35    FE_OFDM,
    36    FE_ATSC
     39   FE_QPSK = 0,
     40   FE_QAM = 1,
     41   FE_OFDM = 2,
     42   FE_ATSC = 3,
     43   FE_DVB_S = (1 << 2),
     44   FE_DVB_C = (1 << 3),
     45   FE_DVB_T = (1 << 4),
     46   FE_DVB_S2 = (1 << 5),
    3747} fe_type_t;
    3848
    39 
    4049typedef enum fe_caps {
    4150   FE_IS_STUPID         = 0,
    4251   FE_CAN_INVERSION_AUTO      = 0x1,
     
    6271   FE_CAN_HIERARCHY_AUTO      = 0x100000,
    6372   FE_CAN_8VSB         = 0x200000,
    6473   FE_CAN_16VSB         = 0x400000,
     74   FE_HAS_EXTENDED_INFO      = 0x10000000,
    6575   FE_NEEDS_BENDING      = 0x20000000, // not supported anymore, don't use (frontend requires frequency bending)
    6676   FE_CAN_RECOVER         = 0x40000000, // frontend can recover from a cable unplug automatically
    6777   FE_CAN_MUTE_TS         = 0x80000000  // frontend can stop spurious TS data output
    6878} fe_caps_t;
    6979
    70 
    7180struct dvb_frontend_info {
    7281   char       name[128];
    7382   fe_type_t  type;
     
    8291   fe_caps_t  caps;
    8392};
    8493
    85 
    8694/**
    8795 *  Check out the DiSEqC bus spec available on http://www.eutelsat.org/ for
    8896 *  the meaning of this struct...
     
    126134   FE_HAS_SYNC   = 0x08,   /*  found sync bytes  */
    127135   FE_HAS_LOCK   = 0x10,   /*  everything's working... */
    128136   FE_TIMEDOUT   = 0x20,   /*  no lock within the last ~2 seconds */
    129    FE_REINIT   = 0x40    /*  frontend was reinitialized, */
    130 } fe_status_t;           /*  application is recommended to reset */
    131               /*  DiSEqC, tone and parameters */
     137   FE_REINIT   = 0x40    /*  legacy cruft, do not use */
     138} fe_status_t;
     139
    132140
    133141typedef enum fe_spectral_inversion {
    134142   INVERSION_OFF,
     
    147155   FEC_6_7,
    148156   FEC_7_8,
    149157   FEC_8_9,
    150    FEC_AUTO
     158   FEC_AUTO,
     159   FEC_3_5,
     160   FEC_9_10
    151161} fe_code_rate_t;
    152162
    153163
    154164typedef enum fe_modulation {
    155    QPSK,
    156    QAM_16,
    157    QAM_32,
    158    QAM_64,
    159    QAM_128,
    160    QAM_256,
    161    QAM_AUTO,
    162    VSB_8,
    163    VSB_16
     165   MOD_QPSK     = 0,
     166   QPSK         = 0,
     167   MOD_QAM_16   = 1,
     168   QAM_16       = 1,
     169   MOD_QAM_32   = 2,
     170   QAM_32       = 2,
     171   MOD_QAM_64   = 3,
     172   QAM_64       = 3,
     173   MOD_QAM_128  = 4,
     174   QAM_128      = 4,
     175   MOD_QAM_256  = 5,
     176   QAM_256      = 5,
     177   MOD_QAM_AUTO = 6,
     178   QAM_AUTO     = 6,
     179   MOD_8VSB     = 7,
     180   VSB_8        = 7,
     181   MOD_16VSB    = 8,
     182   VSB_16       = 8,
     183   MOD_2VSB     = 9,
     184   MOD_4VSB     = 10,
     185   MOD_BPSK     = 11,
     186   MOD_16APSK   = 12,
     187   MOD_32APSK   = 13,
     188   MOD_8PSK     = 14,
     189   MOD_16PSK    = 15,
    164190} fe_modulation_t;
    165191
     192typedef enum fe_rolloff_factor {
     193   ROLLOFF_ALPHA_0_35,
     194   ROLLOFF_ALPHA_0_25,
     195   ROLLOFF_ALPHA_0_20
     196} fe_rolloff_factor_t;
     197
    166198typedef enum fe_transmit_mode {
    167199   TRANSMISSION_MODE_2K,
    168200   TRANSMISSION_MODE_8K,
     
    194226   HIERARCHY_AUTO
    195227} fe_hierarchy_t;
    196228
     229/**
     230 *  this struct will be filled by the FE_GET_EXTENDED_INFO ioctl.
     231 *  it is a extension to the normal frontend capabilities and provided
     232 *  if the dvb_fe_info.caps is having the FE_HAS_EXTENDED_INFO bit set.
     233 */
     234struct dvb_fe_caps_extended {
     235   __u32   fecs;      /* supported fecs */
     236   __u32   modulations;   /* supported modulations */
     237   __u32   standards;   /* supported frontend_types */
     238};
     239
    197240
    198 struct dvb_qpsk_parameters {
    199    __u32      symbol_rate;  /* symbol rate in Symbols per second */
     241struct dvb_dvbs_parameters {
     242   __u32      symbol_rate;  /* symbol rate in symbols per second */
    200243   fe_code_rate_t   fec_inner;    /* forward error correction (see above) */
    201244};
    202245
    203 struct dvb_qam_parameters {
    204    __u32      symbol_rate; /* symbol rate in Symbols per second */
     246struct dvb_dvbc_parameters {
     247   __u32      symbol_rate; /* symbol rate in symbols per second */
    205248   fe_code_rate_t   fec_inner;   /* forward error correction (see above) */
    206249   fe_modulation_t   modulation;  /* modulation type (see above) */
    207250};
    208251
    209 struct dvb_vsb_parameters {
     252struct dvb_atsc_parameters {
    210253   fe_modulation_t   modulation;  /* modulation type (see above) */
    211254};
    212255
    213 struct dvb_ofdm_parameters {
     256struct dvb_dvbt_parameters {
    214257   fe_bandwidth_t      bandwidth;
    215258   fe_code_rate_t      code_rate_HP;  /* high priority stream code rate */
    216259   fe_code_rate_t      code_rate_LP;  /* low priority stream code rate */
     
    220263   fe_hierarchy_t      hierarchy_information;
    221264};
    222265
     266struct dvb_dvbs2_parameters {
     267   __u32         symbol_rate;    /* symbol rate in symbols per second */
     268   fe_code_rate_t      fec_inner;      /* forward error correction (see above) */
     269   fe_modulation_t      modulation;     /* modulation type (see above) */
     270   fe_rolloff_factor_t   rolloff_factor; /* rolloff factor needed for dvb-s2 */
     271};
     272
     273/* The following structure is used to allocate enough space in the union
     274   for future expansion.
     275*/
     276struct dvb_private_parameters {
     277   __u32      priv[64];
     278};
     279
     280#define dvb_qpsk_parameters dvb_dvbs_parameters
     281#define dvb_qam_parameters dvb_dvbc_parameters
     282#define dvb_ofdm_parameters dvb_dvbt_parameters
     283#define dvb_vsb_parameters dvb_atsc_parameters
    223284
     285/* just kept for backwards binary compatibility
     286 * deprecated for usage in actual applications
     287 */
    224288struct dvb_frontend_parameters {
    225289   __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
    226290              /* intermediate frequency in kHz for QPSK */
    227291   fe_spectral_inversion_t inversion;
    228292   union {
    229       struct dvb_qpsk_parameters qpsk;
    230       struct dvb_qam_parameters  qam;
    231       struct dvb_ofdm_parameters ofdm;
    232       struct dvb_vsb_parameters vsb;
     293      struct dvb_dvbs_parameters qpsk;
     294      struct dvb_dvbc_parameters  qam;
     295      struct dvb_dvbt_parameters ofdm;
     296      struct dvb_atsc_parameters vsb;
    233297   } u;
     298};// __attribute((__deprecated__));
     299
     300typedef union {
     301      struct dvb_dvbs_parameters qpsk;
     302      struct dvb_dvbc_parameters qam;
     303      struct dvb_dvbt_parameters ofdm;
     304      struct dvb_atsc_parameters vsb;
     305      struct dvb_dvbs2_parameters qpsk2;
     306      struct dvb_private_parameters priv;
     307} frontend_parameters_union;
     308
     309struct dvb_frontend_parameters_new {
     310   __u32 frequency;     /* (absolute) frequency in Hz for QAM/OFDM/ATSC */
     311              /* intermediate frequency in kHz for QPSK */
     312   fe_spectral_inversion_t inversion;
     313   frontend_parameters_union u;
    234314};
    235315
     316/**
     317 * Important:
     318 * FE_GET_EVENT and struct dvb_frontend_event
     319 * are deprecated due to:
     320 * FE_GET_EVENT is a mis-designed ioctl
     321 * informations within dvb_frontend_event will
     322 * always return stale information.
     323 * Applications should:
     324 * - open the frontend device with O_NONBLOCK
     325 * - poll() for events
     326 * - FE_GET_EVENT all pending events to clear the POLLPRI status,
     327 *   and throw them away
     328 * - FE_READ_STATUS etc. to get current information
     329 */
    236330
    237331struct dvb_frontend_event {
    238332   fe_status_t status;
    239333   struct dvb_frontend_parameters parameters;
    240 };
    241 
     334}; // __attribute((__deprecated__));
    242335
    243336/**
    244337 * When set, this flag will disable any zigzagging or other "normal" tuning
     
    267360#define FE_READ_SNR         _IOR('o', 72, __u16)
    268361#define FE_READ_UNCORRECTED_BLOCKS _IOR('o', 73, __u32)
    269362
     363#define FE_SET_FRONTEND2      _IOW('o', 84, struct dvb_frontend_parameters_new)
     364#define FE_GET_FRONTEND2      _IOR('o', 85, struct dvb_frontend_parameters_new)
     365
     366/**
     367 * next two IOCTLs are deprecated for further use in applications
     368 */
    270369#define FE_SET_FRONTEND         _IOW('o', 76, struct dvb_frontend_parameters)
    271370#define FE_GET_FRONTEND         _IOR('o', 77, struct dvb_frontend_parameters)
     371
     372
    272373#define FE_SET_FRONTEND_TUNE_MODE  _IO('o', 81) /* unsigned int */
     374
     375/**
     376 * use to set the FE_STANDARD - if a tuner supports more than one type.
     377 * e.g. DVB-C/T or DVB-S/S2 combi frontends. after FE_SET_STANDARD was set,
     378 * the drivers has to make sure still to reflect the standards available,
     379 * but capabilities should be adjusted to the selected standard
     380 */
     381#define FE_SET_STANDARD         _IO('o', 82) /* fe_type_t */
     382
     383/**
     384 * used to query the extended frontend capabilities (see above for details)
     385 */
     386#define FE_GET_EXTENDED_INFO      _IOR('o', 83, struct dvb_fe_caps_extended)
     387
     388/**
     389 * FE_GET_EVENT is deprecated for applications.
     390 * you should use FE_READ_STATUS and if needed the FE_GET_FRONTEND_NEW
     391 * IOCTLs.
     392 */
    273393#define FE_GET_EVENT         _IOR('o', 78, struct dvb_frontend_event)
    274394
    275395#define FE_DISHNETWORK_SEND_LEGACY_CMD _IO('o', 80) /* unsigned int */