From: Uwe Hermann Date: Wed, 30 May 2012 07:10:41 +0000 (+0200) Subject: sr: fx2lafw: Fix a firmware upload bug on 32bit systems. X-Git-Tag: libsigrok-0.1.1~11 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=e8bd58ffd2615ab2fbb0a963f359a705c584e4e1;p=libsigrok.git sr: fx2lafw: Fix a firmware upload bug on 32bit systems. The glib GTimeVal data type (and some functions using it) will be faded out from glib sooner or later, so it's not a good idea to use them anyway. In this specific case GTimeVal.tv_sec was overflowing, leading a check in libsigrok to fail, and thus to FX2 firmware upload errors, i.e. non-working fx2lafw devices. http://thread.gmane.org/gmane.comp.debugging.sigrok.devel/166 The root cause is that GTimeVal.tv_sec is a 'glong' (8 bytes on 64bit systems, but only 4 on 32bit systems). We now use an int64_t (and g_get_monotonic_time() instead of the more problematics g_get_current_time() which uses a GTimeVal). This has been verified to fix the issue on a 32bit system. Other uses of GTimeVal in libsigrok will be removed in a later release. Also, drop unneeded GTV_TO_MSEC. --- diff --git a/hardware/fx2lafw/fx2lafw.c b/hardware/fx2lafw/fx2lafw.c index a13e9d80..1109d802 100644 --- a/hardware/fx2lafw/fx2lafw.c +++ b/hardware/fx2lafw/fx2lafw.c @@ -415,7 +415,7 @@ static int hw_init(const char *devinfo) if (ezusb_upload_firmware(devlist[i], USB_CONFIGURATION, prof->firmware) == SR_OK) /* Remember when the firmware on this device was updated */ - g_get_current_time(&ctx->fw_updated); + ctx->fw_updated = g_get_monotonic_time(); else sr_err("fx2lafw: Firmware upload failed for " "device %d.", devcnt); @@ -432,10 +432,10 @@ static int hw_init(const char *devinfo) static int hw_dev_open(int dev_index) { - GTimeVal cur_time; struct sr_dev_inst *sdi; struct context *ctx; - int timediff, ret; + int ret; + int64_t timediff_us, timediff_ms; if (!(sdi = sr_dev_inst_get(dev_insts, dev_index))) return SR_ERR; @@ -446,19 +446,23 @@ static int hw_dev_open(int dev_index) * for the FX2 to renumerate. */ ret = 0; - if (GTV_TO_MSEC(ctx->fw_updated) > 0) { + + 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 */ g_usleep(300 * 1000); - timediff = 0; - while (timediff < MAX_RENUM_DELAY) { + timediff_ms = 0; + while (timediff_ms < MAX_RENUM_DELAY) { if ((ret = fx2lafw_dev_open(dev_index)) == SR_OK) break; g_usleep(100 * 1000); - g_get_current_time(&cur_time); - timediff = GTV_TO_MSEC(cur_time) - GTV_TO_MSEC(ctx->fw_updated); + + 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); } - sr_info("fx2lafw: Device came back after %d ms.", timediff); + sr_info("fx2lafw: Device came back after %d ms.", timediff_ms); } else { ret = fx2lafw_dev_open(dev_index); } diff --git a/hardware/fx2lafw/fx2lafw.h b/hardware/fx2lafw/fx2lafw.h index dca21ba3..f8bf99a6 100644 --- a/hardware/fx2lafw/fx2lafw.h +++ b/hardware/fx2lafw/fx2lafw.h @@ -62,7 +62,7 @@ struct context { * after the upgrade) this is like a global lock. No device will open * until a proper delay after the last device was upgraded. */ - GTimeVal fw_updated; + int64_t fw_updated; /* Device/Capture Settings */ uint64_t cur_samplerate; diff --git a/sigrok-internal.h b/sigrok-internal.h index d79be5f9..fde076bb 100644 --- a/sigrok-internal.h +++ b/sigrok-internal.h @@ -53,8 +53,6 @@ struct sr_serial_dev_inst { int fd; }; -#define GTV_TO_MSEC(gtv) (gtv.tv_sec * 1000 + gtv.tv_usec / 1000) - #ifdef HAVE_LIBUSB_1_0 /* USB-specific instances */ SR_PRIV struct sr_usb_dev_inst *sr_usb_dev_inst_new(uint8_t bus,