diff --git a/hardware/common/ezusb.c b/hardware/common/ezusb.c index fe204a00..68692c3a 100644 --- a/hardware/common/ezusb.c +++ b/hardware/common/ezusb.c @@ -78,3 +78,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; +} diff --git a/hardware/saleae-logic/saleae-logic.c b/hardware/saleae-logic/saleae-logic.c index 9ebb207e..ee6a406d 100644 --- a/hardware/saleae-logic/saleae-logic.c +++ b/hardware/saleae-logic/saleae-logic.c @@ -275,34 +275,10 @@ struct sigrok_device_instance *sl_open_device(int device_index) int upload_firmware(libusb_device *dev) { - struct libusb_device_handle *hdl; - int err; + int ret; - 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); + if (ret = ezusb_upload_firmware(dev, USB_CONFIGURATION, FIRMWARE) != 0) return 1; - } - - err = libusb_set_configuration(hdl, USB_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, FIRMWARE) != 0) - return 1; - - if ((ezusb_reset(hdl, 0)) < 0) - return 1; - - libusb_close(hdl); /* Remember when the last firmware update was done. */ g_get_current_time(&firmware_updated); diff --git a/sigrok.h b/sigrok.h index f5678e76..4c3af637 100644 --- a/sigrok.h +++ b/sigrok.h @@ -394,6 +394,8 @@ int session_save(char *filename); int ezusb_reset(struct libusb_device_handle *hdl, int set_clear); int ezusb_install_firmware(libusb_device_handle *hdl, char *filename); +int ezusb_upload_firmware(libusb_device *dev, int configuration, + const char *filename); GSList *list_serial_ports(void); int serial_open(const char *pathname, int flags);