From a42aec7f6e61b83fcd00e20827b31cc0ee3852d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Espeland?= Date: Mon, 3 May 2010 15:06:43 +0200 Subject: [PATCH] Sigma: Merge storage of rise/fall triggers. --- hardware/asix-sigma/asix-sigma.c | 35 +++++++++++++++++++++----------- hardware/asix-sigma/asix-sigma.h | 10 +++------ 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/hardware/asix-sigma/asix-sigma.c b/hardware/asix-sigma/asix-sigma.c index 819afa1d..08f6c9d5 100644 --- a/hardware/asix-sigma/asix-sigma.c +++ b/hardware/asix-sigma/asix-sigma.c @@ -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)) { diff --git a/hardware/asix-sigma/asix-sigma.h b/hardware/asix-sigma/asix-sigma.h index 1320acec..be7ecbff 100644 --- a/hardware/asix-sigma/asix-sigma.h +++ b/hardware/asix-sigma/asix-sigma.h @@ -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). */ };