From: HÃ¥vard Espeland Date: Mon, 3 May 2010 19:30:37 +0000 (+0200) Subject: Sigma: Use software trigger to pinpoint exact sample. X-Git-Tag: libsigrok-0.1.0~527 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=36b1c8e61b277aabc84d181992795447e7339e5d;p=libsigrok.git Sigma: Use software trigger to pinpoint exact sample. --- diff --git a/hardware/asix-sigma/asix-sigma.c b/hardware/asix-sigma/asix-sigma.c index fe57d857..18664829 100644 --- a/hardware/asix-sigma/asix-sigma.c +++ b/hardware/asix-sigma/asix-sigma.c @@ -727,6 +727,37 @@ static int hw_set_configuration(int device_index, int capability, void *value) return ret; } +/* Software trigger to determine exact trigger position. */ +static int get_trigger_offset(uint16_t *samples, uint16_t last_sample, + struct sigma_trigger *t) +{ + int i; + + for (i = 0; i < 8; ++i) { + if (i > 0) + last_sample = samples[i-1]; + + /* Simple triggers. */ + if ((samples[i] & t->simplemask) != t->simplevalue) + continue; + + /* Rising edge. */ + if ((last_sample & t->risingmask) != 0 || (samples[i] & + t->risingmask) != t->risingmask) + continue; + + /* Falling edge. */ + if ((last_sample & t->fallingmask) != t->fallingmask || (samples[i] & + t->fallingmask) != 0) + continue; + + break; + } + + /* If we did not match, return original trigger pos. */ + return i & 0x7; +} + /* * Decode chunk of 1024 bytes, 64 clusters, 7 events per cluster. * Each event is 20ns apart, and can contain multiple samples. @@ -753,7 +784,7 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, /* Check if trigger is in this chunk. */ if (triggerpos != -1) { if (cur_samplerate <= MHZ(50)) - triggerpos -= EVENTS_PER_CLUSTER; + triggerpos -= EVENTS_PER_CLUSTER - 1; else triggeroff = 3; @@ -817,13 +848,12 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts, sent = 0; if (i == triggerts) { /* - * Trigger is presumptively not accurate to sample. - * However, it always trigger before the actual event, - * so it would be possible to forward to correct position - * here by manually checking for trigger condition. + * Trigger is not always accurate to sample because of + * pipeline delay. However, it always triggers before + * the actual event. We therefore look at the next + * samples to pinpoint the exact position of the trigger. */ - - tosend = (triggerpos % 7) - triggeroff; + tosend = get_trigger_offset(samples, *lastsample, &trigger); if (tosend > 0) { packet.type = DF_LOGIC16;