diff --git a/apps/modconfig.c b/apps/modconfig.c index ce1c95b..9562ae7 100644 --- a/apps/modconfig.c +++ b/apps/modconfig.c @@ -81,12 +81,24 @@ int mci_cmd(int dev, struct mci_command *cmd) { int ret; struct ddb_mci_msg msg; + uint8_t status; msg.link = 0; memcpy(&msg.cmd, cmd, sizeof(msg.cmd)); ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); if (ret < 0) { - printf("mci_cmd error %d\n", errno); + dprintf(2, "mci_cmd error %d\n", errno); + return ret; + } + status = msg.res.status; + if (status == MCI_STATUS_OK) + return ret; + if (status == MCI_STATUS_UNSUPPORTED) { + dprintf(2, "Unsupported MCI command\n"); + return ret; + } + if (status == MCI_STATUS_INVALID_PARAMETER) { + dprintf(2, "Invalid MCI parameters\n"); return ret; } return ret; @@ -145,7 +157,7 @@ void output_cb(void *priv, char *par, char *val) } else printf("invalid connector\n"); } else if (!strcasecmp(par, "power")) { - mc->output.mod_setup_output.channel_power = strtol(val, NULL, 10); + mc->output.mod_setup_output.channel_power = (uint32_t) (strtod(val, NULL) * 100.0); } else if (!strcasecmp(par, "channels")) { mc->output.mod_setup_output.num_channels = strtol(val, NULL, 10); }else if (!strcasecmp(par, "unit")) { @@ -168,16 +180,16 @@ void channels_cb(void *priv, char *par, char *val) return; } if (!strcasecmp(par, "frequency")) { - mc->channels.mod_setup_channels[0].frequency = strtol(val, NULL, 10); + mc->channels.mod_setup_channels[0].frequency = (uint32_t) (strtod(val, NULL) * 1000000.0); printf("frequency = %u\n", mc->channels.mod_setup_channels[0].frequency); } else if (!strcasecmp(par, "channels")) { mc->channels.mod_setup_channels[0].num_channels = strtol(val, NULL, 10); } else if (!strcasecmp(par, "standard")) { mc->channels.mod_setup_channels[0].standard = strtol(val, NULL, 10); } else if (!strcasecmp(par, "offset")) { - mc->channels.mod_setup_channels[0].offset = strtol(val, NULL, 10); + mc->channels.mod_setup_channels[0].offset = (uint32_t) (strtod(val, NULL) * 1000000.0); } else if (!strcasecmp(par, "bandwidth")) { - mc->channels.mod_setup_channels[0].bandwidth = strtol(val, NULL, 10); + mc->channels.mod_setup_channels[0].bandwidth = (uint32_t) (strtod(val, NULL) * 1000000.0); mc->channels.mod_setup_channels[0].offset = mc->channels.mod_setup_channels[0].bandwidth / 2; } else @@ -200,7 +212,7 @@ void streams_cb(void *priv, char *par, char *val) } else if (!strcasecmp(par, "stream_format")) { mc->stream.mod_setup_stream.stream_format = strtol(val, NULL, 10); } else if (!strcasecmp(par, "symbol_rate")) { - mc->stream.mod_setup_stream.symbol_rate = strtol(val, NULL, 10); + mc->stream.mod_setup_stream.symbol_rate = (uint32_t) (strtod(val, NULL) * 1000000.0); } else if (!strcasecmp(par, "stream")) { mc->stream.mod_stream = strtol(val, NULL, 10); printf("set stream %u to channel %u\n", mc->stream.mod_stream, mc->stream.mod_channel); @@ -232,6 +244,7 @@ int main(int argc, char*argv[]) static struct option long_options[] = { {"device", required_argument, 0, 'd'}, {"config", required_argument, 0, 'c'}, + {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; c = getopt_long(argc, argv, "d:c:", @@ -245,6 +258,9 @@ int main(int argc, char*argv[]) case 'c': configname = optarg; break; + case 'h': + dprintf(2, "modconfig [-d device_number] [-c config_file]\n"); + break; default: break; } @@ -255,8 +271,10 @@ int main(int argc, char*argv[]) } snprintf(fn, 127, "/dev/ddbridge/card%u", device); fd = open(fn, O_RDWR); - if (fd < 0) + if (fd < 0) { + dprintf(2, "Could not open %s\n", fn); return -1; + } mc.fd = fd; parse(configname, "output", (void *) &mc, output_cb); if (mc.set_output) diff --git a/apps/modulator.conf b/apps/modulator.conf index 1d92b27..1f4cf5c 100644 --- a/apps/modulator.conf +++ b/apps/modulator.conf @@ -1,22 +1,51 @@ [output] +# connector = OFF, SMA or F connector = F +# number of total channels to be used at the same time +# use lower number to have fewer channels but stronger signal per channel channels = 16 +# unit of power in DBUV or DBM unit = DBUV -power = 5000 +# power output in units of above unit +power = 50.0 + + +# define channels: +# channels are frequency slots to which a stream (mod0, mod1 ...) can be assigned [channels] +# standard: 0 = generic, 1 = DVB-T 8MHz, 2 = DVB-T 7 MHz, 3 = DVB-T 6 MHz standard = 1 + +# numbers of channels to allocate, starting from frequency below +# this defines 25 channels at 474, 474+8, 474+16, etc. Mhz channels = 25 -frequency = 474000000 +# frequency of channel 0, following channels are spaced according to set standard +frequency = 474.0 + [streams] +# number of streams depends on the card hardware +# streams correspond to devices mod0, mod1, ... +# channels are defined above in channels section + +# 0 = 1/32, 1 = 1/16, 2 = 1/8, 3 = 1/4 guard_interval = 0 +# 0 = 2K, 1 = 8K (2K not yet supported) fft_size = 1 +# all following streams will be set according to the last set other parameters + +# example: +# this would set mod 1 to 474 MHz and mod0 to 482 MHz (474 + 8 MHz) +# both with guard interval 1/32 and 8K FFT +# and mod2 to 490MHz, guard interval 1/16 and 8K FFT channel = 1 stream = 0 - +# channel = 0 stream = 1 - - +# +guard_interval = 1 +channel = 2 +stream = 2