X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Ffx2lafw.c;h=a1a131e5fb18834837c684e325464f463b9bb9df;hb=bd47acabe33813acb7dd6a4ebf155418072b08b7;hp=afdd95019b8bad440c1127038d90a18037dfbb5e;hpb=f3ab43a8fbc39fe786718a7a3f5528acb3150aa7;p=libsigrok.git diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index afdd9501..a1a131e5 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -467,8 +467,7 @@ static int hw_dev_open(int dev_index) * If the firmware was recently uploaded, wait up to MAX_RENUM_DELAY_MS * milliseconds for the FX2 to renumerate. */ - ret = 0; - + ret = SR_ERR; if (ctx->fw_updated > 0) { sr_info("fx2lafw: Waiting for device to reset."); /* takes at least 300ms for the FX2 to be gone from the USB bus */ @@ -480,9 +479,8 @@ static int hw_dev_open(int dev_index) g_usleep(100 * 1000); timediff_us = g_get_monotonic_time() - ctx->fw_updated; - timediff_ms = timediff_us / G_USEC_PER_SEC; - sr_spew("fx2lafw: timediff: %" PRIi64 " us.", - timediff_us); + timediff_ms = timediff_us / 1000; + sr_spew("fx2lafw: waited %" PRIi64 " ms", timediff_ms); } sr_info("fx2lafw: Device came back after %d ms.", timediff_ms); } else { @@ -497,7 +495,21 @@ static int hw_dev_open(int dev_index) ret = libusb_claim_interface(ctx->usb->devhdl, USB_INTERFACE); if (ret != 0) { - sr_err("fx2lafw: Unable to claim interface: %d.", ret); + switch(ret) { + case LIBUSB_ERROR_BUSY: + sr_err("fx2lafw: Unable to claim USB interface. Another " + "program or driver has already claimed it."); + break; + + case LIBUSB_ERROR_NO_DEVICE: + sr_err("fx2lafw: Device has been disconnected."); + break; + + default: + sr_err("fx2lafw: Unable to claim interface: %d.", ret); + break; + } + return SR_ERR; } @@ -766,8 +778,8 @@ static void receive_transfer(struct libusb_transfer *transfer) */ packet.type = SR_DF_LOGIC; packet.payload = &logic; - logic.length = ctx->trigger_stage; - logic.unitsize = 1; + logic.unitsize = sizeof(*ctx->trigger_buffer); + logic.length = ctx->trigger_stage * logic.unitsize; logic.data = ctx->trigger_buffer; sr_session_send(ctx->session_dev_id, &packet); @@ -818,8 +830,8 @@ static void receive_transfer(struct libusb_transfer *transfer) static int hw_dev_acquisition_start(int dev_index, void *cb_data) { struct sr_dev_inst *sdi; - struct sr_datafeed_packet *packet; - struct sr_datafeed_header *header; + struct sr_datafeed_packet packet; + struct sr_datafeed_header header; struct sr_datafeed_meta_logic meta; struct context *ctx; struct libusb_transfer *transfer; @@ -833,16 +845,6 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) ctx->session_dev_id = cb_data; ctx->num_samples = 0; - if (!(packet = g_try_malloc(sizeof(struct sr_datafeed_packet)))) { - sr_err("fx2lafw: %s: packet malloc failed.", __func__); - return SR_ERR_MALLOC; - } - - if (!(header = g_try_malloc(sizeof(struct sr_datafeed_header)))) { - sr_err("fx2lafw: %s: header malloc failed.", __func__); - return SR_ERR_MALLOC; - } - /* Start with 2K transfer, subsequently increased to 4K. */ size = 2048; for (i = 0; i < NUM_SIMUL_TRANSFERS; i++) { @@ -871,21 +873,18 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) 40, receive_data, NULL); free(lupfd); /* NOT g_free()! */ - packet->type = SR_DF_HEADER; - packet->payload = header; - header->feed_version = 1; - gettimeofday(&header->starttime, NULL); - sr_session_send(cb_data, packet); + packet.type = SR_DF_HEADER; + packet.payload = &header; + header.feed_version = 1; + gettimeofday(&header.starttime, NULL); + sr_session_send(cb_data, &packet); /* Send metadata about the SR_DF_LOGIC packets to come. */ - packet->type = SR_DF_META_LOGIC; - packet->payload = &meta; + packet.type = SR_DF_META_LOGIC; + packet.payload = &meta; meta.samplerate = ctx->cur_samplerate; meta.num_probes = ctx->sample_wide ? 16 : 8; - sr_session_send(cb_data, packet); - - g_free(header); - g_free(packet); + sr_session_send(cb_data, &packet); if ((ret = command_start_acquisition (ctx->usb->devhdl, ctx->cur_samplerate, ctx->sample_wide)) != SR_OK) {