Improve encapsulation of JTAG event handling:
[fw/openocd] / src / jtag / tcl.c
1 /***************************************************************************
2  *   Copyright (C) 2005 by Dominic Rath                                    *
3  *   Dominic.Rath@gmx.de                                                   *
4  *                                                                         *
5  *   Copyright (C) 2007,2008 Ã˜yvind Harboe                                 *
6  *   oyvind.harboe@zylin.com                                               *
7  *                                                                         *
8  *   Copyright (C) 2009 SoftPLC Corporation                                *
9  *       http://softplc.com                                                *
10  *   dick@softplc.com                                                      *
11  *                                                                         *
12  *   Copyright (C) 2009 Zachary T Welch                                    *
13  *   zw@superlucidity.net                                                  *
14  *                                                                         *
15  *   This program is free software; you can redistribute it and/or modify  *
16  *   it under the terms of the GNU General Public License as published by  *
17  *   the Free Software Foundation; either version 2 of the License, or     *
18  *   (at your option) any later version.                                   *
19  *                                                                         *
20  *   This program is distributed in the hope that it will be useful,       *
21  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
22  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
23  *   GNU General Public License for more details.                          *
24  *                                                                         *
25  *   You should have received a copy of the GNU General Public License     *
26  *   along with this program; if not, write to the                         *
27  *   Free Software Foundation, Inc.,                                       *
28  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
29  ***************************************************************************/
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33
34 #include "jtag.h"
35 #include "minidriver.h"
36 #include "interface.h"
37
38 #ifdef HAVE_STRINGS_H
39 #include <strings.h>
40 #endif
41
42 static const Jim_Nvp nvp_jtag_tap_event[] = {
43         { .value = JTAG_TAP_EVENT_ENABLE,       .name = "tap-enable" },
44         { .value = JTAG_TAP_EVENT_DISABLE,      .name = "tap-disable" },
45
46         { .name = NULL, .value = -1 }
47 };
48
49 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
50  */
51
52 #if BUILD_ECOSBOARD == 1
53         extern jtag_interface_t zy1000_interface;
54 #elif defined(BUILD_MINIDRIVER_DUMMY)
55         extern jtag_interface_t minidummy_interface;
56 #else // standard drivers
57 #if BUILD_PARPORT == 1
58         extern jtag_interface_t parport_interface;
59 #endif
60
61 #if BUILD_DUMMY == 1
62         extern jtag_interface_t dummy_interface;
63 #endif
64
65 #if BUILD_FT2232_FTD2XX == 1
66         extern jtag_interface_t ft2232_interface;
67 #endif
68
69 #if BUILD_FT2232_LIBFTDI == 1
70         extern jtag_interface_t ft2232_interface;
71 #endif
72
73 #if BUILD_AMTJTAGACCEL == 1
74         extern jtag_interface_t amt_jtagaccel_interface;
75 #endif
76
77 #if BUILD_EP93XX == 1
78         extern jtag_interface_t ep93xx_interface;
79 #endif
80
81 #if BUILD_AT91RM9200 == 1
82         extern jtag_interface_t at91rm9200_interface;
83 #endif
84
85 #if BUILD_GW16012 == 1
86         extern jtag_interface_t gw16012_interface;
87 #endif
88
89 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
90         extern jtag_interface_t presto_interface;
91 #endif
92
93 #if BUILD_USBPROG == 1
94         extern jtag_interface_t usbprog_interface;
95 #endif
96
97 #if BUILD_JLINK == 1
98         extern jtag_interface_t jlink_interface;
99 #endif
100
101 #if BUILD_VSLLINK == 1
102         extern jtag_interface_t vsllink_interface;
103 #endif
104
105 #if BUILD_RLINK == 1
106         extern jtag_interface_t rlink_interface;
107 #endif
108
109 #if BUILD_ARMJTAGEW == 1
110         extern jtag_interface_t armjtagew_interface;
111 #endif
112 #endif // standard drivers
113
114 /**
115  * The list of built-in JTAG interfaces, containing entries for those
116  * drivers that were enabled by the @c configure script.
117  *
118  * The list should be defined to contain either one minidriver interface
119  * or some number of standard driver interfaces, never both.
120  */
121 jtag_interface_t *jtag_interfaces[] = {
122 #if BUILD_ECOSBOARD == 1
123         &zy1000_interface,
124 #elif defined(BUILD_MINIDRIVER_DUMMY)
125         &minidummy_interface,
126 #else // standard drivers
127 #if BUILD_PARPORT == 1
128         &parport_interface,
129 #endif
130 #if BUILD_DUMMY == 1
131         &dummy_interface,
132 #endif
133 #if BUILD_FT2232_FTD2XX == 1
134         &ft2232_interface,
135 #endif
136 #if BUILD_FT2232_LIBFTDI == 1
137         &ft2232_interface,
138 #endif
139 #if BUILD_AMTJTAGACCEL == 1
140         &amt_jtagaccel_interface,
141 #endif
142 #if BUILD_EP93XX == 1
143         &ep93xx_interface,
144 #endif
145 #if BUILD_AT91RM9200 == 1
146         &at91rm9200_interface,
147 #endif
148 #if BUILD_GW16012 == 1
149         &gw16012_interface,
150 #endif
151 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
152         &presto_interface,
153 #endif
154 #if BUILD_USBPROG == 1
155         &usbprog_interface,
156 #endif
157 #if BUILD_JLINK == 1
158         &jlink_interface,
159 #endif
160 #if BUILD_VSLLINK == 1
161         &vsllink_interface,
162 #endif
163 #if BUILD_RLINK == 1
164         &rlink_interface,
165 #endif
166 #if BUILD_ARMJTAGEW == 1
167         &armjtagew_interface,
168 #endif
169 #endif // standard drivers
170         NULL,
171 };
172
173 extern struct jtag_interface_s *jtag;
174 extern jtag_interface_t *jtag_interface;
175
176 /* jtag commands */
177 static int handle_interface_list_command(struct command_context_s *cmd_ctx,
178                 char *cmd, char **args, int argc);
179 static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
180 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
181 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
182 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
183 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
184 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
185 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
186
187 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
188
189 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
190 static int handle_runtest_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
191 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
192 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
193 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args);
194
195 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
196 static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
197 static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
198
199 extern int jtag_examine_chain(void);
200 extern int jtag_validate_chain(void);
201
202 enum jtag_tap_cfg_param {
203         JCFG_EVENT
204 };
205
206 static Jim_Nvp nvp_config_opts[] = {
207         { .name = "-event",      .value = JCFG_EVENT },
208
209         { .name = NULL,          .value = -1 }
210 };
211
212 static int jtag_tap_configure_cmd( Jim_GetOptInfo *goi, jtag_tap_t * tap)
213 {
214         Jim_Nvp *n;
215         Jim_Obj *o;
216         int e;
217
218         /* parse config or cget options */
219         while (goi->argc > 0) {
220                 Jim_SetEmptyResult (goi->interp);
221
222                 e = Jim_GetOpt_Nvp(goi, nvp_config_opts, &n);
223                 if (e != JIM_OK) {
224                         Jim_GetOpt_NvpUnknown(goi, nvp_config_opts, 0);
225                         return e;
226                 }
227
228                 switch (n->value) {
229                         case JCFG_EVENT:
230                                 if (goi->argc == 0) {
231                                         Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ..." );
232                                         return JIM_ERR;
233                                 }
234
235                                 e = Jim_GetOpt_Nvp( goi, nvp_jtag_tap_event, &n );
236                                 if (e != JIM_OK) {
237                                         Jim_GetOpt_NvpUnknown(goi, nvp_jtag_tap_event, 1);
238                                         return e;
239                                 }
240
241                                 if (goi->isconfigure) {
242                                         if (goi->argc != 1) {
243                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
244                                                 return JIM_ERR;
245                                         }
246                                 } else {
247                                         if (goi->argc != 0) {
248                                                 Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
249                                                 return JIM_ERR;
250                                         }
251                                 }
252
253                                 {
254                                         jtag_tap_event_action_t *jteap;
255
256                                         jteap = tap->event_action;
257                                         /* replace existing? */
258                                         while (jteap) {
259                                                 if (jteap->event == (enum jtag_tap_event)n->value) {
260                                                         break;
261                                                 }
262                                                 jteap = jteap->next;
263                                         }
264
265                                         if (goi->isconfigure) {
266                                                 if (jteap == NULL) {
267                                                         /* create new */
268                                                         jteap = calloc(1, sizeof (*jteap));
269                                                 }
270                                                 jteap->event = n->value;
271                                                 Jim_GetOpt_Obj( goi, &o);
272                                                 if (jteap->body) {
273                                                         Jim_DecrRefCount(interp, jteap->body);
274                                                 }
275                                                 jteap->body = Jim_DuplicateObj(goi->interp, o);
276                                                 Jim_IncrRefCount(jteap->body);
277
278                                                 /* add to head of event list */
279                                                 jteap->next = tap->event_action;
280                                                 tap->event_action = jteap;
281                                                 Jim_SetEmptyResult(goi->interp);
282                                         } else {
283                                                 /* get */
284                                                 if (jteap == NULL) {
285                                                         Jim_SetEmptyResult(goi->interp);
286                                                 } else {
287                                                         Jim_SetResult(goi->interp, Jim_DuplicateObj(goi->interp, jteap->body));
288                                                 }
289                                         }
290                                 }
291                                 /* loop for more */
292                                 break;
293                 }
294         } /* while (goi->argc) */
295
296         return JIM_OK;
297 }
298
299
300 extern void jtag_tap_init(jtag_tap_t *tap);
301 extern void jtag_tap_free(jtag_tap_t *tap);
302
303 static int jim_newtap_cmd( Jim_GetOptInfo *goi )
304 {
305         jtag_tap_t *pTap;
306         jim_wide w;
307         int x;
308         int e;
309         int reqbits;
310         Jim_Nvp *n;
311         char *cp;
312         const Jim_Nvp opts[] = {
313 #define NTAP_OPT_IRLEN     0
314                 { .name = "-irlen"                      ,       .value = NTAP_OPT_IRLEN },
315 #define NTAP_OPT_IRMASK    1
316                 { .name = "-irmask"                     ,       .value = NTAP_OPT_IRMASK },
317 #define NTAP_OPT_IRCAPTURE 2
318                 { .name = "-ircapture"          ,       .value = NTAP_OPT_IRCAPTURE },
319 #define NTAP_OPT_ENABLED   3
320                 { .name = "-enable"                     ,       .value = NTAP_OPT_ENABLED },
321 #define NTAP_OPT_DISABLED  4
322                 { .name = "-disable"            ,       .value = NTAP_OPT_DISABLED },
323 #define NTAP_OPT_EXPECTED_ID 5
324                 { .name = "-expected-id"        ,       .value = NTAP_OPT_EXPECTED_ID },
325                 { .name = NULL                          ,       .value = -1 },
326         };
327
328         pTap = malloc( sizeof(jtag_tap_t) );
329         memset( pTap, 0, sizeof(*pTap) );
330         if( !pTap ){
331                 Jim_SetResult_sprintf( goi->interp, "no memory");
332                 return JIM_ERR;
333         }
334         /*
335          * we expect CHIP + TAP + OPTIONS
336          * */
337         if( goi->argc < 3 ){
338                 Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
339                 return JIM_ERR;
340         }
341         Jim_GetOpt_String( goi, &cp, NULL );
342         pTap->chip = strdup(cp);
343
344         Jim_GetOpt_String( goi, &cp, NULL );
345         pTap->tapname = strdup(cp);
346
347         /* name + dot + name + null */
348         x = strlen(pTap->chip) + 1 + strlen(pTap->tapname) + 1;
349         cp = malloc( x );
350         sprintf( cp, "%s.%s", pTap->chip, pTap->tapname );
351         pTap->dotted_name = cp;
352
353         LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
354                           pTap->chip, pTap->tapname, pTap->dotted_name, goi->argc);
355
356         /* default is enabled */
357         pTap->enabled = 1;
358
359         /* deal with options */
360 #define NTREQ_IRLEN      1
361 #define NTREQ_IRCAPTURE  2
362 #define NTREQ_IRMASK     4
363
364         /* clear them as we find them */
365         reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
366
367         while( goi->argc ){
368                 e = Jim_GetOpt_Nvp( goi, opts, &n );
369                 if( e != JIM_OK ){
370                         Jim_GetOpt_NvpUnknown( goi, opts, 0 );
371                         return e;
372                 }
373                 LOG_DEBUG("Processing option: %s", n->name );
374                 switch( n->value ){
375                 case NTAP_OPT_ENABLED:
376                         pTap->enabled = 1;
377                         break;
378                 case NTAP_OPT_DISABLED:
379                         pTap->enabled = 0;
380                         break;
381                 case NTAP_OPT_EXPECTED_ID:
382                 {
383                         u32 *new_expected_ids;
384
385                         e = Jim_GetOpt_Wide( goi, &w );
386                         if( e != JIM_OK) {
387                                 Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
388                                 return e;
389                         }
390
391                         new_expected_ids = malloc(sizeof(u32) * (pTap->expected_ids_cnt + 1));
392                         if (new_expected_ids == NULL) {
393                                 Jim_SetResult_sprintf( goi->interp, "no memory");
394                                 return JIM_ERR;
395                         }
396
397                         memcpy(new_expected_ids, pTap->expected_ids, sizeof(u32) * pTap->expected_ids_cnt);
398
399                         new_expected_ids[pTap->expected_ids_cnt] = w;
400
401                         free(pTap->expected_ids);
402                         pTap->expected_ids = new_expected_ids;
403                         pTap->expected_ids_cnt++;
404                         break;
405                 }
406                 case NTAP_OPT_IRLEN:
407                 case NTAP_OPT_IRMASK:
408                 case NTAP_OPT_IRCAPTURE:
409                         e = Jim_GetOpt_Wide( goi, &w );
410                         if( e != JIM_OK ){
411                                 Jim_SetResult_sprintf( goi->interp, "option: %s bad parameter", n->name );
412                                 return e;
413                         }
414                         if( (w < 0) || (w > 0xffff) ){
415                                 /* wacky value */
416                                 Jim_SetResult_sprintf( goi->interp, "option: %s - wacky value: %d (0x%x)",
417                                                                            n->name, (int)(w), (int)(w));
418                                 return JIM_ERR;
419                         }
420                         switch(n->value){
421                         case NTAP_OPT_IRLEN:
422                                 pTap->ir_length = w;
423                                 reqbits &= (~(NTREQ_IRLEN));
424                                 break;
425                         case NTAP_OPT_IRMASK:
426                                 pTap->ir_capture_mask = w;
427                                 reqbits &= (~(NTREQ_IRMASK));
428                                 break;
429                         case NTAP_OPT_IRCAPTURE:
430                                 pTap->ir_capture_value = w;
431                                 reqbits &= (~(NTREQ_IRCAPTURE));
432                                 break;
433                         }
434                 } /* switch(n->value) */
435         } /* while( goi->argc ) */
436
437         /* Did all the required option bits get cleared? */
438         if (0 == reqbits)
439         {
440                 jtag_tap_init(pTap);
441                 return ERROR_OK;
442         }
443
444         Jim_SetResult_sprintf(goi->interp,
445                         "newtap: %s missing required parameters",
446                         pTap->dotted_name);
447         jtag_tap_free(pTap);
448         return JIM_ERR;
449 }
450
451 static void jtag_tap_handle_event( jtag_tap_t * tap, enum jtag_tap_event e)
452 {
453         jtag_tap_event_action_t * jteap;
454         int done;
455
456         jteap = tap->event_action;
457
458         done = 0;
459         while (jteap) {
460                 if (jteap->event == e) {
461                         done = 1;
462                         LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
463                                         tap->dotted_name,
464                                         e,
465                                         Jim_Nvp_value2name_simple(nvp_jtag_tap_event, e)->name,
466                                         Jim_GetString(jteap->body, NULL) );
467                         if (Jim_EvalObj(interp, jteap->body) != JIM_OK) {
468                                 Jim_PrintErrorMessage(interp);
469                         }
470                 }
471
472                 jteap = jteap->next;
473         }
474
475         if (!done) {
476                 LOG_DEBUG( "event %d %s - no action",
477                                 e,
478                                 Jim_Nvp_value2name_simple( nvp_jtag_tap_event, e)->name);
479         }
480 }
481
482
483 static int jim_jtag_command( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
484 {
485         Jim_GetOptInfo goi;
486         int e;
487         Jim_Nvp *n;
488         Jim_Obj *o;
489         struct command_context_s *context;
490
491         enum {
492                 JTAG_CMD_INTERFACE,
493                 JTAG_CMD_INIT_RESET,
494                 JTAG_CMD_NEWTAP,
495                 JTAG_CMD_TAPENABLE,
496                 JTAG_CMD_TAPDISABLE,
497                 JTAG_CMD_TAPISENABLED,
498                 JTAG_CMD_CONFIGURE,
499                 JTAG_CMD_CGET
500         };
501
502         const Jim_Nvp jtag_cmds[] = {
503                 { .name = "interface"     , .value = JTAG_CMD_INTERFACE },
504                 { .name = "arp_init-reset", .value = JTAG_CMD_INIT_RESET },
505                 { .name = "newtap"        , .value = JTAG_CMD_NEWTAP },
506                 { .name = "tapisenabled"     , .value = JTAG_CMD_TAPISENABLED },
507                 { .name = "tapenable"     , .value = JTAG_CMD_TAPENABLE },
508                 { .name = "tapdisable"    , .value = JTAG_CMD_TAPDISABLE },
509                 { .name = "configure"     , .value = JTAG_CMD_CONFIGURE },
510                 { .name = "cget"          , .value = JTAG_CMD_CGET },
511
512                 { .name = NULL, .value = -1 },
513         };
514
515         context = Jim_GetAssocData(interp, "context");
516         /* go past the command */
517         Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
518
519         e = Jim_GetOpt_Nvp( &goi, jtag_cmds, &n );
520         if( e != JIM_OK ){
521                 Jim_GetOpt_NvpUnknown( &goi, jtag_cmds, 0 );
522                 return e;
523         }
524                 Jim_SetEmptyResult( goi.interp );
525         switch( n->value ){
526         case JTAG_CMD_INTERFACE:
527                 /* return the name of the interface */
528                 /* TCL code might need to know the exact type... */
529                 /* FUTURE: we allow this as a means to "set" the interface. */
530                 if( goi.argc != 0 ){
531                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
532                         return JIM_ERR;
533                 }
534                 Jim_SetResultString( goi.interp, jtag_interface->name, -1 );
535                 return JIM_OK;
536         case JTAG_CMD_INIT_RESET:
537                 if( goi.argc != 0 ){
538                         Jim_WrongNumArgs( goi.interp, 1, goi.argv-1, "(no params)");
539                         return JIM_ERR;
540                 }
541                 e = jtag_init_reset(context);
542                 if( e != ERROR_OK ){
543                         Jim_SetResult_sprintf( goi.interp, "error: %d", e);
544                         return JIM_ERR;
545                 }
546                 return JIM_OK;
547         case JTAG_CMD_NEWTAP:
548                 return jim_newtap_cmd( &goi );
549                 break;
550         case JTAG_CMD_TAPISENABLED:
551         case JTAG_CMD_TAPENABLE:
552         case JTAG_CMD_TAPDISABLE:
553                 if( goi.argc != 1 ){
554                         Jim_SetResultString( goi.interp, "Too many parameters",-1 );
555                         return JIM_ERR;
556                 }
557
558                 {
559                         jtag_tap_t *t;
560                         t = jtag_tap_by_jim_obj( goi.interp, goi.argv[0] );
561                         if( t == NULL ){
562                                 return JIM_ERR;
563                         }
564                         switch( n->value ){
565                         case JTAG_CMD_TAPISENABLED:
566                                 e = t->enabled;
567                                 break;
568                         case JTAG_CMD_TAPENABLE:
569                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_ENABLE);
570                                 e = 1;
571                                 t->enabled = e;
572                                 break;
573                         case JTAG_CMD_TAPDISABLE:
574                                 jtag_tap_handle_event( t, JTAG_TAP_EVENT_DISABLE);
575                                 e = 0;
576                                 t->enabled = e;
577                                 break;
578                         }
579                         Jim_SetResult( goi.interp, Jim_NewIntObj( goi.interp, e ) );
580                         return JIM_OK;
581                 }
582                 break;
583
584         case JTAG_CMD_CGET:
585                 if( goi.argc < 2 ){
586                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ...");
587                         return JIM_ERR;
588                 }
589
590                 {
591                         jtag_tap_t *t;
592
593                         Jim_GetOpt_Obj(&goi, &o);
594                         t = jtag_tap_by_jim_obj( goi.interp, o );
595                         if( t == NULL ){
596                                 return JIM_ERR;
597                         }
598
599                         goi.isconfigure = 0;
600                         return jtag_tap_configure_cmd( &goi, t);
601                 }
602                 break;
603
604         case JTAG_CMD_CONFIGURE:
605                 if( goi.argc < 3 ){
606                         Jim_WrongNumArgs( goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
607                         return JIM_ERR;
608                 }
609
610                 {
611                         jtag_tap_t *t;
612
613                         Jim_GetOpt_Obj(&goi, &o);
614                         t = jtag_tap_by_jim_obj( goi.interp, o );
615                         if( t == NULL ){
616                                 return JIM_ERR;
617                         }
618
619                         goi.isconfigure = 1;
620                         return jtag_tap_configure_cmd( &goi, t);
621                 }
622         }
623
624         return JIM_ERR;
625 }
626
627 int jtag_register_commands(struct command_context_s *cmd_ctx)
628 {
629         register_jim( cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");
630
631         register_command(cmd_ctx, NULL, "interface", handle_interface_command,
632                 COMMAND_CONFIG, "try to configure interface");
633         register_command(cmd_ctx, NULL,
634                 "interface_list", &handle_interface_list_command,
635                 COMMAND_ANY, "list all built-in interfaces");
636         register_command(cmd_ctx, NULL, "jtag_speed", handle_jtag_speed_command,
637                 COMMAND_ANY, "(DEPRECATED) set jtag speed (if supported)");
638         register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
639                 COMMAND_ANY, "set maximum jtag speed (if supported); "
640                 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
641         register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
642                 COMMAND_CONFIG, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
643         register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
644                 COMMAND_ANY,
645                 "[none/trst_only/srst_only/trst_and_srst] [srst_pulls_trst/trst_pulls_srst] [combined/separate] [trst_push_pull/trst_open_drain] [srst_push_pull/srst_open_drain]");
646         register_command(cmd_ctx, NULL, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command,
647                 COMMAND_ANY, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
648         register_command(cmd_ctx, NULL, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command,
649                 COMMAND_ANY, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
650
651         register_command(cmd_ctx, NULL, "scan_chain", handle_scan_chain_command,
652                 COMMAND_EXEC, "print current scan chain configuration");
653
654         register_command(cmd_ctx, NULL, "jtag_reset", handle_jtag_reset_command,
655                 COMMAND_EXEC, "toggle reset lines <trst> <srst>");
656         register_command(cmd_ctx, NULL, "runtest", handle_runtest_command,
657                 COMMAND_EXEC, "move to Run-Test/Idle, and execute <num_cycles>");
658         register_command(cmd_ctx, NULL, "irscan", handle_irscan_command,
659                 COMMAND_EXEC, "execute IR scan <device> <instr> [dev2] [instr2] ...");
660         register_jim(cmd_ctx, "drscan", Jim_Command_drscan, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
661         register_jim(cmd_ctx, "flush_count", Jim_Command_flush_count, "returns number of times the JTAG queue has been flushed");
662
663         register_command(cmd_ctx, NULL, "verify_ircapture", handle_verify_ircapture_command,
664                 COMMAND_ANY, "verify value captured during Capture-IR <enable|disable>");
665         register_command(cmd_ctx, NULL, "verify_jtag", handle_verify_jtag_command,
666                 COMMAND_ANY, "verify value capture <enable|disable>");
667         register_command(cmd_ctx, NULL, "tms_sequence", handle_tms_sequence_command,
668                 COMMAND_ANY, "choose short(default) or long tms_sequence <short|long>");
669         return ERROR_OK;
670 }
671
672 static int default_khz(int khz, int *jtag_speed)
673 {
674         LOG_ERROR("Translation from khz to jtag_speed not implemented");
675         return ERROR_FAIL;
676 }
677
678 static int default_speed_div(int speed, int *khz)
679 {
680         LOG_ERROR("Translation from jtag_speed to khz not implemented");
681         return ERROR_FAIL;
682 }
683
684 static int default_power_dropout(int *dropout)
685 {
686         *dropout=0; /* by default we can't detect power dropout */
687         return ERROR_OK;
688 }
689
690 static int default_srst_asserted(int *srst_asserted)
691 {
692         *srst_asserted=0; /* by default we can't detect srst asserted */
693         return ERROR_OK;
694 }
695
696 static int handle_interface_command(struct command_context_s *cmd_ctx,
697                 char *cmd, char **args, int argc)
698 {
699         /* check whether the interface is already configured */
700         if (jtag_interface)
701         {
702                 LOG_WARNING("Interface already configured, ignoring");
703                 return ERROR_OK;
704         }
705
706         /* interface name is a mandatory argument */
707         if (argc != 1 || args[0][0] == '\0')
708                 return ERROR_COMMAND_SYNTAX_ERROR;
709
710         for (unsigned i = 0; NULL != jtag_interfaces[i]; i++)
711         {
712                 if (strcmp(args[0], jtag_interfaces[i]->name) != 0)
713                         continue;
714
715                 int retval = jtag_interfaces[i]->register_commands(cmd_ctx);
716                 if (ERROR_OK != retval)
717                                 return retval;
718
719                 jtag_interface = jtag_interfaces[i];
720
721                 if (jtag_interface->khz == NULL)
722                         jtag_interface->khz = default_khz;
723                 if (jtag_interface->speed_div == NULL)
724                         jtag_interface->speed_div = default_speed_div;
725                 if (jtag_interface->power_dropout == NULL)
726                         jtag_interface->power_dropout = default_power_dropout;
727                 if (jtag_interface->srst_asserted == NULL)
728                         jtag_interface->srst_asserted = default_srst_asserted;
729
730                 return ERROR_OK;
731         }
732
733         /* no valid interface was found (i.e. the configuration option,
734          * didn't match one of the compiled-in interfaces
735          */
736         LOG_ERROR("The specified JTAG interface was not found (%s)", args[0]);
737         handle_interface_list_command(cmd_ctx, cmd, args, argc);
738         return ERROR_JTAG_INVALID_INTERFACE;
739 }
740
741 static int handle_interface_list_command(struct command_context_s *cmd_ctx,
742                 char *cmd, char **args, int argc)
743 {
744         if (strcmp(cmd, "interface_list") == 0 && argc > 0)
745                 return ERROR_COMMAND_SYNTAX_ERROR;
746
747         command_print(cmd_ctx, "The following JTAG interfaces are available:");
748         for (unsigned i = 0; NULL != jtag_interfaces[i]; i++)
749         {
750                 const char *name = jtag_interfaces[i]->name;
751                 command_print(cmd_ctx, "%u: %s", i + 1, name);
752         }
753
754         return ERROR_OK;
755 }
756
757 static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
758 {
759         int e;
760         char buf[1024];
761         Jim_Obj *newargs[ 10 ];
762         /*
763          * CONVERT SYNTAX
764          * argv[-1] = command
765          * argv[ 0] = ir length
766          * argv[ 1] = ir capture
767          * argv[ 2] = ir mask
768          * argv[ 3] = not actually used by anything but in the docs
769          */
770
771         if( argc < 4 ){
772                 command_print( cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
773                 return ERROR_OK;
774         }
775         command_print( cmd_ctx, "OLD SYNTAX: DEPRECATED - translating to new syntax");
776         command_print( cmd_ctx, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
777                                    args[0],
778                                    args[1],
779                                    args[2] );
780         command_print( cmd_ctx, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
781         command_print( cmd_ctx, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
782         command_print( cmd_ctx, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
783         command_print( cmd_ctx, "And then refer to the taps by the dotted name.");
784
785         newargs[0] = Jim_NewStringObj( interp, "jtag", -1   );
786         newargs[1] = Jim_NewStringObj( interp, "newtap", -1 );
787         sprintf( buf, "chip%d", jtag_tap_count() );
788         newargs[2] = Jim_NewStringObj( interp, buf, -1 );
789         sprintf( buf, "tap%d", jtag_tap_count() );
790         newargs[3] = Jim_NewStringObj( interp, buf, -1  );
791         newargs[4] = Jim_NewStringObj( interp, "-irlen", -1  );
792         newargs[5] = Jim_NewStringObj( interp, args[0], -1  );
793         newargs[6] = Jim_NewStringObj( interp, "-ircapture", -1  );
794         newargs[7] = Jim_NewStringObj( interp, args[1], -1  );
795         newargs[8] = Jim_NewStringObj( interp, "-irmask", -1  );
796         newargs[9] = Jim_NewStringObj( interp, args[2], -1  );
797
798         command_print( cmd_ctx, "NEW COMMAND:");
799         sprintf( buf, "%s %s %s %s %s %s %s %s %s %s",
800                          Jim_GetString( newargs[0], NULL ),
801                          Jim_GetString( newargs[1], NULL ),
802                          Jim_GetString( newargs[2], NULL ),
803                          Jim_GetString( newargs[3], NULL ),
804                          Jim_GetString( newargs[4], NULL ),
805                          Jim_GetString( newargs[5], NULL ),
806                          Jim_GetString( newargs[6], NULL ),
807                          Jim_GetString( newargs[7], NULL ),
808                          Jim_GetString( newargs[8], NULL ),
809                          Jim_GetString( newargs[9], NULL ) );
810
811         e = jim_jtag_command( interp, 10, newargs );
812         if( e != JIM_OK ){
813                 command_print( cmd_ctx, "%s", Jim_GetString( Jim_GetResult(interp), NULL ) );
814         }
815         return e;
816 }
817
818 static int handle_scan_chain_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
819 {
820         jtag_tap_t *tap;
821
822         tap = jtag_all_taps();
823         command_print(cmd_ctx, "     TapName            | Enabled |   IdCode      Expected    IrLen IrCap  IrMask Instr     ");
824         command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
825
826         while( tap ){
827                 u32 expected, expected_mask, cur_instr, ii;
828                 expected = buf_get_u32(tap->expected, 0, tap->ir_length);
829                 expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
830                 cur_instr = buf_get_u32(tap->cur_instr, 0, tap->ir_length);
831
832                 command_print(cmd_ctx,
833                                           "%2d | %-18s |    %c    | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
834                                           tap->abs_chain_position,
835                                           tap->dotted_name,
836                                           tap->enabled ? 'Y' : 'n',
837                                           tap->idcode,
838                                           (tap->expected_ids_cnt > 0 ? tap->expected_ids[0] : 0),
839                                           tap->ir_length,
840                                           expected,
841                                           expected_mask,
842                                           cur_instr);
843
844                 for (ii = 1; ii < tap->expected_ids_cnt; ii++) {
845                         command_print(cmd_ctx, "   |                    |         |            | 0x%08x |      |      |      |         ",
846                                                   tap->expected_ids[ii]);
847                 }
848
849                 tap = tap->next_tap;
850         }
851
852         return ERROR_OK;
853 }
854
855 static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
856 {
857         int new_cfg = 0;
858         int mask = 0;
859
860         if (argc < 1)
861                 return ERROR_COMMAND_SYNTAX_ERROR;
862
863         /* Original versions cared about the order of these tokens:
864          *   reset_config signals [combination [trst_type [srst_type]]]
865          * They also clobbered the previous configuration even on error.
866          *
867          * Here we don't care about the order, and only change values
868          * which have been explicitly specified.
869          */
870         for (; argc; argc--, args++) {
871                 int tmp = 0;
872                 int m;
873
874                 /* signals */
875                 m = RESET_HAS_TRST | RESET_HAS_SRST;
876                 if (strcmp(*args, "none") == 0)
877                         tmp = RESET_NONE;
878                 else if (strcmp(*args, "trst_only") == 0)
879                         tmp = RESET_HAS_TRST;
880                 else if (strcmp(*args, "srst_only") == 0)
881                         tmp = RESET_HAS_SRST;
882                 else if (strcmp(*args, "trst_and_srst") == 0)
883                         tmp = RESET_HAS_TRST | RESET_HAS_SRST;
884                 else
885                         m = 0;
886                 if (mask & m) {
887                         LOG_ERROR("extra reset_config %s spec (%s)",
888                                         "signal", *args);
889                         return ERROR_INVALID_ARGUMENTS;
890                 }
891                 if (m)
892                         goto next;
893
894                 /* combination (options for broken wiring) */
895                 m = RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
896                 if (strcmp(*args, "separate") == 0)
897                         /* separate reset lines - default */;
898                 else if (strcmp(*args, "srst_pulls_trst") == 0)
899                         tmp |= RESET_SRST_PULLS_TRST;
900                 else if (strcmp(*args, "trst_pulls_srst") == 0)
901                         tmp |= RESET_TRST_PULLS_SRST;
902                 else if (strcmp(*args, "combined") == 0)
903                         tmp |= RESET_SRST_PULLS_TRST | RESET_TRST_PULLS_SRST;
904                 else
905                         m = 0;
906                 if (mask & m) {
907                         LOG_ERROR("extra reset_config %s spec (%s)",
908                                         "combination", *args);
909                         return ERROR_INVALID_ARGUMENTS;
910                 }
911                 if (m)
912                         goto next;
913
914                 /* trst_type (NOP without HAS_TRST) */
915                 m = RESET_TRST_OPEN_DRAIN;
916                 if (strcmp(*args, "trst_open_drain") == 0)
917                         tmp |= RESET_TRST_OPEN_DRAIN;
918                 else if (strcmp(*args, "trst_push_pull") == 0)
919                         /* push/pull from adapter - default */;
920                 else
921                         m = 0;
922                 if (mask & m) {
923                         LOG_ERROR("extra reset_config %s spec (%s)",
924                                         "trst_type", *args);
925                         return ERROR_INVALID_ARGUMENTS;
926                 }
927                 if (m)
928                         goto next;
929
930                 /* srst_type (NOP without HAS_SRST) */
931                 m |= RESET_SRST_PUSH_PULL;
932                 if (strcmp(*args, "srst_push_pull") == 0)
933                         tmp |= RESET_SRST_PUSH_PULL;
934                 else if (strcmp(*args, "srst_open_drain") == 0)
935                         /* open drain from adapter - default */;
936                 else
937                         m = 0;
938                 if (mask & m) {
939                         LOG_ERROR("extra reset_config %s spec (%s)",
940                                         "srst_type", *args);
941                         return ERROR_INVALID_ARGUMENTS;
942                 }
943                 if (m)
944                         goto next;
945
946                 /* caller provided nonsense; fail */
947                 LOG_ERROR("unknown reset_config flag (%s)", *args);
948                 return ERROR_INVALID_ARGUMENTS;
949
950 next:
951                 /* Remember the bits which were specified (mask)
952                  * and their new values (new_cfg).
953                  */
954                 mask |= m;
955                 new_cfg |= tmp;
956         }
957
958         /* clear previous values of those bits, save new values */
959         enum reset_types old_cfg = jtag_get_reset_config();
960         old_cfg &= ~mask;
961         new_cfg |= old_cfg;
962         jtag_set_reset_config(new_cfg);
963
964         return ERROR_OK;
965 }
966
967 static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx,
968                 char *cmd, char **args, int argc)
969 {
970         if (argc > 1)
971                 return ERROR_COMMAND_SYNTAX_ERROR;
972         if (argc == 1)
973                 jtag_set_nsrst_delay(strtoul(args[0], NULL, 0));
974         command_print(cmd_ctx, "jtag_nsrst_delay: %u", jtag_get_nsrst_delay());
975         return ERROR_OK;
976 }
977
978 static int handle_jtag_ntrst_delay_command(struct command_context_s *cmd_ctx,
979                 char *cmd, char **args, int argc)
980 {
981         if (argc > 1)
982                 return ERROR_COMMAND_SYNTAX_ERROR;
983         if (argc == 1)
984                 jtag_set_ntrst_delay(strtoul(args[0], NULL, 0));
985         command_print(cmd_ctx, "jtag_ntrst_delay: %u", jtag_get_ntrst_delay());
986         return ERROR_OK;
987 }
988
989 static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
990 {
991         int retval = ERROR_OK;
992
993         if (argc > 1)
994                 return ERROR_COMMAND_SYNTAX_ERROR;
995         if (argc == 1)
996         {
997                 LOG_DEBUG("handle jtag speed");
998
999                 int cur_speed = 0;
1000                 cur_speed = strtoul(args[0], NULL, 0);
1001                 retval = jtag_set_speed(cur_speed);
1002
1003         }
1004         command_print(cmd_ctx, "jtag_speed: %d", jtag_get_speed());
1005
1006         return retval;
1007 }
1008
1009 static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1010 {
1011         if (argc > 1)
1012                 return ERROR_COMMAND_SYNTAX_ERROR;
1013
1014         int retval = ERROR_OK;
1015         int cur_speed = 0;
1016         if (argc == 1)
1017         {
1018                 LOG_DEBUG("handle jtag khz");
1019
1020                 jtag_set_speed_khz(strtoul(args[0], NULL, 0));
1021                 if (jtag != NULL)
1022                 {
1023                         LOG_DEBUG("have interface set up");
1024                         int speed_div1;
1025                         retval = jtag->khz(jtag_get_speed_khz(), &speed_div1);
1026                         if (ERROR_OK != retval)
1027                         {
1028                                 jtag_set_speed_khz(0);
1029                                 return retval;
1030                         }
1031                         cur_speed = speed_div1;
1032                 }
1033                 retval = jtag_set_speed(cur_speed);
1034         }
1035
1036         cur_speed = jtag_get_speed_khz();
1037         if (jtag != NULL)
1038         {
1039                 retval = jtag->speed_div(jtag_get_speed(), &cur_speed);
1040                 if (ERROR_OK != retval)
1041                         return retval;
1042         }
1043
1044         if (cur_speed)
1045                 command_print(cmd_ctx, "%d kHz", cur_speed);
1046         else
1047                 command_print(cmd_ctx, "RCLK - adaptive");
1048         return retval;
1049
1050 }
1051
1052 static int handle_jtag_reset_command(struct command_context_s *cmd_ctx,
1053                 char *cmd, char **args, int argc)
1054 {
1055         if (argc != 2)
1056                 return ERROR_COMMAND_SYNTAX_ERROR;
1057
1058         int trst = -1;
1059         if (args[0][0] == '1')
1060                 trst = 1;
1061         else if (args[0][0] == '0')
1062                 trst = 0;
1063         else
1064                 return ERROR_COMMAND_SYNTAX_ERROR;
1065
1066         int srst = -1;
1067         if (args[1][0] == '1')
1068                 srst = 1;
1069         else if (args[1][0] == '0')
1070                 srst = 0;
1071         else
1072                 return ERROR_COMMAND_SYNTAX_ERROR;
1073
1074         if (jtag_interface_init(cmd_ctx) != ERROR_OK)
1075                 return ERROR_JTAG_INIT_FAILED;
1076
1077         jtag_add_reset(trst, srst);
1078         jtag_execute_queue();
1079
1080         return ERROR_OK;
1081 }
1082
1083 static int handle_runtest_command(struct command_context_s *cmd_ctx,
1084                 char *cmd, char **args, int argc)
1085 {
1086         if (argc != 1)
1087                 return ERROR_COMMAND_SYNTAX_ERROR;
1088
1089         jtag_add_runtest(strtol(args[0], NULL, 0), jtag_get_end_state());
1090         jtag_execute_queue();
1091
1092         return ERROR_OK;
1093 }
1094
1095 /*
1096  * For "irscan" or "drscan" commands, the "end" (really, "next") state
1097  * should be stable ... and *NOT* a shift state, otherwise free-running
1098  * jtag clocks could change the values latched by the update state.
1099  */
1100 static bool scan_is_safe(tap_state_t state)
1101 {
1102         switch (state)
1103         {
1104         case TAP_RESET:
1105         case TAP_IDLE:
1106         case TAP_DRPAUSE:
1107         case TAP_IRPAUSE:
1108                 return true;
1109         default:
1110                 return false;
1111         }
1112 }
1113
1114
1115 static int handle_irscan_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1116 {
1117         int i;
1118         scan_field_t *fields;
1119         jtag_tap_t *tap;
1120         tap_state_t endstate;
1121
1122         if ((argc < 2) || (argc % 2))
1123         {
1124                 return ERROR_COMMAND_SYNTAX_ERROR;
1125         }
1126
1127         /* optional "-endstate" "statename" at the end of the arguments,
1128          * so that e.g. IRPAUSE can let us load the data register before
1129          * entering RUN/IDLE to execute the instruction we load here.
1130          */
1131         endstate = TAP_IDLE;
1132
1133         if( argc >= 4 ){
1134                 /* have at least one pair of numbers. */
1135                 /* is last pair the magic text? */
1136                 if( 0 == strcmp( "-endstate", args[ argc - 2 ] ) ){
1137                         const char *cpA;
1138                         const char *cpS;
1139                         cpA = args[ argc-1 ];
1140                         for( endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++ ){
1141                                 cpS = tap_state_name( endstate );
1142                                 if( 0 == strcmp( cpA, cpS ) ){
1143                                         break;
1144                                 }
1145                         }
1146                         if( endstate >= TAP_NUM_STATES ){
1147                                 return ERROR_COMMAND_SYNTAX_ERROR;
1148                         } else {
1149                                 if (!scan_is_safe(endstate))
1150                                         LOG_WARNING("irscan with unsafe "
1151                                                         "endstate \"%s\"", cpA);
1152                                 /* found - remove the last 2 args */
1153                                 argc -= 2;
1154                         }
1155                 }
1156         }
1157
1158         int num_fields = argc / 2;
1159
1160         fields = malloc(sizeof(scan_field_t) * num_fields);
1161
1162         for (i = 0; i < num_fields; i++)
1163         {
1164                 tap = jtag_tap_by_string( args[i*2] );
1165                 if (tap==NULL)
1166                 {
1167                         command_print( cmd_ctx, "Tap: %s unknown", args[i*2] );
1168                         return ERROR_FAIL;
1169                 }
1170                 int field_size = tap->ir_length;
1171                 fields[i].tap = tap;
1172                 fields[i].num_bits = field_size;
1173                 fields[i].out_value = malloc(CEIL(field_size, 8));
1174                 buf_set_u32(fields[i].out_value, 0, field_size, strtoul(args[i*2+1], NULL, 0));
1175                 fields[i].in_value = NULL;
1176         }
1177
1178         /* did we have an endstate? */
1179         jtag_add_ir_scan(num_fields, fields, endstate);
1180
1181         int retval=jtag_execute_queue();
1182
1183         for (i = 0; i < num_fields; i++)
1184                 free(fields[i].out_value);
1185
1186         free (fields);
1187
1188         return retval;
1189 }
1190
1191 static int Jim_Command_drscan(Jim_Interp *interp, int argc, Jim_Obj *const *args)
1192 {
1193         int retval;
1194         scan_field_t *fields;
1195         int num_fields;
1196         int field_count = 0;
1197         int i, e;
1198         jtag_tap_t *tap;
1199         tap_state_t endstate;
1200
1201         /* args[1] = device
1202          * args[2] = num_bits
1203          * args[3] = hex string
1204          * ... repeat num bits and hex string ...
1205          *
1206          * .. optionally:
1207         *     args[N-2] = "-endstate"
1208          *     args[N-1] = statename
1209          */
1210         if ((argc < 4) || ((argc % 2)!=0))
1211         {
1212                 Jim_WrongNumArgs(interp, 1, args, "wrong arguments");
1213                 return JIM_ERR;
1214         }
1215
1216         endstate = TAP_IDLE;
1217
1218         /* validate arguments as numbers */
1219         e = JIM_OK;
1220         for (i = 2; i < argc; i+=2)
1221         {
1222                 long bits;
1223                 const char *cp;
1224
1225                 e = Jim_GetLong(interp, args[i], &bits);
1226                 /* If valid - try next arg */
1227                 if( e == JIM_OK ){
1228                         continue;
1229                 }
1230
1231                 /* Not valid.. are we at the end? */
1232                 if ( ((i+2) != argc) ){
1233                         /* nope, then error */
1234                         return e;
1235                 }
1236
1237                 /* it could be: "-endstate FOO"
1238                  * e.g. DRPAUSE so we can issue more instructions
1239                  * before entering RUN/IDLE and executing them.
1240                  */
1241
1242                 /* get arg as a string. */
1243                 cp = Jim_GetString( args[i], NULL );
1244                 /* is it the magic? */
1245                 if( 0 == strcmp( "-endstate", cp ) ){
1246                         /* is the statename valid? */
1247                         cp = Jim_GetString( args[i+1], NULL );
1248
1249                         /* see if it is a valid state name */
1250                         endstate = tap_state_by_name(cp);
1251                         if( endstate < 0 ){
1252                                 /* update the error message */
1253                                 Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp );
1254                         } else {
1255                                 if (!scan_is_safe(endstate))
1256                                         LOG_WARNING("drscan with unsafe "
1257                                                         "endstate \"%s\"", cp);
1258
1259                                 /* valid - so clear the error */
1260                                 e = JIM_OK;
1261                                 /* and remove the last 2 args */
1262                                 argc -= 2;
1263                         }
1264                 }
1265
1266                 /* Still an error? */
1267                 if( e != JIM_OK ){
1268                         return e; /* too bad */
1269                 }
1270         } /* validate args */
1271
1272         tap = jtag_tap_by_jim_obj( interp, args[1] );
1273         if( tap == NULL ){
1274                 return JIM_ERR;
1275         }
1276
1277         num_fields=(argc-2)/2;
1278         fields = malloc(sizeof(scan_field_t) * num_fields);
1279         for (i = 2; i < argc; i+=2)
1280         {
1281                 long bits;
1282                 int len;
1283                 const char *str;
1284
1285                 Jim_GetLong(interp, args[i], &bits);
1286                 str = Jim_GetString(args[i+1], &len);
1287
1288                 fields[field_count].tap = tap;
1289                 fields[field_count].num_bits = bits;
1290                 fields[field_count].out_value = malloc(CEIL(bits, 8));
1291                 str_to_buf(str, len, fields[field_count].out_value, bits, 0);
1292                 fields[field_count].in_value = fields[field_count].out_value;
1293                 field_count++;
1294         }
1295
1296         jtag_add_dr_scan(num_fields, fields, endstate);
1297
1298         retval = jtag_execute_queue();
1299         if (retval != ERROR_OK)
1300         {
1301                 Jim_SetResultString(interp, "drscan: jtag execute failed",-1);
1302                 return JIM_ERR;
1303         }
1304
1305         field_count=0;
1306         Jim_Obj *list = Jim_NewListObj(interp, NULL, 0);
1307         for (i = 2; i < argc; i+=2)
1308         {
1309                 long bits;
1310                 char *str;
1311
1312                 Jim_GetLong(interp, args[i], &bits);
1313                 str = buf_to_str(fields[field_count].in_value, bits, 16);
1314                 free(fields[field_count].out_value);
1315
1316                 Jim_ListAppendElement(interp, list, Jim_NewStringObj(interp, str, strlen(str)));
1317                 free(str);
1318                 field_count++;
1319         }
1320
1321         Jim_SetResult(interp, list);
1322
1323         free(fields);
1324
1325         return JIM_OK;
1326 }
1327
1328
1329 static int Jim_Command_flush_count(Jim_Interp *interp, int argc, Jim_Obj *const *args)
1330 {
1331         Jim_SetResult(interp, Jim_NewIntObj(interp, jtag_get_flush_queue_count()));
1332
1333         return JIM_OK;
1334 }
1335
1336
1337 static int handle_verify_ircapture_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1338 {
1339         if (argc > 1)
1340                 return ERROR_COMMAND_SYNTAX_ERROR;
1341
1342         if (argc == 1)
1343         {
1344                 if (strcmp(args[0], "enable") == 0)
1345                         jtag_set_verify_capture_ir(true);
1346                 else if (strcmp(args[0], "disable") == 0)
1347                         jtag_set_verify_capture_ir(false);
1348                 else
1349                         return ERROR_COMMAND_SYNTAX_ERROR;
1350         }
1351
1352         const char *status = jtag_will_verify_capture_ir() ? "enabled": "disabled";
1353         command_print(cmd_ctx, "verify Capture-IR is %s", status);
1354
1355         return ERROR_OK;
1356 }
1357
1358 static int handle_verify_jtag_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1359 {
1360         if (argc > 1)
1361                 return ERROR_COMMAND_SYNTAX_ERROR;
1362
1363         if (argc == 1)
1364         {
1365                 if (strcmp(args[0], "enable") == 0)
1366                         jtag_set_verify(true);
1367                 else if (strcmp(args[0], "disable") == 0)
1368                         jtag_set_verify(false);
1369                 else
1370                         return ERROR_COMMAND_SYNTAX_ERROR;
1371         }
1372
1373         const char *status = jtag_will_verify() ? "enabled": "disabled";
1374         command_print(cmd_ctx, "verify jtag capture is %s", status);
1375
1376         return ERROR_OK;
1377 }
1378
1379 static int handle_tms_sequence_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
1380 {
1381         if (argc > 1)
1382                 return ERROR_COMMAND_SYNTAX_ERROR;
1383
1384         if (argc == 1)
1385         {
1386                 bool use_new_table;
1387                 if (strcmp(args[0], "short") == 0)
1388                         use_new_table = true;
1389                 else if (strcmp(args[0], "long") == 0)
1390                         use_new_table = false;
1391                 else
1392                         return ERROR_COMMAND_SYNTAX_ERROR;
1393
1394                 tap_use_new_tms_table(use_new_table);
1395         }
1396
1397         command_print(cmd_ctx, "tms sequence is  %s",
1398                         tap_uses_new_tms_table() ? "short": "long");
1399
1400         return ERROR_OK;
1401 }
1402