X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Fjtag%2Ftcl.c;h=768301470d2d90447afe13ce3cc99e5739fb11b9;hp=819b26710c775f454b5797b68cddc68b9a440446;hb=3117a318d42606cbcfd39559e144f6f6b0313fe9;hpb=38f8e5eefac748a30a4bf5e9d7a7313c8ae0e4e9
diff --git a/src/jtag/tcl.c b/src/jtag/tcl.c
index 819b26710c..768301470d 100644
--- a/src/jtag/tcl.c
+++ b/src/jtag/tcl.c
@@ -23,9 +23,7 @@
* 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., *
- * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ * along with this program. If not, see . *
***************************************************************************/
#ifdef HAVE_CONFIG_H
@@ -33,6 +31,7 @@
#endif
#include "jtag.h"
+#include "swd.h"
#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
@@ -43,6 +42,7 @@
#endif
#include
+#include "transport/transport.h"
/**
* @file
@@ -58,8 +58,6 @@ static const Jim_Nvp nvp_jtag_tap_event[] = {
{ .name = NULL, .value = -1 }
};
-extern struct jtag_interface *jtag_interface;
-
struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *o)
{
const char *cp = Jim_GetString(o, NULL);
@@ -170,7 +168,10 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
return JIM_ERR;
num_fields = (argc-2)/2;
- assert(num_fields > 0);
+ if (num_fields <= 0) {
+ Jim_SetResultString(interp, "drscan: no scan fields supplied", -1);
+ return JIM_ERR;
+ }
fields = malloc(sizeof(struct scan_field) * num_fields);
for (i = 2; i < argc; i += 2) {
long bits;
@@ -204,7 +205,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
Jim_GetLong(interp, args[i], &bits);
str = buf_to_str(fields[field_count].in_value, bits, 16);
- free((void *)fields[field_count].out_value);
+ free(fields[field_count].in_value);
Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
free(str);
@@ -432,20 +433,15 @@ static int jim_newtap_expected_id(Jim_Nvp *n, Jim_GetOptInfo *goi,
return e;
}
- unsigned expected_len = sizeof(uint32_t) * pTap->expected_ids_cnt;
- uint32_t *new_expected_ids = malloc(expected_len + sizeof(uint32_t));
- if (new_expected_ids == NULL) {
+ uint32_t *p = realloc(pTap->expected_ids,
+ (pTap->expected_ids_cnt + 1) * sizeof(uint32_t));
+ if (!p) {
Jim_SetResultFormatted(goi->interp, "no memory");
return JIM_ERR;
}
- memcpy(new_expected_ids, pTap->expected_ids, expected_len);
-
- new_expected_ids[pTap->expected_ids_cnt] = w;
-
- free(pTap->expected_ids);
- pTap->expected_ids = new_expected_ids;
- pTap->expected_ids_cnt++;
+ pTap->expected_ids = p;
+ pTap->expected_ids[pTap->expected_ids_cnt++] = w;
return JIM_OK;
}
@@ -466,7 +462,6 @@ static int jim_newtap_ir_param(Jim_Nvp *n, Jim_GetOptInfo *goi,
if (e != JIM_OK) {
Jim_SetResultFormatted(goi->interp,
"option: %s bad parameter", n->name);
- free((void *)pTap->dotted_name);
return e;
}
switch (n->value) {
@@ -537,11 +532,13 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
free(pTap);
return JIM_ERR;
}
- Jim_GetOpt_String(goi, &cp, NULL);
- pTap->chip = strdup(cp);
- Jim_GetOpt_String(goi, &cp, NULL);
- pTap->tapname = strdup(cp);
+ const char *tmp;
+ Jim_GetOpt_String(goi, &tmp, NULL);
+ pTap->chip = strdup(tmp);
+
+ Jim_GetOpt_String(goi, &tmp, NULL);
+ pTap->tapname = strdup(tmp);
/* name + dot + name + null */
x = strlen(pTap->chip) + 1 + strlen(pTap->tapname) + 1;
@@ -552,8 +549,15 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
+ if (!transport_is_jtag()) {
+ /* SWD doesn't require any JTAG tap parameters */
+ pTap->enabled = true;
+ jtag_tap_init(pTap);
+ return JIM_OK;
+ }
+
/* IEEE specifies that the two LSBs of an IR scan are 01, so make
- * that the default. The "-irlen" and "-irmask" options are only
+ * that the default. The "-ircapture" and "-irmask" options are only
* needed to cope with nonstandard TAPs, or to specify more bits.
*/
pTap->ir_capture_mask = 0x03;
@@ -563,7 +567,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
e = Jim_GetOpt_Nvp(goi, opts, &n);
if (e != JIM_OK) {
Jim_GetOpt_NvpUnknown(goi, opts, 0);
- free((void *)pTap->dotted_name);
+ free(cp);
free(pTap);
return e;
}
@@ -578,7 +582,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
case NTAP_OPT_EXPECTED_ID:
e = jim_newtap_expected_id(n, goi, pTap);
if (JIM_OK != e) {
- free((void *)pTap->dotted_name);
+ free(cp);
free(pTap);
return e;
}
@@ -588,7 +592,7 @@ static int jim_newtap_cmd(Jim_GetOptInfo *goi)
case NTAP_OPT_IRCAPTURE:
e = jim_newtap_ir_param(n, goi, pTap);
if (JIM_OK != e) {
- free((void *)pTap->dotted_name);
+ free(cp);
free(pTap);
return e;
}
@@ -672,6 +676,7 @@ static int jim_jtag_arp_init(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
+ int e = ERROR_OK;
Jim_GetOptInfo goi;
Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
if (goi.argc != 0) {
@@ -679,7 +684,11 @@ static int jim_jtag_arp_init_reset(Jim_Interp *interp, int argc, Jim_Obj *const
return JIM_ERR;
}
struct command_context *context = current_command_context(interp);
- int e = jtag_init_reset(context);
+ if (transport_is_jtag())
+ e = jtag_init_reset(context);
+ else if (transport_is_swd())
+ e = swd_init_reset(context);
+
if (e != ERROR_OK) {
Jim_Obj *eObj = Jim_NewIntObj(goi.interp, e);
Jim_SetResultFormatted(goi.interp, "error: %#s", eObj);
@@ -885,7 +894,7 @@ static const struct command_registration jtag_subcommand_handlers[] = {
},
{
.name = "configure",
- .mode = COMMAND_EXEC,
+ .mode = COMMAND_ANY,
.jim_handler = jim_jtag_configure,
.help = "Provide a Tcl handler for the specified "
"TAP event.",
@@ -957,7 +966,7 @@ COMMAND_HANDLER(handle_scan_chain_command)
for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
snprintf(expected_id, sizeof expected_id, "0x%08x",
- (unsigned) tap->expected_ids[1]);
+ (unsigned) tap->expected_ids[ii]);
if (tap->ignore_version)
expected_id[2] = '*';
@@ -1115,17 +1124,12 @@ COMMAND_HANDLER(handle_irscan_command)
return ERROR_COMMAND_SYNTAX_ERROR;
}
- size_t fields_len = sizeof(struct scan_field) * num_fields;
- fields = malloc(fields_len);
- memset(fields, 0, fields_len);
+ fields = calloc(num_fields, sizeof(*fields));
int retval;
for (i = 0; i < num_fields; i++) {
tap = jtag_tap_by_string(CMD_ARGV[i*2]);
if (tap == NULL) {
- int j;
- for (j = 0; j < i; j++)
- free((void *)fields[j].out_value);
free(fields);
command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[i*2]);
@@ -1133,14 +1137,14 @@ COMMAND_HANDLER(handle_irscan_command)
}
int field_size = tap->ir_length;
fields[i].num_bits = field_size;
- fields[i].out_value = malloc(DIV_ROUND_UP(field_size, 8));
+ uint8_t *v = malloc(DIV_ROUND_UP(field_size, 8));
- uint32_t value;
- retval = parse_u32(CMD_ARGV[i * 2 + 1], &value);
+ uint64_t value;
+ retval = parse_u64(CMD_ARGV[i * 2 + 1], &value);
if (ERROR_OK != retval)
goto error_return;
- void *v = (void *)fields[i].out_value;
- buf_set_u32(v, 0, field_size, value);
+ buf_set_u64(v, 0, field_size, value);
+ fields[i].out_value = v;
fields[i].in_value = NULL;
}
@@ -1244,7 +1248,7 @@ COMMAND_HANDLER(handle_wait_srst_deassert)
LOG_USER("Waiting for srst assert + deassert for at most %dms", timeout_ms);
int asserted_yet;
- long long then = timeval_ms();
+ int64_t then = timeval_ms();
while (jtag_srst_asserted(&asserted_yet) == ERROR_OK) {
if ((timeval_ms() - then) > timeout_ms) {
LOG_ERROR("Timed out");