From: Bert Vermeulen Date: Sun, 8 Jul 2012 14:25:23 +0000 (+0200) Subject: sr: split driver init into init() and scan() X-Git-Tag: dsupstream~844 X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=80bf04263528998feb17cedc5b7aa9668dbc8d4d;hp=b159add3d9e3804f7806e82b01374fa099610668;p=libsigrok.git sr: split driver init into init() and scan() init() now only does whatever administrative stuff it needs (typically not much), and returns an error code. scan() can be called multiple times during the life of an application, and returns a GSList of struct sr_dev_inst * of devices found during that scan. The instances are a copy of the ones stored in the driver's own instance list, to be freed by the caller with g_slist_free() only. The scan() call can be passed a GSList of struct sr_hwopt *, to direct the scanning. --- diff --git a/hwdriver.c b/hwdriver.c index 42932b36..91b0e6d9 100644 --- a/hwdriver.c +++ b/hwdriver.c @@ -125,47 +125,44 @@ static struct sr_dev_driver *drivers_list[] = { */ SR_API struct sr_dev_driver **sr_driver_list(void) { + return drivers_list; } /** * Initialize a hardware driver. * - * The specified driver is initialized, and all devices discovered by the - * driver are instantiated. - * * @param driver The driver to initialize. * - * @return The number of devices found and instantiated by the driver. + * @return SR_OK if all went well, or an error code otherwise. */ SR_API int sr_driver_init(struct sr_dev_driver *driver) { - int num_devs, num_probes, i, j; - int num_initialized_devs = 0; - struct sr_dev *dev; - char **probe_names; - - sr_dbg("initializing %s driver", driver->name); - num_devs = driver->init(); - for (i = 0; i < num_devs; i++) { - num_probes = GPOINTER_TO_INT( - driver->dev_info_get(i, SR_DI_NUM_PROBES)); - probe_names = (char **)driver->dev_info_get(i, - SR_DI_PROBE_NAMES); - - if (!probe_names) { - sr_warn("hwdriver: %s: driver %s does not return a " - "list of probe names", __func__, driver->name); - continue; - } - - dev = sr_dev_new(driver, i); - for (j = 0; j < num_probes; j++) - sr_dev_probe_add(dev, probe_names[j]); - num_initialized_devs++; - } - return num_initialized_devs; + if (driver->init) + return driver->init(); + + return SR_OK; +} + +/** + * Tell a hardware driver to scan for devices. + * + * @param driver The driver. + * @param options A list of struct sr_hwopt options to pass to the driver's + * scanner. + * + * @return A GSList * of struct sr_dev_inst, or NULL if no devices were found. + * This list must be freed by the caller, but without freeing the data + * pointed to in the list. + */ +SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options) +{ + + if (driver->scan) + return driver->scan(options); + + return NULL; } SR_PRIV void sr_hw_cleanup_all(void) diff --git a/libsigrok.h b/libsigrok.h index 0ba97bce..bedfbdb7 100644 --- a/libsigrok.h +++ b/libsigrok.h @@ -478,7 +478,7 @@ struct sr_dev_driver { int api_version; int (*init) (void); int (*cleanup) (void); - int (*scan) (void); + GSList *(*scan) (GSList *options); /* Device-specific */ int (*dev_open) (int dev_index); diff --git a/proto.h b/proto.h index cb5c211c..81544181 100644 --- a/proto.h +++ b/proto.h @@ -73,6 +73,7 @@ SR_API int sr_filter_probes(int in_unitsize, int out_unitsize, SR_API struct sr_dev_driver **sr_driver_list(void); SR_API int sr_driver_init(struct sr_dev_driver *driver); +SR_API GSList *sr_driver_scan(struct sr_dev_driver *driver, GSList *options); SR_API gboolean sr_driver_hwcap_exists(struct sr_dev_driver *driver, int hwcap); SR_API const struct sr_hwcap_option *sr_hw_hwcap_get(int hwcap);