Sigma: Use software trigger to pinpoint exact sample.
This commit is contained in:
parent
6aac77375b
commit
36b1c8e61b
|
@ -727,6 +727,37 @@ static int hw_set_configuration(int device_index, int capability, void *value)
|
||||||
return ret;
|
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.
|
* Decode chunk of 1024 bytes, 64 clusters, 7 events per cluster.
|
||||||
* Each event is 20ns apart, and can contain multiple samples.
|
* 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. */
|
/* Check if trigger is in this chunk. */
|
||||||
if (triggerpos != -1) {
|
if (triggerpos != -1) {
|
||||||
if (cur_samplerate <= MHZ(50))
|
if (cur_samplerate <= MHZ(50))
|
||||||
triggerpos -= EVENTS_PER_CLUSTER;
|
triggerpos -= EVENTS_PER_CLUSTER - 1;
|
||||||
else
|
else
|
||||||
triggeroff = 3;
|
triggeroff = 3;
|
||||||
|
|
||||||
|
@ -817,13 +848,12 @@ static int decode_chunk_ts(uint8_t *buf, uint16_t *lastts,
|
||||||
sent = 0;
|
sent = 0;
|
||||||
if (i == triggerts) {
|
if (i == triggerts) {
|
||||||
/*
|
/*
|
||||||
* Trigger is presumptively not accurate to sample.
|
* Trigger is not always accurate to sample because of
|
||||||
* However, it always trigger before the actual event,
|
* pipeline delay. However, it always triggers before
|
||||||
* so it would be possible to forward to correct position
|
* the actual event. We therefore look at the next
|
||||||
* here by manually checking for trigger condition.
|
* samples to pinpoint the exact position of the trigger.
|
||||||
*/
|
*/
|
||||||
|
tosend = get_trigger_offset(samples, *lastsample, &trigger);
|
||||||
tosend = (triggerpos % 7) - triggeroff;
|
|
||||||
|
|
||||||
if (tosend > 0) {
|
if (tosend > 0) {
|
||||||
packet.type = DF_LOGIC16;
|
packet.type = DF_LOGIC16;
|
||||||
|
|
Loading…
Reference in New Issue