Hi list,
Based on the original DVB API patch of last week, I've done a cleaner
rewrite of the patch. This time, the changes to the VDR sources are
limited to a few #includes and replacements of ioctl calls by the new
DVBFE_ioctl wrapper call. All the magic goes into this API wrapper, that
translates multiproto calls into DVB 3.0 API calls.
There's also more control on the behavior. Adding DEFINES +=
-DDVB_MULTIPROTO_WRAPPER=1 to Make.config will enforce the API
translation even if the multiproto API is present, setting it =0 will
disable API translation, requiring the multiproto API to be present. By
default, the present API is automatically detected, and the wrapper is
enabled accordingly.
The patch currently doesn't translate the whole API, just the parts that
are used by VDR. But if required, the missing parts can surely be
integrated.
Cheers,
Udo
diff -Nu vdr-1.5.14/channels.c vdr-1.5.14-wrapper/channels.c
--- vdr-1.5.14/channels.c 2008-01-27 14:59:53.000000000 +0100
+++ vdr-1.5.14-wrapper/channels.c 2008-02-02 23:37:38.000000000 +0100
@@ -11,6 +11,7 @@
#include <linux/dvb/frontend.h>
#include <ctype.h>
#include "device.h"
+#include "dvb_api_wrapper.h"
#include "epg.h"
#include "timers.h"
diff -Nu vdr-1.5.14/dvb_api_wrapper.c vdr-1.5.14-wrapper/dvb_api_wrapper.c
--- vdr-1.5.14/dvb_api_wrapper.c 1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.5.14-wrapper/dvb_api_wrapper.c 2008-02-02 23:57:09.000000000 +0100
@@ -0,0 +1,203 @@
+/*
+ * dvb_api_wrapper.c:
+ * Wrapper to translate Multiproto DVB API to DVB 3.0 API calls
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: $
+ */
+
+#include "dvb_api_wrapper.h"
+#include <string.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+
+#ifdef DVB_MULTIPROTO_WRAPPER
+
+static bool TranslateCodeRate(fe_code_rate &oldfec, dvbfe_fec fec) {
+ switch (fec) {
+ case DVBFE_FEC_NONE: oldfec = FEC_NONE; return true;
+ case DVBFE_FEC_1_2: oldfec = FEC_1_2; return true;
+ case DVBFE_FEC_2_3: oldfec = FEC_2_3; return true;
+ case DVBFE_FEC_3_4: oldfec = FEC_3_4; return true;
+ case DVBFE_FEC_4_5: oldfec = FEC_4_5; return true;
+ case DVBFE_FEC_5_6: oldfec = FEC_5_6; return true;
+ case DVBFE_FEC_6_7: oldfec = FEC_6_7; return true;
+ case DVBFE_FEC_7_8: oldfec = FEC_7_8; return true;
+ case DVBFE_FEC_8_9: oldfec = FEC_8_9; return true;
+ case DVBFE_FEC_AUTO: oldfec = FEC_AUTO; return true;
+ default: return false;
+ }
+}
+
+static bool TranslateModulation(fe_modulation &oldmod, dvbfe_modulation mod) {
+ switch (mod) {
+ case DVBFE_MOD_QPSK: oldmod = QPSK; return true;
+ case DVBFE_MOD_QAM16: oldmod = QAM_16; return true;
+ case DVBFE_MOD_QAM32: oldmod = QAM_32; return true;
+ case DVBFE_MOD_QAM64: oldmod = QAM_64; return true;
+ case DVBFE_MOD_QAM128: oldmod = QAM_128; return true;
+ case DVBFE_MOD_QAM256: oldmod = QAM_256; return true;
+ case DVBFE_MOD_QAMAUTO: oldmod = QAM_AUTO; return true;
+ default: return false;
+ }
+}
+
+static bool TranslateBandwidth(fe_bandwidth_t &oldbw, dvbfe_bandwidth bandwidth) {
+ switch (bandwidth) {
+ case DVBFE_BANDWIDTH_8_MHZ: oldbw = BANDWIDTH_8_MHZ; return true;
+ case DVBFE_BANDWIDTH_7_MHZ: oldbw = BANDWIDTH_7_MHZ; return true;
+ case DVBFE_BANDWIDTH_6_MHZ: oldbw = BANDWIDTH_6_MHZ; return true;
+ case DVBFE_BANDWIDTH_AUTO: oldbw = BANDWIDTH_AUTO; return true;
+ default: return false;
+ }
+}
+
+static bool TranslateTransmission(fe_transmit_mode_t &oldtrans, dvbfe_transmission_mode trans) {
+ switch (trans) {
+ case DVBFE_TRANSMISSION_MODE_2K: oldtrans = TRANSMISSION_MODE_2K; return true;
+ case DVBFE_TRANSMISSION_MODE_8K: oldtrans = TRANSMISSION_MODE_8K; return true;
+ case DVBFE_TRANSMISSION_MODE_AUTO: oldtrans = TRANSMISSION_MODE_AUTO; return true;
+ default: return false;
+ }
+}
+
+static bool TranslateGuard(fe_guard_interval_t &oldguard, dvbfe_guard_interval guard) {
+ switch (guard) {
+ case DVBFE_GUARD_INTERVAL_1_32: oldguard = GUARD_INTERVAL_1_32; return true;
+ case DVBFE_GUARD_INTERVAL_1_16: oldguard = GUARD_INTERVAL_1_16; return true;
+ case DVBFE_GUARD_INTERVAL_1_8: oldguard = GUARD_INTERVAL_1_8; return true;
+ case DVBFE_GUARD_INTERVAL_1_4: oldguard = GUARD_INTERVAL_1_4; return true;
+ case DVBFE_GUARD_INTERVAL_AUTO: oldguard = GUARD_INTERVAL_AUTO; return true;
+ default: return false;
+ }
+}
+
+static bool TranslateHierarchy(fe_hierarchy_t &oldhier, dvbfe_hierarchy hierarchy, dvbfe_alpha alpha) {
+ switch (hierarchy) {
+ case DVBFE_HIERARCHY_OFF: oldhier = HIERARCHY_NONE; return true;
+ case DVBFE_HIERARCHY_AUTO: oldhier = HIERARCHY_AUTO; return true;
+ case DVBFE_HIERARCHY_ON:
+ switch (alpha) {
+ case DVBFE_ALPHA_1: oldhier = HIERARCHY_1; return true;
+ case DVBFE_ALPHA_2: oldhier = HIERARCHY_2; return true;
+ case DVBFE_ALPHA_4: oldhier = HIERARCHY_4; return true;
+ default: return false;
+ }
+ default: return false;
+ }
+}
+
+static int ioctl_DVBFE_SET_PARAMS(int d, dvbfe_params *params) {
+ dvb_frontend_parameters oldparams;
+ memset(&oldparams, 0, sizeof(oldparams));
+
+ oldparams.frequency = params->frequency;
+ oldparams.inversion = params->inversion;
+
+ switch (params->delivery) {
+ case DVBFE_DELSYS_DVBS:
+ if ( params->delsys.dvbs.modulation != DVBFE_MOD_QPSK
+ || !TranslateCodeRate(oldparams.u.qpsk.fec_inner, params->delsys.dvbs.fec)) {
+ errno = EINVAL;
+ return -1;
+ }
+ oldparams.u.qpsk.symbol_rate = params->delsys.dvbs.symbol_rate;
+ break;
+ case DVBFE_DELSYS_DVBC:
+ if ( !TranslateModulation(oldparams.u.qam.modulation, params->delsys.dvbc.modulation)
+ || !TranslateCodeRate(oldparams.u.qam.fec_inner, params->delsys.dvbc.fec)) {
+ errno = EINVAL;
+ return -1;
+ }
+ oldparams.u.qam.symbol_rate = params->delsys.dvbc.symbol_rate;
+ break;
+ case DVBFE_DELSYS_DVBT:
+ if ( !TranslateModulation(oldparams.u.ofdm.constellation, params->delsys.dvbt.constellation)
+ || !TranslateBandwidth(oldparams.u.ofdm.bandwidth, params->delsys.dvbt.bandwidth)
+ || !TranslateCodeRate(oldparams.u.ofdm.code_rate_HP, params->delsys.dvbt.code_rate_HP)
+ || !TranslateCodeRate(oldparams.u.ofdm.code_rate_LP, params->delsys.dvbt.code_rate_LP)
+ || !TranslateTransmission(oldparams.u.ofdm.transmission_mode, params->delsys.dvbt.transmission_mode)
+ || !TranslateGuard(oldparams.u.ofdm.guard_interval, params->delsys.dvbt.guard_interval)
+ || !TranslateHierarchy(oldparams.u.ofdm.hierarchy_information, params->delsys.dvbt.hierarchy, params->delsys.dvbt.alpha)) {
+ errno = EINVAL;
+ return -1;
+ }
+ // ignored: params->delsys.dvbt.priority
+ break;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+ return ioctl(d, FE_SET_FRONTEND, &oldparams);
+}
+
+static int ioctl_DVBFE_GET_DELSYS(int d, dvbfe_delsys *delsys) {
+ dvb_frontend_info oldinfo;
+
+ int err = ioctl(d, FE_GET_INFO, &oldinfo);
+ if (err < 0) return err;
+
+ switch (oldinfo.type) {
+ case FE_QPSK: *delsys = DVBFE_DELSYS_DVBS; return 0;
+ case FE_QAM: *delsys = DVBFE_DELSYS_DVBC; return 0;
+ case FE_OFDM: *delsys = DVBFE_DELSYS_DVBT; return 0;
+ default:;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
+static int ioctl_DVBFE_GET_INFO(int d, dvbfe_info *feinfo) {
+ dvb_frontend_info oldinfo;
+
+ int err = ioctl(d, FE_GET_INFO, &oldinfo);
+ if (err < 0) return err;
+
+ strncpy(feinfo->name, oldinfo.name, 128);
+
+ feinfo->frequency_min = oldinfo.frequency_min;
+ feinfo->frequency_max = oldinfo.frequency_max;
+ feinfo->frequency_step = oldinfo.frequency_stepsize;
+ feinfo->frequency_tolerance = oldinfo.frequency_tolerance;
+ feinfo->symbol_rate_min = oldinfo.symbol_rate_min;
+ feinfo->symbol_rate_max = oldinfo.symbol_rate_max;
+ feinfo->symbol_rate_tolerance = oldinfo.symbol_rate_tolerance;
+
+ switch (oldinfo.type) {
+ case FE_QPSK:
+ if (feinfo->delivery == DVBFE_DELSYS_DVBS)
+ return err; // ok
+ break;
+ case FE_QAM:
+ if (feinfo->delivery == DVBFE_DELSYS_DVBC)
+ return err; // ok
+ break;
+ case FE_OFDM:
+ if (feinfo->delivery == DVBFE_DELSYS_DVBT)
+ return err; // ok
+ break;
+ default:;
+ }
+ errno = EINVAL;
+ return -1;
+}
+
+int DVBFE_ioctl(int d, int request, void *data) {
+ switch (request) {
+ case DVBFE_SET_PARAMS:
+ return ioctl_DVBFE_SET_PARAMS(d, (dvbfe_params*)data);
+ case DVBFE_GET_DELSYS:
+ return ioctl_DVBFE_GET_DELSYS(d, (dvbfe_delsys*)data);
+ case DVBFE_GET_INFO:
+ return ioctl_DVBFE_GET_INFO(d, (dvbfe_info*)data);
+ case DVBFE_GET_PARAMS:
+ case DVBFE_GET_EVENT:
+ errno = EINVAL;
+ return -1;
+ }
+ return ioctl(d, request, data);
+}
+
+#endif // ifdef DVB_MULTIPROTO_WRAPPER
diff -Nu vdr-1.5.14/dvb_api_wrapper.h vdr-1.5.14-wrapper/dvb_api_wrapper.h
--- vdr-1.5.14/dvb_api_wrapper.h 1970-01-01 01:00:00.000000000 +0100
+++ vdr-1.5.14-wrapper/dvb_api_wrapper.h 2008-02-03 00:04:51.000000000 +0100
@@ -0,0 +1,418 @@
+/*
+ * dvb_api_wrapper.h:
+ * Wrapper to translate Multiproto DVB API to DVB 3.0 API calls
+ *
+ * See the main source file 'vdr.c' for copyright information and
+ * how to reach the author.
+ *
+ * $Id: $
+ */
+
+#ifndef __DVB_API_WRAPPER_H
+#define __DVB_API_WRAPPER_H
+
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/version.h>
+
+#if DVB_API_VERSION != 3
+#error VDR requires Linux DVB driver API version 3!
+#endif
+
+#if !defined(DVB_MULTIPROTO_WRAPPER) && DVB_API_VERSION_MINOR < 3
+#define DVB_MULTIPROTO_WRAPPER 1
+#endif
+
+#if defined(DVB_MULTIPROTO_WRAPPER) && DVB_MULTIPROTO_WRAPPER == 0
+#undef DVB_MULTIPROTO_WRAPPER
+#endif
+
+#if DVB_API_VERSION_MINOR < 3
+
+// DVB API is missing multiproto structs, so we declare them.
+// The following is based on frontend.h from multiproto DVB driver
+
+/*
+ * Delivery Systems
+ * needs to set/queried for multistandard frontends
+ */
+enum dvbfe_delsys {
+ DVBFE_DELSYS_DVBS = (1 << 0),
+ DVBFE_DELSYS_DSS = (1 << 1),
+ DVBFE_DELSYS_DVBS2 = (1 << 2),
+ DVBFE_DELSYS_DVBC = (1 << 3),
+ DVBFE_DELSYS_DVBT = (1 << 4),
+ DVBFE_DELSYS_DVBH = (1 << 5),
+ DVBFE_DELSYS_ATSC = (1 << 6),
+ DVBFE_DELSYS_DUMMY = (1 << 31)
+};
+#define DVBFE_GET_DELSYS _IOR('o', 82, enum dvbfe_delsys)
+
+/* Modulation types */
+enum dvbfe_modulation {
+ DVBFE_MOD_NONE = (0 << 0),
+ DVBFE_MOD_BPSK = (1 << 0),
+ DVBFE_MOD_QPSK = (1 << 1),
+ DVBFE_MOD_OQPSK = (1 << 2),
+ DVBFE_MOD_8PSK = (1 << 3),
+ DVBFE_MOD_16APSK = (1 << 4),
+ DVBFE_MOD_32APSK = (1 << 5),
+ DVBFE_MOD_QAM4 = (1 << 6),
+ DVBFE_MOD_QAM16 = (1 << 7),
+ DVBFE_MOD_QAM32 = (1 << 8),
+ DVBFE_MOD_QAM64 = (1 << 9),
+ DVBFE_MOD_QAM128 = (1 << 10),
+ DVBFE_MOD_QAM256 = (1 << 11),
+ DVBFE_MOD_QAM512 = (1 << 12),
+ DVBFE_MOD_QAM1024 = (1 << 13),
+ DVBFE_MOD_QAMAUTO = (1 << 14),
+ DVBFE_MOD_OFDM = (1 << 15),
+ DVBFE_MOD_COFDM = (1 << 16),
+ DVBFE_MOD_VSB8 = (1 << 17),
+ DVBFE_MOD_VSB16 = (1 << 18),
+ DVBFE_MOD_AUTO = (1 << 31)
+};
+
+/*
+ * Convolution Code Rate (Viterbi Inner Code Rate)
+ * DVB-S2 uses LDPC. Information on LDPC can be found at
+ * http://www.ldpc-codes.com
+ */
+enum dvbfe_fec {
+ DVBFE_FEC_NONE = (0 << 0),
+ DVBFE_FEC_1_4 = (1 << 0),
+ DVBFE_FEC_1_3 = (1 << 1),
+ DVBFE_FEC_2_5 = (1 << 2),
+ DVBFE_FEC_1_2 = (1 << 3),
+ DVBFE_FEC_3_5 = (1 << 4),
+ DVBFE_FEC_2_3 = (1 << 5),
+ DVBFE_FEC_3_4 = (1 << 6),
+ DVBFE_FEC_4_5 = (1 << 7),
+ DVBFE_FEC_5_6 = (1 << 8),
+ DVBFE_FEC_6_7 = (1 << 9),
+ DVBFE_FEC_7_8 = (1 << 10),
+ DVBFE_FEC_8_9 = (1 << 11),
+ DVBFE_FEC_9_10 = (1 << 12),
+ DVBFE_FEC_AUTO = (1 << 31)
+};
+
+/* Frontend Inversion (I/Q Swap) */
+enum dvbfe_inversion {
+ DVBFE_INVERSION_OFF = 0,
+ DVBFE_INVERSION_ON = 1,
+ DVBFE_INVERSION_AUTO = 2
+};
+
+/* DVB-S parameters */
+struct dvbs_params {
+ __u32 symbol_rate;
+
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+};
+
+/* DSS parameters */
+struct dss_params {
+ __u32 symbol_rate;
+
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+};
+
+/*
+ * Rolloff Rate (Nyquist Filter Rolloff)
+ * NOTE: DVB-S2 has rates of 0.20, 0.25, 0.35
+ * Values are x100
+ * Applies to DVB-S2
+ */
+enum dvbfe_rolloff {
+ DVBFE_ROLLOFF_35 = 0,
+ DVBFE_ROLLOFF_25 = 1,
+ DVBFE_ROLLOFF_20 = 2,
+ DVBFE_ROLLOFF_UNKNOWN = 3
+};
+
+/* DVB-S2 parameters */
+struct dvbs2_params {
+ __u32 symbol_rate;
+
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+
+ /* Informational fields only */
+ enum dvbfe_rolloff rolloff;
+
+ __u8 matype_1;
+ __u8 matype_2;
+ __u8 upl_1;
+ __u8 upl_2;
+ __u8 dfl_1;
+ __u8 dfl_2;
+ __u8 sync;
+ __u8 syncd_1;
+ __u8 syncd_2;
+
+ __u8 pad[32];
+};
+
+/* DVB-C parameters */
+struct dvbc_params {
+ __u32 symbol_rate;
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+};
+
+/* DVB-T Channel bandwidth */
+enum dvbfe_bandwidth {
+ DVBFE_BANDWIDTH_8_MHZ = (1 << 0),
+ DVBFE_BANDWIDTH_7_MHZ = (1 << 1),
+ DVBFE_BANDWIDTH_6_MHZ = (1 << 2),
+ DVBFE_BANDWIDTH_5_MHZ = (1 << 3),
+ DVBFE_BANDWIDTH_AUTO = (1 << 31)
+};
+
+/* DVB-T/DVB-H transmission mode */
+enum dvbfe_transmission_mode {
+ DVBFE_TRANSMISSION_MODE_2K = (1 << 0),
+ DVBFE_TRANSMISSION_MODE_4K = (1 << 1),
+ DVBFE_TRANSMISSION_MODE_8K = (1 << 2),
+ DVBFE_TRANSMISSION_MODE_AUTO = (1 << 31)
+};
+
+/* DVB-T/DVB-H Guard interval */
+enum dvbfe_guard_interval {
+ DVBFE_GUARD_INTERVAL_1_32 = (1 << 1),
+ DVBFE_GUARD_INTERVAL_1_16 = (1 << 2),
+ DVBFE_GUARD_INTERVAL_1_8 = (1 << 3),
+ DVBFE_GUARD_INTERVAL_1_4 = (1 << 4),
+ DVBFE_GUARD_INTERVAL_AUTO = (1 << 31)
+};
+
+/* DVB-T/DVB-H Hierarchial modulation */
+enum dvbfe_hierarchy {
+ DVBFE_HIERARCHY_OFF = (1 << 0),
+ DVBFE_HIERARCHY_ON = (1 << 1),
+ DVBFE_HIERARCHY_AUTO = (1 << 2)
+};
+
+/* DVB-T/DVB-H Rolloff's */
+enum dvbfe_alpha {
+ DVBFE_ALPHA_1 = (1 << 0),
+ DVBFE_ALPHA_2 = (1 << 1),
+ DVBFE_ALPHA_4 = (1 << 2)
+};
+
+/* Stream priority (Hierachial coding) */
+enum dvbfe_stream_priority {
+ DVBFE_STREAM_PRIORITY_HP = (0 << 0),
+ DVBFE_STREAM_PRIORITY_LP = (1 << 0)
+};
+
+/* DVB-T parameters */
+struct dvbt_params {
+ enum dvbfe_modulation constellation;
+ enum dvbfe_bandwidth bandwidth;
+ enum dvbfe_fec code_rate_HP;
+ enum dvbfe_fec code_rate_LP;
+ enum dvbfe_transmission_mode transmission_mode;
+ enum dvbfe_guard_interval guard_interval;
+ enum dvbfe_hierarchy hierarchy;
+ enum dvbfe_alpha alpha;
+ enum dvbfe_stream_priority priority;
+
+ __u8 pad[32];
+};
+
+/* DVB-H Interleaver type */
+enum dvbfe_interleaver {
+ DVBFE_INTERLEAVER_NATIVE = (1 << 0),
+ DVBFE_INTERLEAVER_INDEPTH = (1 << 1),
+ DVBFE_INTERLEAVER_AUTO = (1 << 31)
+};
+
+/* DVB-H MPE-FEC Indicator */
+enum dvbfe_mpefec {
+ DVBFE_MPEFEC_OFF = (1 << 0),
+ DVBFE_MPEFEC_ON = (1 << 1)
+};
+
+/* DVB-H Timeslicing Indicator */
+enum dvbfe_timeslicing {
+ DVBFE_TIMESLICING_OFF = (1 << 0),
+ DVBFE_TIMESLICING_ON = (1 << 1)
+};
+
+/* DVB-H parameters */
+struct dvbh_params {
+ enum dvbfe_modulation constellation;
+ enum dvbfe_fec code_rate_HP;
+ enum dvbfe_fec code_rate_LP;
+ enum dvbfe_transmission_mode transmission_mode;
+ enum dvbfe_guard_interval guard_interval;
+ enum dvbfe_hierarchy hierarchy;
+ enum dvbfe_alpha alpha;
+ enum dvbfe_interleaver interleaver;
+ enum dvbfe_mpefec mpefec;
+ enum dvbfe_timeslicing timeslicing;
+ enum dvbfe_stream_priority priority;
+
+ __u32 bandwidth;
+ __u8 pad[32];
+};
+
+/* ATSC parameters */
+struct atsc_params {
+ enum dvbfe_modulation modulation;
+
+ __u8 pad[32];
+};
+
+/* DVB Frontend Tuning Parameters */
+struct dvbfe_params {
+ __u32 frequency;
+ enum fe_spectral_inversion inversion;
+ enum dvbfe_delsys delivery;
+
+ __u8 pad[32];
+
+ union {
+ struct dvbs_params dvbs;
+ struct dss_params dss;
+ struct dvbs2_params dvbs2;
+ struct dvbc_params dvbc;
+ struct dvbt_params dvbt;
+ struct dvbh_params dvbh;
+ struct atsc_params atsc;
+
+ __u8 pad[128];
+ } delsys;
+};
+#define DVBFE_SET_PARAMS _IOW('o', 83, struct dvbfe_params)
+#define DVBFE_GET_PARAMS _IOWR('o', 84, struct dvbfe_params)
+
+/* DVB-S capability bitfields */
+struct dvbfe_dvbs_info {
+ enum dvbfe_modulation UNSUPPORTED_modulation;
+ enum dvbfe_fec UNSUPPORTED_fec;
+};
+
+/* DSS capability bitfields */
+struct dvbfe_dss_info {
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+};
+
+/* DVB-S2 capability bitfields */
+struct dvbfe_dvbs2_info {
+ enum dvbfe_modulation modulation;
+ enum dvbfe_fec fec;
+
+ __u8 pad[32];
+};
+
+/* DVB-C capability bitfields */
+struct dvbfe_dvbc_info {
+ enum dvbfe_modulation UNSUPPORTED_modulation;
+};
+
+/* DVB-T capability bitfields */
+struct dvbfe_dvbt_info {
+ enum dvbfe_modulation UNSUPPORTED_modulation;
+ enum dvbfe_stream_priority UNSUPPORTED_stream_priority;
+
+ __u8 pad[32];
+};
+
+/* DVB-H capability bitfields */
+struct dvbfe_dvbh_info {
+ enum dvbfe_modulation modulation;
+ enum dvbfe_stream_priority stream_priority;
+
+ __u8 pad[32];
+};
+
+/* ATSC capability bitfields */
+struct dvbfe_atsc_info {
+ enum dvbfe_modulation modulation;
+
+ __u8 pad[32];
+};
+
+/* DVB Frontend related Information */
+struct dvbfe_info {
+ char name[128];
+
+ /* For Multi Standard tuners, set "delivery"
+ * to the relevant delivery system to retrieve the
+ * relevant delivery system related information.
+ */
+ enum dvbfe_delsys delivery;
+
+ union {
+ struct dvbfe_dvbs_info dvbs;
+ struct dvbfe_dss_info dss;
+ struct dvbfe_dvbs2_info dvbs2;
+ struct dvbfe_dvbc_info dvbc;
+ struct dvbfe_dvbt_info dvbt;
+ struct dvbfe_dvbh_info dvbh;
+ struct dvbfe_atsc_info atsc;
+
+ __u8 pad[128];
+ } delsys;
+
+ __u32 frequency_min;
+ __u32 frequency_max;
+ __u32 frequency_step;
+ __u32 frequency_tolerance;
+ __u32 symbol_rate_min;
+ __u32 symbol_rate_max;
+ __u32 symbol_rate_tolerance;
+
+ enum fe_spectral_inversion UNSUPPORTED_inversion;
+
+ __u8 pad[128];
+};
+#define DVBFE_GET_INFO _IOWR('o', 85, struct dvbfe_info)
+
+enum dvbfe_status {
+ DVBFE_HAS_SIGNAL = (1 << 0), /* something above noise floor */
+ DVBFE_HAS_CARRIER = (1 << 1), /* Signal found */
+ DVBFE_HAS_VITERBI = (1 << 2), /* FEC is stable */
+ DVBFE_HAS_SYNC = (1 << 3), /* SYNC found */
+ DVBFE_HAS_LOCK = (1 << 4), /* OK .. */
+ DVBFE_TIMEDOUT = (1 << 5), /* no lock in last ~2 s */
+ DVBFE_STATUS_DUMMY = (1 << 31)
+};
+
+/* DVB Frontend events */
+struct dvbfe_events {
+ enum dvbfe_status status;
+
+ __u8 pad[32];
+};
+
+struct dvbfe_event {
+ struct dvbfe_events fe_events;
+ struct dvbfe_params fe_params;
+};
+#define DVBFE_GET_EVENT _IOR('o', 86, struct dvbfe_event)
+
+
+// End of copied section of frontend.h
+
+#endif // DVB_API_VERSION_MINOR < 3
+
+
+
+#ifdef DVB_MULTIPROTO_WRAPPER
+
+// Wrapper for multiproto ioctl calls:
+int DVBFE_ioctl(int d, int request, void *data);
+
+#else // ifdef DVB_MULTIPROTO_WRAPPER
+
+// Null wrapper for multiproto ioctl calls:
+int DVBFE_ioctl(int d, int request, void *data) { return ioctl(d, request, data); }
+
+#endif // ifdef DVB_MULTIPROTO_WRAPPER
+
+#endif // ifndef __DVB_API_EMULATE_H
diff -Nu vdr-1.5.14/dvbdevice.c vdr-1.5.14-wrapper/dvbdevice.c
--- vdr-1.5.14/dvbdevice.c 2008-02-03 00:08:05.000000000 +0100
+++ vdr-1.5.14-wrapper/dvbdevice.c 2008-02-03 00:08:05.000000000 +0100
@@ -269,7 +269,7 @@
dvbfe_info feinfo;
feinfo.delivery = Frontend.delivery;
- CHECK(ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
+ CHECK(DVBFE_ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
}
else if (frontendType & DVBFE_DELSYS_DVBC) {
Frontend.delivery = DVBFE_DELSYS_DVBC;
@@ -284,7 +284,7 @@
dvbfe_info feinfo;
feinfo.delivery = Frontend.delivery;
- CHECK(ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
+ CHECK(DVBFE_ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
}
else if (frontendType & DVBFE_DELSYS_DVBT) {
Frontend.delivery = DVBFE_DELSYS_DVBT;
@@ -305,13 +305,13 @@
dvbfe_info feinfo;
feinfo.delivery = Frontend.delivery;
- CHECK(ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
+ CHECK(DVBFE_ioctl(fd_frontend, DVBFE_GET_INFO, &feinfo)); //switch system
}
else {
esyslog("ERROR: attempt to set channel with unknown DVB frontend type");
return false;
}
- if (ioctl(fd_frontend, DVBFE_SET_PARAMS, &Frontend) < 0) {
+ if (DVBFE_ioctl(fd_frontend, DVBFE_SET_PARAMS, &Frontend) < 0) {
esyslog("ERROR: frontend %d: %m", cardIndex);
return false;
}
@@ -460,7 +460,7 @@
// We only check the devices that must be present - the others will be checked before accessing them://XXX
if (fd_frontend >= 0) {
- if (ioctl(fd_frontend, DVBFE_GET_DELSYS, &frontendType) >= 0) {
+ if (DVBFE_ioctl(fd_frontend, DVBFE_GET_DELSYS, &frontendType) >= 0) {
const char **DeliverySystem = DeliverySystems;
cString ds;
for (int i = 0; i < 32; i++) {
diff -Nu vdr-1.5.14/dvbdevice.h vdr-1.5.14-wrapper/dvbdevice.h
--- vdr-1.5.14/dvbdevice.h 2008-01-27 11:21:02.000000000 +0100
+++ vdr-1.5.14-wrapper/dvbdevice.h 2008-02-02 23:37:53.000000000 +0100
@@ -14,9 +14,10 @@
#include <linux/dvb/version.h>
#include "device.h"
#include "dvbspu.h"
+#include "dvb_api_wrapper.h"
-#if DVB_API_VERSION != 3 || DVB_API_VERSION_MINOR != 3
-#error VDR requires Linux DVB driver API version 3.3!
+#if DVB_API_VERSION != 3
+#error VDR requires Linux DVB driver API version 3!
#endif
#define MAXDVBDEVICES 8
diff -Nu vdr-1.5.14/Makefile vdr-1.5.14-wrapper/Makefile
--- vdr-1.5.14/Makefile 2008-01-13 13:53:17.000000000 +0100
+++ vdr-1.5.14-wrapper/Makefile 2008-01-28 20:46:07.000000000 +0100
@@ -36,7 +36,7 @@
SILIB = $(LSIDIR)/libsi.a
-OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
+OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvb_api_wrapper.o dvbdevice.o dvbci.o dvbosd.o\
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
diff -Nu vdr-1.5.14/nit.c vdr-1.5.14-wrapper/nit.c
--- vdr-1.5.14/nit.c 2008-01-26 16:08:01.000000000 +0100
+++ vdr-1.5.14-wrapper/nit.c 2008-02-02 23:38:08.000000000 +0100
@@ -10,6 +10,7 @@
#include "nit.h"
#include <linux/dvb/frontend.h>
#include "channels.h"
+#include "dvb_api_wrapper.h"
#include "eitscan.h"
#include "libsi/section.h"
#include "libsi/descriptor.h"
_______________________________________________
vdr mailing list
vdr@xxxxxxxxxxx
http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr