On Sun, 19 Jun 2011, steve tell wrote:
On Sat, 18 Jun 2011, Mike Frysinger wrote:
+ * language bindings. In theory, this code could someday be merged into
+ * the core urjtag library.
let's do that now rather than later
This is the first of a 2-part patch. This first one only refactors
existing routines, in preparation for a cleaner version of the pyhon
bindings patch.
Subject: [PATCH 1/2] create urj_tap_chain_connect() and urj_bus_init()
by factoring cmd_cable() and cmd_initbus() respectively.
new routines present a more convenient API for use by C and language
bindings.
---
urjtag/include/urjtag/bus.h | 9 ++++
urjtag/include/urjtag/chain.h | 9 ++++
urjtag/include/urjtag/cmd.h | 18 ++++++++
urjtag/src/bus/buses.c | 43 ++++++++++++++++++++
urjtag/src/cmd/cmd_cable.c | 80 +-------------------------------------
urjtag/src/cmd/cmd_initbus.c | 35 +----------------
urjtag/src/tap/chain.c | 87 ++++++++++++++++++++++++++++++++++++++++-
7 files changed, 167 insertions(+), 114 deletions(-)
From 0820d34f97cc713e34ec6a2c8e067987510e1be8 Mon Sep 17 00:00:00 2001
From: Steve Tell <[email protected]>
Date: Sat, 25 Jun 2011 12:49:01 -0400
Subject: [PATCH 1/2] create urj_tap_chain_connect() and urj_bus_init()
by factoring cmd_cable() and cmd_initbus() respectively.
new routines present a more convenient API for use by C and language
bindings.
---
urjtag/include/urjtag/bus.h | 9 ++++
urjtag/include/urjtag/chain.h | 9 ++++
urjtag/include/urjtag/cmd.h | 18 ++++++++
urjtag/src/bus/buses.c | 43 ++++++++++++++++++++
urjtag/src/cmd/cmd_cable.c | 80 +-------------------------------------
urjtag/src/cmd/cmd_initbus.c | 35 +----------------
urjtag/src/tap/chain.c | 87 ++++++++++++++++++++++++++++++++++++++++-
7 files changed, 167 insertions(+), 114 deletions(-)
diff --git a/urjtag/include/urjtag/bus.h b/urjtag/include/urjtag/bus.h
index d08157c..e1cadae 100644
--- a/urjtag/include/urjtag/bus.h
+++ b/urjtag/include/urjtag/bus.h
@@ -58,4 +58,13 @@ int urj_bus_buses_delete (urj_bus_t *abus);
*/
int urj_bus_buses_set (int n);
+/**
+ * initialize bus, assigning a driver to it.
+ * @param chain jtag chain object
+ * @param drivername name of bus driver
+ * @param params additional driver-specific parameters
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
+ */
+int urj_bus_init (urj_chain_t *chain, const char *drivername, char *params[]);
+
#endif /* URJ_BUS_H */
diff --git a/urjtag/include/urjtag/chain.h b/urjtag/include/urjtag/chain.h
index 9b8d477..7af51d2 100644
--- a/urjtag/include/urjtag/chain.h
+++ b/urjtag/include/urjtag/chain.h
@@ -49,6 +49,15 @@ struct URJ_CHAIN
urj_chain_t *urj_tap_chain_alloc (void);
void urj_tap_chain_free (urj_chain_t *chain);
+/**
+ * Connect to a chain of Tap controllers using the specified cable type.
+ * @param chain chain object to connect
+ * @param drivername name of cable driver.
+ * @param params some drivers reqiure additional parameters.
+ *
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
+ */
+int urj_tap_chain_connect (urj_chain_t *chain, char *drivername, char
*params[]);
void urj_tap_chain_disconnect (urj_chain_t *chain);
/** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
int urj_tap_chain_clock (urj_chain_t *chain, int tms, int tdi, int n);
diff --git a/urjtag/include/urjtag/cmd.h b/urjtag/include/urjtag/cmd.h
index b7ea807..2cab40c 100644
--- a/urjtag/include/urjtag/cmd.h
+++ b/urjtag/include/urjtag/cmd.h
@@ -56,4 +56,22 @@ int urj_cmd_run (urj_chain_t *chain, char *params[]);
*/
char **urj_cmd_complete (urj_chain_t *chain, const char *line, int point);
+/**
+ * Parse an number from a string, in the syntaxes supported by urjtag.
+ * @param s string containing textual representation of a number
+ * @param i pointer to variable in which to store the resulting number.
+ * @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error
+ */
+int urj_cmd_get_number (const char *s, long unsigned *i);
+
+/** @return URJ_STATUS_OK on success; URJ_STATUS_FAIL on error */
+int urj_cmd_test_cable (urj_chain_t * chain);
+
+/**
+ * Count the number of parameters in a list of strings
+ * @param params pointer to array of null-terminated strings
+ * @return number of parameter strings; 0 for none.
+ */
+int urj_cmd_params (char *params[]);
+
#endif /* URJ_CMD_H */
diff --git a/urjtag/src/bus/buses.c b/urjtag/src/bus/buses.c
index e59960f..e7578fb 100644
--- a/urjtag/src/bus/buses.c
+++ b/urjtag/src/bus/buses.c
@@ -141,6 +141,49 @@ urj_bus_buses_set (int n)
return URJ_STATUS_OK;
}
+
+int
+urj_bus_init (urj_chain_t *chain, const char *drivername, char *params[])
+{
+ int drv, i;
+ const urj_param_t **bus_params;
+
+ if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
+ return URJ_STATUS_FAIL;
+
+ if (urj_tap_chain_active_part (chain) == NULL)
+ return URJ_STATUS_FAIL;
+
+ for (drv = 0; urj_bus_drivers[drv] != NULL; drv++)
+ if (strcasecmp (urj_bus_drivers[drv]->name, drivername) == 0)
+ break;
+
+ if (urj_bus_drivers[drv] == NULL)
+ {
+ urj_error_set (URJ_ERROR_NOTFOUND, "Unknown bus: %s", drivername);
+ return URJ_STATUS_FAIL;
+ }
+
+ urj_param_init (&bus_params);
+ for (i = 0; params[i] != NULL; i++)
+ if (urj_param_push (&urj_bus_param_list, &bus_params,
+ params[i]) != URJ_STATUS_OK)
+ {
+ urj_param_clear (&bus_params);
+ return URJ_STATUS_FAIL;
+ }
+
+ if (urj_bus_init_bus(chain, urj_bus_drivers[drv], bus_params) == NULL)
+ {
+ urj_param_clear (&bus_params);
+ return URJ_STATUS_FAIL;
+ }
+
+ urj_param_clear (&bus_params);
+ return URJ_STATUS_OK;
+}
+
+
urj_bus_t *
urj_bus_init_bus (urj_chain_t *chain, const urj_bus_driver_t *bus_driver,
const urj_param_t *param[])
diff --git a/urjtag/src/cmd/cmd_cable.c b/urjtag/src/cmd/cmd_cable.c
index 3fd5700..45e15b8 100644
--- a/urjtag/src/cmd/cmd_cable.c
+++ b/urjtag/src/cmd/cmd_cable.c
@@ -48,15 +48,8 @@ cable_probe (char *params[])
static int
cmd_cable_run (urj_chain_t *chain, char *params[])
{
- urj_cable_t *cable = NULL;
int i;
- int j;
int paramc = urj_cmd_params (params);
- const urj_param_t **cable_params;
- urj_cable_parport_devtype_t devtype = -1;
- const char *devname = NULL;
- int param_start = 2;
- const urj_cable_driver_t *driver;
/* we need at least one parameter for 'cable' command */
if (paramc < 2)
@@ -102,78 +95,7 @@ cmd_cable_run (urj_chain_t *chain, char *params[])
}
}
- /* search cable driver list */
- for (i = 0; urj_tap_cable_drivers[i]; i++)
- if (strcasecmp (params[1], urj_tap_cable_drivers[i]->name) == 0)
- break;
- driver = urj_tap_cable_drivers[i];
- if (!driver)
- {
- urj_error_set (URJ_ERROR_NOTFOUND, _("Unknown cable type: '%s'"),
- params[1]);
- return URJ_STATUS_FAIL;
- }
-
- if (paramc >= 3 && strcasecmp (params[2], "help") == 0)
- {
- driver->help (URJ_LOG_LEVEL_NORMAL, driver->name);
- return URJ_STATUS_OK;
- }
-
- if (driver->device_type == URJ_CABLE_DEVICE_PARPORT)
- {
- if (paramc < 4)
- {
- urj_error_set (URJ_ERROR_SYNTAX,
- "parallel cable requires >= 4 parameters");
- return URJ_STATUS_FAIL;
- }
- for (j = 0; j < URJ_CABLE_PARPORT_N_DEVS; j++)
- if (strcasecmp (params[2],
- urj_cable_parport_devtype_string(j)) == 0)
- break;
- if (j == URJ_CABLE_PARPORT_N_DEVS)
- {
- urj_error_set (URJ_ERROR_INVALID,
- "unknown parallel port device type '%s'",
params[2]);
- return URJ_STATUS_FAIL;
- }
-
- devtype = j;
- devname = params[3];
- param_start = 4;
- }
-
- urj_param_init (&cable_params);
- for (j = param_start; params[j] != NULL; j++)
- if (urj_param_push (&urj_cable_param_list, &cable_params,
- params[j]) != URJ_STATUS_OK)
- {
- urj_param_clear (&cable_params);
- return URJ_STATUS_FAIL;
- }
-
- switch (driver->device_type)
- {
- case URJ_CABLE_DEVICE_PARPORT:
- cable = urj_tap_cable_parport_connect (chain, driver, devtype, devname,
- cable_params);
- break;
- case URJ_CABLE_DEVICE_USB:
- cable = urj_tap_cable_usb_connect (chain, driver, cable_params);
- break;
- case URJ_CABLE_DEVICE_OTHER:
- cable = urj_tap_cable_other_connect (chain, driver, cable_params);
- break;
- }
-
- urj_param_clear (&cable_params);
-
- if (cable == NULL)
- return URJ_STATUS_FAIL;
-
- chain->cable->chain = chain;
- return URJ_STATUS_OK;
+ return urj_tap_chain_connect(chain, params[1], ¶ms[2]);
}
static void
diff --git a/urjtag/src/cmd/cmd_initbus.c b/urjtag/src/cmd/cmd_initbus.c
index 2c9f266..946ac48 100644
--- a/urjtag/src/cmd/cmd_initbus.c
+++ b/urjtag/src/cmd/cmd_initbus.c
@@ -51,40 +51,7 @@ cmd_initbus_run (urj_chain_t *chain, char *params[])
return URJ_STATUS_FAIL;
}
- if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
- return URJ_STATUS_FAIL;
-
- if (urj_tap_chain_active_part (chain) == NULL)
- return URJ_STATUS_FAIL;
-
- for (drv = 0; urj_bus_drivers[drv] != NULL; drv++)
- if (strcasecmp (urj_bus_drivers[drv]->name, params[1]) == 0)
- break;
-
- if (urj_bus_drivers[drv] == NULL)
- {
- urj_error_set (URJ_ERROR_NOTFOUND, _("Unknown bus: %s"), params[1]);
- return URJ_STATUS_FAIL;
- }
-
- urj_param_init (&bus_params);
- for (i = 2; params[i] != NULL; i++)
- if (urj_param_push (&urj_bus_param_list, &bus_params,
- params[i]) != URJ_STATUS_OK)
- {
- urj_param_clear (&bus_params);
- return URJ_STATUS_FAIL;
- }
-
- if (urj_bus_init_bus(chain, urj_bus_drivers[drv], bus_params) == NULL)
- {
- urj_param_clear (&bus_params);
- return URJ_STATUS_FAIL;
- }
-
- urj_param_clear (&bus_params);
-
- return URJ_STATUS_OK;
+ return urj_bus_init(chain, params[0], ¶ms[1]);
}
static void
diff --git a/urjtag/src/tap/chain.c b/urjtag/src/tap/chain.c
index d677a88..97665f8 100644
--- a/urjtag/src/tap/chain.c
+++ b/urjtag/src/tap/chain.c
@@ -33,7 +33,7 @@
#include <urjtag/tap_state.h>
#include <urjtag/tap.h>
#include <urjtag/data_register.h>
-
+#include <urjtag/cmd.h>
#include <urjtag/bsdl.h>
#include <urjtag/chain.h>
@@ -71,6 +71,91 @@ urj_tap_chain_free (urj_chain_t *chain)
free (chain);
}
+int
+urj_tap_chain_connect (urj_chain_t *chain, char *drivername, char *params[])
+{
+ urj_cable_t *cable = NULL;
+ int i;
+ int j;
+ int paramc = urj_cmd_params (params);
+ const urj_param_t **cable_params;
+ urj_cable_parport_devtype_t devtype = -1;
+ const char *devname = NULL;
+ int param_start = 0;
+ const urj_cable_driver_t *driver;
+
+ /* search cable driver list */
+ for (i = 0; urj_tap_cable_drivers[i]; i++)
+ if (strcasecmp (drivername, urj_tap_cable_drivers[i]->name) == 0)
+ break;
+ driver = urj_tap_cable_drivers[i];
+ if (!driver)
+ {
+ urj_error_set (URJ_ERROR_INVALID,
+ "unknown cable driver '%s'", drivername);
+ return URJ_STATUS_FAIL;
+ }
+
+ if (driver->device_type == URJ_CABLE_DEVICE_PARPORT)
+ {
+ if (paramc < 3)
+ {
+ urj_error_set (URJ_ERROR_SYNTAX,
+ "parallel cable requires >= 3 parameters");
+ return URJ_STATUS_FAIL;
+ }
+ for (j = 0; j < URJ_CABLE_PARPORT_N_DEVS; j++)
+ if (strcasecmp (params[0],
+ urj_cable_parport_devtype_string (j)) == 0)
+ break;
+ if (j == URJ_CABLE_PARPORT_N_DEVS)
+ {
+ urj_error_set (URJ_ERROR_INVALID,
+ "unknown parallel port device type '%s'",
+ params[0]);
+ return URJ_STATUS_FAIL;
+ }
+
+ devtype = j;
+ devname = params[1];
+ param_start = 2;
+ }
+
+ urj_param_init (&cable_params);
+ for (j = param_start; params[j] != NULL; j++)
+ if (urj_param_push (&urj_cable_param_list, &cable_params,
+ params[j]) != URJ_STATUS_OK)
+ {
+ urj_param_clear (&cable_params);
+ return URJ_STATUS_FAIL;
+ }
+
+ switch (driver->device_type)
+ {
+ case URJ_CABLE_DEVICE_PARPORT:
+ cable =
+ urj_tap_cable_parport_connect (chain, driver, devtype, devname,
+ cable_params);
+ break;
+ case URJ_CABLE_DEVICE_USB:
+ cable = urj_tap_cable_usb_connect (chain, driver, cable_params);
+ break;
+ case URJ_CABLE_DEVICE_OTHER:
+ cable = urj_tap_cable_other_connect (chain, driver, cable_params);
+ break;
+ }
+
+ urj_param_clear (&cable_params);
+
+ if (cable == NULL)
+ {
+ return URJ_STATUS_FAIL;
+ }
+
+ chain->cable->chain = chain;
+ return URJ_STATUS_OK;
+}
+
void
urj_tap_chain_disconnect (urj_chain_t *chain)
{
--
1.7.4
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense..
http://p.sf.net/sfu/splunk-d2d-c1
_______________________________________________
UrJTAG-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/urjtag-development