From: Guido Trentalancia Date: Fri, 16 Nov 2018 17:42:47 +0000 (+0100) Subject: hameg-hmo: Try to find a valid serialcomm if none is supplied. X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=232eb33c67ecf5b1ab81d04ba32ec28b5c20794f;p=libsigrok.git hameg-hmo: Try to find a valid serialcomm if none is supplied. If no serial port option is specified on the command-line using the "serialcomm" driver option, but the device is connected through USB and it requires a known default serial port option, then use it in order to avoid data corruption or even worse problems. Note: the easiest way to reproduce data corruption on HMO3000 series is to start an analog data acquisition (e.g. on channel CH1) after switching from Ethernet mode to USB VCP mode (HO732 USB/Ethernet interface). This fixes parts of bug #1321. --- diff --git a/src/scpi/scpi_serial.c b/src/scpi/scpi_serial.c index c73d1b48..8690d6f1 100644 --- a/src/scpi/scpi_serial.c +++ b/src/scpi/scpi_serial.c @@ -74,11 +74,30 @@ static GSList *scpi_serial_scan(struct drv_context *drvc) static int scpi_serial_dev_inst_new(void *priv, struct drv_context *drvc, const char *resource, char **params, const char *serialcomm) { + GSList *l, *r; + unsigned i; struct scpi_serial *sscpi = priv; (void)drvc; (void)params; + /* If no serial port option is specified on the command-line using the + * "serialcomm" driver option, but the device is connected through USB + * and it requires a known default serial port option, then used it in + * order to avoid data corruption or even worse problems. + */ + if (!serialcomm) { + for (i = 0; i < ARRAY_SIZE(scpi_serial_usb_ids); i++) { + if (!(l = sr_serial_find_usb(scpi_serial_usb_ids[i].vendor_id, + scpi_serial_usb_ids[i].product_id))) + continue; + for (r = l; r; r = r->next) + if (!strcmp(resource, r->data) && scpi_serial_usb_ids[i].serialcomm) + serialcomm = scpi_serial_usb_ids[i].serialcomm; + g_slist_free_full(l, g_free); + } + } + sscpi->serial = sr_serial_dev_inst_new(resource, serialcomm); return SR_OK;