asix-sigma: Use new trigger API.

This commit is contained in:
Bert Vermeulen 2014-05-28 00:19:58 +02:00
parent 9f00e5aefb
commit 39c64c6a4f
1 changed files with 78 additions and 65 deletions

View File

@ -36,7 +36,6 @@
#define USB_DESCRIPTION "ASIX SIGMA" #define USB_DESCRIPTION "ASIX SIGMA"
#define USB_VENDOR_NAME "ASIX" #define USB_VENDOR_NAME "ASIX"
#define USB_MODEL_NAME "SIGMA" #define USB_MODEL_NAME "SIGMA"
#define TRIGGER_TYPE "rf10"
SR_PRIV struct sr_dev_driver asix_sigma_driver_info; SR_PRIV struct sr_dev_driver asix_sigma_driver_info;
static struct sr_dev_driver *di = &asix_sigma_driver_info; static struct sr_dev_driver *di = &asix_sigma_driver_info;
@ -74,11 +73,18 @@ static const char *channel_names[] = {
static const int32_t hwcaps[] = { static const int32_t hwcaps[] = {
SR_CONF_LOGIC_ANALYZER, SR_CONF_LOGIC_ANALYZER,
SR_CONF_SAMPLERATE, SR_CONF_SAMPLERATE,
SR_CONF_TRIGGER_TYPE, SR_CONF_TRIGGER_MATCH,
SR_CONF_CAPTURE_RATIO, SR_CONF_CAPTURE_RATIO,
SR_CONF_LIMIT_MSEC, SR_CONF_LIMIT_MSEC,
}; };
static const int32_t trigger_matches[] = {
SR_TRIGGER_ZERO,
SR_TRIGGER_ONE,
SR_TRIGGER_RISING,
SR_TRIGGER_FALLING,
};
static const char *sigma_firmware_files[] = { static const char *sigma_firmware_files[] = {
/* 50 MHz, supports 8 bit fractions */ /* 50 MHz, supports 8 bit fractions */
FIRMWARE_DIR "/asix-sigma-50.fw", FIRMWARE_DIR "/asix-sigma-50.fw",
@ -708,56 +714,62 @@ static int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
* The Sigma supports complex triggers using boolean expressions, but this * The Sigma supports complex triggers using boolean expressions, but this
* has not been implemented yet. * has not been implemented yet.
*/ */
static int configure_channels(const struct sr_dev_inst *sdi) static int convert_trigger(const struct sr_dev_inst *sdi)
{ {
struct dev_context *devc = sdi->priv; struct dev_context *devc;
const struct sr_channel *ch; struct sr_trigger *trigger;
const GSList *l; struct sr_trigger_stage *stage;
int trigger_set = 0; struct sr_trigger_match *match;
int channelbit; const GSList *l, *m;
int channelbit, trigger_set;
devc = sdi->priv;
memset(&devc->trigger, 0, sizeof(struct sigma_trigger)); memset(&devc->trigger, 0, sizeof(struct sigma_trigger));
if (!(trigger = sr_session_trigger_get()))
return SR_OK;
for (l = sdi->channels; l; l = l->next) { trigger_set = 0;
ch = (struct sr_channel *)l->data; for (l = trigger->stages; l; l = l->next) {
channelbit = 1 << (ch->index); stage = l->data;
for (m = stage->matches; m; m = m->next) {
if (!ch->enabled || !ch->trigger) match = m->data;
if (!match->channel->enabled)
/* Ignore disabled channels with a trigger. */
continue; continue;
channelbit = 1 << (match->channel->index);
if (devc->cur_samplerate >= SR_MHZ(100)) { if (devc->cur_samplerate >= SR_MHZ(100)) {
/* Fast trigger support. */ /* Fast trigger support. */
if (trigger_set) { if (trigger_set) {
sr_err("Only a single pin trigger in 100 and " sr_err("Only a single pin trigger is "
"200MHz mode is supported."); "supported in 100 and 200MHz mode.");
return SR_ERR; return SR_ERR;
} }
if (ch->trigger[0] == 'f') if (match->match == SR_TRIGGER_FALLING)
devc->trigger.fallingmask |= channelbit; devc->trigger.fallingmask |= channelbit;
else if (ch->trigger[0] == 'r') else if (match->match == SR_TRIGGER_RISING)
devc->trigger.risingmask |= channelbit; devc->trigger.risingmask |= channelbit;
else { else {
sr_err("Only rising/falling trigger in 100 " sr_err("Only rising/falling trigger is "
"and 200MHz mode is supported."); "supported in 100 and 200MHz mode.");
return SR_ERR; return SR_ERR;
} }
++trigger_set; ++trigger_set;
} else { } else {
/* Simple trigger support (event). */ /* Simple trigger support (event). */
if (ch->trigger[0] == '1') { if (match->match == SR_TRIGGER_ONE) {
devc->trigger.simplevalue |= channelbit; devc->trigger.simplevalue |= channelbit;
devc->trigger.simplemask |= channelbit; devc->trigger.simplemask |= channelbit;
} }
else if (ch->trigger[0] == '0') { else if (match->match == SR_TRIGGER_ZERO) {
devc->trigger.simplevalue &= ~channelbit; devc->trigger.simplevalue &= ~channelbit;
devc->trigger.simplemask |= channelbit; devc->trigger.simplemask |= channelbit;
} }
else if (ch->trigger[0] == 'f') { else if (match->match == SR_TRIGGER_FALLING) {
devc->trigger.fallingmask |= channelbit; devc->trigger.fallingmask |= channelbit;
++trigger_set; ++trigger_set;
} }
else if (ch->trigger[0] == 'r') { else if (match->match == SR_TRIGGER_RISING) {
devc->trigger.risingmask |= channelbit; devc->trigger.risingmask |= channelbit;
++trigger_set; ++trigger_set;
} }
@ -773,10 +785,9 @@ static int configure_channels(const struct sr_dev_inst *sdi)
return SR_ERR; return SR_ERR;
} }
} }
if (trigger_set)
devc->use_triggers = 1;
} }
}
return SR_OK; return SR_OK;
} }
@ -894,8 +905,10 @@ static int config_list(int key, GVariant **data, const struct sr_dev_inst *sdi,
g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar); g_variant_builder_add(&gvb, "{sv}", "samplerates", gvar);
*data = g_variant_builder_end(&gvb); *data = g_variant_builder_end(&gvb);
break; break;
case SR_CONF_TRIGGER_TYPE: case SR_CONF_TRIGGER_MATCH:
*data = g_variant_new_string(TRIGGER_TYPE); *data = g_variant_new_fixed_array(G_VARIANT_TYPE_INT32,
trigger_matches, ARRAY_SIZE(trigger_matches),
sizeof(int32_t));
break; break;
default: default:
return SR_ERR_NA; return SR_ERR_NA;
@ -1410,8 +1423,8 @@ static int dev_acquisition_start(const struct sr_dev_inst *sdi, void *cb_data)
devc = sdi->priv; devc = sdi->priv;
if (configure_channels(sdi) != SR_OK) { if (convert_trigger(sdi) != SR_OK) {
sr_err("Failed to configure channels."); sr_err("Failed to configure triggers.");
return SR_ERR; return SR_ERR;
} }