X-Git-Url: http://sigrok.org/gitweb/?a=blobdiff_plain;f=hardware%2Ffx2lafw%2Ffx2lafw.c;h=4344cf24199e4913b3313d09fafb89abe58f26e1;hb=61136ea6035778f2894a1e32b78f94a0640a5a91;hp=28866133962ec6d3eb5e3b7883d34b770068e95f;hpb=0caa1ef0cb0b2231e232a7d1681e4e13fe838035;p=libsigrok.git diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index 28866133..4344cf24 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -24,8 +24,8 @@ #include #include #include "config.h" -#include "sigrok.h" -#include "sigrok-internal.h" +#include "libsigrok.h" +#include "libsigrok-internal.h" #include "fx2lafw.h" #include "command.h" @@ -38,6 +38,13 @@ static const struct fx2lafw_profile supported_fx2[] = { { 0x08a9, 0x0014, "CWAV", "USBee AX", NULL, FIRMWARE_DIR "/fx2lafw-cwav-usbeeax.fw", 0 }, + /* + * CWAV USBee DX + * XZL-Studio DX + */ + { 0x08a9, 0x0015, "CWAV", "USBee DX", NULL, + FIRMWARE_DIR "/fx2lafw-cwav-usbeedx.fw", + DEV_CAPS_16BIT }, /* * CWAV USBee SX @@ -375,26 +382,28 @@ static struct context *fx2lafw_dev_new(void) * API callbacks */ -static int hw_init(const char *devinfo) +static int hw_init(void) +{ + + if (libusb_init(&usb_context) != 0) { + sr_warn("fx2lafw: Failed to initialize libusb."); + return SR_ERR; + } + + return SR_OK; +} + +static int hw_scan(void) { struct sr_dev_inst *sdi; struct libusb_device_descriptor des; const struct fx2lafw_profile *prof; struct context *ctx; libusb_device **devlist; - int ret; - int devcnt = 0; - int i, j; - - /* Avoid compiler warnings. */ - (void)devinfo; - - if (libusb_init(&usb_context) != 0) { - sr_warn("fx2lafw: Failed to initialize libusb."); - return 0; - } + int devcnt, ret, i, j; /* Find all fx2lafw compatible devices and upload firmware to them. */ + devcnt = 0; libusb_get_device_list(usb_context, &devlist); for (i = 0; devlist[i]; i++) { @@ -662,11 +671,11 @@ static int receive_data(int fd, int revents, void *cb_data) static void abort_acquisition(struct context *ctx) { - unsigned int i; + int i; ctx->num_samples = -1; - for (i = 0; i < ctx->num_transfers; i++) { + for (i = ctx->num_transfers - 1; i >= 0; i--) { if (ctx->transfers[i]) libusb_cancel_transfer(ctx->transfers[i]); } @@ -918,6 +927,10 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) return SR_ERR; ctx = sdi->priv; + + if (ctx->submitted_transfers != 0) + return SR_ERR; + ctx->session_dev_id = cb_data; ctx->num_samples = 0; ctx->empty_transfer_count = 0; @@ -942,9 +955,9 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) 2 | LIBUSB_ENDPOINT_IN, buf, size, receive_transfer, ctx, timeout); if (libusb_submit_transfer(transfer) != 0) { - /* TODO: Free them all. */ libusb_free_transfer(transfer); g_free(buf); + abort_acquisition(ctx); return SR_ERR; } ctx->transfers[i] = transfer; @@ -972,6 +985,7 @@ static int hw_dev_acquisition_start(int dev_index, void *cb_data) if ((ret = command_start_acquisition (ctx->usb->devhdl, ctx->cur_samplerate, ctx->sample_wide)) != SR_OK) { + abort_acquisition(ctx); return ret; } @@ -1000,6 +1014,7 @@ SR_PRIV struct sr_dev_driver fx2lafw_driver_info = { .api_version = 1, .init = hw_init, .cleanup = hw_cleanup, + .scan = hw_scan, .dev_open = hw_dev_open, .dev_close = hw_dev_close, .dev_info_get = hw_dev_info_get,