X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fprotocol.c;h=93d2623951e565f099ab68cc02e4af8ac66ccf32;hb=2142a79b53e7fb2d9d050c382b624820601c1bd6;hp=e2c34e5c9169699df381d5b8fecbbab3e8685849;hpb=8ebad343709aad6ef4d5aa83a2633690ef313de5;p=libsigrok.git diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index e2c34e5c..93d26239 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -168,11 +168,17 @@ static int sigma_read_pos(uint32_t *stoppos, uint32_t *triggerpos, *triggerpos = result[0] | (result[1] << 8) | (result[2] << 16); *stoppos = result[3] | (result[4] << 8) | (result[5] << 16); - /* Not really sure why this must be done, but according to spec. */ + /* + * These "position" values point to after the event (end of + * capture data, trigger condition matched). This is why they + * get decremented here. Sample memory consists of 512-byte + * chunks with meta data in the upper 64 bytes. Thus when the + * decrements takes us into this upper part of the chunk, then + * further move backwards to the end of the chunk's data part. + */ if ((--*stoppos & 0x1ff) == 0x1ff) *stoppos -= 64; - - if ((*--triggerpos & 0x1ff) == 0x1ff) + if ((--*triggerpos & 0x1ff) == 0x1ff) *triggerpos -= 64; return 1; @@ -1009,14 +1015,13 @@ static int download_capture(struct sr_dev_inst *sdi) devc = sdi->priv; dl_events_in_line = 64 * 7; - trg_line = ~0; - trg_event = ~0; dram_line = g_try_malloc0(chunks_per_read * sizeof(*dram_line)); if (!dram_line) return FALSE; sr_info("Downloading sample data."); + devc->state.state = SIGMA_DOWNLOAD; /* * Ask the hardware to stop data acquisition. Reception of the @@ -1037,6 +1042,8 @@ static int download_capture(struct sr_dev_inst *sdi) /* Check if trigger has fired. */ modestatus = sigma_get_register(READ_MODE, devc); + trg_line = ~0; + trg_event = ~0; if (modestatus & RMR_TRIGGERED) { trg_line = triggerpos >> 9; trg_event = triggerpos & 0x1ff; @@ -1097,13 +1104,13 @@ static int download_capture(struct sr_dev_inst *sdi) dl_lines_done += dl_lines_curr; } + g_free(dram_line); std_session_send_df_end(sdi); + devc->state.state = SIGMA_IDLE; sr_dev_acquisition_stop(sdi); - g_free(dram_line); - return TRUE; } @@ -1146,6 +1153,14 @@ SR_PRIV int sigma_receive_data(int fd, int revents, void *cb_data) if (devc->state.state == SIGMA_IDLE) return TRUE; + /* + * When the application has requested to stop the acquisition, + * then immediately start downloading sample data. Otherwise + * keep checking configured limits which will terminate the + * acquisition and initiate download. + */ + if (devc->state.state == SIGMA_STOPPING) + return download_capture(sdi); if (devc->state.state == SIGMA_CAPTURE) return sigma_capture_mode(sdi);