Remove whitespace that occurs after '('.
[fw/openocd] / src / jtag / tcl.c
index 121c19abca4b698783716d096c0fd266777848f0..4422111bb71403b4f8a3c0e3d25a77f6decb420a 100644 (file)
 #include <strings.h>
 #endif
 
-extern bool hasKHz;
+static const Jim_Nvp nvp_jtag_tap_event[] = {
+       { .value = JTAG_TAP_EVENT_ENABLE,       .name = "tap-enable" },
+       { .value = JTAG_TAP_EVENT_DISABLE,      .name = "tap-disable" },
 
-extern const Jim_Nvp nvp_jtag_tap_event[];
+       { .name = NULL, .value = -1 }
+};
 
 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
  */
 
-#if BUILD_ECOSBOARD == 1
+#if BUILD_ZY1000 == 1
        extern jtag_interface_t zy1000_interface;
 #elif defined(BUILD_MINIDRIVER_DUMMY)
        extern jtag_interface_t minidummy_interface;
@@ -116,7 +119,7 @@ extern const Jim_Nvp nvp_jtag_tap_event[];
  * or some number of standard driver interfaces, never both.
  */
 jtag_interface_t *jtag_interfaces[] = {
-#if BUILD_ECOSBOARD == 1
+#if BUILD_ZY1000 == 1
        &zy1000_interface,
 #elif defined(BUILD_MINIDRIVER_DUMMY)
        &minidummy_interface,
@@ -167,7 +170,6 @@ jtag_interface_t *jtag_interfaces[] = {
        NULL,
 };
 
-extern struct jtag_interface_s *jtag;
 extern jtag_interface_t *jtag_interface;
 
 /* jtag commands */
@@ -187,6 +189,7 @@ static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cm
 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
+static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args);
 
 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -206,7 +209,7 @@ static Jim_Nvp nvp_config_opts[] = {
        { .name = NULL,          .value = -1 }
 };
 
-static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
+static int jtag_tap_configure_cmd(Jim_GetOptInfo *goi, jtag_tap_t * tap)
 {
        Jim_Nvp *n;
        Jim_Obj *o;
@@ -225,11 +228,11 @@ static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
                switch (n->value) {
                        case JCFG_EVENT:
                                if (goi->argc == 0) {
-                                       Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ..." );
+                                       Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ..." );
                                        return JIM_ERR;
                                }
 
-                               e = Jim_GetOpt_Nvp( goi, nvp_jtag_tap_event, &n );
+                               e = Jim_GetOpt_Nvp(goi, nvp_jtag_tap_event, &n );
                                if (e != JIM_OK) {
                                        Jim_GetOpt_NvpUnknown(goi, nvp_jtag_tap_event, 1);
                                        return e;
@@ -253,7 +256,7 @@ static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
                                        jteap = tap->event_action;
                                        /* replace existing? */
                                        while (jteap) {
-                                               if (jteap->event == (enum jtag_tap_event)n->value) {
+                                               if (jteap->event == (enum jtag_event)n->value) {
                                                        break;
                                                }
                                                jteap = jteap->next;
@@ -265,7 +268,7 @@ static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
                                                        jteap = calloc(1, sizeof (*jteap));
                                                }
                                                jteap->event = n->value;
-                                               Jim_GetOpt_Obj( goi, &o);
+                                               Jim_GetOpt_Obj(goi, &o);
                                                if (jteap->body) {
                                                        Jim_DecrRefCount(interp, jteap->body);
                                                }
@@ -293,11 +296,17 @@ static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
        return JIM_OK;
 }
 
+static int is_bad_irval(int ir_length, jim_wide w)
+{
+       jim_wide v = 1;
 
-extern void jtag_tap_init(jtag_tap_t *tap);
-extern void jtag_tap_free(jtag_tap_t *tap);
+       v <<= ir_length;
+       v -= 1;
+       v = ~v;
+       return (w & v) != 0;
+}
 
-static int jim_newtap_cmd( Jim_GetOptInfo *goi )
+static int jim_newtap_cmd(Jim_GetOptInfo *goi )
 {
        jtag_tap_t *pTap;
        jim_wide w;
@@ -322,37 +331,34 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
                { .name = NULL                          ,       .value = -1 },
        };
 
-       pTap = malloc( sizeof(jtag_tap_t) );
-       memset( pTap, 0, sizeof(*pTap) );
-       if( !pTap ){
-               Jim_SetResult_sprintf( goi->interp, "no memory");
+       pTap = calloc(1, sizeof(jtag_tap_t));
+       if (!pTap) {
+               Jim_SetResult_sprintf(goi->interp, "no memory");
                return JIM_ERR;
        }
+
        /*
         * we expect CHIP + TAP + OPTIONS
         * */
-       ifgoi->argc < 3 ){
+       if (goi->argc < 3 ){
                Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
                return JIM_ERR;
        }
-       Jim_GetOpt_String( goi, &cp, NULL );
+       Jim_GetOpt_String(goi, &cp, NULL );
        pTap->chip = strdup(cp);
 
-       Jim_GetOpt_String( goi, &cp, NULL );
+       Jim_GetOpt_String(goi, &cp, NULL );
        pTap->tapname = strdup(cp);
 
        /* name + dot + name + null */
        x = strlen(pTap->chip) + 1 + strlen(pTap->tapname) + 1;
-       cp = malloc( x );
-       sprintf( cp, "%s.%s", pTap->chip, pTap->tapname );
+       cp = malloc(x );
+       sprintf(cp, "%s.%s", pTap->chip, pTap->tapname );
        pTap->dotted_name = cp;
 
        LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
                          pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
 
-       /* default is enabled */
-       pTap->enabled = 1;
-
        /* deal with options */
 #define NTREQ_IRLEN      1
 #define NTREQ_IRCAPTURE  2
@@ -361,37 +367,37 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
        /* clear them as we find them */
        reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
 
-       whilegoi->argc ){
-               e = Jim_GetOpt_Nvp( goi, opts, &n );
-               ife != JIM_OK ){
-                       Jim_GetOpt_NvpUnknown( goi, opts, 0 );
+       while (goi->argc ){
+               e = Jim_GetOpt_Nvp(goi, opts, &n );
+               if (e != JIM_OK ){
+                       Jim_GetOpt_NvpUnknown(goi, opts, 0 );
                        return e;
                }
                LOG_DEBUG("Processing option: %s", n->name );
-               switchn->value ){
+               switch (n->value ){
                case NTAP_OPT_ENABLED:
-                       pTap->enabled = 1;
+                       pTap->disabled_after_reset = false;
                        break;
                case NTAP_OPT_DISABLED:
-                       pTap->enabled = 0;
+                       pTap->disabled_after_reset = true;
                        break;
                case NTAP_OPT_EXPECTED_ID:
                {
-                       u32 *new_expected_ids;
+                       uint32_t *new_expected_ids;
 
-                       e = Jim_GetOpt_Wide( goi, &w );
-                       ife != JIM_OK) {
+                       e = Jim_GetOpt_Wide(goi, &w );
+                       if (e != JIM_OK) {
                                Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
                                return e;
                        }
 
-                       new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
+                       new_expected_ids = malloc(sizeof(uint32_t) * (pTap->expected_ids_cnt + 1));
                        if (new_expected_ids == NULL) {
-                               Jim_SetResult_sprintf( goi->interp, "no memory");
+                               Jim_SetResult_sprintf(goi->interp, "no memory");
                                return JIM_ERR;
                        }
 
-                       memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
+                       memcpy(new_expected_ids, pTap->expected_ids, sizeof(uint32_t) * pTap->expected_ids_cnt);
 
                        new_expected_ids[pTap->expected_ids_cnt] = w;
 
@@ -403,33 +409,42 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
                case NTAP_OPT_IRLEN:
                case NTAP_OPT_IRMASK:
                case NTAP_OPT_IRCAPTURE:
-                       e = Jim_GetOpt_Wide( goi, &w );
-                       ife != JIM_OK ){
-                               Jim_SetResult_sprintf( goi->interp, "option: %s bad parameter", n->name );
+                       e = Jim_GetOpt_Wide(goi, &w );
+                       if (e != JIM_OK ){
+                               Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name );
                                return e;
                        }
-                       if( (w < 0) || (w > 0xffff) ){
-                               /* wacky value */
-                               Jim_SetResult_sprintf( goi->interp, "option: %s - wacky value: %d (0x%x)",
-                                                                          n->name, (int)(w), (int)(w));
-                               return JIM_ERR;
-                       }
-                       switch(n->value){
+                       switch (n->value){
                        case NTAP_OPT_IRLEN:
+                               if (w > (jim_wide) (8 * sizeof(pTap->ir_capture_value)))
+                                       LOG_WARNING("huge IR length %d", (int) w);
                                pTap->ir_length = w;
                                reqbits &= (~(NTREQ_IRLEN));
                                break;
                        case NTAP_OPT_IRMASK:
+                               if (is_bad_irval(pTap->ir_length, w)) {
+                                       LOG_ERROR("IR mask %x too big",
+                                                       (int) w);
+                                       return ERROR_FAIL;
+                               }
                                pTap->ir_capture_mask = w;
                                reqbits &= (~(NTREQ_IRMASK));
                                break;
                        case NTAP_OPT_IRCAPTURE:
+                               if (is_bad_irval(pTap->ir_length, w)) {
+                                       LOG_ERROR("IR capture %x too big",
+                                                       (int) w);
+                                       return ERROR_FAIL;
+                               }
                                pTap->ir_capture_value = w;
                                reqbits &= (~(NTREQ_IRCAPTURE));
                                break;
                        }
-               } /* switch(n->value) */
-       } /* while( goi->argc ) */
+               } /* switch (n->value) */
+       } /* while (goi->argc ) */
+
+       /* default is enabled-after-reset */
+       pTap->enabled = !pTap->disabled_after_reset;
 
        /* Did all the required option bits get cleared? */
        if (0 == reqbits)
@@ -445,7 +460,45 @@ static int jim_newtap_cmd( Jim_GetOptInfo *goi )
        return JIM_ERR;
 }
 
-static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
+static void jtag_tap_handle_event(jtag_tap_t *tap, enum jtag_event e)
+{
+       jtag_tap_event_action_t * jteap;
+       int done;
+
+       jteap = tap->event_action;
+
+       done = 0;
+       while (jteap) {
+               if (jteap->event == e) {
+                       done = 1;
+                       LOG_DEBUG("JTAG tap: %s event: %d (%s) action: %s\n",
+                                       tap->dotted_name,
+                                       e,
+                                       Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name,
+                                       Jim_GetString(jteap->body, NULL) );
+                       if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
+                               Jim_PrintErrorMessage(interp);
+                       } else {
+                               /* NOTE:  we currently assume the handlers
+                                * can't fail.  That presumes later code
+                                * will be verifying the scan chains ...
+                                */
+                               tap->enabled = (e == JTAG_TAP_EVENT_ENABLE);
+                       }
+               }
+
+               jteap = jteap->next;
+       }
+
+       if (!done) {
+               LOG_DEBUG("event %d %s - no action",
+                               e,
+                               Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name);
+       }
+}
+
+
+static int jim_jtag_command(Jim_Interp *interp, int argc, Jim_Obj *const *argv )
 {
        Jim_GetOptInfo goi;
        int e;
@@ -479,76 +532,95 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
 
        context = Jim_GetAssocData(interp, "context");
        /* go past the command */
-       Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+       Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1 );
 
-       e = Jim_GetOpt_Nvp( &goi, jtag_cmds, &n );
-       ife != JIM_OK ){
-               Jim_GetOpt_NvpUnknown( &goi, jtag_cmds, 0 );
+       e = Jim_GetOpt_Nvp(&goi, jtag_cmds, &n );
+       if (e != JIM_OK ){
+               Jim_GetOpt_NvpUnknown(&goi, jtag_cmds, 0 );
                return e;
        }
-               Jim_SetEmptyResult( goi.interp );
-       switchn->value ){
+               Jim_SetEmptyResult(goi.interp );
+       switch (n->value ){
        case JTAG_CMD_INTERFACE:
                /* return the name of the interface */
                /* TCL code might need to know the exact type... */
                /* FUTURE: we allow this as a means to "set" the interface. */
-               ifgoi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
+               if (goi.argc != 0 ){
+                       Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
                        return JIM_ERR;
                }
-               Jim_SetResultString( goi.interp, jtag_interface->name, -1 );
+               Jim_SetResultString(goi.interp, jtag_interface->name, -1 );
                return JIM_OK;
        case JTAG_CMD_INIT_RESET:
-               ifgoi.argc != 0 ){
-                       Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
+               if (goi.argc != 0 ){
+                       Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
                        return JIM_ERR;
                }
                e = jtag_init_reset(context);
-               ife != ERROR_OK ){
-                       Jim_SetResult_sprintf( goi.interp, "error: %d", e);
+               if (e != ERROR_OK ){
+                       Jim_SetResult_sprintf(goi.interp, "error: %d", e);
                        return JIM_ERR;
                }
                return JIM_OK;
        case JTAG_CMD_NEWTAP:
-               return jim_newtap_cmd( &goi );
+               return jim_newtap_cmd(&goi );
                break;
        case JTAG_CMD_TAPISENABLED:
        case JTAG_CMD_TAPENABLE:
        case JTAG_CMD_TAPDISABLE:
-               ifgoi.argc != 1 ){
-                       Jim_SetResultString( goi.interp, "Too many parameters",-1 );
+               if (goi.argc != 1 ){
+                       Jim_SetResultString(goi.interp, "Too many parameters",-1 );
                        return JIM_ERR;
                }
 
                {
                        jtag_tap_t *t;
-                       t = jtag_tap_by_jim_obj( goi.interp, goi.argv[0] );
-                       if( t == NULL ){
+
+                       t = jtag_tap_by_jim_obj(goi.interp, goi.argv[0]);
+                       if (t == NULL)
                                return JIM_ERR;
-                       }
-                       switch( n->value ){
+
+                       switch (n->value) {
                        case JTAG_CMD_TAPISENABLED:
-                               e = t->enabled;
                                break;
                        case JTAG_CMD_TAPENABLE:
-                               jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
-                               e = 1;
-                               t->enabled = e;
+                               if (t->enabled)
+                                       break;
+                               jtag_tap_handle_event(t, JTAG_TAP_EVENT_ENABLE);
+                               if (!t->enabled)
+                                       break;
+
+                               /* FIXME add JTAG sanity checks, w/o TLR
+                                *  - scan chain length grew by one (this)
+                                *  - IDs and IR lengths are as expected
+                                */
+
+                               jtag_call_event_callbacks(JTAG_TAP_EVENT_ENABLE);
                                break;
                        case JTAG_CMD_TAPDISABLE:
-                               jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE);
-                               e = 0;
-                               t->enabled = e;
+                               if (!t->enabled)
+                                       break;
+                               jtag_tap_handle_event(t, JTAG_TAP_EVENT_DISABLE);
+                               if (t->enabled)
+                                       break;
+
+                               /* FIXME add JTAG sanity checks, w/o TLR
+                                *  - scan chain length shrank by one (this)
+                                *  - IDs and IR lengths are as expected
+                                */
+
+                               jtag_call_event_callbacks(JTAG_TAP_EVENT_DISABLE);
                                break;
                        }
-                       Jim_SetResult( goi.interp, Jim_NewIntObj( goi.interp, e ) );
+                       e = t->enabled;
+                       Jim_SetResult(goi.interp, Jim_NewIntObj(goi.interp, e));
                        return JIM_OK;
                }
                break;
 
        case JTAG_CMD_CGET:
-               ifgoi.argc < 2 ){
-                       Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ...");
+               if (goi.argc < 2 ){
+                       Jim_WrongNumArgs(goi.interp, 0, NULL, "?tap-name? -option ...");
                        return JIM_ERR;
                }
 
@@ -556,19 +628,19 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
                        jtag_tap_t *t;
 
                        Jim_GetOpt_Obj(&goi, &o);
-                       t = jtag_tap_by_jim_obj( goi.interp, o );
-                       ift == NULL ){
+                       t = jtag_tap_by_jim_obj(goi.interp, o );
+                       if (t == NULL ){
                                return JIM_ERR;
                        }
 
                        goi.isconfigure = 0;
-                       return jtag_tap_configure_cmd( &goi, t);
+                       return jtag_tap_configure_cmd(&goi, t);
                }
                break;
 
        case JTAG_CMD_CONFIGURE:
-               ifgoi.argc < 3 ){
-                       Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
+               if (goi.argc < 3 ){
+                       Jim_WrongNumArgs(goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
                        return JIM_ERR;
                }
 
@@ -576,13 +648,13 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
                        jtag_tap_t *t;
 
                        Jim_GetOpt_Obj(&goi, &o);
-                       t = jtag_tap_by_jim_obj( goi.interp, o );
-                       ift == NULL ){
+                       t = jtag_tap_by_jim_obj(goi.interp, o );
+                       if (t == NULL ){
                                return JIM_ERR;
                        }
 
                        goi.isconfigure = 1;
-                       return jtag_tap_configure_cmd( &goi, t);
+                       return jtag_tap_configure_cmd(&goi, t);
                }
        }
 
@@ -591,7 +663,7 @@ static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv
 
 int jtag_register_commands(struct command_context_s *cmd_ctx)
 {
-       register_jim( cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
+       register_jim(cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
 
        register_command(cmd_ctx, NULL, "interface", handle_interface_command,
                COMMAND_CONFIG, "try to configure interface");
@@ -624,13 +696,14 @@ int jtag_register_commands(struct command_context_s *cmd_ctx)
                COMMAND_EXEC, "execute IR scan <device> <instr> [dev2] [instr2] ...");
        register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
        register_jim(cmd_ctx, "flush_count", Jim_Command_flush_count, "returns number of times the JTAG queue has been flushed");
+       register_jim(cmd_ctx, "pathmove", Jim_Command_pathmove, "move JTAG to state1 then to state2, state3, etc. <state1>,<state2>,<stat3>...");
 
        register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
-               COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
+               COMMAND_ANY, "verify value captured during Capture-IR <enable | disable>");
        register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command,
-               COMMAND_ANY, "verify value capture <enable|disable>");
+               COMMAND_ANY, "verify value capture <enable | disable>");
        register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command,
-               COMMAND_ANY, "choose short(default) or long tms_sequence <short|long>");
+               COMMAND_ANY, "choose short(default) or long tms_sequence <short | long>");
        return ERROR_OK;
 }
 
@@ -648,13 +721,13 @@ static int default_speed_div(int speed, int *khz)
 
 static int default_power_dropout(int *dropout)
 {
-       *dropout=0; /* by default we can't detect power dropout */
+       *dropout = 0; /* by default we can't detect power dropout */
        return ERROR_OK;
 }
 
 static int default_srst_asserted(int *srst_asserted)
 {
-       *srst_asserted=0; /* by default we can't detect srst asserted */
+       *srst_asserted = 0; /* by default we can't detect srst asserted */
        return ERROR_OK;
 }
 
@@ -733,49 +806,49 @@ static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *c
         * argv[ 3] = not actually used by anything but in the docs
         */
 
-       ifargc < 4 ){
-               command_print( cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
+       if (argc < 4 ){
+               command_print(cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
                return ERROR_OK;
        }
-       command_print( cmd_ctx, "OLD SYNTAX: DEPRECATED - translating to new syntax");
-       command_print( cmd_ctx, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
+       command_print(cmd_ctx, "OLD SYNTAX: DEPRECATED - translating to new syntax");
+       command_print(cmd_ctx, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
                                   args[0],
                                   args[1],
                                   args[2] );
-       command_print( cmd_ctx, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
-       command_print( cmd_ctx, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
-       command_print( cmd_ctx, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
-       command_print( cmd_ctx, "And then refer to the taps by the dotted name.");
-
-       newargs[0] = Jim_NewStringObj( interp, "jtag", -1   );
-       newargs[1] = Jim_NewStringObj( interp, "newtap", -1 );
-       sprintf( buf, "chip%d", jtag_tap_count() );
-       newargs[2] = Jim_NewStringObj( interp, buf, -1 );
-       sprintf( buf, "tap%d", jtag_tap_count() );
-       newargs[3] = Jim_NewStringObj( interp, buf, -1  );
-       newargs[4] = Jim_NewStringObj( interp, "-irlen", -1  );
-       newargs[5] = Jim_NewStringObj( interp, args[0], -1  );
-       newargs[6] = Jim_NewStringObj( interp, "-ircapture", -1  );
-       newargs[7] = Jim_NewStringObj( interp, args[1], -1  );
-       newargs[8] = Jim_NewStringObj( interp, "-irmask", -1  );
-       newargs[9] = Jim_NewStringObj( interp, args[2], -1  );
-
-       command_print( cmd_ctx, "NEW COMMAND:");
-       sprintf( buf, "%s %s %s %s %s %s %s %s %s %s",
-                        Jim_GetString( newargs[0], NULL ),
-                        Jim_GetString( newargs[1], NULL ),
-                        Jim_GetString( newargs[2], NULL ),
-                        Jim_GetString( newargs[3], NULL ),
-                        Jim_GetString( newargs[4], NULL ),
-                        Jim_GetString( newargs[5], NULL ),
-                        Jim_GetString( newargs[6], NULL ),
-                        Jim_GetString( newargs[7], NULL ),
-                        Jim_GetString( newargs[8], NULL ),
-                        Jim_GetString( newargs[9], NULL ) );
-
-       e = jim_jtag_command( interp, 10, newargs );
-       ife != JIM_OK ){
-               command_print( cmd_ctx, "%s", Jim_GetString( Jim_GetResult(interp), NULL ) );
+       command_print(cmd_ctx, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
+       command_print(cmd_ctx, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
+       command_print(cmd_ctx, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
+       command_print(cmd_ctx, "And then refer to the taps by the dotted name.");
+
+       newargs[0] = Jim_NewStringObj(interp, "jtag", -1   );
+       newargs[1] = Jim_NewStringObj(interp, "newtap", -1 );
+       sprintf(buf, "chip%d", jtag_tap_count() );
+       newargs[2] = Jim_NewStringObj(interp, buf, -1 );
+       sprintf(buf, "tap%d", jtag_tap_count() );
+       newargs[3] = Jim_NewStringObj(interp, buf, -1  );
+       newargs[4] = Jim_NewStringObj(interp, "-irlen", -1  );
+       newargs[5] = Jim_NewStringObj(interp, args[0], -1  );
+       newargs[6] = Jim_NewStringObj(interp, "-ircapture", -1  );
+       newargs[7] = Jim_NewStringObj(interp, args[1], -1  );
+       newargs[8] = Jim_NewStringObj(interp, "-irmask", -1  );
+       newargs[9] = Jim_NewStringObj(interp, args[2], -1  );
+
+       command_print(cmd_ctx, "NEW COMMAND:");
+       sprintf(buf, "%s %s %s %s %s %s %s %s %s %s",
+                        Jim_GetString(newargs[0], NULL ),
+                        Jim_GetString(newargs[1], NULL ),
+                        Jim_GetString(newargs[2], NULL ),
+                        Jim_GetString(newargs[3], NULL ),
+                        Jim_GetString(newargs[4], NULL ),
+                        Jim_GetString(newargs[5], NULL ),
+                        Jim_GetString(newargs[6], NULL ),
+                        Jim_GetString(newargs[7], NULL ),
+                        Jim_GetString(newargs[8], NULL ),
+                        Jim_GetString(newargs[9], NULL ) );
+
+       e = jim_jtag_command(interp, 10, newargs );
+       if (e != JIM_OK ){
+               command_print(cmd_ctx, "%s", Jim_GetString(Jim_GetResult(interp), NULL ) );
        }
        return e;
 }
@@ -788,8 +861,8 @@ static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cm
        command_print(cmd_ctx, "     TapName            | Enabled |   IdCode      Expected    IrLen IrCap  IrMask Instr     ");
        command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
 
-       whiletap ){
-               u32 expected, expected_mask, cur_instr, ii;
+       while (tap ){
+               uint32_t expected, expected_mask, cur_instr, ii;
                expected = buf_get_u32(tap->expected, 0, tap->ir_length);
                expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
                cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
@@ -799,16 +872,16 @@ static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cm
                                          tap->abs_chain_position,
                                          tap->dotted_name,
                                          tap->enabled ? 'Y' : 'n',
-                                         tap->idcode,
-                                         (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
-                                         tap->ir_length,
-                                         expected,
-                                         expected_mask,
-                                         cur_instr);
+                                         (unsigned int)(tap->idcode),
+                                         (unsigned int)(tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
+                                         (unsigned int)(tap->ir_length),
+                                         (unsigned int)(expected),
+                                         (unsigned int)(expected_mask),
+                                         (unsigned int)(cur_instr));
 
                for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
                        command_print(cmd_ctx, "   |                    |         |            | 0x%08x |      |      |      |         ",
-                                                 tap->expected_ids[ii]);
+                                                 (unsigned int)(tap->expected_ids[ii]));
                }
 
                tap = tap->next_tap;
@@ -935,7 +1008,13 @@ static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx,
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
        if (argc == 1)
-               jtag_set_nsrst_delay(strtoul(args[0], NULL, 0));
+       {
+               unsigned delay;
+               int retval = parse_uint(args[0], &delay);
+               if (ERROR_OK != retval)
+                       return retval;
+               jtag_set_nsrst_delay(delay);
+       }
        command_print(cmd_ctx, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
        return ERROR_OK;
 }
@@ -946,7 +1025,13 @@ static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx,
        if (argc > 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
        if (argc == 1)
-               jtag_set_ntrst_delay(strtoul(args[0], NULL, 0));
+       {
+               unsigned delay;
+               int retval = parse_uint(args[0], &delay);
+               if (ERROR_OK != retval)
+                       return retval;
+               jtag_set_ntrst_delay(delay);
+       }
        command_print(cmd_ctx, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
        return ERROR_OK;
 }
@@ -961,8 +1046,10 @@ static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cm
        {
                LOG_DEBUG("handle jtag speed");
 
-               int cur_speed = 0;
-               cur_speed = strtoul(args[0], NULL, 0);
+               unsigned cur_speed = 0;
+               int retval = parse_uint(args[0], &cur_speed);
+               if (ERROR_OK != retval)
+                       return retval;
                retval = jtag_set_speed(cur_speed);
 
        }
@@ -977,44 +1064,28 @@ static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd,
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        int retval = ERROR_OK;
-       int cur_speed = 0;
        if (argc == 1)
        {
-               LOG_DEBUG("handle jtag khz");
-
-               jtag_set_speed_khz(strtoul(args[0], NULL, 0));
-               if (jtag != NULL)
-               {
-                       LOG_DEBUG("have interface set up");
-                       int speed_div1;
-                       retval = jtag->khz(jtag_get_speed_khz(), &speed_div1);
-                       if (ERROR_OK != retval)
-                       {
-                               jtag_set_speed_khz(0);
-                               return retval;
-                       }
-                       cur_speed = speed_div1;
-
-                       retval = jtag_set_speed(cur_speed);
-               }
-               else
-                       hasKHz = true;
-       }
-
-       cur_speed = jtag_get_speed_khz();
-       if (jtag != NULL)
-       {
-               retval = jtag->speed_div(jtag_get_speed(), &cur_speed);
+               unsigned khz = 0;
+               int retval = parse_uint(args[0], &khz);
+               if (ERROR_OK != retval)
+                       return retval;
+               retval = jtag_config_khz(khz);
                if (ERROR_OK != retval)
                        return retval;
        }
 
+       int cur_speed = jtag_get_speed_khz();
+       retval = jtag_get_speed_readable(&cur_speed);
+       if (ERROR_OK != retval)
+               return retval;
+
        if (cur_speed)
                command_print(cmd_ctx, "%d kHz", cur_speed);
        else
                command_print(cmd_ctx, "RCLK - adaptive");
-       return retval;
 
+       return retval;
 }
 
 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx,
@@ -1054,7 +1125,12 @@ static int handle_runtest_command(struct command_context_s *cmd_ctx,
        if (argc != 1)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
-       jtag_add_runtest(strtol(args[0], NULL, 0), jtag_get_end_state());
+       unsigned num_clocks;
+       int retval = parse_uint(args[0], &num_clocks);
+       if (ERROR_OK != retval)
+               return retval;
+
+       jtag_add_runtest(num_clocks, TAP_IDLE);
        jtag_execute_queue();
 
        return ERROR_OK;
@@ -1098,20 +1174,20 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
         */
        endstate = TAP_IDLE;
 
-       ifargc >= 4 ){
+       if (argc >= 4 ){
                /* have at least one pair of numbers. */
                /* is last pair the magic text? */
-               if( 0 == strcmp( "-endstate", args[ argc - 2 ] ) ){
+               if (0 == strcmp("-endstate", args[ argc - 2 ] ) ){
                        const char *cpA;
                        const char *cpS;
                        cpA = args[ argc-1 ];
-                       forendstate = 0 ; endstate < TAP_NUM_STATES ; endstate++ ){
-                               cpS = tap_state_name( endstate );
-                               if( 0 == strcmp( cpA, cpS ) ){
+                       for (endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++ ){
+                               cpS = tap_state_name(endstate );
+                               if (0 == strcmp(cpA, cpS ) ){
                                        break;
                                }
                        }
-                       ifendstate >= TAP_NUM_STATES ){
+                       if (endstate >= TAP_NUM_STATES ){
                                return ERROR_COMMAND_SYNTAX_ERROR;
                        } else {
                                if (!scan_is_safe(endstate))
@@ -1124,32 +1200,43 @@ static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, c
        }
 
        int num_fields = argc / 2;
+       size_t fields_len = sizeof(scan_field_t) * num_fields;
+       fields = malloc(fields_len);
+       memset(fields, 0, fields_len);
 
-       fields = malloc(sizeof(scan_field_t) * num_fields);
-
+       int retval;
        for (i = 0; i < num_fields; i++)
        {
-               tap = jtag_tap_by_string( args[i*2] );
-               if (tap==NULL)
+               tap = jtag_tap_by_string(args[i*2] );
+               if (tap == NULL)
                {
-                       command_print( cmd_ctx, "Tap: %s unknown", args[i*2] );
+                       command_print(cmd_ctx, "Tap: %s unknown", args[i*2] );
                        return ERROR_FAIL;
                }
                int field_size = tap->ir_length;
                fields[i].tap = tap;
                fields[i].num_bits = field_size;
                fields[i].out_value = malloc(CEIL(field_size, 8));
-               buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
+
+               uint32_t value;
+               retval = parse_u32(args[i * 2 + 1], &value);
+               if (ERROR_OK != retval)
+                       goto error_return;
+               buf_set_u32(fields[i].out_value, 0, field_size, value);
                fields[i].in_value = NULL;
        }
 
        /* did we have an endstate? */
        jtag_add_ir_scan(num_fields, fields, endstate);
 
-       int retval=jtag_execute_queue();
+       retval = jtag_execute_queue();
 
+error_return:
        for (i = 0; i < num_fields; i++)
-               free(fields[i].out_value);
+       {
+               if (NULL != fields[i].out_value)
+                       free(fields[i].out_value);
+       }
 
        free (fields);
 
@@ -1175,7 +1262,7 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
        *     args[N-2] = "-endstate"
         *     args[N-1] = statename
         */
-       if ((argc < 4) || ((argc % 2)!=0))
+       if ((argc < 4) || ((argc % 2) != 0))
        {
                Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
                return JIM_ERR;
@@ -1183,21 +1270,23 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
 
        endstate = TAP_IDLE;
 
+       script_debug(interp, "drscan", argc, args);
+
        /* validate arguments as numbers */
        e = JIM_OK;
-       for (i = 2; i < argc; i+=2)
+       for (i = 2; i < argc; i += 2)
        {
                long bits;
                const char *cp;
 
                e = Jim_GetLong(interp, args[i], &bits);
                /* If valid - try next arg */
-               ife == JIM_OK ){
+               if (e == JIM_OK ){
                        continue;
                }
 
                /* Not valid.. are we at the end? */
-               if ( ((i+2) != argc) ){
+               if (((i + 2) != argc) ){
                        /* nope, then error */
                        return e;
                }
@@ -1208,15 +1297,15 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                 */
 
                /* get arg as a string. */
-               cp = Jim_GetString( args[i], NULL );
+               cp = Jim_GetString(args[i], NULL );
                /* is it the magic? */
-               if( 0 == strcmp( "-endstate", cp ) ){
+               if (0 == strcmp("-endstate", cp ) ){
                        /* is the statename valid? */
-                       cp = Jim_GetString( args[i+1], NULL );
+                       cp = Jim_GetString(args[i + 1], NULL );
 
                        /* see if it is a valid state name */
                        endstate = tap_state_by_name(cp);
-                       ifendstate < 0 ){
+                       if (endstate < 0 ){
                                /* update the error message */
                                Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
                        } else {
@@ -1232,26 +1321,26 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                }
 
                /* Still an error? */
-               ife != JIM_OK ){
+               if (e != JIM_OK ){
                        return e; /* too bad */
                }
        } /* validate args */
 
-       tap = jtag_tap_by_jim_obj( interp, args[1] );
-       iftap == NULL ){
+       tap = jtag_tap_by_jim_obj(interp, args[1] );
+       if (tap == NULL ){
                return JIM_ERR;
        }
 
-       num_fields=(argc-2)/2;
+       num_fields = (argc-2)/2;
        fields = malloc(sizeof(scan_field_t) * num_fields);
-       for (i = 2; i < argc; i+=2)
+       for (i = 2; i < argc; i += 2)
        {
                long bits;
                int len;
                const char *str;
 
                Jim_GetLong(interp, args[i], &bits);
-               str = Jim_GetString(args[i+1], &len);
+               str = Jim_GetString(args[i + 1], &len);
 
                fields[field_count].tap = tap;
                fields[field_count].num_bits = bits;
@@ -1270,9 +1359,9 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
                return JIM_ERR;
        }
 
-       field_count=0;
+       field_count = 0;
        Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
-       for (i = 2; i < argc; i+=2)
+       for (i = 2; i < argc; i += 2)
        {
                long bits;
                char *str;
@@ -1294,8 +1383,54 @@ static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args
 }
 
 
+static int Jim_Command_pathmove(Jim_Interp *interp, int argc, Jim_Obj *const *args)
+{
+       tap_state_t states[8];
+
+       if ((argc < 2) || ((size_t)argc > (sizeof(states)/sizeof(*states) + 1)))
+       {
+               Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
+               return JIM_ERR;
+       }
+
+       script_debug(interp, "pathmove", argc, args);
+
+       int i;
+       for (i = 0; i < argc-1; i++)
+       {
+               const char *cp;
+               cp = Jim_GetString(args[i + 1], NULL );
+               states[i] = tap_state_by_name(cp);
+               if (states[i] < 0 )
+               {
+                       /* update the error message */
+                       Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
+                       return JIM_ERR;
+               }
+       }
+
+       if ((jtag_add_statemove(states[0]) != ERROR_OK) || (jtag_execute_queue()!= ERROR_OK))
+       {
+               Jim_SetResultString(interp, "pathmove: jtag execute failed",-1);
+               return JIM_ERR;
+       }
+
+       jtag_add_pathmove(argc-2, states + 1);
+
+       if (jtag_execute_queue()!= ERROR_OK)
+       {
+               Jim_SetResultString(interp, "pathmove: failed",-1);
+               return JIM_ERR;
+       }
+
+       return JIM_OK;
+}
+
+
 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
 {
+       script_debug(interp, "flush_count", argc, args);
+
        Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count()));
 
        return JIM_OK;
@@ -1304,25 +1439,21 @@ static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const
 
 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
+       if (argc > 1)
+               return ERROR_COMMAND_SYNTAX_ERROR;
+
        if (argc == 1)
        {
                if (strcmp(args[0], "enable") == 0)
-               {
-                       jtag_verify_capture_ir = 1;
-               }
+                       jtag_set_verify_capture_ir(true);
                else if (strcmp(args[0], "disable") == 0)
-               {
-                       jtag_verify_capture_ir = 0;
-               } else
-               {
+                       jtag_set_verify_capture_ir(false);
+               else
                        return ERROR_COMMAND_SYNTAX_ERROR;
-               }
-       } else if (argc != 0)
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
        }
 
-       command_print(cmd_ctx, "verify Capture-IR is %s", (jtag_verify_capture_ir) ? "enabled": "disabled");
+       const char *status = jtag_will_verify_capture_ir() ? "enabled": "disabled";
+       command_print(cmd_ctx, "verify Capture-IR is %s", status);
 
        return ERROR_OK;
 }
@@ -1371,4 +1502,3 @@ static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *
 
        return ERROR_OK;
 }
-