int main(int argc, char *argv[]) { struct dvb_v5_fe_parms *parms; int fe_flags = O_RDWR; argp_parse(&argp, argc, argv, 0, 0, 0); /* * If called without any option, be verbose, to print the * DVB frontend information. */ if (!get && !delsys && !set_params && !femon) verbose++; if (!delsys && !set_params) fe_flags = O_RDONLY; parms = dvb_fe_open_flags(adapter, frontend, verbose, dvbv3, NULL, fe_flags); if (!parms) return -1; if (delsys) { printf("Changing delivery system to: %s\n", delivery_system_name[delsys]); dvb_set_sys(parms, delsys); goto ret; } #if 0 if (set_params) do_something(); #endif if (get) { dvb_fe_get_parms(parms); dvb_fe_prt_parms(parms); } if (femon) get_show_stats(parms); ret: dvb_fe_close(parms); return 0; }
int main(int argc, char *argv[]) { struct dvb_device *dvb; struct dvb_dev_list *dvb_dev; struct dvb_v5_fe_parms *parms; int ret, fe_flags = O_RDWR; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); #endif if (argp_parse(&argp, argc, argv, ARGP_NO_HELP | ARGP_NO_EXIT, 0, 0)) { argp_help(&argp, stderr, ARGP_HELP_SHORT_USAGE, PROGRAM_NAME); return -1; } /* * If called without any option, be verbose, to print the * DVB frontend information. */ if (!get && !delsys && !set_params && !femon) verbose++; if (!delsys && !set_params) fe_flags = O_RDONLY; dvb = dvb_dev_alloc(); if (!dvb) return -1; if (server && port) { printf(_("Connecting to %s:%d\n"), server, port); ret = dvb_dev_remote_init(dvb, server, port); if (ret < 0) return -1; } dvb_dev_set_log(dvb, verbose, NULL); if (device_mon) { dvb_dev_find(dvb, &dev_change_monitor, NULL); while (1) { usleep(1000000); } } dvb_dev_find(dvb, NULL, NULL); parms = dvb->fe_parms; dvb_dev = dvb_dev_seek_by_adapter(dvb, adapter, frontend, DVB_DEVICE_FRONTEND); if (!dvb_dev) return -1; if (!dvb_dev_open(dvb, dvb_dev->sysname, fe_flags)) return -1; if (delsys) { printf(_("Changing delivery system to: %s\n"), delivery_system_name[delsys]); dvb_set_sys(parms, delsys); goto ret; } #if 0 if (set_params) do_something(); #endif if (get) { dvb_fe_get_parms(parms); dvb_fe_prt_parms(parms); } if (femon) get_show_stats(parms); ret: dvb_dev_free(dvb); return 0; }
int dvb_set_compat_delivery_system(struct dvb_v5_fe_parms *p, uint32_t desired_system) { struct dvb_v5_fe_parms_priv *parms = (void *)p; int i; uint32_t delsys = SYS_UNDEFINED; enum dvbv3_emulation_type type; /* Check if the desired delivery system is supported */ for (i = 0; i < parms->p.num_systems; i++) { if (parms->p.systems[i] == desired_system) { dvb_set_sys(&parms->p, desired_system); return 0; } } /* * Find the closest DVBv3 system that matches the delivery * system. */ type = dvbv3_type(desired_system); /* * Get the last non-DVBv3 delivery system that has the same type * of the desired system */ for (i = 0; i < parms->p.num_systems; i++) { if ((dvbv3_type(parms->p.systems[i]) == type) && !is_dvbv3_delsys(parms->p.systems[i])) delsys = parms->p.systems[i]; } if (delsys == SYS_UNDEFINED) return EINVAL; dvb_log(_("Using a DVBv3 compat file for %s"), delivery_system_name[delsys]); dvb_set_sys(&parms->p, delsys); /* Put ISDB-T into auto mode */ if (delsys == SYS_ISDBT) { dvb_fe_store_parm(&parms->p, DTV_BANDWIDTH_HZ, 6000000); dvb_fe_store_parm(&parms->p, DTV_ISDBT_PARTIAL_RECEPTION, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_SOUND_BROADCASTING, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_SB_SUBCHANNEL_ID, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_SB_SEGMENT_IDX, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_SB_SEGMENT_COUNT, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYER_ENABLED, 7); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERA_FEC, FEC_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERB_FEC, FEC_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERC_FEC, FEC_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERA_MODULATION, QAM_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERB_MODULATION, QAM_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERC_MODULATION, QAM_AUTO); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERA_SEGMENT_COUNT, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERA_TIME_INTERLEAVING, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERB_SEGMENT_COUNT, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERB_TIME_INTERLEAVING, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERC_SEGMENT_COUNT, 0); dvb_fe_store_parm(&parms->p, DTV_ISDBT_LAYERC_TIME_INTERLEAVING, 0); } return 0; }
struct dvb_v5_fe_parms *dvb_fe_open_flags(int adapter, int frontend, unsigned verbose, unsigned use_legacy_call, dvb_logfunc logfunc, int flags) { int fd, i, r; char *fname; struct dtv_properties dtv_prop; struct dvb_v5_fe_parms_priv *parms = NULL; libdvbv5_initialize(); if (logfunc == NULL) logfunc = dvb_default_log; r = asprintf(&fname, "/dev/dvb/adapter%i/frontend%i", adapter, frontend); if (r < 0) { logfunc(LOG_ERR, _("asprintf error")); return NULL; } if (!fname) { logfunc(LOG_ERR, _("fname calloc: %s"), strerror(errno)); return NULL; } fd = open(fname, flags, 0); if (fd == -1) { logfunc(LOG_ERR, _("%s while opening %s"), strerror(errno), fname); free(fname); return NULL; } parms = calloc(sizeof(*parms), 1); if (!parms) { logfunc(LOG_ERR, _("parms calloc: %s"), strerror(errno)); close(fd); free(fname); return NULL; } parms->fname = fname; parms->fd = fd; parms->fe_flags = flags; parms->p.verbose = verbose; parms->p.default_charset = "iso-8859-1"; parms->p.output_charset = "utf-8"; parms->p.logfunc = logfunc; parms->p.lna = LNA_AUTO; parms->p.sat_number = -1; parms->p.abort = 0; parms->country = COUNTRY_UNKNOWN; if (xioctl(fd, FE_GET_INFO, &parms->p.info) == -1) { dvb_perror("FE_GET_INFO"); dvb_v5_free(parms); close(fd); free(fname); return NULL; } if (verbose) { fe_caps_t caps = parms->p.info.caps; dvb_log(_("Device %s (%s) capabilities:"), parms->p.info.name, fname); for (i = 0; i < ARRAY_SIZE(fe_caps_name); i++) { if (caps & fe_caps_name[i].idx) dvb_log (" %s", fe_caps_name[i].name); } } parms->dvb_prop[0].cmd = DTV_API_VERSION; parms->dvb_prop[1].cmd = DTV_DELIVERY_SYSTEM; dtv_prop.num = 2; dtv_prop.props = parms->dvb_prop; /* Detect a DVBv3 device */ if (xioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) { parms->dvb_prop[0].u.data = 0x300; parms->dvb_prop[1].u.data = SYS_UNDEFINED; } parms->p.version = parms->dvb_prop[0].u.data; parms->p.current_sys = parms->dvb_prop[1].u.data; if (verbose) dvb_log (_("DVB API Version %d.%d%s, Current v5 delivery system: %s"), parms->p.version / 256, parms->p.version % 256, use_legacy_call ? _(" (forcing DVBv3 calls)") : "", delivery_system_name[parms->p.current_sys]); if (parms->p.version < 0x500) use_legacy_call = 1; if (parms->p.version >= 0x50a) parms->p.has_v5_stats = 1; else parms->p.has_v5_stats = 0; if (use_legacy_call || parms->p.version < 0x505) { parms->p.legacy_fe = 1; switch(parms->p.info.type) { case FE_QPSK: parms->p.current_sys = SYS_DVBS; parms->p.systems[parms->p.num_systems++] = parms->p.current_sys; if (parms->p.version < 0x0500) break; if (parms->p.info.caps & FE_CAN_2G_MODULATION) parms->p.systems[parms->p.num_systems++] = SYS_DVBS2; if (parms->p.info.caps & FE_CAN_TURBO_FEC) parms->p.systems[parms->p.num_systems++] = SYS_TURBO; break; case FE_QAM: parms->p.current_sys = SYS_DVBC_ANNEX_A; parms->p.systems[parms->p.num_systems++] = parms->p.current_sys; break; case FE_OFDM: parms->p.current_sys = SYS_DVBT; parms->p.systems[parms->p.num_systems++] = parms->p.current_sys; if (parms->p.version < 0x0500) break; if (parms->p.info.caps & FE_CAN_2G_MODULATION) parms->p.systems[parms->p.num_systems++] = SYS_DVBT2; break; case FE_ATSC: if (parms->p.info.caps & (FE_CAN_8VSB | FE_CAN_16VSB)) parms->p.systems[parms->p.num_systems++] = SYS_ATSC; if (parms->p.info.caps & (FE_CAN_QAM_64 | FE_CAN_QAM_256 | FE_CAN_QAM_AUTO)) parms->p.systems[parms->p.num_systems++] = SYS_DVBC_ANNEX_B; parms->p.current_sys = parms->p.systems[0]; break; } if (!parms->p.num_systems) { dvb_logerr(_("delivery system not detected")); dvb_v5_free(parms); close(fd); return NULL; } } else { parms->dvb_prop[0].cmd = DTV_ENUM_DELSYS; parms->n_props = 1; dtv_prop.num = 1; dtv_prop.props = parms->dvb_prop; if (xioctl(fd, FE_GET_PROPERTY, &dtv_prop) == -1) { dvb_perror("FE_GET_PROPERTY"); dvb_v5_free(parms); close(fd); return NULL; } parms->p.num_systems = parms->dvb_prop[0].u.buffer.len; for (i = 0; i < parms->p.num_systems; i++) parms->p.systems[i] = parms->dvb_prop[0].u.buffer.data[i]; if (parms->p.num_systems == 0) { dvb_logerr(_("driver returned 0 supported delivery systems!")); dvb_v5_free(parms); close(fd); return NULL; } } if (verbose) { dvb_log(_("Supported delivery system%s: "), (parms->p.num_systems > 1) ? "s" : ""); for (i = 0; i < parms->p.num_systems; i++) { if (parms->p.systems[i] == parms->p.current_sys) dvb_log (" [%s]", delivery_system_name[parms->p.systems[i]]); else dvb_log (" %s", delivery_system_name[parms->p.systems[i]]); } if (use_legacy_call || parms->p.version < 0x505) dvb_log(_("Warning: new delivery systems like ISDB-T, ISDB-S, DMB-TH, DSS, ATSC-MH will be miss-detected by a DVBv5.4 or earlier API call")); } /* * Fix a bug at some DVB drivers */ if (parms->p.current_sys == SYS_UNDEFINED) parms->p.current_sys = parms->p.systems[0]; /* Prepare to use the delivery system */ parms->n_props = dvb_add_parms_for_sys(&parms->p, parms->p.current_sys); if ((flags & O_ACCMODE) == O_RDWR) dvb_set_sys(&parms->p, parms->p.current_sys); /* * Prepare the status struct - DVBv5.10 parameters should * come first, as they'll be read together. */ parms->stats.prop[0].cmd = DTV_STAT_SIGNAL_STRENGTH; parms->stats.prop[1].cmd = DTV_STAT_CNR; parms->stats.prop[2].cmd = DTV_STAT_PRE_ERROR_BIT_COUNT; parms->stats.prop[3].cmd = DTV_STAT_PRE_TOTAL_BIT_COUNT; parms->stats.prop[4].cmd = DTV_STAT_POST_ERROR_BIT_COUNT; parms->stats.prop[5].cmd = DTV_STAT_POST_TOTAL_BIT_COUNT; parms->stats.prop[6].cmd = DTV_STAT_ERROR_BLOCK_COUNT; parms->stats.prop[7].cmd = DTV_STAT_TOTAL_BLOCK_COUNT; /* Now, status and the calculated stats */ parms->stats.prop[8].cmd = DTV_STATUS; parms->stats.prop[9].cmd = DTV_BER; parms->stats.prop[10].cmd = DTV_PER; parms->stats.prop[11].cmd = DTV_QUALITY; parms->stats.prop[12].cmd = DTV_PRE_BER; return &parms->p; }