#include "libsigrok.h"
#include "libsigrok-internal.h"
+/* Message logging helpers with driver-specific prefix string. */
+#define DRIVER_LOG_DOMAIN "hwdriver: "
+#define sr_log(l, s, args...) sr_log(l, DRIVER_LOG_DOMAIN s, ## args)
+#define sr_spew(s, args...) sr_spew(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_dbg(s, args...) sr_dbg(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_info(s, args...) sr_info(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_warn(s, args...) sr_warn(DRIVER_LOG_DOMAIN s, ## args)
+#define sr_err(s, args...) sr_err(DRIVER_LOG_DOMAIN s, ## args)
+
/**
* @file
*
/**
* Initialize a hardware driver.
*
+ * This usually involves memory allocations and variable initializations
+ * within the driver, but _not_ scanning for attached devices.
+ * The API call sr_driver_scan() is used for that.
+ *
* @param ctx A libsigrok context object allocated by a previous call to
- * sr_init().
- * @param driver The driver to initialize.
+ * sr_init(). Must not be NULL.
+ * @param driver The driver to initialize. This must be a pointer to one of
+ * the entries returned by sr_driver_list(). Must not be NULL.
*
- * @return SR_OK if all went well, or an error code otherwise.
+ * @return SR_OK upon success, SR_ERR_ARG upon invalid parameters,
+ * SR_ERR_BUG upon internal errors, or another negative error code
+ * upon other errors.
*/
SR_API int sr_driver_init(struct sr_context *ctx, struct sr_dev_driver *driver)
{
+ int ret;
+
+ if (!ctx) {
+ sr_err("Invalid libsigrok context, can't initialize.");
+ return SR_ERR_ARG;
+ }
- if (driver->init)
- return driver->init(ctx);
+ if (!driver) {
+ sr_err("Invalid driver, can't initialize.");
+ return SR_ERR_ARG;
+ }
- return SR_OK;
+ sr_spew("Initializing driver '%s'.", driver->name);
+ if ((ret = driver->init(ctx)) < 0)
+ sr_err("Failed to initialize the driver: %d.", ret);
+
+ return ret;
}
/**
{
int ret;
- if (!sdi || !sdi->driver)
+ if (!sdi || !sdi->driver || !value)
return SR_ERR;
if (!sdi->driver->config_set)