diff --git a/apps/modconfig.c b/apps/modconfig.c index 036c69f..7d3589c 100644 --- a/apps/modconfig.c +++ b/apps/modconfig.c @@ -85,91 +85,149 @@ struct param_table_entry { struct param_table_entry mod_standard_table[] = { { .name = "0", .value = MOD_STANDARD_GENERIC }, { .name = "GENERIC", .value = MOD_STANDARD_GENERIC }, + { .name = "1", .value = MOD_STANDARD_DVBT_8 }, { .name = "DVBT_8", .value = MOD_STANDARD_DVBT_8 }, { .name = "DVBT2_8", .value = MOD_STANDARD_DVBT_8 }, + { .name = "2", .value = MOD_STANDARD_DVBT_7 }, { .name = "DVBT_7", .value = MOD_STANDARD_DVBT_7 }, { .name = "DVBT2_7", .value = MOD_STANDARD_DVBT_7 }, + { .name = "3", .value = MOD_STANDARD_DVBT_6 }, { .name = "DVBT_6", .value = MOD_STANDARD_DVBT_6 }, { .name = "DVBT2_6", .value = MOD_STANDARD_DVBT_6 }, + { .name = "4", .value = MOD_STANDARD_DVBT_5 }, { .name = "DVBT_5", .value = MOD_STANDARD_DVBT_5 }, { .name = "DVBT2_5", .value = MOD_STANDARD_DVBT_5 }, + { .name = "8", .value = MOD_STANDARD_DVBC_8 }, { .name = "DVBC_8", .value = MOD_STANDARD_DVBC_8 }, + { .name = "9", .value = MOD_STANDARD_DVBC_7 }, { .name = "DVBC_7", .value = MOD_STANDARD_DVBC_7 }, + { .name = "10", .value = MOD_STANDARD_DVBC_6 }, { .name = "DVBC_6", .value = MOD_STANDARD_DVBC_6 }, + + { .name = "11", .value = MOD_STANDARD_J83B_QAM64 }, + { .name = "J83B_QAM64", .value = MOD_STANDARD_J83B_QAM64 }, + + { .name = "12", .value = MOD_STANDARD_J83B_QAM256 }, + { .name = "J83B_QAM256", .value = MOD_STANDARD_J83B_QAM256 }, + + { .name = "13", .value = MOD_STANDARD_ISDBC_QAM64 }, + { .name = "ISDBC_QAM64", .value = MOD_STANDARD_ISDBC_QAM64 }, + { .name = "J83C_QAM64", .value = MOD_STANDARD_ISDBC_QAM64 }, + + { .name = "14", .value = MOD_STANDARD_ISDBC_QAM256 }, + { .name = "ISDBC_QAM256", .value = MOD_STANDARD_ISDBC_QAM256 }, + { .name = "J83C_QAM256", .value = MOD_STANDARD_ISDBC_QAM256 }, + { .name = NULL, .value = 0 } }; struct param_table_entry stream_format_table[] = { - { .name = "default", .value = MOD_FORMAT_DEFAULT }, - { .name = "IQ16", .value = MOD_FORMAT_IQ16 }, - { .name = "IQ8", .value = MOD_FORMAT_IQ8 }, - { .name = "IDX8", .value = MOD_FORMAT_IDX8 }, - { .name = "TS", .value = MOD_FORMAT_TS }, { .name = "0", .value = MOD_FORMAT_DEFAULT }, + { .name = "default", .value = MOD_FORMAT_DEFAULT }, + { .name = "1", .value = MOD_FORMAT_IQ16 }, + { .name = "IQ16", .value = MOD_FORMAT_IQ16 }, + { .name = "2", .value = MOD_FORMAT_IQ8 }, + { .name = "IQ8", .value = MOD_FORMAT_IQ8 }, + { .name = "3", .value = MOD_FORMAT_IDX8 }, + { .name = "IDX8", .value = MOD_FORMAT_IDX8 }, + { .name = "4", .value = MOD_FORMAT_TS }, + { .name = "TS", .value = MOD_FORMAT_TS }, + { .name = NULL, .value = 0 } }; struct param_table_entry guard_interval_table[] = { - { .name = "1/32", .value = MOD_DVBT_GI_1_32 }, - { .name = "1/16", .value = MOD_DVBT_GI_1_16 }, - { .name = "1/8", .value = MOD_DVBT_GI_1_8 }, - { .name = "1/4", .value = MOD_DVBT_GI_1_4 }, { .name = "0", .value = MOD_DVBT_GI_1_32 }, + { .name = "1/32", .value = MOD_DVBT_GI_1_32 }, + { .name = "1", .value = MOD_DVBT_GI_1_16 }, + { .name = "1/16", .value = MOD_DVBT_GI_1_16 }, + { .name = "2", .value = MOD_DVBT_GI_1_8 }, + { .name = "1/8", .value = MOD_DVBT_GI_1_8 }, + { .name = "3", .value = MOD_DVBT_GI_1_4 }, + { .name = "1/4", .value = MOD_DVBT_GI_1_4 }, { .name = NULL, .value = 0 } }; struct param_table_entry puncture_rate_table[] = { - { .name = "1/2", .value = MOD_DVBT_PR_1_2 }, - { .name = "2/3", .value = MOD_DVBT_PR_2_3 }, - { .name = "3/4", .value = MOD_DVBT_PR_3_4 }, - { .name = "5/6", .value = MOD_DVBT_PR_5_6 }, - { .name = "7/8", .value = MOD_DVBT_PR_7_8 }, { .name = "1", .value = MOD_DVBT_PR_1_2 }, + { .name = "1/2", .value = MOD_DVBT_PR_1_2 }, + { .name = "2", .value = MOD_DVBT_PR_2_3 }, + { .name = "2/3", .value = MOD_DVBT_PR_2_3 }, + { .name = "3", .value = MOD_DVBT_PR_3_4 }, + { .name = "3/4", .value = MOD_DVBT_PR_3_4 }, + { .name = "5", .value = MOD_DVBT_PR_5_6 }, + { .name = "5/6", .value = MOD_DVBT_PR_5_6 }, + { .name = "7", .value = MOD_DVBT_PR_7_8 }, + { .name = "7/8", .value = MOD_DVBT_PR_7_8 }, + { .name = NULL, .value = 0 } }; struct param_table_entry dvbt_constellation_table[] = { { .name = "0", .value = MOD_DVBT_QPSK }, { .name = "qpsk", .value = MOD_DVBT_QPSK }, + { .name = "1", .value = MOD_DVBT_16QAM }, { .name = "16qam", .value = MOD_DVBT_16QAM }, { .name = "qam16", .value = MOD_DVBT_16QAM }, + { .name = "2", .value = MOD_DVBT_64QAM }, { .name = "64qam", .value = MOD_DVBT_64QAM }, { .name = "qam64", .value = MOD_DVBT_64QAM }, + { .name = NULL, .value = 0 } }; struct param_table_entry qam_modulation_table[] = { { .name = "0", .value = MOD_QAM_DVBC_16 }, { .name = "qam_dvbc_16", .value = MOD_QAM_DVBC_16 }, + { .name = "1", .value = MOD_QAM_DVBC_32 }, { .name = "qam_dvbc_32", .value = MOD_QAM_DVBC_32 }, + { .name = "2", .value = MOD_QAM_DVBC_64 }, { .name = "qam_dvbc_64", .value = MOD_QAM_DVBC_64 }, + { .name = "3", .value = MOD_QAM_DVBC_128 }, { .name = "qam_dvbc_128", .value = MOD_QAM_DVBC_128 }, + { .name = "4", .value = MOD_QAM_DVBC_256 }, { .name = "qam_dvbc_256", .value = MOD_QAM_DVBC_256 }, + + { .name = "5", .value = MOD_QAM_J83B_64 }, + { .name = "qam_j83b_64", .value = MOD_QAM_J83B_64 }, + + { .name = "6", .value = MOD_QAM_DVBC_256 }, + { .name = "qam_j83b_256", .value = MOD_QAM_J83B_256 }, + + { .name = "7", .value = MOD_QAM_GENERIC }, + { .name = "qam_generic", .value = MOD_QAM_GENERIC }, + + { .name = "8", .value = MOD_QAM_ISDBC_64 }, + { .name = "qam_isdbc_64", .value = MOD_QAM_ISDBC_64 }, + + { .name = "9", .value = MOD_QAM_ISDBC_256 }, + { .name = "qam_isdbc_256", .value = MOD_QAM_ISDBC_256 }, + { .name = NULL, .value = 0 } }; @@ -180,6 +238,7 @@ int parse_param(char *val, struct param_table_entry *table, int *value) { while (table->name) { if( !strcasecmp(val,table->name)) { *value = table->value; + printf("%s=%u\n", val, *value); return 0; } table++; @@ -190,14 +249,34 @@ int parse_param(char *val, struct param_table_entry *table, int *value) { return -1; } +void dump(const uint8_t *b, int l) +{ + int i, j; + + for (j = 0; j < l; j += 16, b += 16) { + for (i = 0; i < 16; i++) + if (i + j < l) + printf("%02x ", b[i]); + else + printf(" "); + printf(" | "); + for (i = 0; i < 16; i++) + if (i + j < l) + putchar((b[i] > 31 && b[i] < 127) ? b[i] : '.'); + printf("\n"); + } +} + int mci_cmd(int dev, struct mci_command *cmd) { int ret; struct ddb_mci_msg msg; uint8_t status; + memset(&msg, 0, sizeof(msg)); msg.link = 0; memcpy(&msg.cmd, cmd, sizeof(msg.cmd)); + dump((uint8_t *) &msg.cmd, sizeof(msg.cmd)); ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); if (ret < 0) { dprintf(2, "mci_cmd error %d\n", errno); @@ -277,7 +356,7 @@ void output_cb(void *priv, char *par, char *val) mc->output.mod_setup_output.channel_power = (int16_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")) { + } else if (!strcasecmp(par, "unit")) { if (!strcasecmp(val, "DBUV")) { mc->output.mod_setup_output.unit = MOD_UNIT_DBUV; } else if (!strcasecmp(val, "DBM")) { @@ -303,10 +382,11 @@ void channels_cb(void *priv, char *par, char *val) } else if (!strcasecmp(par, "channels")) { mc->channels.mod_setup_channels[0].num_channels = strtol(val, NULL, 10); } else if (!strcasecmp(par, "standard")) { - if (!parse_param(val,mod_standard_table,&value)) - mc->stream.mod_setup_channels[0].standard = value; + if (!parse_param(val,mod_standard_table, &value)) + mc->channels.mod_setup_channels[0].standard = value; + printf("standard = %u\n", value); } else if (!strcasecmp(par, "offset")) { - mc->channels.mod_setup_channels[0].offset = (uint32_t) (strtod(val, NULL) * 1000000.0); + 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 = (uint32_t) (strtod(val, NULL) * 1000000.0); mc->channels.mod_setup_channels[0].offset = @@ -359,6 +439,29 @@ void streams_cb(void *priv, char *par, char *val) printf("invalid streams parameter: %s = %s\n", par, val); } +int mci_lic(int dev) +{ + struct ddb_mci_msg msg = { + .cmd.command = CMD_EXPORT_LICENSE, + .cmd.get_bb_header.select = 0, + }; + struct mci_result *res = &msg.res; + int ret; + int i; + + ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); + if (ret < 0) { + printf("Error: %d %d\n", ret, errno); + return ret; + } + if (res->bb_header.valid) { + printf("MATYPE1: %02x\n", res->bb_header.matype_1); + printf("MATYPE2: %02x\n", res->bb_header.matype_2); + } + dump(&res->license, sizeof(res->license)); + return ret; +} + int main(int argc, char*argv[]) { int fd = -1; @@ -412,6 +515,7 @@ int main(int argc, char*argv[]) dprintf(2, "Could not open %s\n", fn); return -1; } + mci_lic(fd); mc.fd = fd; parse(configname, "channels", (void *) &mc, channels_cb); if (mc.set_channels) {