Factor out common hw_init() driver code.
Most drivers do pretty much the same things in their hw_init() right now, so factor out that code to std_hw_init() in std.c.
This commit is contained in:
parent
4b97c74e0b
commit
063e7aef6d
|
@ -37,7 +37,8 @@ libsigrok_la_SOURCES = \
|
|||
strutil.c \
|
||||
log.c \
|
||||
version.c \
|
||||
error.c
|
||||
error.c \
|
||||
std.c
|
||||
|
||||
libsigrok_la_LIBADD = \
|
||||
$(LIBOBJS) \
|
||||
|
|
|
@ -91,17 +91,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -52,17 +52,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -420,17 +420,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -70,17 +70,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -74,17 +74,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -148,17 +148,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -89,17 +89,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *fluke_scan(const char *conn, const char *serialcomm)
|
||||
|
|
|
@ -384,17 +384,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -259,17 +259,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -70,17 +70,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -54,17 +54,7 @@ static struct sr_dev_driver *di = &link_mso19_driver_info;
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -139,17 +139,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -57,17 +57,7 @@ static struct sr_dev_driver *di = &ols_driver_info;
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -152,17 +152,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -192,19 +192,9 @@ static int clear_instances(int dmm)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx, int dmm)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
sr_dbg("Selected '%s' subdriver.", dmms[dmm].di->name);
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
dmms[dmm].di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, dmms[dmm].di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *scan(const char *conn, const char *serialcomm, int dmm)
|
||||
|
|
|
@ -70,17 +70,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -57,23 +57,13 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx, int dmm)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
if (dmm == UNI_T_UT61D)
|
||||
di = di_ut61d;
|
||||
else if (dmm == VOLTCRAFT_VC820)
|
||||
di = di_vc820;
|
||||
sr_dbg("Selected '%s' subdriver.", di->name);
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static int hw_init_ut61d(struct sr_context *sr_ctx)
|
||||
|
|
|
@ -74,17 +74,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, DRIVER_LOG_DOMAIN);
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -289,17 +289,7 @@ static int clear_instances(void)
|
|||
|
||||
static int hw_init(struct sr_context *sr_ctx)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("Driver context malloc failed.");
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
return std_hw_init(sr_ctx, di, "zeroplus: ");
|
||||
}
|
||||
|
||||
static GSList *hw_scan(GSList *options)
|
||||
|
|
|
@ -123,6 +123,11 @@ SR_PRIV int sr_source_add(int fd, int events, int timeout,
|
|||
SR_PRIV int sr_session_send(const struct sr_dev_inst *sdi,
|
||||
const struct sr_datafeed_packet *packet);
|
||||
|
||||
/*--- std.c -----------------------------------------------------------------*/
|
||||
|
||||
SR_PRIV int std_hw_init(struct sr_context *sr_ctx, struct sr_dev_driver *di,
|
||||
const char *prefix);
|
||||
|
||||
/*--- hardware/common/serial.c ----------------------------------------------*/
|
||||
|
||||
enum {
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
* This file is part of the sigrok project.
|
||||
*
|
||||
* Copyright (C) 2013 Uwe Hermann <uwe@hermann-uwe.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include "libsigrok.h"
|
||||
#include "libsigrok-internal.h"
|
||||
|
||||
/**
|
||||
* Standard sr_driver_init() API helper.
|
||||
*
|
||||
* This function can be used to simplify most driver's hw_init() API callback.
|
||||
*
|
||||
* It creates a new 'struct drv_context' (drvc), assigns sr_ctx to it, and
|
||||
* then 'drvc' is assigned to the 'struct sr_dev_driver' (di) that is passed.
|
||||
*
|
||||
* @param sr_ctx The libsigrok context to assign.
|
||||
* @param di The driver instance to use.
|
||||
* @param prefix A driver-specific prefix string used for log messages.
|
||||
*
|
||||
* @return SR_OK upon success, SR_ERR_ARG upon invalid arguments, or
|
||||
* SR_ERR_MALLOC upon memory allocation errors.
|
||||
*/
|
||||
SR_PRIV int std_hw_init(struct sr_context *sr_ctx, struct sr_dev_driver *di,
|
||||
const char *prefix)
|
||||
{
|
||||
struct drv_context *drvc;
|
||||
|
||||
if (!di) {
|
||||
sr_err("%sInvalid driver, cannot initialize.", prefix);
|
||||
return SR_ERR_ARG;
|
||||
}
|
||||
|
||||
if (!(drvc = g_try_malloc0(sizeof(struct drv_context)))) {
|
||||
sr_err("%sDriver context malloc failed.", prefix);
|
||||
return SR_ERR_MALLOC;
|
||||
}
|
||||
|
||||
drvc->sr_ctx = sr_ctx;
|
||||
di->priv = drvc;
|
||||
|
||||
return SR_OK;
|
||||
}
|
Loading…
Reference in New Issue