X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fhardware%2Fasix-sigma%2Fprotocol.c;h=82a0f9c20405f5946f71c08ea45aac723d256662;hb=f06fb3e9f1fdfc3780bfa8cb06f76a2d630d6f1c;hp=98cfce7a185b1b4dd45a2940b372a04b227a5fd2;hpb=85c032e48553458b43d0eb8315a7587abee4493f;p=libsigrok.git diff --git a/src/hardware/asix-sigma/protocol.c b/src/hardware/asix-sigma/protocol.c index 98cfce7a..82a0f9c2 100644 --- a/src/hardware/asix-sigma/protocol.c +++ b/src/hardware/asix-sigma/protocol.c @@ -184,14 +184,16 @@ static int sigma_read_dram(uint16_t startchunk, size_t numchunks, { size_t i; uint8_t buf[4096]; - int idx = 0; + int idx; /* Send the startchunk. Index start with 1. */ - buf[0] = startchunk >> 8; - buf[1] = startchunk & 0xff; - sigma_write_register(WRITE_MEMROW, buf, 2, devc); + idx = 0; + buf[idx++] = startchunk >> 8; + buf[idx++] = startchunk & 0xff; + sigma_write_register(WRITE_MEMROW, buf, idx, devc); /* Read the DRAM. */ + idx = 0; buf[idx++] = REG_DRAM_BLOCK; buf[idx++] = REG_DRAM_WAIT_ACK; @@ -330,7 +332,7 @@ static int sigma_fpga_init_la(struct dev_context *devc) /* Initialize the logic analyzer mode. */ uint8_t logic_mode_start[] = { REG_ADDR_LOW | (READ_ID & 0xf), - REG_ADDR_HIGH | (READ_ID >> 8), + REG_ADDR_HIGH | (READ_ID >> 4), REG_READ_ADDR, /* Read ID register. */ REG_ADDR_LOW | (WRITE_TEST & 0xf), @@ -442,10 +444,18 @@ static int upload_firmware(struct sr_context *ctx, unsigned char *buf; unsigned char pins; size_t buf_size; - const char *firmware = sigma_firmware_files[firmware_idx]; - struct ftdi_context *ftdic = &devc->ftdic; + const char *firmware; + struct ftdi_context *ftdic; + + /* Avoid downloading the same firmware multiple times. */ + firmware = sigma_firmware_files[firmware_idx]; + if (devc->cur_firmware == firmware_idx) { + sr_info("Not uploading firmware file '%s' again.", firmware); + return SR_OK; + } /* Make sure it's an ASIX SIGMA. */ + ftdic = &devc->ftdic; ret = ftdi_usb_open_desc(ftdic, USB_VENDOR, USB_PRODUCT, USB_DESCRIPTION, NULL); if (ret < 0) { @@ -938,12 +948,18 @@ static int decode_chunk_ts(struct sigma_dram_line *dram_line, struct sr_dev_inst *sdi) { struct sigma_dram_cluster *dram_cluster; - struct dev_context *devc = sdi->priv; - unsigned int clusters_in_line = - (events_in_line + (EVENTS_PER_CLUSTER - 1)) / EVENTS_PER_CLUSTER; + struct dev_context *devc; + unsigned int clusters_in_line; unsigned int events_in_cluster; unsigned int i; - uint32_t trigger_cluster = ~0, triggered = 0; + uint32_t trigger_cluster, triggered; + + devc = sdi->priv; + clusters_in_line = events_in_line; + clusters_in_line += EVENTS_PER_CLUSTER - 1; + clusters_in_line /= EVENTS_PER_CLUSTER; + trigger_cluster = ~0; + triggered = 0; /* Check if trigger is in this chunk. */ if (trigger_event < (64 * 7)) { @@ -978,17 +994,22 @@ static int decode_chunk_ts(struct sigma_dram_line *dram_line, static int download_capture(struct sr_dev_inst *sdi) { - struct dev_context *devc = sdi->priv; const uint32_t chunks_per_read = 32; + + struct dev_context *devc; struct sigma_dram_line *dram_line; int bufsz; uint32_t stoppos, triggerpos; uint8_t modestatus; - uint32_t i; uint32_t dl_lines_total, dl_lines_curr, dl_lines_done; - uint32_t dl_events_in_line = 64 * 7; - uint32_t trg_line = ~0, trg_event = ~0; + uint32_t dl_events_in_line; + uint32_t trg_line, trg_event; + + 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) @@ -1072,13 +1093,13 @@ static int download_capture(struct sr_dev_inst *sdi) */ static int sigma_capture_mode(struct sr_dev_inst *sdi) { - struct dev_context *devc = sdi->priv; - + struct dev_context *devc; uint64_t running_msec; struct timeval tv; - uint32_t stoppos, triggerpos; + devc = sdi->priv; + /* Check if the selected sampling duration passed. */ gettimeofday(&tv, 0); running_msec = (tv.tv_sec - devc->start_tv.tv_sec) * 1000 +