]> sigrok.org Git - libsigrok.git/blobdiff - hardware/chronovu-la8/driver.c
la8: Adapt to new driver conventions.
[libsigrok.git] / hardware / chronovu-la8 / driver.c
index 2b697bbb27953f7fe2971413db1b1a36b5ba0f5f..18483740d4268a1a7e76ce73305df9ec0c5b7d04 100644 (file)
@@ -91,8 +91,7 @@ SR_PRIV int is_valid_samplerate(uint64_t samplerate)
                        return 1;
        }
 
-       sr_err("la8: %s: invalid samplerate (%" PRIu64 "Hz)",
-              __func__, samplerate);
+       sr_err("Invalid samplerate (%" PRIu64 "Hz).", samplerate);
 
        return 0;
 }
@@ -110,13 +109,12 @@ SR_PRIV int is_valid_samplerate(uint64_t samplerate)
 SR_PRIV uint8_t samplerate_to_divcount(uint64_t samplerate)
 {
        if (samplerate == 0) {
-               sr_err("la8: %s: samplerate was 0", __func__);
+               sr_err("%s: samplerate was 0.", __func__);
                return 0xff;
        }
 
        if (!is_valid_samplerate(samplerate)) {
-               sr_err("la8: %s: can't get divcount, samplerate invalid",
-                      __func__);
+               sr_err("%s: Can't get divcount, samplerate invalid.", __func__);
                return 0xff;
        }
 
@@ -126,38 +124,38 @@ SR_PRIV uint8_t samplerate_to_divcount(uint64_t samplerate)
 /**
  * Write data of a certain length to the LA8's FTDI device.
  *
- * @param ctx The struct containing private per-device-instance data. Must not
- *            be NULL. ctx->ftdic must not be NULL either.
+ * @param devc The struct containing private per-device-instance data. Must not
+ *            be NULL. devc->ftdic must not be NULL either.
  * @param buf The buffer containing the data to write. Must not be NULL.
  * @param size The number of bytes to write. Must be >= 0.
  * @return The number of bytes written, or a negative value upon errors.
  */
-SR_PRIV int la8_write(struct context *ctx, uint8_t *buf, int size)
+SR_PRIV int la8_write(struct dev_context *devc, uint8_t *buf, int size)
 {
        int bytes_written;
 
-       /* Note: Caller checked that ctx and ctx->ftdic != NULL. */
+       /* Note: Caller checked that devc and devc->ftdic != NULL. */
 
        if (!buf) {
-               sr_err("la8: %s: buf was NULL", __func__);
+               sr_err("%s: buf was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
        if (size < 0) {
-               sr_err("la8: %s: size was < 0", __func__);
+               sr_err("%s: size was < 0.", __func__);
                return SR_ERR_ARG;
        }
 
-       bytes_written = ftdi_write_data(ctx->ftdic, buf, size);
+       bytes_written = ftdi_write_data(devc->ftdic, buf, size);
 
        if (bytes_written < 0) {
-               sr_err("la8: %s: ftdi_write_data: (%d) %s", __func__,
-                      bytes_written, ftdi_get_error_string(ctx->ftdic));
-               (void) la8_close_usb_reset_sequencer(ctx); /* Ignore errors. */
+               sr_err("%s: ftdi_write_data: (%d) %s.", __func__,
+                      bytes_written, ftdi_get_error_string(devc->ftdic));
+               (void) la8_close_usb_reset_sequencer(devc); /* Ignore errors. */
        } else if (bytes_written != size) {
-               sr_err("la8: %s: bytes to write: %d, bytes written: %d",
+               sr_err("%s: bytes to write: %d, bytes written: %d.",
                       __func__, size, bytes_written);
-               (void) la8_close_usb_reset_sequencer(ctx); /* Ignore errors. */
+               (void) la8_close_usb_reset_sequencer(devc); /* Ignore errors. */
        }
 
        return bytes_written;
@@ -166,59 +164,59 @@ SR_PRIV int la8_write(struct context *ctx, uint8_t *buf, int size)
 /**
  * Read a certain amount of bytes from the LA8's FTDI device.
  *
- * @param ctx The struct containing private per-device-instance data. Must not
- *            be NULL. ctx->ftdic must not be NULL either.
+ * @param devc The struct containing private per-device-instance data. Must not
+ *            be NULL. devc->ftdic must not be NULL either.
  * @param buf The buffer where the received data will be stored. Must not
  *            be NULL.
  * @param size The number of bytes to read. Must be >= 1.
  * @return The number of bytes read, or a negative value upon errors.
  */
-SR_PRIV int la8_read(struct context *ctx, uint8_t *buf, int size)
+SR_PRIV int la8_read(struct dev_context *devc, uint8_t *buf, int size)
 {
        int bytes_read;
 
-       /* Note: Caller checked that ctx and ctx->ftdic != NULL. */
+       /* Note: Caller checked that devc and devc->ftdic != NULL. */
 
        if (!buf) {
-               sr_err("la8: %s: buf was NULL", __func__);
+               sr_err("%s: buf was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
        if (size <= 0) {
-               sr_err("la8: %s: size was <= 0", __func__);
+               sr_err("%s: size was <= 0.", __func__);
                return SR_ERR_ARG;
        }
 
-       bytes_read = ftdi_read_data(ctx->ftdic, buf, size);
+       bytes_read = ftdi_read_data(devc->ftdic, buf, size);
 
        if (bytes_read < 0) {
-               sr_err("la8: %s: ftdi_read_data: (%d) %s", __func__,
-                      bytes_read, ftdi_get_error_string(ctx->ftdic));
+               sr_err("%s: ftdi_read_data: (%d) %s.", __func__,
+                      bytes_read, ftdi_get_error_string(devc->ftdic));
        } else if (bytes_read != size) {
-               // sr_err("la8: %s: bytes to read: %d, bytes read: %d",
+               // sr_err("%s: Bytes to read: %d, bytes read: %d.",
                //        __func__, size, bytes_read);
        }
 
        return bytes_read;
 }
 
-SR_PRIV int la8_close(struct context *ctx)
+SR_PRIV int la8_close(struct dev_context *devc)
 {
        int ret;
 
-       if (!ctx) {
-               sr_err("la8: %s: ctx was NULL", __func__);
+       if (!devc) {
+               sr_err("%s: devc was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!ctx->ftdic) {
-               sr_err("la8: %s: ctx->ftdic was NULL", __func__);
+       if (!devc->ftdic) {
+               sr_err("%s: devc->ftdic was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       if ((ret = ftdi_usb_close(ctx->ftdic)) < 0) {
-               sr_err("la8: %s: ftdi_usb_close: (%d) %s",
-                      __func__, ret, ftdi_get_error_string(ctx->ftdic));
+       if ((ret = ftdi_usb_close(devc->ftdic)) < 0) {
+               sr_err("%s: ftdi_usb_close: (%d) %s.",
+                      __func__, ret, ftdi_get_error_string(devc->ftdic));
        }
 
        return ret;
@@ -227,49 +225,49 @@ SR_PRIV int la8_close(struct context *ctx)
 /**
  * Close the ChronoVu LA8 USB port and reset the LA8 sequencer logic.
  *
- * @param ctx The struct containing private per-device-instance data.
+ * @param devc The struct containing private per-device-instance data.
  * @return SR_OK upon success, SR_ERR_ARG upon invalid arguments.
  */
-SR_PRIV int la8_close_usb_reset_sequencer(struct context *ctx)
+SR_PRIV int la8_close_usb_reset_sequencer(struct dev_context *devc)
 {
        /* Magic sequence of bytes for resetting the LA8 sequencer logic. */
        uint8_t buf[8] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
        int ret;
 
-       if (!ctx) {
-               sr_err("la8: %s: ctx was NULL", __func__);
+       if (!devc) {
+               sr_err("%s: devc was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!ctx->ftdic) {
-               sr_err("la8: %s: ctx->ftdic was NULL", __func__);
+       if (!devc->ftdic) {
+               sr_err("%s: devc->ftdic was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       if (ctx->ftdic->usb_dev) {
+       if (devc->ftdic->usb_dev) {
                /* Reset the LA8 sequencer logic, then wait 100ms. */
-               sr_dbg("la8: Resetting sequencer logic.");
-               (void) la8_write(ctx, buf, 8); /* Ignore errors. */
+               sr_dbg("Resetting sequencer logic.");
+               (void) la8_write(devc, buf, 8); /* Ignore errors. */
                g_usleep(100 * 1000);
 
                /* Purge FTDI buffers, then reset and close the FTDI device. */
-               sr_dbg("la8: Purging buffers, resetting+closing FTDI device.");
+               sr_dbg("Purging buffers, resetting+closing FTDI device.");
 
                /* Log errors, but ignore them (i.e., don't abort). */
-               if ((ret = ftdi_usb_purge_buffers(ctx->ftdic)) < 0)
-                       sr_err("la8: %s: ftdi_usb_purge_buffers: (%d) %s",
-                           __func__, ret, ftdi_get_error_string(ctx->ftdic));
-               if ((ret = ftdi_usb_reset(ctx->ftdic)) < 0)
-                       sr_err("la8: %s: ftdi_usb_reset: (%d) %s", __func__,
-                              ret, ftdi_get_error_string(ctx->ftdic));
-               if ((ret = ftdi_usb_close(ctx->ftdic)) < 0)
-                       sr_err("la8: %s: ftdi_usb_close: (%d) %s", __func__,
-                              ret, ftdi_get_error_string(ctx->ftdic));
+               if ((ret = ftdi_usb_purge_buffers(devc->ftdic)) < 0)
+                       sr_err("%s: ftdi_usb_purge_buffers: (%d) %s.",
+                           __func__, ret, ftdi_get_error_string(devc->ftdic));
+               if ((ret = ftdi_usb_reset(devc->ftdic)) < 0)
+                       sr_err("%s: ftdi_usb_reset: (%d) %s.", __func__,
+                              ret, ftdi_get_error_string(devc->ftdic));
+               if ((ret = ftdi_usb_close(devc->ftdic)) < 0)
+                       sr_err("%s: ftdi_usb_close: (%d) %s.", __func__,
+                              ret, ftdi_get_error_string(devc->ftdic));
        }
 
        /* Close USB device, deinitialize and free the FTDI context. */
-       ftdi_free(ctx->ftdic); /* Returns void. */
-       ctx->ftdic = NULL;
+       ftdi_free(devc->ftdic); /* Returns void. */
+       devc->ftdic = NULL;
 
        return SR_OK;
 }
@@ -279,26 +277,26 @@ SR_PRIV int la8_close_usb_reset_sequencer(struct context *ctx)
  *
  * The LA8 must be reset after a failed read/write operation or upon timeouts.
  *
- * @param ctx The struct containing private per-device-instance data.
+ * @param devc The struct containing private per-device-instance data.
  * @return SR_OK upon success, SR_ERR upon failure.
  */
-SR_PRIV int la8_reset(struct context *ctx)
+SR_PRIV int la8_reset(struct dev_context *devc)
 {
        uint8_t buf[BS];
        time_t done, now;
        int bytes_read;
 
-       if (!ctx) {
-               sr_err("la8: %s: ctx was NULL", __func__);
+       if (!devc) {
+               sr_err("%s: devc was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       if (!ctx->ftdic) {
-               sr_err("la8: %s: ctx->ftdic was NULL", __func__);
+       if (!devc->ftdic) {
+               sr_err("%s: devc->ftdic was NULL.", __func__);
                return SR_ERR_ARG;
        }
 
-       sr_dbg("la8: Resetting the device.");
+       sr_dbg("Resetting the device.");
 
        /*
         * Purge pending read data from the FTDI hardware FIFO until
@@ -307,35 +305,35 @@ SR_PRIV int la8_reset(struct context *ctx)
        done = 20 + time(NULL);
        do {
                /* TODO: Ignore errors? Check for < 0 at least! */
-               bytes_read = la8_read(ctx, (uint8_t *)&buf, BS);
+               bytes_read = la8_read(devc, (uint8_t *)&buf, BS);
                now = time(NULL);
        } while ((done > now) && (bytes_read > 0));
 
        /* Reset the LA8 sequencer logic and close the USB port. */
-       (void) la8_close_usb_reset_sequencer(ctx); /* Ignore errors. */
+       (void) la8_close_usb_reset_sequencer(devc); /* Ignore errors. */
 
-       sr_dbg("la8: Device reset finished.");
+       sr_dbg("Device reset finished.");
 
        return SR_OK;
 }
 
-SR_PRIV int configure_probes(struct context *ctx, const GSList *probes)
+SR_PRIV int configure_probes(const struct sr_dev_inst *sdi)
 {
+       struct dev_context *devc;
        const struct sr_probe *probe;
        const GSList *l;
        uint8_t probe_bit;
        char *tc;
 
-       /* Note: Caller checked that ctx != NULL. */
+       devc = sdi->priv;
+       devc->trigger_pattern = 0;
+       devc->trigger_mask = 0; /* Default to "don't care" for all probes. */
 
-       ctx->trigger_pattern = 0;
-       ctx->trigger_mask = 0; /* Default to "don't care" for all probes. */
-
-       for (l = probes; l; l = l->next) {
+       for (l = sdi->probes; l; l = l->next) {
                probe = (struct sr_probe *)l->data;
 
                if (!probe) {
-                       sr_err("la8: %s: probe was NULL", __func__);
+                       sr_err("%s: probe was NULL.", __func__);
                        return SR_ERR;
                }
 
@@ -349,8 +347,8 @@ SR_PRIV int configure_probes(struct context *ctx, const GSList *probes)
 
                /* Note: Must only be run if probe->trigger != NULL. */
                if (probe->index < 0 || probe->index > 7) {
-                       sr_err("la8: %s: invalid probe index %d, must be "
-                              "between 0 and 7", __func__, probe->index);
+                       sr_err("%s: Invalid probe index %d, must be "
+                              "between 0 and 7.", __func__, probe->index);
                        return SR_ERR;
                }
 
@@ -358,35 +356,35 @@ SR_PRIV int configure_probes(struct context *ctx, const GSList *probes)
 
                /* Configure the probe's trigger mask and trigger pattern. */
                for (tc = probe->trigger; tc && *tc; tc++) {
-                       ctx->trigger_mask |= probe_bit;
+                       devc->trigger_mask |= probe_bit;
 
                        /* Sanity check, LA8 only supports low/high trigger. */
                        if (*tc != '0' && *tc != '1') {
-                               sr_err("la8: %s: invalid trigger '%c', only "
-                                      "'0'/'1' supported", __func__, *tc);
+                               sr_err("%s: Invalid trigger '%c', only "
+                                      "'0'/'1' supported.", __func__, *tc);
                                return SR_ERR;
                        }
 
                        if (*tc == '1')
-                               ctx->trigger_pattern |= probe_bit;
+                               devc->trigger_pattern |= probe_bit;
                }
        }
 
-       sr_dbg("la8: trigger_mask = 0x%x, trigger_pattern = 0x%x",
-              ctx->trigger_mask, ctx->trigger_pattern);
+       sr_dbg("Trigger mask = 0x%x, trigger pattern = 0x%x.",
+              devc->trigger_mask, devc->trigger_pattern);
 
        return SR_OK;
 }
 
 SR_PRIV int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
 {
-       struct context *ctx;
+       struct dev_context *devc;
 
        /* Note: Caller checked that sdi and sdi->priv != NULL. */
 
-       ctx = sdi->priv;
+       devc = sdi->priv;
 
-       sr_spew("la8: Trying to set samplerate to %" PRIu64 "Hz.", samplerate);
+       sr_spew("Trying to set samplerate to %" PRIu64 "Hz.", samplerate);
 
        fill_supported_samplerates_if_needed();
 
@@ -395,9 +393,9 @@ SR_PRIV int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
                return SR_ERR;
 
        /* Set the new samplerate. */
-       ctx->cur_samplerate = samplerate;
+       devc->cur_samplerate = samplerate;
 
-       sr_dbg("la8: Samplerate set to %" PRIu64 "Hz.", ctx->cur_samplerate);
+       sr_dbg("Samplerate set to %" PRIu64 "Hz.", devc->cur_samplerate);
 
        return SR_OK;
 }
@@ -405,54 +403,54 @@ SR_PRIV int set_samplerate(const struct sr_dev_inst *sdi, uint64_t samplerate)
 /**
  * Get a block of data from the LA8.
  *
- * @param ctx The struct containing private per-device-instance data. Must not
- *            be NULL. ctx->ftdic must not be NULL either.
+ * @param devc The struct containing private per-device-instance data. Must not
+ *            be NULL. devc->ftdic must not be NULL either.
  * @return SR_OK upon success, or SR_ERR upon errors.
  */
-SR_PRIV int la8_read_block(struct context *ctx)
+SR_PRIV int la8_read_block(struct dev_context *devc)
 {
        int i, byte_offset, m, mi, p, index, bytes_read;
        time_t now;
 
-       /* Note: Caller checked that ctx and ctx->ftdic != NULL. */
+       /* Note: Caller checked that devc and devc->ftdic != NULL. */
 
-       sr_spew("la8: Reading block %d.", ctx->block_counter);
+       sr_spew("Reading block %d.", devc->block_counter);
 
-       bytes_read = la8_read(ctx, ctx->mangled_buf, BS);
+       bytes_read = la8_read(devc, devc->mangled_buf, BS);
 
        /* If first block read got 0 bytes, retry until success or timeout. */
-       if ((bytes_read == 0) && (ctx->block_counter == 0)) {
+       if ((bytes_read == 0) && (devc->block_counter == 0)) {
                do {
-                       sr_spew("la8: Reading block 0 (again).");
-                       bytes_read = la8_read(ctx, ctx->mangled_buf, BS);
+                       sr_spew("Reading block 0 (again).");
+                       bytes_read = la8_read(devc, devc->mangled_buf, BS);
                        /* TODO: How to handle read errors here? */
                        now = time(NULL);
-               } while ((ctx->done > now) && (bytes_read == 0));
+               } while ((devc->done > now) && (bytes_read == 0));
        }
 
        /* Check if block read was successful or a timeout occured. */
        if (bytes_read != BS) {
-               sr_err("la8: Trigger timed out. Bytes read: %d.", bytes_read);
-               (void) la8_reset(ctx); /* Ignore errors. */
+               sr_err("Trigger timed out. Bytes read: %d.", bytes_read);
+               (void) la8_reset(devc); /* Ignore errors. */
                return SR_ERR;
        }
 
        /* De-mangle the data. */
-       sr_spew("la8: Demangling block %d.", ctx->block_counter);
-       byte_offset = ctx->block_counter * BS;
+       sr_spew("Demangling block %d.", devc->block_counter);
+       byte_offset = devc->block_counter * BS;
        m = byte_offset / (1024 * 1024);
        mi = m * (1024 * 1024);
        for (i = 0; i < BS; i++) {
                p = i & (1 << 0);
                index = m * 2 + (((byte_offset + i) - mi) / 2) * 16;
-               index += (ctx->divcount == 0) ? p : (1 - p);
-               ctx->final_buf[index] = ctx->mangled_buf[i];
+               index += (devc->divcount == 0) ? p : (1 - p);
+               devc->final_buf[index] = devc->mangled_buf[i];
        }
 
        return SR_OK;
 }
 
-SR_PRIV void send_block_to_session_bus(struct context *ctx, int block)
+SR_PRIV void send_block_to_session_bus(struct dev_context *devc, int block)
 {
        int i;
        uint8_t sample, expected_sample;
@@ -460,14 +458,14 @@ SR_PRIV void send_block_to_session_bus(struct context *ctx, int block)
        struct sr_datafeed_logic logic;
        int trigger_point; /* Relative trigger point (in this block). */
 
-       /* Note: No sanity checks on ctx/block, caller is responsible. */
+       /* Note: No sanity checks on devc/block, caller is responsible. */
 
        /* Check if we can find the trigger condition in this block. */
        trigger_point = -1;
-       expected_sample = ctx->trigger_pattern & ctx->trigger_mask;
+       expected_sample = devc->trigger_pattern & devc->trigger_mask;
        for (i = 0; i < BS; i++) {
                /* Don't continue if the trigger was found previously. */
-               if (ctx->trigger_found)
+               if (devc->trigger_found)
                        break;
 
                /*
@@ -475,14 +473,14 @@ SR_PRIV void send_block_to_session_bus(struct context *ctx, int block)
                 * no trigger conditions were specified by the user. In that
                 * case we don't want to send an SR_DF_TRIGGER packet at all.
                 */
-               if (ctx->trigger_mask == 0x00)
+               if (devc->trigger_mask == 0x00)
                        break;
 
-               sample = *(ctx->final_buf + (block * BS) + i);
+               sample = *(devc->final_buf + (block * BS) + i);
 
-               if ((sample & ctx->trigger_mask) == expected_sample) {
+               if ((sample & devc->trigger_mask) == expected_sample) {
                        trigger_point = i;
-                       ctx->trigger_found = 1;
+                       devc->trigger_found = 1;
                        break;
                }
        }
@@ -490,14 +488,14 @@ SR_PRIV void send_block_to_session_bus(struct context *ctx, int block)
        /* If no trigger was found, send one SR_DF_LOGIC packet. */
        if (trigger_point == -1) {
                /* Send an SR_DF_LOGIC packet to the session bus. */
-               sr_spew("la8: sending SR_DF_LOGIC packet (%d bytes) for "
-                       "block %d", BS, block);
+               sr_spew("Sending SR_DF_LOGIC packet (%d bytes) for "
+                       "block %d.", BS, block);
                packet.type = SR_DF_LOGIC;
                packet.payload = &logic;
                logic.length = BS;
                logic.unitsize = 1;
-               logic.data = ctx->final_buf + (block * BS);
-               sr_session_send(ctx->session_dev_id, &packet);
+               logic.data = devc->final_buf + (block * BS);
+               sr_session_send(devc->session_dev_id, &packet);
                return;
        }
 
@@ -513,34 +511,34 @@ SR_PRIV void send_block_to_session_bus(struct context *ctx, int block)
        /* If at least one sample is located before the trigger... */
        if (trigger_point > 0) {
                /* Send pre-trigger SR_DF_LOGIC packet to the session bus. */
-               sr_spew("la8: sending pre-trigger SR_DF_LOGIC packet, "
-                       "start = %d, length = %d", block * BS, trigger_point);
+               sr_spew("Sending pre-trigger SR_DF_LOGIC packet, "
+                       "start = %d, length = %d.", block * BS, trigger_point);
                packet.type = SR_DF_LOGIC;
                packet.payload = &logic;
                logic.length = trigger_point;
                logic.unitsize = 1;
-               logic.data = ctx->final_buf + (block * BS);
-               sr_session_send(ctx->session_dev_id, &packet);
+               logic.data = devc->final_buf + (block * BS);
+               sr_session_send(devc->session_dev_id, &packet);
        }
 
        /* Send the SR_DF_TRIGGER packet to the session bus. */
-       sr_spew("la8: sending SR_DF_TRIGGER packet, sample = %d",
+       sr_spew("Sending SR_DF_TRIGGER packet, sample = %d.",
                (block * BS) + trigger_point);
        packet.type = SR_DF_TRIGGER;
        packet.payload = NULL;
-       sr_session_send(ctx->session_dev_id, &packet);
+       sr_session_send(devc->session_dev_id, &packet);
 
        /* If at least one sample is located after the trigger... */
        if (trigger_point < (BS - 1)) {
                /* Send post-trigger SR_DF_LOGIC packet to the session bus. */
-               sr_spew("la8: sending post-trigger SR_DF_LOGIC packet, "
-                       "start = %d, length = %d",
+               sr_spew("Sending post-trigger SR_DF_LOGIC packet, "
+                       "start = %d, length = %d.",
                        (block * BS) + trigger_point, BS - trigger_point);
                packet.type = SR_DF_LOGIC;
                packet.payload = &logic;
                logic.length = BS - trigger_point;
                logic.unitsize = 1;
-               logic.data = ctx->final_buf + (block * BS) + trigger_point;
-               sr_session_send(ctx->session_dev_id, &packet);
+               logic.data = devc->final_buf + (block * BS) + trigger_point;
+               sr_session_send(devc->session_dev_id, &packet);
        }
 }