X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fprotocol.c;h=f8289ba749d86491064bc94f75d0139a731c4851;hb=3281cf59aa822563e6ce2f5a21597e59327296ad;hp=db89d6890a9c2d9d1f214de5d0335f297719d5b5;hpb=9a0a606a8215aa7fd41bb72a3653dff7ef54505b;p=libsigrok.git diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index db89d689..f8289ba7 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -26,12 +26,6 @@ #include #include "protocol.h" -#define USB_VENDOR 0xa600 -#define USB_PRODUCT 0xa000 -#define USB_DESCRIPTION "ASIX SIGMA" -#define USB_VENDOR_NAME "ASIX" -#define USB_MODEL_NAME "SIGMA" - /* * The ASIX Sigma supports arbitrary integer frequency divider in * the 50MHz mode. The divider is in range 1...256 , allowing for @@ -732,6 +726,26 @@ static uint16_t sigma_dram_cluster_ts(struct sigma_dram_cluster *cluster) return (cluster->timestamp_hi << 8) | cluster->timestamp_lo; } +/* + * Return one 16bit data entity of a DRAM cluster at the specified index. + */ +static uint16_t sigma_dram_cluster_data(struct sigma_dram_cluster *cl, int idx) +{ + uint16_t sample; + + sample = 0; + sample |= cl->samples[idx].sample_lo << 0; + sample |= cl->samples[idx].sample_hi << 8; + sample = (sample >> 8) | (sample << 8); + return sample; +} + +static void store_sr_sample(uint8_t *samples, int idx, uint16_t data) +{ + samples[2 * idx + 0] = (data >> 0) & 0xff; + samples[2 * idx + 1] = (data >> 8) & 0xff; +} + static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, unsigned int events_in_cluster, unsigned int triggered, @@ -741,7 +755,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, struct sigma_state *ss = &devc->state; struct sr_datafeed_packet packet; struct sr_datafeed_logic logic; - uint16_t tsdiff, ts; + uint16_t tsdiff, ts, sample; uint8_t samples[2048]; unsigned int i; @@ -767,8 +781,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, */ for (ts = 0; ts < tsdiff; ts++) { i = ts % 1024; - samples[2 * i + 0] = ss->lastsample & 0xff; - samples[2 * i + 1] = ss->lastsample >> 8; + store_sr_sample(samples, i, ss->lastsample); /* * If we have 1024 samples ready or we're at the @@ -785,12 +798,17 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, * Parse the samples in current cluster and prepare them * to be submitted to Sigrok. */ + sample = 0; for (i = 0; i < events_in_cluster; i++) { - samples[2 * i + 1] = dram_cluster->samples[i].sample_lo; - samples[2 * i + 0] = dram_cluster->samples[i].sample_hi; + sample = sigma_dram_cluster_data(dram_cluster, i); + store_sr_sample(samples, i, sample); } - /* Send data up to trigger point (if triggered). */ + /* + * If a trigger position applies, then provide the datafeed with + * the first part of data up to that position, then send the + * trigger marker. + */ int trigger_offset = 0; if (triggered) { /* @@ -816,6 +834,10 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, } } + /* + * Send the data after the trigger, or all of the received data + * if no trigger position applies. + */ if (events_in_cluster > 0) { packet.type = SR_DF_LOGIC; logic.length = events_in_cluster * logic.unitsize; @@ -823,10 +845,7 @@ static void sigma_decode_dram_cluster(struct sigma_dram_cluster *dram_cluster, sr_session_send(sdi, &packet); } - ss->lastsample = - samples[2 * (events_in_cluster - 1) + 0] | - (samples[2 * (events_in_cluster - 1) + 1] << 8); - + ss->lastsample = sample; } /*