Sigma: Use software trigger to pinpoint exact sample.

This commit is contained in:
Håvard Espeland 2010-05-03 21:30:37 +02:00
parent 6aac77375b
commit 36b1c8e61b
1 changed files with 37 additions and 7 deletions

View File

@ -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;