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:
Uwe Hermann 2013-01-29 12:55:00 +01:00
parent 4b97c74e0b
commit 063e7aef6d
22 changed files with 85 additions and 210 deletions

View File

@ -37,7 +37,8 @@ libsigrok_la_SOURCES = \
strutil.c \
log.c \
version.c \
error.c
error.c \
std.c
libsigrok_la_LIBADD = \
$(LIBOBJS) \

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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 {

59
std.c Normal file
View File

@ -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;
}