]> sigrok.org Git - libsigrok.git/blobdiff - hardware/common/ezusb.c
output_vcd: Remember samples between packets.
[libsigrok.git] / hardware / common / ezusb.c
index fe204a00208ab738fd7a41e3767ea3f319e482eb..884ceafdccf9fa693a401aecd0ffa1a170d963e6 100644 (file)
@@ -56,15 +56,14 @@ int ezusb_install_firmware(libusb_device_handle *hdl, const char *filename)
                return 1;
        }
 
-       result = 0;
-       offset = 0;
+       result = offset = 0;
        while (1) {
                chunksize = fread(buf, 1, 4096, fw);
                if (chunksize == 0)
                        break;
                err = libusb_control_transfer(hdl, LIBUSB_REQUEST_TYPE_VENDOR |
-                               LIBUSB_ENDPOINT_OUT, 0xa0, offset, 0x0000,
-                               buf, chunksize, 100);
+                                             LIBUSB_ENDPOINT_OUT, 0xa0, offset,
+                                             0x0000, buf, chunksize, 100);
                if (err < 0) {
                        g_warning("Unable to send firmware to device: %d", err);
                        result = 1;
@@ -78,3 +77,38 @@ int ezusb_install_firmware(libusb_device_handle *hdl, const char *filename)
 
        return result;
 }
+
+int ezusb_upload_firmware(libusb_device *dev, int configuration,
+                         const char *filename)
+{
+       struct libusb_device_handle *hdl;
+       int err;
+
+       g_message("uploading firmware to device on %d.%d",
+                 libusb_get_bus_number(dev), libusb_get_device_address(dev));
+
+       err = libusb_open(dev, &hdl);
+       if (err != 0) {
+               g_warning("failed to open device: %d", err);
+               return 1;
+       }
+
+       err = libusb_set_configuration(hdl, configuration);
+       if (err != 0) {
+               g_warning("Unable to set configuration: %d", err);
+               return 1;
+       }
+
+       if ((ezusb_reset(hdl, 1)) < 0)
+               return 1;
+
+       if (ezusb_install_firmware(hdl, filename) != 0)
+               return 1;
+
+       if ((ezusb_reset(hdl, 0)) < 0)
+               return 1;
+
+       libusb_close(hdl);
+
+       return 0;
+}