]> sigrok.org Git - libsigrok.git/blobdiff - src/hardware/fx2lafw/dslogic.c
dslogic: Fix FPGA bitstream upload.
[libsigrok.git] / src / hardware / fx2lafw / dslogic.c
index 489671f5a6621b53d44d48b02c7a7aef8bd46a58..14b5decf2473859d5ef0cc5a44734abf33d77879 100644 (file)
 #include "protocol.h"
 #include "dslogic.h"
 
-#define FW_BUFSIZE 4096
+#define FW_BUFSIZE (4 * 1024)
+
+#define FPGA_UPLOAD_DELAY (10 * 1000)
+
+#define USB_TIMEOUT (3 * 1000)
+
 int dslogic_fpga_firmware_upload(const struct sr_dev_inst *sdi,
                const char *filename)
 {
@@ -38,6 +43,7 @@ int dslogic_fpga_firmware_upload(const struct sr_dev_inst *sdi,
        int chunksize, result, ret;
        unsigned char *buf;
        int sum, transferred;
+       uint8_t cmd[3];
 
        sr_dbg("Uploading FPGA firmware at %s.", filename);
 
@@ -48,21 +54,22 @@ int dslogic_fpga_firmware_upload(const struct sr_dev_inst *sdi,
        }
 
        /* Tell the device firmware is coming. */
+       memset(cmd, 0, sizeof(cmd));
        if ((ret = libusb_control_transfer(usb->devhdl, LIBUSB_REQUEST_TYPE_VENDOR |
                        LIBUSB_ENDPOINT_OUT, DS_CMD_FPGA_FW, 0x0000, 0x0000,
-                       NULL, 0, 3000)) < 0) {
+                       (unsigned char *)&cmd, sizeof(cmd), USB_TIMEOUT)) < 0) {
                sr_err("Failed to upload FPGA firmware: %s.", libusb_error_name(ret));
                return SR_ERR;
        }
        buf = g_malloc(FW_BUFSIZE);
 
-       if ((fw = g_fopen(filename, "rb")) == NULL) {
+       if (!(fw = g_fopen(filename, "rb"))) {
                sr_err("Unable to open %s for reading: %s.", filename, strerror(errno));
                return SR_ERR;
        }
 
        /* Give the FX2 time to get ready for FPGA firmware upload. */
-       g_usleep(10 * 1000);
+       g_usleep(FPGA_UPLOAD_DELAY);
 
        sum = 0;
        result = SR_OK;
@@ -71,7 +78,7 @@ int dslogic_fpga_firmware_upload(const struct sr_dev_inst *sdi,
                        break;
 
                if ((ret = libusb_bulk_transfer(usb->devhdl, 2 | LIBUSB_ENDPOINT_OUT,
-                               buf, chunksize, &transferred, 1000)) < 0) {
+                               buf, chunksize, &transferred, USB_TIMEOUT)) < 0) {
                        sr_err("Unable to configure FPGA firmware: %s.",
                                        libusb_error_name(ret));
                        result = SR_ERR;
@@ -110,7 +117,7 @@ int dslogic_start_acquisition(const struct sr_dev_inst *sdi)
        usb = sdi->conn;
        ret = libusb_control_transfer(usb->devhdl, LIBUSB_REQUEST_TYPE_VENDOR |
                        LIBUSB_ENDPOINT_OUT, DS_CMD_START, 0x0000, 0x0000,
-                       (unsigned char *)&mode, sizeof(mode), 3000);
+                       (unsigned char *)&mode, sizeof(mode), USB_TIMEOUT);
        if (ret < 0) {
                sr_err("Failed to send start command: %s.", libusb_error_name(ret));
                return SR_ERR;
@@ -131,7 +138,7 @@ int dslogic_stop_acquisition(const struct sr_dev_inst *sdi)
        usb = sdi->conn;
        ret = libusb_control_transfer(usb->devhdl, LIBUSB_REQUEST_TYPE_VENDOR |
                        LIBUSB_ENDPOINT_OUT, DS_CMD_START, 0x0000, 0x0000,
-                       (unsigned char *)&mode, sizeof(struct dslogic_mode), 3000);
+                       (unsigned char *)&mode, sizeof(struct dslogic_mode), USB_TIMEOUT);
        if (ret < 0) {
                sr_err("Failed to send stop command: %s.", libusb_error_name(ret));
                return SR_ERR;
@@ -182,7 +189,7 @@ int dslogic_fpga_configure(const struct sr_dev_inst *sdi)
 
        ret = libusb_control_transfer(usb->devhdl, LIBUSB_REQUEST_TYPE_VENDOR |
                        LIBUSB_ENDPOINT_OUT, DS_CMD_CONFIG, 0x0000, 0x0000,
-                       c, 3, 100);
+                       c, 3, USB_TIMEOUT);
        if (ret < 0) {
                sr_err("Failed to send FPGA configure command: %s.", libusb_error_name(ret));
                return SR_ERR;
@@ -218,8 +225,7 @@ int dslogic_fpga_configure(const struct sr_dev_inst *sdi)
 
        len = sizeof(struct dslogic_fpga_config);
        ret = libusb_bulk_transfer(usb->devhdl, 2 | LIBUSB_ENDPOINT_OUT,
-                       (unsigned char *)&cfg, len,
-                       &transferred, 100);
+                       (unsigned char *)&cfg, len, &transferred, USB_TIMEOUT);
        if (ret < 0 || transferred != len) {
                sr_err("Failed to send FPGA configuration: %s.", libusb_error_name(ret));
                return SR_ERR;