Sigma: Merge storage of rise/fall triggers.

This commit is contained in:
Håvard Espeland 2010-05-03 15:06:43 +02:00
parent 4ae1f45136
commit a42aec7f6e
2 changed files with 26 additions and 19 deletions

View File

@ -576,11 +576,13 @@ static int configure_probes(GSList *probes)
struct probe *probe;
GSList *l;
int trigger_set = 0;
int probebit;
memset(&trigger, 0, sizeof(struct sigma_trigger));
for (l = probes; l; l = l->next) {
probe = (struct probe *)l->data;
probebit = 1 << (probe->index - 1);
if (!probe->enabled || !probe->trigger)
continue;
@ -593,9 +595,9 @@ static int configure_probes(GSList *probes)
return SIGROK_ERR;
}
if (probe->trigger[0] == 'f')
trigger.fast_fall = 1;
trigger.fallingmask |= probebit;
else if (probe->trigger[0] == 'r')
trigger.fast_fall = 0;
trigger.risingmask |= probebit;
else {
g_warning("Asix Sigma only supports "
"rising/falling trigger in 100 "
@ -603,25 +605,23 @@ static int configure_probes(GSList *probes)
return SIGROK_ERR;
}
trigger.fast_pin = probe->index - 1;
++trigger_set;
} else {
/* Simple trigger support (event). */
if (probe->trigger[0] == '1') {
trigger.simplevalue |= 1 << (probe->index - 1);
trigger.simplemask |= 1 << (probe->index - 1);
trigger.simplevalue |= probebit;
trigger.simplemask |= probebit;
}
else if (probe->trigger[0] == '0') {
trigger.simplevalue |= 0 << (probe->index - 1);
trigger.simplemask |= 1 << (probe->index - 1);
trigger.simplevalue &= ~probebit;
trigger.simplemask |= probebit;
}
else if (probe->trigger[0] == 'f') {
trigger.fallingmask |= 1 << (probe->index - 1);
trigger.fallingmask |= probebit;
++trigger_set;
}
else if (probe->trigger[0] == 'r') {
trigger.risingmask |= 1 << (probe->index - 1);
trigger.risingmask |= probebit;
++trigger_set;
}
@ -1092,6 +1092,7 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
uint8_t triggerselect;
struct triggerinout triggerinout_conf;
struct triggerlut lut;
int triggerpin;
session_device_id = session_device_id;
@ -1111,8 +1112,18 @@ static int hw_start_acquisition(int device_index, gpointer session_device_id)
if (cur_samplerate >= MHZ(100)) {
sigma_set_register(WRITE_TRIGGER_SELECT1, 0x81);
triggerselect = (1 << LEDSEL1) | (trigger.fast_fall << 3) |
(trigger.fast_pin & 0x7);
/* Find which pin to trigger on from mask. */
for (triggerpin = 0; triggerpin < 8; ++triggerpin)
if ((trigger.risingmask | trigger.fallingmask) &
(1 << triggerpin))
break;
/* Set trigger pin and light LED on trigger. */
triggerselect = (1 << LEDSEL1) | (triggerpin & 0x7);
/* Default rising edge. */
if (trigger.fallingmask)
triggerselect |= 1 << 3;
/* All other modes. */
} else if (cur_samplerate <= MHZ(50)) {

View File

@ -124,18 +124,14 @@ struct triggerlut {
/* Trigger configuration */
struct sigma_trigger {
/* Single-pin trigger support (100 and 200 MHz).*/
uint8_t fast_pin;
uint8_t fast_fall;
/* Only two probes can be used in mask. */
uint16_t risingmask;
uint16_t fallingmask;
/* Simple trigger support (<= 50 MHz). */
uint16_t simplemask;
uint16_t simplevalue;
/* Only two probes can be used in mask */
uint16_t risingmask;
uint16_t fallingmask;
/* TODO: Advanced trigger support (boolean expressions). */
};