From: Aurelien Jacobs Date: Sun, 2 Feb 2014 20:50:14 +0000 (+0100) Subject: hameg-hmo: use the new scpi scan API X-Git-Tag: libsigrok-0.3.0~153 X-Git-Url: https://sigrok.org/gitaction?a=commitdiff_plain;h=ca28abd6a55c87c3c17fe839b3515ce1e5f121a5;p=libsigrok.git hameg-hmo: use the new scpi scan API --- diff --git a/hardware/hameg-hmo/api.c b/hardware/hameg-hmo/api.c index 5abd8c5f..b82d2a3f 100644 --- a/hardware/hameg-hmo/api.c +++ b/hardware/hameg-hmo/api.c @@ -18,7 +18,6 @@ */ #include -#include #include "protocol.h" #define SERIALCOMM "115200/8n1/flow=1" @@ -35,16 +34,6 @@ static const int32_t hwopts[] = { SR_CONF_SERIALCOMM, }; -struct usb_id_info { - uint16_t vendor_id; - uint16_t product_id; -}; - -static struct usb_id_info ho_models[] = { - { 0x0403, 0xed72 }, /* HO720 */ - { 0x0403, 0xed73 }, /* HO730 */ -}; - enum { PG_INVALID = -1, PG_NONE, @@ -57,145 +46,6 @@ static int init(struct sr_context *sr_ctx) return std_init(sr_ctx, di, LOG_PREFIX); } -/** - * Find USB serial devices via the USB vendor ID and product ID. - * - * @param vendor_id Vendor ID of the USB device. - * @param product_id Product ID of the USB device. - * - * @return A GSList of strings containing the path of the serial device or - * NULL if no serial device is found. The returned list must be freed - * by the caller. - */ -static GSList *auto_find_usb(uint16_t vendor_id, uint16_t product_id) -{ -#ifdef __linux__ - const gchar *usb_dev; - const char device_tree[] = "/sys/bus/usb/devices/"; - GDir *devices_dir, *device_dir; - GSList *l = NULL; - GSList *tty_devs; - GSList *matched_paths; - FILE *fd; - char tmp[5]; - gchar *vendor_path, *product_path, *path_copy; - gchar *prefix, *subdir_path, *device_path, *tty_path; - unsigned long read_vendor_id, read_product_id; - const char *file; - - l = NULL; - tty_devs = NULL; - matched_paths = NULL; - - if (!(devices_dir = g_dir_open(device_tree, 0, NULL))) - return NULL; - - /* - * Find potential candidates using the vendor ID and product ID - * and store them in matched_paths. - */ - while ((usb_dev = g_dir_read_name(devices_dir))) { - vendor_path = g_strconcat(device_tree, - usb_dev, "/idVendor", NULL); - product_path = g_strconcat(device_tree, - usb_dev, "/idProduct", NULL); - - if (!g_file_test(vendor_path, G_FILE_TEST_EXISTS) || - !g_file_test(product_path, G_FILE_TEST_EXISTS)) - goto skip_device; - - if ((fd = g_fopen(vendor_path, "r")) == NULL) - goto skip_device; - - if (fgets(tmp, sizeof(tmp), fd) == NULL) { - fclose(fd); - goto skip_device; - } - read_vendor_id = strtoul(tmp, NULL, 16); - - fclose(fd); - - if ((fd = g_fopen(product_path, "r")) == NULL) - goto skip_device; - - if (fgets(tmp, sizeof(tmp), fd) == NULL) { - fclose(fd); - goto skip_device; - } - read_product_id = strtoul(tmp, NULL, 16); - - fclose(fd); - - if (vendor_id == read_vendor_id && - product_id == read_product_id) { - path_copy = g_strdup(usb_dev); - matched_paths = g_slist_prepend(matched_paths, - path_copy); - } - -skip_device: - g_free(vendor_path); - g_free(product_path); - } - g_dir_close(devices_dir); - - /* For every matched device try to find a ttyUSBX subfolder. */ - for (l = matched_paths; l; l = l->next) { - subdir_path = NULL; - - device_path = g_strconcat(device_tree, l->data, NULL); - - if (!(device_dir = g_dir_open(device_path, 0, NULL))) { - g_free(device_path); - continue; - } - - prefix = g_strconcat(l->data, ":", NULL); - - while ((file = g_dir_read_name(device_dir))) { - if (g_str_has_prefix(file, prefix)) { - subdir_path = g_strconcat(device_path, - "/", file, NULL); - break; - } - } - g_dir_close(device_dir); - - g_free(prefix); - g_free(device_path); - - if (subdir_path) { - if (!(device_dir = g_dir_open(subdir_path, 0, NULL))) { - g_free(subdir_path); - continue; - } - g_free(subdir_path); - - while ((file = g_dir_read_name(device_dir))) { - if (g_str_has_prefix(file, "ttyUSB")) { - tty_path = g_strconcat("/dev/", - file, NULL); - sr_dbg("Found USB device %04x:%04x attached to %s.", - vendor_id, product_id, tty_path); - tty_devs = g_slist_prepend(tty_devs, - tty_path); - break; - } - } - g_dir_close(device_dir); - } - } - g_slist_free_full(matched_paths, g_free); - - return tty_devs; -#else - (void)vendor_id; - (void)product_id; - - return NULL; -#endif -} - static int check_manufacturer(const char *manufacturer) { unsigned int i; @@ -207,26 +57,16 @@ static int check_manufacturer(const char *manufacturer) return SR_ERR; } -static struct sr_dev_inst *hmo_probe_serial_device(const char *serial_device, - const char *serial_options) +static struct sr_dev_inst *hmo_probe_serial_device(struct sr_scpi_dev_inst *scpi) { struct sr_dev_inst *sdi; struct dev_context *devc; struct sr_scpi_hw_info *hw_info; - struct sr_scpi_dev_inst *scpi; sdi = NULL; devc = NULL; - scpi = NULL; hw_info = NULL; - if (!(scpi = scpi_dev_inst_new(di->priv, serial_device, serial_options))) - goto fail; - - sr_info("Probing %s.", serial_device); - if (sr_scpi_open(scpi) != SR_OK) - goto fail; - if (sr_scpi_get_hw_id(scpi, &hw_info) != SR_OK) { sr_info("Couldn't get IDN response."); goto fail; @@ -263,8 +103,6 @@ static struct sr_dev_inst *hmo_probe_serial_device(const char *serial_device, fail: if (hw_info) sr_scpi_hw_info_free(hw_info); - if (scpi) - sr_scpi_free(scpi); if (sdi) sr_dev_inst_free(sdi); if (devc) @@ -275,49 +113,7 @@ fail: static GSList *scan(GSList *options) { - GSList *devices; - struct drv_context *drvc; - struct sr_dev_inst *sdi; - const char *serial_device, *serial_options; - GSList *l, *tty_devs; - unsigned int i; - - serial_device = NULL; - serial_options = SERIALCOMM; - sdi = NULL; - devices = NULL; - drvc = di->priv; - drvc->instances = NULL; - - if (sr_serial_extract_options(options, &serial_device, - &serial_options) == SR_OK) { - sdi = hmo_probe_serial_device(serial_device, serial_options); - if (sdi != NULL) { - devices = g_slist_append(devices, sdi); - drvc->instances = g_slist_append(drvc->instances, sdi); - } - } else { - tty_devs = NULL; - - for (i = 0; i < ARRAY_SIZE(ho_models); i++) { - if ((l = auto_find_usb(ho_models[i].vendor_id, - ho_models[i].product_id)) == NULL) - continue; - tty_devs = g_slist_concat(tty_devs, l); - } - - for (l = tty_devs; l; l = l->next) { - sdi = hmo_probe_serial_device(l->data, serial_options); - if (sdi != NULL) { - devices = g_slist_append(devices, sdi); - drvc->instances = g_slist_append(drvc->instances, sdi); - } - } - - g_slist_free_full(tty_devs, g_free); - } - - return devices; + return sr_scpi_scan(di->priv, options, hmo_probe_serial_device); } static GSList *dev_list(void)