forked from Ivasoft/DSView
Add DAQ mode for DSCope series of products
This commit is contained in:
@@ -26,13 +26,19 @@
|
||||
|
||||
|
||||
static struct sr_dev_mode mode_list[] = {
|
||||
{"DAQ", ANALOG},
|
||||
{"OSC", DSO},
|
||||
};
|
||||
|
||||
enum {
|
||||
/** Normal */
|
||||
OP_NORMAL = 0,
|
||||
/** Internal pattern test mode */
|
||||
OP_INTEST = 1,
|
||||
};
|
||||
static const char *opmodes[] = {
|
||||
"Normal",
|
||||
"Internal Test",
|
||||
"Internal Test",
|
||||
};
|
||||
|
||||
static const char *thresholds[] = {
|
||||
@@ -77,7 +83,59 @@ static const char *probe_names[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const int32_t probeOptions[] = {
|
||||
SR_CONF_PROBE_COUPLING,
|
||||
SR_CONF_PROBE_VDIV,
|
||||
SR_CONF_PROBE_MAP_UNIT,
|
||||
SR_CONF_PROBE_MAP_MIN,
|
||||
SR_CONF_PROBE_MAP_MAX,
|
||||
};
|
||||
|
||||
static const int32_t probeSessions[] = {
|
||||
SR_CONF_PROBE_COUPLING,
|
||||
SR_CONF_PROBE_VDIV,
|
||||
SR_CONF_PROBE_MAP_UNIT,
|
||||
SR_CONF_PROBE_MAP_MIN,
|
||||
SR_CONF_PROBE_MAP_MAX,
|
||||
};
|
||||
|
||||
static const uint8_t probeCoupling[] = {
|
||||
SR_DC_COUPLING,
|
||||
SR_AC_COUPLING,
|
||||
};
|
||||
|
||||
static const uint64_t probeVdivs[] = {
|
||||
SR_mV(10),
|
||||
SR_mV(20),
|
||||
SR_mV(50),
|
||||
SR_mV(100),
|
||||
SR_mV(200),
|
||||
SR_mV(500),
|
||||
SR_V(1),
|
||||
SR_V(2),
|
||||
};
|
||||
|
||||
static const char *probeMapUnits[] = {
|
||||
"V",
|
||||
"A",
|
||||
"°C",
|
||||
"°F",
|
||||
"g",
|
||||
"m",
|
||||
"m/s",
|
||||
"Custom",
|
||||
};
|
||||
|
||||
static const uint64_t samplerates[] = {
|
||||
SR_HZ(10),
|
||||
SR_HZ(20),
|
||||
SR_HZ(50),
|
||||
SR_HZ(100),
|
||||
SR_HZ(200),
|
||||
SR_HZ(500),
|
||||
SR_KHZ(1),
|
||||
SR_KHZ(2),
|
||||
SR_KHZ(5),
|
||||
SR_KHZ(10),
|
||||
SR_KHZ(20),
|
||||
SR_KHZ(50),
|
||||
@@ -112,9 +170,10 @@ static const uint64_t samplecounts[] = {
|
||||
SR_MB(8),
|
||||
SR_MB(16),
|
||||
SR_MB(32),
|
||||
SR_MB(64),
|
||||
SR_MB(128),
|
||||
};
|
||||
|
||||
static uint16_t opmodes_show_count = 2;
|
||||
static const uint8_t zero_base_addr = 0x40;
|
||||
static const uint8_t zero_big_addr = 0x20;
|
||||
|
||||
@@ -217,23 +276,40 @@ static uint64_t get_default_vgain(const struct sr_dev_inst *sdi, unsigned int nu
|
||||
return vgain;
|
||||
}
|
||||
|
||||
static int counts_size(const struct sr_dev_inst *sdi)
|
||||
{
|
||||
if (strcmp(sdi->model, "DSCope") == 0 ||
|
||||
strcmp(sdi->model, "DSCope20") == 0 ||
|
||||
strcmp(sdi->model, "DSCope B20") == 0) {
|
||||
if (sdi->mode == DSO)
|
||||
return 15;
|
||||
else if (sdi->mode == ANALOG)
|
||||
return ARRAY_SIZE(samplecounts);
|
||||
else
|
||||
return 0;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void probe_init(struct sr_dev_inst *sdi)
|
||||
{
|
||||
int i;
|
||||
GSList *l;
|
||||
for (l = sdi->channels; l; l = l->next) {
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
if (sdi->mode == DSO) {
|
||||
probe->vdiv = 1000;
|
||||
probe->vfactor = 1;
|
||||
probe->vpos = 0;
|
||||
probe->coupling = SR_DC_COUPLING;
|
||||
probe->trig_value = 0x80;
|
||||
probe->vpos_trans = get_default_trans(sdi);
|
||||
probe->ms_show = TRUE;
|
||||
for (i = DSO_MS_BEGIN; i < DSO_MS_END; i++)
|
||||
probe->ms_en[i] = default_ms_en[i];
|
||||
}
|
||||
probe->vdiv = 1000;
|
||||
probe->vfactor = 1;
|
||||
probe->vpos = 0;
|
||||
probe->coupling = SR_DC_COUPLING;
|
||||
probe->trig_value = 0x80;
|
||||
probe->vpos_trans = get_default_trans(sdi);
|
||||
probe->ms_show = TRUE;
|
||||
for (i = DSO_MS_BEGIN; i < DSO_MS_END; i++)
|
||||
probe->ms_en[i] = default_ms_en[i];
|
||||
probe->map_unit = probeMapUnits[0];
|
||||
probe->map_min = -1;
|
||||
probe->map_max = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -243,7 +319,8 @@ static int setup_probes(struct sr_dev_inst *sdi, int num_probes)
|
||||
struct sr_channel *probe;
|
||||
|
||||
for (j = 0; j < num_probes; j++) {
|
||||
if (!(probe = sr_channel_new(j, (sdi->mode == LOGIC) ? SR_CHANNEL_LOGIC : ((sdi->mode == DSO) ? SR_CHANNEL_DSO : SR_CHANNEL_ANALOG),
|
||||
if (!(probe = sr_channel_new(j, (sdi->mode == LOGIC) ? SR_CHANNEL_LOGIC :
|
||||
((sdi->mode == DSO) ? SR_CHANNEL_DSO : SR_CHANNEL_ANALOG),
|
||||
TRUE, probe_names[j])))
|
||||
return SR_ERR;
|
||||
sdi->channels = g_slist_append(sdi->channels, probe);
|
||||
@@ -276,7 +353,7 @@ static int adjust_probes(struct sr_dev_inst *sdi, int num_probes)
|
||||
return SR_OK;
|
||||
}
|
||||
|
||||
static struct DSL_context *DSCope_dev_new(void)
|
||||
static struct DSL_context *DSCope_dev_new(const struct sr_dev_inst *sdi)
|
||||
{
|
||||
struct DSL_context *devc;
|
||||
|
||||
@@ -294,7 +371,11 @@ static struct DSL_context *DSCope_dev_new(void)
|
||||
devc->clock_type = FALSE;
|
||||
devc->clock_edge = FALSE;
|
||||
devc->instant = FALSE;
|
||||
devc->op_mode = SR_OP_BUFFER;
|
||||
devc->op_mode = OP_NORMAL;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = FALSE;
|
||||
devc->samplerates_size = ARRAY_SIZE(samplerates);
|
||||
devc->samplecounts_size = counts_size(sdi);
|
||||
devc->th_level = SR_TH_3V3;
|
||||
devc->filter = SR_FILTER_NONE;
|
||||
devc->timebase = 10000;
|
||||
@@ -306,12 +387,10 @@ static struct DSL_context *DSCope_dev_new(void)
|
||||
devc->zero = FALSE;
|
||||
devc->data_lock = FALSE;
|
||||
devc->cali = FALSE;
|
||||
devc->dso_bits = 8;
|
||||
devc->unit_bits = 8;
|
||||
devc->trigger_margin = 8;
|
||||
devc->trigger_channel = 0;
|
||||
devc->rle_mode = FALSE;
|
||||
devc->stream = FALSE;
|
||||
|
||||
return devc;
|
||||
}
|
||||
|
||||
@@ -402,7 +481,7 @@ static GSList *scan(GSList *options)
|
||||
if (setup_probes(sdi, 2) != SR_OK)
|
||||
return NULL;
|
||||
|
||||
devc = DSCope_dev_new();
|
||||
devc = DSCope_dev_new(sdi);
|
||||
devc->profile = prof;
|
||||
sdi->priv = devc;
|
||||
drvc->instances = g_slist_append(drvc->instances, sdi);
|
||||
@@ -524,8 +603,8 @@ static uint64_t dso_cmd_gen(const struct sr_dev_inst *sdi, struct sr_channel* ch
|
||||
devc = sdi->priv;
|
||||
|
||||
switch (id) {
|
||||
case SR_CONF_EN_CH:
|
||||
case SR_CONF_COUPLING:
|
||||
case SR_CONF_PROBE_EN:
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
if (devc->zero || dsl_en_ch_num(sdi) == 2) {
|
||||
cmd += 0x0E00;
|
||||
//cmd += 0x000;
|
||||
@@ -544,14 +623,14 @@ static uint64_t dso_cmd_gen(const struct sr_dev_inst *sdi, struct sr_channel* ch
|
||||
else if (ch->coupling == SR_GND_COUPLING)
|
||||
cmd &= 0xFFFFFDFF;
|
||||
break;
|
||||
case SR_CONF_VDIV:
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
case SR_CONF_TIMEBASE:
|
||||
cmd += 0x8;
|
||||
cmd += ch->index << ch_bit;
|
||||
// --VGAIN
|
||||
cmd += dso_vga(sdi, ch);
|
||||
break;
|
||||
case SR_CONF_VPOS:
|
||||
case SR_CONF_PROBE_VPOS:
|
||||
cmd += 0x10;
|
||||
cmd += ch->index << ch_bit;
|
||||
vpos = dso_vpos(sdi, ch);
|
||||
@@ -606,17 +685,17 @@ static int dso_init(const struct sr_dev_inst *sdi)
|
||||
|
||||
for(l = sdi->channels; l; l = l->next) {
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_COUPLING));
|
||||
if (ret != SR_OK) {
|
||||
sr_err("DSO set coupling of channel %d command failed!", probe->index);
|
||||
return ret;
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_VDIV));
|
||||
if (ret != SR_OK) {
|
||||
sr_err("Set VDIV of channel %d command failed!", probe->index);
|
||||
return ret;
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_VPOS));
|
||||
if (ret != SR_OK) {
|
||||
sr_err("Set VPOS of channel %d command failed!", probe->index);
|
||||
return ret;
|
||||
@@ -765,6 +844,12 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_boolean(FALSE);
|
||||
break;
|
||||
case SR_CONF_STREAM:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_boolean(devc->stream);
|
||||
break;
|
||||
case SR_CONF_MAX_DSO_SAMPLERATE:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
@@ -780,12 +865,12 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint64(DSCOPE_INSTANT_DEPTH);
|
||||
break;
|
||||
case SR_CONF_VGAIN:
|
||||
case SR_CONF_PROBE_VGAIN:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint64(dso_vga(sdi, ch)>>8);
|
||||
break;
|
||||
case SR_CONF_VGAIN_DEFAULT:
|
||||
case SR_CONF_PROBE_VGAIN_DEFAULT:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
vga_ptr = get_vga_ptr(sdi);
|
||||
@@ -795,7 +880,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
}
|
||||
*data = g_variant_new_uint64(get_default_vgain(sdi, i)>>8);
|
||||
break;
|
||||
case SR_CONF_VGAIN_RANGE:
|
||||
case SR_CONF_PROBE_VGAIN_RANGE:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
vga_ptr = get_vga_ptr(sdi);
|
||||
@@ -806,7 +891,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
uint16_t vgain_default= (get_default_vgain(sdi, i)>>8) & 0x0FFF;
|
||||
*data = g_variant_new_uint16(min(CALI_VGAIN_RANGE, vgain_default*2));
|
||||
break;
|
||||
case SR_CONF_VOFF:
|
||||
case SR_CONF_PROBE_VOFF:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
uint16_t voff = dso_voff(sdi, ch);
|
||||
@@ -821,16 +906,37 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
}
|
||||
*data = g_variant_new_uint16(voff);
|
||||
break;
|
||||
case SR_CONF_VOFF_DEFAULT:
|
||||
case SR_CONF_PROBE_VOFF_DEFAULT:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint16(get_default_voff(sdi, ch->index));
|
||||
break;
|
||||
case SR_CONF_VOFF_RANGE:
|
||||
case SR_CONF_PROBE_VOFF_RANGE:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint16(CALI_VOFF_RANGE);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_UNIT:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_string(ch->map_unit);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_MIN:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_double(ch->map_min);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_MAX:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_double(ch->map_max);
|
||||
break;
|
||||
case SR_CONF_VLD_CH_NUM:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_int16(DSCOPE_VLD_CH_NUM);
|
||||
break;
|
||||
default:
|
||||
return SR_ERR_NA;
|
||||
}
|
||||
@@ -868,30 +974,26 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
while(libusb_try_lock_events(drvc->sr_ctx->libusb_ctx));
|
||||
devc->data_lock = g_variant_get_boolean(data);
|
||||
libusb_unlock_events(drvc->sr_ctx->libusb_ctx);
|
||||
} else if (id == SR_CONF_VDIV) {
|
||||
} else if (id == SR_CONF_PROBE_VDIV) {
|
||||
ch->vdiv = g_variant_get_uint64(data);
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_VDIV));
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_VDIV));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv",
|
||||
__func__, ch->index, ch->vdiv);
|
||||
else
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv failed",
|
||||
__func__, ch->index, ch->vdiv);
|
||||
} else if (id == SR_CONF_FACTOR) {
|
||||
} else if (id == SR_CONF_PROBE_FACTOR) {
|
||||
ch->vfactor = g_variant_get_uint64(data);
|
||||
sr_dbg("%s: setting Factor of channel %d to %d", __func__,
|
||||
ch->index, ch->vfactor);
|
||||
} else if (id == SR_CONF_TIMEBASE) {
|
||||
devc->timebase = g_variant_get_uint64(data);
|
||||
} else if (id == SR_CONF_COUPLING) {
|
||||
} else if (id == SR_CONF_PROBE_COUPLING) {
|
||||
ch->coupling = g_variant_get_byte(data);
|
||||
if (ch->coupling == SR_GND_COUPLING)
|
||||
ch->coupling = SR_DC_COUPLING;
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_COUPLING));
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_COUPLING));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting AC COUPLING of channel %d to %d",
|
||||
__func__, ch->index, ch->coupling);
|
||||
@@ -973,7 +1075,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
}
|
||||
} else if (id == SR_CONF_INSTANT) {
|
||||
devc->instant = g_variant_get_boolean(data);
|
||||
if (dsl_en_ch_num(sdi) != 0) {
|
||||
if (sdi->mode == DSO && dsl_en_ch_num(sdi) != 0) {
|
||||
if (devc->instant)
|
||||
devc->limit_samples = DSCOPE_INSTANT_DEPTH / dsl_en_ch_num(sdi);
|
||||
else
|
||||
@@ -981,43 +1083,62 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
}
|
||||
} else if (id == SR_CONF_DEVICE_MODE) {
|
||||
sdi->mode = g_variant_get_int16(data);
|
||||
if (sdi->mode == LOGIC) {
|
||||
num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? 16 : 8;
|
||||
} else if (sdi->mode == DSO) {
|
||||
sdi->mode = DSO;
|
||||
if (sdi->mode == DSO) {
|
||||
num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_DSO_PROBES_NUM : 1;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, NULL, SR_CONF_DSO_SYNC));
|
||||
if (ret != SR_OK)
|
||||
sr_dbg("%s: DSO configuration sync failed", __func__);
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, sdi->channels->data, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, sdi->channels->data, SR_CONF_PROBE_VDIV));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: Initial setting for DSO mode", __func__);
|
||||
else
|
||||
sr_dbg("%s: Initial setting for DSO mode failed", __func__);
|
||||
devc->op_mode = OP_NORMAL;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = FALSE;
|
||||
devc->instant = FALSE;
|
||||
devc->samplerates_size = ARRAY_SIZE(samplerates);
|
||||
devc->cur_samplerate = DSCOPE_MAX_SAMPLERATE / num_probes;
|
||||
devc->limit_samples = DSCOPE_MAX_DEPTH / num_probes;
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_DSO_PROBES_NUM : 1;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, sdi->channels->data, SR_CONF_PROBE_VDIV));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: Initial setting for DSO mode", __func__);
|
||||
else
|
||||
sr_dbg("%s: Initial setting for DSO mode failed", __func__);
|
||||
devc->op_mode = OP_NORMAL;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = TRUE;
|
||||
devc->instant = TRUE;
|
||||
devc->samplerates_size = 19;
|
||||
devc->cur_samplerate = SR_MHZ(1);
|
||||
devc->limit_samples = SR_MB(16);
|
||||
} else {
|
||||
num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1;
|
||||
num_probes = 0;
|
||||
}
|
||||
devc->samplecounts_size = counts_size(sdi);
|
||||
sr_dev_probes_free(sdi);
|
||||
setup_probes(sdi, num_probes);
|
||||
sr_dbg("%s: setting mode to %d", __func__, sdi->mode);
|
||||
} else if (id == SR_CONF_OPERATION_MODE) {
|
||||
stropt = g_variant_get_string(data, NULL);
|
||||
if (!strcmp(stropt, opmodes[SR_OP_BUFFER])) {
|
||||
devc->op_mode = SR_OP_BUFFER;
|
||||
} else if (!strcmp(stropt, opmodes[SR_OP_INTERNAL_TEST])) {
|
||||
devc->op_mode = SR_OP_INTERNAL_TEST;
|
||||
if (!strcmp(stropt, opmodes[OP_NORMAL])) {
|
||||
devc->op_mode = OP_NORMAL;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
} else if (!strcmp(stropt, opmodes[OP_INTEST])) {
|
||||
devc->op_mode = OP_INTEST;
|
||||
devc->test_mode = SR_TEST_INTERNAL;
|
||||
} else {
|
||||
ret = SR_ERR;
|
||||
}
|
||||
sr_dbg("%s: setting pattern to %d",
|
||||
__func__, devc->op_mode);
|
||||
} else if (id == SR_CONF_EN_CH) {
|
||||
} else if (id == SR_CONF_PROBE_EN) {
|
||||
ch->enabled = g_variant_get_boolean(data);
|
||||
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_EN_CH));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_EN));
|
||||
if (dsl_en_ch_num(sdi) != 0) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, 0, SR_CONF_SAMPLERATE));
|
||||
}
|
||||
@@ -1028,11 +1149,9 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
else
|
||||
sr_dbg("%s: setting ENABLE of channel %d to %d failed",
|
||||
__func__, ch->index, ch->enabled);
|
||||
} else if (id == SR_CONF_VPOS) {
|
||||
} else if (id == SR_CONF_PROBE_VPOS) {
|
||||
ch->vpos = g_variant_get_double(data);
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_VPOS));
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_VPOS));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting VPOS of channel %d to %lf mv",
|
||||
__func__, ch->index, ch->vpos);
|
||||
@@ -1151,7 +1270,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
} else if (id == SR_CONF_VOCM) {
|
||||
const uint8_t vocm = g_variant_get_byte(data);
|
||||
ret = dsl_wr_reg(sdi, COMB_ADDR+4, vocm);
|
||||
} else if (id == SR_CONF_VGAIN) {
|
||||
} else if (id == SR_CONF_PROBE_VGAIN) {
|
||||
const uint64_t vgain = g_variant_get_uint64(data) << 8;
|
||||
int i;
|
||||
struct DSL_vga *vga_ptr = get_vga_ptr(sdi);
|
||||
@@ -1163,14 +1282,14 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
(vga_ptr+i)->vgain1 = vgain;
|
||||
}
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_VDIV));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv",
|
||||
__func__, ch->index, ch->vdiv);
|
||||
else
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv failed",
|
||||
__func__, ch->index, ch->vdiv);
|
||||
} else if (id == SR_CONF_VOFF) {
|
||||
} else if (id == SR_CONF_PROBE_VOFF) {
|
||||
uint16_t voff = g_variant_get_uint16(data);
|
||||
if (strcmp(sdi->model, "DSCope") == 0) {
|
||||
double voltage_off = (2.0 * voff / CALI_VOFF_RANGE - 1) * ch->vdiv;
|
||||
@@ -1194,13 +1313,19 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
(vga_ptr+i)->voff1 = voff;
|
||||
}
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_VPOS));
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting VPOS of channel %d to %lf mv",
|
||||
__func__, ch->index, ch->vpos);
|
||||
else
|
||||
sr_dbg("%s: setting VPOS of channel %d to %lf mv failed",
|
||||
__func__, ch->index, ch->vpos);
|
||||
} else if (id == SR_CONF_PROBE_MAP_UNIT) {
|
||||
ch->map_unit = g_variant_get_string(data, NULL);
|
||||
} else if (id == SR_CONF_PROBE_MAP_MIN) {
|
||||
ch->map_min = g_variant_get_double(data);
|
||||
} else if (id == SR_CONF_PROBE_MAP_MAX) {
|
||||
ch->map_max = g_variant_get_double(data);
|
||||
} else {
|
||||
ret = SR_ERR_NA;
|
||||
}
|
||||
@@ -1211,11 +1336,13 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
const struct sr_channel_group *cg)
|
||||
{
|
||||
struct DSL_context *devc;
|
||||
GVariant *gvar;
|
||||
GVariantBuilder gvb;
|
||||
|
||||
(void)sdi;
|
||||
//(void)sdi;
|
||||
(void)cg;
|
||||
devc = sdi->priv;
|
||||
|
||||
switch (key) {
|
||||
case SR_CONF_SCAN_OPTIONS:
|
||||
@@ -1245,14 +1372,14 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
// gvar = g_variant_new_fixed_array(G_VARIANT_TYPE("t"), samplerates,
|
||||
// ARRAY_SIZE(samplerates), sizeof(uint64_t));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"),
|
||||
samplerates, ARRAY_SIZE(samplerates)*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
samplerates, devc->samplerates_size*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
case SR_CONF_LIMIT_SAMPLES:
|
||||
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"),
|
||||
samplecounts, ARRAY_SIZE(samplecounts)*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
samplecounts, devc->samplecounts_size*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "samplecounts", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
@@ -1260,11 +1387,37 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
*data = g_variant_new_string(TRIGGER_TYPE);
|
||||
break;
|
||||
case SR_CONF_OPERATION_MODE:
|
||||
*data = g_variant_new_strv(opmodes, opmodes_show_count);
|
||||
*data = g_variant_new_strv(opmodes, ARRAY_SIZE(opmodes));
|
||||
break;
|
||||
case SR_CONF_THRESHOLD:
|
||||
*data = g_variant_new_strv(thresholds, ARRAY_SIZE(thresholds));
|
||||
break;
|
||||
|
||||
case SR_CONF_PROBE_CONFIGS:
|
||||
*data = g_variant_new_from_data(G_VARIANT_TYPE("ai"),
|
||||
probeOptions, ARRAY_SIZE(probeOptions)*sizeof(int32_t), TRUE, NULL, NULL);
|
||||
break;
|
||||
case SR_CONF_PROBE_SESSIONS:
|
||||
*data = g_variant_new_from_data(G_VARIANT_TYPE("ai"),
|
||||
probeSessions, ARRAY_SIZE(probeSessions)*sizeof(int32_t), TRUE, NULL, NULL);
|
||||
break;
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"),
|
||||
probeVdivs, ARRAY_SIZE(probeVdivs)*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "vdivs", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("ay"),
|
||||
probeCoupling, ARRAY_SIZE(probeCoupling)*sizeof(uint8_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "coupling", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_UNIT:
|
||||
*data = g_variant_new_strv(probeMapUnits, ARRAY_SIZE(probeMapUnits));
|
||||
break;
|
||||
default:
|
||||
return SR_ERR_NA;
|
||||
}
|
||||
@@ -1302,14 +1455,14 @@ static int dso_zero(const struct sr_dev_inst *sdi)
|
||||
probe0->vpos = (vga_ptr+devc->zero_stage-1)->key * -4.8;
|
||||
vdiv_back[0] = probe0->vdiv;
|
||||
probe0->vdiv = (vga_ptr+devc->zero_stage-1)->key;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 4) {
|
||||
const double voff = 255*0.98 - (devc->mstatus.ch0_max + devc->mstatus.ch0_min) / 2.0;
|
||||
if (abs(voff) < 0.5) {
|
||||
probe0->vpos = vpos_back[0];
|
||||
} else {
|
||||
probe0->vpos_trans += voff;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_PROBE_VPOS));
|
||||
devc->zero_pcnt = 1;
|
||||
}
|
||||
} else if (devc->zero_pcnt == 5) {
|
||||
@@ -1318,14 +1471,14 @@ static int dso_zero(const struct sr_dev_inst *sdi)
|
||||
probe1->vpos = (vga_ptr+devc->zero_stage-1)->key * -4.8;
|
||||
vdiv_back[1] = probe1->vdiv;
|
||||
probe1->vdiv = (vga_ptr+devc->zero_stage-1)->key;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 9) {
|
||||
const double voff = 255*0.98 - (devc->mstatus.ch1_max + devc->mstatus.ch1_min) / 2.0;
|
||||
if (abs(voff) < 0.5) {
|
||||
probe1->vpos = vpos_back[1];
|
||||
} else {
|
||||
probe1->vpos_trans += voff;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_PROBE_VPOS));
|
||||
devc->zero_pcnt = 6;
|
||||
}
|
||||
}
|
||||
@@ -1336,17 +1489,17 @@ static int dso_zero(const struct sr_dev_inst *sdi)
|
||||
devc->zero_comb = 0;
|
||||
vpos_back[0] = probe0->vpos;
|
||||
probe0->vpos = (vga_ptr+devc->zero_stage-1)->key * 4.5;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 15) {
|
||||
probe0->comb_diff_top = (devc->mstatus.ch0_max - devc->mstatus.ch1_max) +
|
||||
(devc->mstatus.ch0_min - devc->mstatus.ch1_min);
|
||||
probe0->vpos = (vga_ptr+devc->zero_stage-1)->key * -4.5;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 20) {
|
||||
probe0->comb_diff_bom = (devc->mstatus.ch0_max - devc->mstatus.ch1_max) +
|
||||
(devc->mstatus.ch0_min - devc->mstatus.ch1_min);
|
||||
probe0->vpos = vpos_back[0];
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe0, SR_CONF_PROBE_VPOS));
|
||||
}
|
||||
|
||||
if (devc->zero_pcnt == 25) {
|
||||
@@ -1354,17 +1507,17 @@ static int dso_zero(const struct sr_dev_inst *sdi)
|
||||
devc->zero_comb = 1;
|
||||
vpos_back[1] = probe1->vpos;
|
||||
probe1->vpos = (vga_ptr+devc->zero_stage-1)->key * 4.5;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 30) {
|
||||
probe1->comb_diff_top = (devc->mstatus.ch1_max - devc->mstatus.ch0_max) +
|
||||
(devc->mstatus.ch1_min - devc->mstatus.ch0_min);
|
||||
probe1->vpos = (vga_ptr+devc->zero_stage-1)->key * -4.5;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_PROBE_VPOS));
|
||||
} else if (devc->zero_pcnt == 35) {
|
||||
probe1->comb_diff_bom = (devc->mstatus.ch1_max - devc->mstatus.ch0_max) +
|
||||
(devc->mstatus.ch1_min - devc->mstatus.ch0_min);
|
||||
probe1->vpos = vpos_back[1];
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe1, SR_CONF_PROBE_VPOS));
|
||||
}
|
||||
|
||||
if (devc->zero_pcnt == 40) {
|
||||
@@ -1385,8 +1538,8 @@ static int dso_zero(const struct sr_dev_inst *sdi)
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
uint64_t vdiv_back = probe->vdiv;
|
||||
probe->vdiv = (vga_ptr+devc->zero_stage)->key;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_VPOS));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_VPOS));
|
||||
probe->vdiv = vdiv_back;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -390,25 +390,42 @@ SR_PRIV int dsl_fpga_arm(const struct sr_dev_inst *sdi)
|
||||
setting.end_sync = 0xfa5afa5a;
|
||||
|
||||
// basic configuration
|
||||
// setting.mode = (trigger->trigger_en << TRIG_EN_BIT) +
|
||||
// (devc->clock_type << CLK_TYPE_BIT) +
|
||||
// (devc->clock_edge << CLK_EDGE_BIT) +
|
||||
// (devc->rle_mode << RLE_MODE_BIT) +
|
||||
// ((sdi->mode == DSO) << DSO_MODE_BIT) +
|
||||
// ((((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << HALF_MODE_BIT) +
|
||||
// ((devc->cur_samplerate == (4 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) << QUAR_MODE_BIT) +
|
||||
// ((sdi->mode == ANALOG) << ANALOG_MODE_BIT) +
|
||||
// ((devc->filter == SR_FILTER_1T) << FILTER_BIT) +
|
||||
// (devc->instant << INSTANT_BIT) +
|
||||
// ((trigger->trigger_mode == SERIAL_TRIGGER) << STRIG_MODE_BIT) +
|
||||
// ((devc->stream) << STREAM_MODE_BIT) +
|
||||
// ((devc->op_mode == SR_OP_LA_LPTEST) << LPB_TEST_BIT) +
|
||||
// ((devc->op_mode == SR_OP_LA_EXTEST) << EXT_TEST_BIT) +
|
||||
// ((devc->op_mode == SR_OP_LA_INTEST) << INT_TEST_BIT);
|
||||
setting.mode = (trigger->trigger_en << TRIG_EN_BIT) +
|
||||
(devc->clock_type << CLK_TYPE_BIT) +
|
||||
(devc->clock_edge << CLK_EDGE_BIT) +
|
||||
(devc->rle_mode << RLE_MODE_BIT) +
|
||||
((sdi->mode == DSO) << DSO_MODE_BIT) +
|
||||
((((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) || (sdi->mode == ANALOG)) << HALF_MODE_BIT) +
|
||||
(((devc->cur_samplerate == (2 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) && sdi->mode != DSO) << HALF_MODE_BIT) +
|
||||
((devc->cur_samplerate == (4 * DSLOGIC_MAX_LOGIC_SAMPLERATE)) << QUAR_MODE_BIT) +
|
||||
((sdi->mode == ANALOG) << ANALOG_MODE_BIT) +
|
||||
((devc->filter == SR_FILTER_1T) << FILTER_BIT) +
|
||||
(devc->instant << INSTANT_BIT) +
|
||||
((trigger->trigger_mode == SERIAL_TRIGGER) << STRIG_MODE_BIT) +
|
||||
((devc->stream) << STREAM_MODE_BIT) +
|
||||
((devc->op_mode == SR_OP_LOOPBACK_TEST) << LPB_TEST_BIT) +
|
||||
((devc->op_mode == SR_OP_EXTERNAL_TEST) << EXT_TEST_BIT) +
|
||||
((devc->op_mode == SR_OP_INTERNAL_TEST) << INT_TEST_BIT);
|
||||
((devc->test_mode == SR_TEST_LOOPBACK) << LPB_TEST_BIT) +
|
||||
((devc->test_mode == SR_TEST_EXTERNAL) << EXT_TEST_BIT) +
|
||||
((devc->test_mode == SR_TEST_INTERNAL) << INT_TEST_BIT);
|
||||
|
||||
// sample rate divider
|
||||
tmp_u32 = (sdi->mode == DSO) ? (uint32_t)ceil(DSLOGIC_MAX_DSO_SAMPLERATE * 1.0 / devc->cur_samplerate / ch_num) :
|
||||
(uint32_t)ceil(DSLOGIC_MAX_LOGIC_SAMPLERATE * 1.0 / devc->cur_samplerate);
|
||||
(sdi->mode == ANALOG) ? (uint32_t)ceil(DSCOPE_MAX_DAQ_SAMPLERATE * 1.0 / max(devc->cur_samplerate, HW_MIN_SAMPLERATE)) :
|
||||
(uint32_t)ceil(DSLOGIC_MAX_LOGIC_SAMPLERATE * 1.0 / devc->cur_samplerate);
|
||||
devc->unit_pitch = ceil(HW_MIN_SAMPLERATE * 1.0 / devc->cur_samplerate);
|
||||
setting.div_l = tmp_u32 & 0x0000ffff;
|
||||
setting.div_h = tmp_u32 >> 16;
|
||||
|
||||
@@ -840,17 +857,17 @@ SR_PRIV int dsl_config_get(int id, GVariant **data, const struct sr_dev_inst *sd
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_boolean(devc->instant);
|
||||
break;
|
||||
case SR_CONF_VDIV:
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
if (!ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint64(ch->vdiv);
|
||||
break;
|
||||
case SR_CONF_FACTOR:
|
||||
case SR_CONF_PROBE_FACTOR:
|
||||
if (!ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_uint64(ch->vfactor);
|
||||
break;
|
||||
case SR_CONF_VPOS:
|
||||
case SR_CONF_PROBE_VPOS:
|
||||
if (!ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_double(ch->vpos);
|
||||
@@ -861,12 +878,12 @@ SR_PRIV int dsl_config_get(int id, GVariant **data, const struct sr_dev_inst *sd
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_uint64(devc->timebase);
|
||||
break;
|
||||
case SR_CONF_COUPLING:
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
if (!ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_byte(ch->coupling);
|
||||
break;
|
||||
case SR_CONF_EN_CH:
|
||||
case SR_CONF_PROBE_EN:
|
||||
if (!ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_boolean(ch->enabled);
|
||||
@@ -937,11 +954,11 @@ SR_PRIV int dsl_config_get(int id, GVariant **data, const struct sr_dev_inst *sd
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_boolean(devc->roll);
|
||||
break;
|
||||
case SR_CONF_DSO_BITS:
|
||||
case SR_CONF_UNIT_BITS:
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_byte(devc->dso_bits);
|
||||
*data = g_variant_new_byte(devc->unit_bits);
|
||||
break;
|
||||
default:
|
||||
return SR_ERR_NA;
|
||||
@@ -1111,10 +1128,17 @@ SR_PRIV int dsl_dev_status_get(const struct sr_dev_inst *sdi, struct sr_status *
|
||||
static unsigned int to_bytes_per_ms(struct DSL_context *devc)
|
||||
{
|
||||
struct sr_dev_inst *sdi = devc->cb_data;
|
||||
if (devc->cur_samplerate > SR_MHZ(100))
|
||||
return SR_MHZ(100) / 1000 * dsl_en_ch_num(sdi) / 8;
|
||||
else
|
||||
return devc->cur_samplerate / 1000 * dsl_en_ch_num(sdi) / 8;
|
||||
if (sdi->mode == LOGIC) {
|
||||
if (devc->cur_samplerate > SR_MHZ(100))
|
||||
return SR_MHZ(100) / 1000 * dsl_en_ch_num(sdi) / 8;
|
||||
else
|
||||
return ceil(devc->cur_samplerate / 1000.0 * dsl_en_ch_num(sdi) / 8);
|
||||
} else {
|
||||
if (devc->cur_samplerate > SR_MHZ(100))
|
||||
return SR_MHZ(100) / 1000.0 * dsl_en_ch_num(sdi);
|
||||
else
|
||||
return ceil(devc->cur_samplerate / 1000.0 * dsl_en_ch_num(sdi));
|
||||
}
|
||||
}
|
||||
|
||||
static size_t get_buffer_size(struct DSL_context *devc)
|
||||
@@ -1150,7 +1174,7 @@ SR_PRIV unsigned int dsl_get_timeout(struct DSL_context *devc)
|
||||
total_size = get_buffer_size(devc) * get_number_of_transfers(devc);
|
||||
timeout = total_size / to_bytes_per_ms(devc);
|
||||
|
||||
if (devc->op_mode == SR_OP_STREAM)
|
||||
if (devc->stream)
|
||||
return timeout + timeout / 4; /* Leave a headroom of 25% percent. */
|
||||
else
|
||||
return 1000;
|
||||
@@ -1307,12 +1331,14 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||
packet.status = SR_PKT_DATA_ERROR;
|
||||
devc->mstatus_valid = FALSE;
|
||||
}
|
||||
} else {
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
packet.type = SR_DF_ANALOG;
|
||||
packet.payload = &analog;
|
||||
analog.probes = sdi->channels;
|
||||
cur_sample_count = transfer->actual_length / (sample_width * g_slist_length(analog.probes));
|
||||
cur_sample_count = transfer->actual_length / (((devc->unit_bits + 7) / 8) * g_slist_length(analog.probes));
|
||||
analog.num_samples = cur_sample_count;
|
||||
analog.unit_bits = devc->unit_bits;
|
||||
analog.unit_pitch = devc->unit_pitch;
|
||||
analog.mq = SR_MQ_VOLTAGE;
|
||||
analog.unit = SR_UNIT_VOLT;
|
||||
analog.mqflags = SR_MQFLAG_AC;
|
||||
@@ -1341,7 +1367,7 @@ static void receive_transfer(struct libusb_transfer *transfer)
|
||||
devc->limit_samples &&
|
||||
devc->num_bytes >= devc->actual_bytes) {
|
||||
devc->status = DSL_STOP;
|
||||
} else if ((sdi->mode != DSO || devc->instant) &&
|
||||
} else if ((sdi->mode == DSO && devc->instant) &&
|
||||
devc->limit_samples &&
|
||||
devc->num_samples >= devc->actual_samples) {
|
||||
devc->status = DSL_STOP;
|
||||
|
||||
@@ -95,6 +95,9 @@
|
||||
//#define DSCOPE_MAX_DEPTH SR_KB(512)
|
||||
#define DSCOPE_MAX_SAMPLERATE SR_MHZ(200)
|
||||
#define DSCOPE_INSTANT_DEPTH SR_MB(32)
|
||||
#define DSCOPE_VLD_CH_NUM 2
|
||||
#define DSCOPE_MAX_DAQ_SAMPLERATE SR_MHZ(100)
|
||||
#define HW_MIN_SAMPLERATE SR_KHZ(10)
|
||||
|
||||
/*
|
||||
* for basic configuration
|
||||
@@ -303,6 +306,8 @@ struct DSL_context {
|
||||
gboolean rle_mode;
|
||||
gboolean instant;
|
||||
uint16_t op_mode;
|
||||
gboolean stream;
|
||||
uint8_t test_mode;
|
||||
uint16_t buf_options;
|
||||
uint16_t ch_mode;
|
||||
uint16_t samplerates_size;
|
||||
@@ -328,10 +333,10 @@ struct DSL_context {
|
||||
int zero_stage;
|
||||
int zero_pcnt;
|
||||
int zero_comb;
|
||||
gboolean stream;
|
||||
gboolean roll;
|
||||
gboolean data_lock;
|
||||
uint8_t dso_bits;
|
||||
uint8_t unit_bits;
|
||||
uint16_t unit_pitch;
|
||||
|
||||
uint64_t num_samples;
|
||||
uint64_t num_bytes;
|
||||
|
||||
@@ -35,6 +35,18 @@ static struct sr_dev_mode pro_mode_list[] = {
|
||||
{"LA", LOGIC},
|
||||
};
|
||||
|
||||
enum {
|
||||
/** Buffer mode */
|
||||
OP_BUFFER = 0,
|
||||
/** Stream mode */
|
||||
OP_STREAM = 1,
|
||||
/** Internal pattern test mode */
|
||||
OP_INTEST = 2,
|
||||
/** External pattern test mode */
|
||||
OP_EXTEST = 3,
|
||||
/** SDRAM loopback test mode */
|
||||
OP_LPTEST = 4,
|
||||
};
|
||||
static const char *opmodes[] = {
|
||||
"Buffer Mode",
|
||||
"Stream Mode",
|
||||
@@ -244,7 +256,7 @@ static int counts_size(const struct sr_dev_inst *sdi)
|
||||
if (strcmp(sdi->model, "DSLogic Basic") == 0)
|
||||
if (sdi->mode == ANALOG)
|
||||
return 5;
|
||||
else if (!devc || devc->op_mode == SR_OP_STREAM)
|
||||
else if (!devc || devc->stream)
|
||||
return ARRAY_SIZE(samplecounts);
|
||||
else
|
||||
return 15;
|
||||
@@ -332,7 +344,9 @@ static struct DSL_context *DSLogic_dev_new(const struct sr_dev_inst *sdi)
|
||||
devc->clock_edge = FALSE;
|
||||
devc->rle_mode = FALSE;
|
||||
devc->instant = FALSE;
|
||||
devc->op_mode = SR_OP_STREAM;
|
||||
devc->op_mode = OP_STREAM;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = (devc->op_mode == OP_STREAM);
|
||||
devc->buf_options = SR_BUF_UPLOAD;
|
||||
devc->ch_mode = 0;
|
||||
devc->samplerates_size = 11;
|
||||
@@ -347,11 +361,11 @@ static struct DSL_context *DSLogic_dev_new(const struct sr_dev_inst *sdi)
|
||||
devc->trigger_hrate = 0;
|
||||
devc->trigger_holdoff = 0;
|
||||
devc->zero = FALSE;
|
||||
devc->stream = (devc->op_mode == SR_OP_STREAM);
|
||||
|
||||
devc->mstatus_valid = FALSE;
|
||||
devc->data_lock = FALSE;
|
||||
devc->max_height = 0;
|
||||
devc->dso_bits = 8;
|
||||
devc->unit_bits = 8;
|
||||
devc->trigger_margin = 8;
|
||||
devc->trigger_channel = 0;
|
||||
|
||||
@@ -521,10 +535,10 @@ static uint64_t dso_cmd_gen(const struct sr_dev_inst *sdi, struct sr_channel* ch
|
||||
devc = sdi->priv;
|
||||
|
||||
switch (id) {
|
||||
case SR_CONF_VDIV:
|
||||
case SR_CONF_EN_CH:
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
case SR_CONF_PROBE_EN:
|
||||
case SR_CONF_TIMEBASE:
|
||||
case SR_CONF_COUPLING:
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
for (l = sdi->channels; l; l = l->next) {
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
if (probe->enabled) {
|
||||
@@ -636,12 +650,12 @@ static int dso_init(const struct sr_dev_inst *sdi)
|
||||
|
||||
for(l = sdi->channels; l; l = l->next) {
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_COUPLING));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_COUPLING));
|
||||
if (ret != SR_OK) {
|
||||
sr_err("DSO set coupling of channel %d command failed!", probe->index);
|
||||
return ret;
|
||||
}
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, probe, SR_CONF_PROBE_VDIV));
|
||||
if (ret != SR_OK) {
|
||||
sr_err("Set VDIV of channel %d command failed!", probe->index);
|
||||
return ret;
|
||||
@@ -718,8 +732,7 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
if (!sdi)
|
||||
return SR_ERR;
|
||||
devc = sdi->priv;
|
||||
*data = g_variant_new_boolean((devc->op_mode != SR_OP_BUFFER) &&
|
||||
(devc->op_mode != SR_OP_STREAM));
|
||||
*data = g_variant_new_boolean(devc->test_mode != SR_TEST_NONE);
|
||||
break;
|
||||
case SR_CONF_ACTUAL_SAMPLES:
|
||||
if (!sdi)
|
||||
@@ -859,10 +872,10 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
while(libusb_try_lock_events(drvc->sr_ctx->libusb_ctx));
|
||||
devc->data_lock = g_variant_get_boolean(data);
|
||||
libusb_unlock_events(drvc->sr_ctx->libusb_ctx);
|
||||
} else if (id == SR_CONF_VDIV) {
|
||||
} else if (id == SR_CONF_PROBE_VDIV) {
|
||||
ch->vdiv = g_variant_get_uint64(data);
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_VDIV));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_VDIV));
|
||||
}
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv",
|
||||
@@ -870,18 +883,18 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
else
|
||||
sr_dbg("%s: setting VDIV of channel %d to %d mv failed",
|
||||
__func__, ch->index, ch->vdiv);
|
||||
} else if (id == SR_CONF_FACTOR) {
|
||||
} else if (id == SR_CONF_PROBE_FACTOR) {
|
||||
ch->vfactor = g_variant_get_uint64(data);
|
||||
sr_dbg("%s: setting Factor of channel %d to %d", __func__,
|
||||
ch->index, ch->vfactor);
|
||||
} else if (id == SR_CONF_TIMEBASE) {
|
||||
devc->timebase = g_variant_get_uint64(data);
|
||||
} else if (id == SR_CONF_COUPLING) {
|
||||
} else if (id == SR_CONF_PROBE_COUPLING) {
|
||||
ch->coupling = g_variant_get_byte(data);
|
||||
if (ch->coupling == SR_GND_COUPLING)
|
||||
ch->coupling = SR_DC_COUPLING;
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_COUPLING));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_COUPLING));
|
||||
}
|
||||
if (ret == SR_OK)
|
||||
sr_dbg("%s: setting AC COUPLING of channel %d to %d",
|
||||
@@ -952,8 +965,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
sr_dbg("%s: setting Trigger Margin to %d failed",
|
||||
__func__, devc->trigger_margin);
|
||||
} else if (id == SR_CONF_SAMPLERATE) {
|
||||
if ((devc->op_mode != SR_OP_INTERNAL_TEST) &&
|
||||
(devc->op_mode != SR_OP_EXTERNAL_TEST)) {
|
||||
if (devc->test_mode != SR_TEST_NONE) {
|
||||
devc->cur_samplerate = g_variant_get_uint64(data);
|
||||
if(sdi->mode == DSO) {
|
||||
devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE);
|
||||
@@ -1002,7 +1014,8 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
} else {
|
||||
dsl_wr_reg(sdi, EEWP_ADDR, bmSCOPE_CLR);
|
||||
num_probes = devc->profile->dev_caps & DEV_CAPS_16BIT ? MAX_ANALOG_PROBES_NUM : 1;
|
||||
devc->op_mode = SR_OP_STREAM;
|
||||
devc->op_mode = OP_STREAM;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = TRUE;
|
||||
devc->samplerates_size = 10;
|
||||
}
|
||||
@@ -1016,20 +1029,23 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
} else if (id == SR_CONF_OPERATION_MODE) {
|
||||
stropt = g_variant_get_string(data, NULL);
|
||||
if (sdi->mode == LOGIC) {
|
||||
if (!strcmp(stropt, opmodes[SR_OP_BUFFER]) && (devc->op_mode != SR_OP_BUFFER)) {
|
||||
devc->op_mode = SR_OP_BUFFER;
|
||||
if (!strcmp(stropt, opmodes[OP_BUFFER]) && (devc->op_mode != OP_BUFFER)) {
|
||||
devc->op_mode = OP_BUFFER;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = FALSE;
|
||||
devc->ch_mode = 0;
|
||||
devc->samplerates_size = 14;
|
||||
adjust_probes(sdi, MAX_LOGIC_PROBES);
|
||||
} else if (!strcmp(stropt, opmodes[SR_OP_STREAM]) && (devc->op_mode != SR_OP_STREAM)) {
|
||||
devc->op_mode = SR_OP_STREAM;
|
||||
} else if (!strcmp(stropt, opmodes[OP_STREAM]) && (devc->op_mode != OP_STREAM)) {
|
||||
devc->op_mode = OP_STREAM;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = TRUE;
|
||||
devc->ch_mode = 0;
|
||||
devc->samplerates_size = 11;
|
||||
adjust_probes(sdi, MAX_LOGIC_PROBES);
|
||||
} else if (!strcmp(stropt, opmodes[SR_OP_INTERNAL_TEST]) && (devc->op_mode != SR_OP_INTERNAL_TEST)) {
|
||||
devc->op_mode = SR_OP_INTERNAL_TEST;
|
||||
} else if (!strcmp(stropt, opmodes[OP_INTEST]) && (devc->op_mode != OP_INTEST)) {
|
||||
devc->op_mode = OP_INTEST;
|
||||
devc->test_mode = SR_TEST_INTERNAL;
|
||||
if (strcmp(sdi->model, "DSLogic Basic") == 0) {
|
||||
devc->stream = TRUE;
|
||||
devc->samplerates_size = 10;
|
||||
@@ -1042,8 +1058,9 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH;
|
||||
devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE;
|
||||
devc->sample_wide = TRUE;
|
||||
} else if (!strcmp(stropt, opmodes[SR_OP_EXTERNAL_TEST]) && (devc->op_mode != SR_OP_EXTERNAL_TEST)) {
|
||||
devc->op_mode = SR_OP_EXTERNAL_TEST;
|
||||
} else if (!strcmp(stropt, opmodes[OP_EXTEST]) && (devc->op_mode != OP_EXTEST)) {
|
||||
devc->op_mode = OP_EXTEST;
|
||||
devc->test_mode = SR_TEST_EXTERNAL;
|
||||
if (strcmp(sdi->model, "DSLogic Basic") == 0) {
|
||||
devc->stream = TRUE;
|
||||
devc->samplerates_size = 11;
|
||||
@@ -1056,8 +1073,9 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
devc->limit_samples = DSLOGIC_MAX_LOGIC_DEPTH;
|
||||
devc->cur_samplerate = DSLOGIC_MAX_LOGIC_SAMPLERATE;
|
||||
devc->sample_wide = TRUE;
|
||||
} else if (!strcmp(stropt, opmodes[SR_OP_LOOPBACK_TEST]) && (devc->op_mode != SR_OP_LOOPBACK_TEST)) {
|
||||
devc->op_mode = SR_OP_LOOPBACK_TEST;
|
||||
} else if (!strcmp(stropt, opmodes[OP_LPTEST]) && (devc->op_mode != OP_LPTEST)) {
|
||||
devc->op_mode = OP_LPTEST;
|
||||
devc->test_mode = SR_TEST_LOOPBACK;
|
||||
devc->stream = FALSE;
|
||||
devc->ch_mode = 0;
|
||||
devc->samplerates_size = 14;
|
||||
@@ -1073,7 +1091,8 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
devc->sample_wide = (devc->cur_samplerate <= DSLOGIC_MAX_DSO_SAMPLERATE);
|
||||
}
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
devc->op_mode = SR_OP_STREAM;
|
||||
devc->op_mode = OP_STREAM;
|
||||
devc->test_mode = SR_TEST_NONE;
|
||||
devc->stream = TRUE;
|
||||
devc->samplerates_size = 10;
|
||||
}
|
||||
@@ -1164,10 +1183,10 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
}
|
||||
sr_dbg("%s: setting Signal Max Height to %d",
|
||||
__func__, devc->max_height);
|
||||
} else if (id == SR_CONF_EN_CH) {
|
||||
} else if (id == SR_CONF_PROBE_EN) {
|
||||
ch->enabled = g_variant_get_boolean(data);
|
||||
if (sdi->mode == DSO) {
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_EN_CH));
|
||||
ret = dsl_wr_dso(sdi, dso_cmd_gen(sdi, ch, SR_CONF_PROBE_EN));
|
||||
uint16_t channel_cnt = 0;
|
||||
GSList *l;
|
||||
for (l = sdi->channels; l; l = l->next) {
|
||||
@@ -1183,7 +1202,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
else
|
||||
sr_dbg("%s: setting ENABLE of channel %d to %d",
|
||||
__func__, ch->index, ch->enabled);
|
||||
} else if (id == SR_CONF_VPOS) {
|
||||
} else if (id == SR_CONF_PROBE_VPOS) {
|
||||
ch->vpos = g_variant_get_double(data);
|
||||
sr_dbg("%s: setting VPOS of channel %d to %lf", __func__,
|
||||
ch->index, ch->vpos);
|
||||
@@ -1277,7 +1296,7 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
case SR_CONF_CHANNEL_MODE:
|
||||
if (devc->stream)
|
||||
*data = g_variant_new_strv(stream_ch_modes, ARRAY_SIZE(stream_ch_modes));
|
||||
else if (devc->op_mode != SR_OP_BUFFER)
|
||||
else if (devc->test_mode != SR_TEST_NONE)
|
||||
*data = g_variant_new_strv(buffer_ch_modes, 1);
|
||||
else
|
||||
*data = g_variant_new_strv(buffer_ch_modes, ARRAY_SIZE(buffer_ch_modes));
|
||||
|
||||
@@ -111,7 +111,7 @@ struct dev_context {
|
||||
gboolean instant;
|
||||
gboolean data_lock;
|
||||
uint8_t max_height;
|
||||
uint8_t dso_bits;
|
||||
uint8_t unit_bits;
|
||||
uint64_t samples_not_sent;
|
||||
|
||||
uint16_t *buf;
|
||||
@@ -147,6 +147,49 @@ static const int32_t sessions[] = {
|
||||
SR_CONF_PATTERN_MODE,
|
||||
};
|
||||
|
||||
static const int32_t probeOptions[] = {
|
||||
SR_CONF_PROBE_COUPLING,
|
||||
SR_CONF_PROBE_VDIV,
|
||||
SR_CONF_PROBE_MAP_UNIT,
|
||||
SR_CONF_PROBE_MAP_MIN,
|
||||
SR_CONF_PROBE_MAP_MAX,
|
||||
};
|
||||
|
||||
static const int32_t probeSessions[] = {
|
||||
SR_CONF_PROBE_COUPLING,
|
||||
SR_CONF_PROBE_VDIV,
|
||||
SR_CONF_PROBE_MAP_UNIT,
|
||||
SR_CONF_PROBE_MAP_MIN,
|
||||
SR_CONF_PROBE_MAP_MAX,
|
||||
};
|
||||
|
||||
static const uint8_t probeCoupling[] = {
|
||||
SR_DC_COUPLING,
|
||||
SR_AC_COUPLING,
|
||||
};
|
||||
|
||||
static const uint64_t probeVdivs[] = {
|
||||
SR_mV(10),
|
||||
SR_mV(20),
|
||||
SR_mV(50),
|
||||
SR_mV(100),
|
||||
SR_mV(200),
|
||||
SR_mV(500),
|
||||
SR_V(1),
|
||||
SR_V(2),
|
||||
};
|
||||
|
||||
static const char *probeMapUnits[] = {
|
||||
"V",
|
||||
"A",
|
||||
"°C",
|
||||
"°F",
|
||||
"g",
|
||||
"m",
|
||||
"m/s",
|
||||
"Custom",
|
||||
};
|
||||
|
||||
static const int const_dc = 1.95 / 10 * 255;
|
||||
static const int sinx[] = {
|
||||
0, 2, 3, 5, 6, 8, 9, 11, 12, 14, 16, 17, 18, 20, 21, 23, 24, 26, 27, 28,
|
||||
@@ -284,7 +327,6 @@ static const char *probe_names[NUM_PROBES + 1] = {
|
||||
"CH8", "CH9", "CH10", "CH11",
|
||||
"CH12", "CH13", "CH14", "CH15",
|
||||
NULL,
|
||||
|
||||
};
|
||||
|
||||
static const gboolean default_ms_en[] = {
|
||||
@@ -321,6 +363,42 @@ static int hw_init(struct sr_context *sr_ctx)
|
||||
return std_hw_init(sr_ctx, di, LOG_PREFIX);
|
||||
}
|
||||
|
||||
static void probe_init(struct sr_dev_inst *sdi)
|
||||
{
|
||||
int i;
|
||||
GSList *l;
|
||||
for (l = sdi->channels; l; l = l->next) {
|
||||
struct sr_channel *probe = (struct sr_channel *)l->data;
|
||||
probe->vdiv = 1000;
|
||||
probe->vfactor = 1;
|
||||
probe->coupling = SR_AC_COUPLING;
|
||||
probe->trig_value = 0x80;
|
||||
probe->vpos = (probe->index == 0 ? 0.5 : -0.5)*probe->vdiv;
|
||||
probe->ms_show = TRUE;
|
||||
for (i = DSO_MS_BEGIN; i < DSO_MS_END; i++)
|
||||
probe->ms_en[i] = default_ms_en[i];
|
||||
probe->map_unit = probeMapUnits[0];
|
||||
probe->map_min = -1;
|
||||
probe->map_max = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int setup_probes(struct sr_dev_inst *sdi, int num_probes)
|
||||
{
|
||||
uint16_t j;
|
||||
struct sr_channel *probe;
|
||||
|
||||
for (j = 0; j < num_probes; j++) {
|
||||
if (!(probe = sr_channel_new(j, (sdi->mode == LOGIC) ? SR_CHANNEL_LOGIC :
|
||||
((sdi->mode == DSO) ? SR_CHANNEL_DSO : SR_CHANNEL_ANALOG),
|
||||
TRUE, probe_names[j])))
|
||||
return SR_ERR;
|
||||
sdi->channels = g_slist_append(sdi->channels, probe);
|
||||
}
|
||||
probe_init(sdi);
|
||||
return SR_OK;
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
{
|
||||
struct sr_dev_inst *sdi;
|
||||
@@ -360,7 +438,7 @@ static GSList *hw_scan(GSList *options)
|
||||
devc->timebase = 500;
|
||||
devc->data_lock = FALSE;
|
||||
devc->max_height = 0;
|
||||
devc->dso_bits = 8;
|
||||
devc->unit_bits = 8;
|
||||
|
||||
sdi->priv = devc;
|
||||
|
||||
@@ -520,25 +598,25 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
case SR_CONF_MAX_HEIGHT_VALUE:
|
||||
*data = g_variant_new_byte(devc->max_height);
|
||||
break;
|
||||
case SR_CONF_VPOS:
|
||||
case SR_CONF_PROBE_VPOS:
|
||||
*data = g_variant_new_double(ch->vpos);
|
||||
break;
|
||||
case SR_CONF_VDIV:
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
*data = g_variant_new_uint64(ch->vdiv);
|
||||
break;
|
||||
case SR_CONF_FACTOR:
|
||||
case SR_CONF_PROBE_FACTOR:
|
||||
*data = g_variant_new_uint64(ch->vfactor);
|
||||
break;
|
||||
case SR_CONF_TIMEBASE:
|
||||
*data = g_variant_new_uint64(devc->timebase);
|
||||
break;
|
||||
case SR_CONF_COUPLING:
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
*data = g_variant_new_byte(ch->coupling);
|
||||
break;
|
||||
case SR_CONF_TRIGGER_VALUE:
|
||||
*data = g_variant_new_byte(ch->trig_value);
|
||||
break;
|
||||
case SR_CONF_EN_CH:
|
||||
case SR_CONF_PROBE_EN:
|
||||
*data = g_variant_new_boolean(ch->enabled);
|
||||
break;
|
||||
case SR_CONF_DATALOCK:
|
||||
@@ -553,8 +631,23 @@ static int config_get(int id, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
case SR_CONF_HW_DEPTH:
|
||||
*data = g_variant_new_uint64(DEMO_MAX_LOGIC_DEPTH);
|
||||
break;
|
||||
case SR_CONF_DSO_BITS:
|
||||
*data = g_variant_new_byte(devc->dso_bits);
|
||||
case SR_CONF_UNIT_BITS:
|
||||
*data = g_variant_new_byte(devc->unit_bits);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_UNIT:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_string(ch->map_unit);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_MIN:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_double(ch->map_min);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_MAX:
|
||||
if (!sdi || !ch)
|
||||
return SR_ERR;
|
||||
*data = g_variant_new_double(ch->map_max);
|
||||
break;
|
||||
case SR_CONF_VLD_CH_NUM:
|
||||
*data = g_variant_new_int16(NUM_PROBES);
|
||||
@@ -570,10 +663,9 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
struct sr_channel *ch,
|
||||
struct sr_channel_group *cg)
|
||||
{
|
||||
uint16_t i, j;
|
||||
int ret;
|
||||
uint16_t i;
|
||||
int ret, num_probes;
|
||||
const char *stropt;
|
||||
struct sr_channel *probe;
|
||||
uint64_t tmp_u64;
|
||||
|
||||
(void) cg;
|
||||
@@ -611,53 +703,25 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
sdi->mode = g_variant_get_int16(data);
|
||||
ret = SR_OK;
|
||||
if (sdi->mode == LOGIC) {
|
||||
sr_dev_probes_free(sdi);
|
||||
for (i = 0; probe_names[i]; i++) {
|
||||
if (!(probe = sr_channel_new(i, SR_CHANNEL_LOGIC, TRUE,
|
||||
probe_names[i])))
|
||||
ret = SR_ERR;
|
||||
else
|
||||
sdi->channels = g_slist_append(sdi->channels, probe);
|
||||
}
|
||||
num_probes = ARRAY_SIZE(probe_names) - 1;
|
||||
devc->cur_samplerate = SR_MHZ(1);
|
||||
devc->limit_samples = SR_MB(1);
|
||||
devc->limit_samples_show = devc->limit_samples;
|
||||
} else if (sdi->mode == DSO) {
|
||||
sr_dev_probes_free(sdi);
|
||||
for (i = 0; i < DEMO_MAX_DSO_PROBES_NUM; i++) {
|
||||
if (!(probe = sr_channel_new(i, SR_CHANNEL_DSO, TRUE,
|
||||
probe_names[i])))
|
||||
ret = SR_ERR;
|
||||
else {
|
||||
probe->vdiv = 1000;
|
||||
probe->vfactor = 1;
|
||||
probe->coupling = SR_AC_COUPLING;
|
||||
probe->trig_value = 0x80;
|
||||
probe->vpos = (probe->index == 0 ? 0.5 : -0.5)*probe->vdiv;
|
||||
sdi->channels = g_slist_append(sdi->channels, probe);
|
||||
probe->ms_show = TRUE;
|
||||
for (j = DSO_MS_BEGIN; j < DSO_MS_END; j++)
|
||||
probe->ms_en[j] = default_ms_en[j];
|
||||
}
|
||||
}
|
||||
num_probes = DEMO_MAX_DSO_PROBES_NUM;
|
||||
devc->cur_samplerate = DEMO_MAX_DSO_SAMPLERATE / DEMO_MAX_DSO_PROBES_NUM;
|
||||
devc->limit_samples = DEMO_MAX_DSO_DEPTH / DEMO_MAX_DSO_PROBES_NUM;
|
||||
devc->limit_samples_show = devc->limit_samples;
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
sr_dev_probes_free(sdi);
|
||||
for (i = 0; i < DS_MAX_ANALOG_PROBES_NUM; i++) {
|
||||
if (!(probe = sr_channel_new(i, SR_CHANNEL_ANALOG, TRUE,
|
||||
probe_names[i])))
|
||||
ret = SR_ERR;
|
||||
else
|
||||
sdi->channels = g_slist_append(sdi->channels, probe);
|
||||
}
|
||||
num_probes = DS_MAX_ANALOG_PROBES_NUM;
|
||||
devc->cur_samplerate = SR_HZ(100);
|
||||
devc->limit_samples = SR_KB(1);
|
||||
devc->limit_samples_show = devc->limit_samples;
|
||||
} else {
|
||||
ret = SR_ERR;
|
||||
num_probes = 0;
|
||||
}
|
||||
sr_dev_probes_free(sdi);
|
||||
setup_probes(sdi, num_probes);
|
||||
sr_dbg("%s: setting mode to %d", __func__, sdi->mode);
|
||||
}else if (id == SR_CONF_PATTERN_MODE) {
|
||||
stropt = g_variant_get_string(data, NULL);
|
||||
@@ -699,7 +763,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_TRIGGER_MARGIN) {
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_EN_CH) {
|
||||
} else if (id == SR_CONF_PROBE_EN) {
|
||||
ch->enabled = g_variant_get_boolean(data);
|
||||
sr_dbg("%s: setting ENABLE of channel %d to %d", __func__,
|
||||
ch->index, ch->enabled);
|
||||
@@ -709,19 +773,19 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
sr_dbg("%s: setting data lock to %d", __func__,
|
||||
devc->data_lock);
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_VDIV) {
|
||||
} else if (id == SR_CONF_PROBE_VDIV) {
|
||||
tmp_u64 = g_variant_get_uint64(data);
|
||||
ch->vpos = (tmp_u64 * 1.0 / ch->vdiv) * ch->vpos;
|
||||
ch->vdiv = tmp_u64;
|
||||
sr_dbg("%s: setting VDIV of channel %d to %" PRIu64, __func__,
|
||||
ch->index, ch->vdiv);
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_FACTOR) {
|
||||
} else if (id == SR_CONF_PROBE_FACTOR) {
|
||||
ch->vfactor = g_variant_get_uint64(data);
|
||||
sr_dbg("%s: setting FACTOR of channel %d to %" PRIu64, __func__,
|
||||
ch->index, ch->vfactor);
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_VPOS) {
|
||||
} else if (id == SR_CONF_PROBE_VPOS) {
|
||||
//ch->vpos = g_variant_get_double(data);
|
||||
sr_dbg("%s: setting VPOS of channel %d to %lf", __func__,
|
||||
ch->index, ch->vpos);
|
||||
@@ -731,7 +795,7 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
sr_dbg("%s: setting TIMEBASE to %" PRIu64, __func__,
|
||||
devc->timebase);
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_COUPLING) {
|
||||
} else if (id == SR_CONF_PROBE_COUPLING) {
|
||||
ch->coupling = g_variant_get_byte(data);
|
||||
sr_dbg("%s: setting AC COUPLING of channel %d to %d", __func__,
|
||||
ch->index, ch->coupling);
|
||||
@@ -751,6 +815,12 @@ static int config_set(int id, GVariant *data, struct sr_dev_inst *sdi,
|
||||
sr_dbg("%s: setting channel %d Trigger Value to %d",
|
||||
__func__, ch->index, ch->trig_value);
|
||||
ret = SR_OK;
|
||||
} else if (id == SR_CONF_PROBE_MAP_UNIT) {
|
||||
ch->map_unit = g_variant_get_string(data, NULL);
|
||||
} else if (id == SR_CONF_PROBE_MAP_MIN) {
|
||||
ch->map_min = g_variant_get_double(data);
|
||||
} else if (id == SR_CONF_PROBE_MAP_MAX) {
|
||||
ch->map_max = g_variant_get_double(data);
|
||||
} else {
|
||||
ret = SR_ERR_NA;
|
||||
}
|
||||
@@ -806,6 +876,32 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
|
||||
case SR_CONF_MAX_HEIGHT:
|
||||
*data = g_variant_new_strv(maxHeights, ARRAY_SIZE(maxHeights));
|
||||
break;
|
||||
|
||||
case SR_CONF_PROBE_CONFIGS:
|
||||
*data = g_variant_new_from_data(G_VARIANT_TYPE("ai"),
|
||||
probeOptions, ARRAY_SIZE(probeOptions)*sizeof(int32_t), TRUE, NULL, NULL);
|
||||
break;
|
||||
case SR_CONF_PROBE_SESSIONS:
|
||||
*data = g_variant_new_from_data(G_VARIANT_TYPE("ai"),
|
||||
probeSessions, ARRAY_SIZE(probeSessions)*sizeof(int32_t), TRUE, NULL, NULL);
|
||||
break;
|
||||
case SR_CONF_PROBE_VDIV:
|
||||
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("at"),
|
||||
probeVdivs, ARRAY_SIZE(probeVdivs)*sizeof(uint64_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "vdivs", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
case SR_CONF_PROBE_COUPLING:
|
||||
g_variant_builder_init(&gvb, G_VARIANT_TYPE("a{sv}"));
|
||||
gvar = g_variant_new_from_data(G_VARIANT_TYPE("ay"),
|
||||
probeCoupling, ARRAY_SIZE(probeCoupling)*sizeof(uint8_t), TRUE, NULL, NULL);
|
||||
g_variant_builder_add(&gvb, "{sv}", "coupling", gvar);
|
||||
*data = g_variant_builder_end(&gvb);
|
||||
break;
|
||||
case SR_CONF_PROBE_MAP_UNIT:
|
||||
*data = g_variant_new_strv(probeMapUnits, ARRAY_SIZE(probeMapUnits));
|
||||
break;
|
||||
default:
|
||||
return SR_ERR_NA;
|
||||
}
|
||||
@@ -851,8 +947,8 @@ static void samples_generator(uint16_t *buf, uint64_t size,
|
||||
|
||||
if (devc->samples_counter == devc->limit_samples &&
|
||||
size != devc->limit_samples) {
|
||||
for (i = 0; i < devc->limit_samples; i++)
|
||||
*(buf + i) = *(buf + ((i + size)%devc->limit_samples));
|
||||
// for (i = 0; i < devc->limit_samples; i++)
|
||||
// *(buf + i) = *(buf + ((i + size)%devc->limit_samples));
|
||||
} else if (sdi->mode == LOGIC) {
|
||||
for (i = 0; i < size; i++) {
|
||||
//index = (i/10/g_slist_length(sdi->channels)+start_rand)%len;
|
||||
@@ -871,12 +967,13 @@ static void samples_generator(uint16_t *buf, uint64_t size,
|
||||
}
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
for (i = 0; i < size; i++) {
|
||||
if (rand() % (devc->limit_samples / 100) == 0)
|
||||
*(buf + i) = 0x4000 + rand() % 0x8000;
|
||||
else if (rand() % (devc->limit_samples / 1000) == 0)
|
||||
*(buf + i) = 0x7000 + rand() % 0x2000;
|
||||
else
|
||||
*(buf + i) = 0x8000;
|
||||
*(buf + i) = 0x8080;
|
||||
if (i % (int)ceil(size / 7.0))
|
||||
*(buf + i) = 0x7E7E + (rand() & 0x0300) + (rand() & 0x003);
|
||||
else if (rand() > INT_MAX / 4)
|
||||
*(buf + i) = 0x7878 + (rand() & 0x0F00) + (rand() & 0x00F);
|
||||
else if (rand() < INT_MAX / 8)
|
||||
*(buf + i) = 0x6060 + (rand() & 0x3F00) + (rand() & 0x03F);
|
||||
}
|
||||
} else {
|
||||
if (devc->pre_index == 0) {
|
||||
@@ -974,9 +1071,9 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi)
|
||||
samples_to_send = MIN(samples_to_send,
|
||||
devc->limit_samples - devc->pre_index);
|
||||
} else if (sdi->mode == ANALOG) {
|
||||
samples_to_send = ceil(samples_elaspsed * g_slist_length(sdi->channels));
|
||||
samples_to_send = ceil(samples_elaspsed/2);
|
||||
samples_to_send = MIN(samples_to_send,
|
||||
devc->limit_samples * g_slist_length(sdi->channels) - devc->pre_index);
|
||||
devc->limit_samples - devc->pre_index);
|
||||
} else {
|
||||
samples_to_send = ceil(samples_elaspsed);
|
||||
samples_to_send += devc->samples_not_sent;
|
||||
@@ -1027,7 +1124,7 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi)
|
||||
}
|
||||
|
||||
if (sdi->mode == ANALOG)
|
||||
devc->samples_counter += sending_now/g_slist_length(sdi->channels);
|
||||
devc->samples_counter += sending_now/2;
|
||||
else
|
||||
devc->samples_counter += sending_now;
|
||||
if (sdi->mode == DSO && !devc->instant &&
|
||||
@@ -1060,7 +1157,8 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi)
|
||||
packet.type = SR_DF_ANALOG;
|
||||
packet.payload = &analog;
|
||||
analog.probes = sdi->channels;
|
||||
analog.num_samples = sending_now / g_slist_length(sdi->channels);
|
||||
analog.num_samples = sending_now / 2;
|
||||
analog.unit_bits = 8;
|
||||
analog.mq = SR_MQ_VOLTAGE;
|
||||
analog.unit = SR_UNIT_VOLT;
|
||||
analog.mqflags = SR_MQFLAG_AC;
|
||||
@@ -1083,7 +1181,7 @@ static int receive_data(int fd, int revents, const struct sr_dev_inst *sdi)
|
||||
}
|
||||
}
|
||||
|
||||
if ((sdi->mode != DSO || devc->instant) && devc->limit_samples &&
|
||||
if ((sdi->mode == LOGIC || devc->instant) && devc->limit_samples &&
|
||||
devc->samples_counter >= devc->limit_samples) {
|
||||
sr_info("Requested number of samples reached.");
|
||||
hw_dev_acquisition_stop(sdi, NULL);
|
||||
|
||||
Reference in New Issue
Block a user