1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * Copyright (C) 2007,2008 Øyvind Harboe *
6 * oyvind.harboe@zylin.com *
8 * Copyright (C) 2009 SoftPLC Corporation *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
17 * This program is distributed in the hope that it will be useful, *
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
20 * GNU General Public License for more details. *
22 * You should have received a copy of the GNU General Public License *
23 * along with this program; if not, write to the *
24 * Free Software Foundation, Inc., *
25 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
26 ***************************************************************************/
31 #include "replacements.h"
46 int jtag_flush_queue_count
; /* count # of flushes for profiling / debugging purposes */
49 /* note that this is not marked as static as it must be available from outside jtag.c for those
50 that implement the jtag_xxx() minidriver layer
52 int jtag_error
=ERROR_OK
;
54 typedef struct cmd_queue_page_s
58 struct cmd_queue_page_s
*next
;
61 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
62 static cmd_queue_page_t
*cmd_queue_pages
= NULL
;
64 char* jtag_event_strings
[] =
66 "JTAG controller reset (RESET or TRST)"
69 const Jim_Nvp nvp_jtag_tap_event
[] = {
70 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
71 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
73 { .name
= NULL
, .value
= -1 }
79 jtag_command_t
*jtag_command_queue
= NULL
;
80 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
81 static jtag_tap_t
*jtag_all_taps
= NULL
;
83 enum reset_types jtag_reset_config
= RESET_NONE
;
84 tap_state_t cmd_queue_end_state
= TAP_RESET
;
85 tap_state_t cmd_queue_cur_state
= TAP_RESET
;
87 int jtag_verify_capture_ir
= 1;
89 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
90 static int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
91 static int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
93 /* maximum number of JTAG devices expected in the chain
95 #define JTAG_MAX_CHAIN_SIZE 20
97 /* callbacks to inform high-level handlers about JTAG state changes */
98 jtag_event_callback_t
*jtag_event_callbacks
;
101 static int speed_khz
= 0;
102 /* flag if the kHz speed was defined */
103 static int hasKHz
= 0;
105 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
108 #if BUILD_ECOSBOARD == 1
109 extern jtag_interface_t zy1000_interface
;
112 #if BUILD_PARPORT == 1
113 extern jtag_interface_t parport_interface
;
117 extern jtag_interface_t dummy_interface
;
120 #if BUILD_FT2232_FTD2XX == 1
121 extern jtag_interface_t ft2232_interface
;
124 #if BUILD_FT2232_LIBFTDI == 1
125 extern jtag_interface_t ft2232_interface
;
128 #if BUILD_AMTJTAGACCEL == 1
129 extern jtag_interface_t amt_jtagaccel_interface
;
132 #if BUILD_EP93XX == 1
133 extern jtag_interface_t ep93xx_interface
;
136 #if BUILD_AT91RM9200 == 1
137 extern jtag_interface_t at91rm9200_interface
;
140 #if BUILD_GW16012 == 1
141 extern jtag_interface_t gw16012_interface
;
144 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
145 extern jtag_interface_t presto_interface
;
148 #if BUILD_USBPROG == 1
149 extern jtag_interface_t usbprog_interface
;
153 extern jtag_interface_t jlink_interface
;
156 #if BUILD_VSLLINK == 1
157 extern jtag_interface_t vsllink_interface
;
161 extern jtag_interface_t rlink_interface
;
164 #if BUILD_ARMJTAGEW == 1
165 extern jtag_interface_t armjtagew_interface
;
168 jtag_interface_t
*jtag_interfaces
[] = {
169 #if BUILD_ECOSBOARD == 1
172 #if BUILD_PARPORT == 1
178 #if BUILD_FT2232_FTD2XX == 1
181 #if BUILD_FT2232_LIBFTDI == 1
184 #if BUILD_AMTJTAGACCEL == 1
185 &amt_jtagaccel_interface
,
187 #if BUILD_EP93XX == 1
190 #if BUILD_AT91RM9200 == 1
191 &at91rm9200_interface
,
193 #if BUILD_GW16012 == 1
196 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
199 #if BUILD_USBPROG == 1
205 #if BUILD_VSLLINK == 1
211 #if BUILD_ARMJTAGEW == 1
212 &armjtagew_interface
,
217 jtag_interface_t
*jtag
= NULL
;
220 static jtag_interface_t
*jtag_interface
= NULL
;
223 /* forward declarations */
224 //void jtag_add_pathmove(int num_states, tap_state_t *path);
225 //void jtag_add_runtest(int num_cycles, tap_state_t endstate);
226 //void jtag_add_end_state(tap_state_t endstate);
227 //void jtag_add_sleep(u32 us);
228 //int jtag_execute_queue(void);
229 static tap_state_t
tap_state_by_name(const char *name
);
232 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
233 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
234 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
235 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
236 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
237 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
238 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
240 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
242 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
243 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
244 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
245 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
246 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
247 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
249 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
251 jtag_tap_t
*jtag_AllTaps(void)
253 return jtag_all_taps
;
256 int jtag_NumTotalTaps(void)
270 int jtag_NumEnabledTaps(void)
286 jtag_tap_t
*jtag_TapByString( const char *s
)
294 if( 0 == strcmp( t
->dotted_name
, s
) ){
300 /* backup plan is by number */
302 /* ok - is "s" a number? */
304 n
= strtol( s
, &cp
, 0 );
305 if( (s
!= cp
) && (*cp
== 0) ){
307 t
= jtag_TapByAbsPosition(n
);
313 jtag_tap_t
* jtag_TapByJimObj( Jim_Interp
*interp
, Jim_Obj
*o
)
318 cp
= Jim_GetString( o
, NULL
);
323 t
= jtag_TapByString( cp
);
326 Jim_SetResult_sprintf(interp
,"Tap: %s is unknown", cp
);
331 /* returns a pointer to the n-th device in the scan chain */
332 jtag_tap_t
* jtag_TapByAbsPosition( int n
)
340 while( t
&& (n
> 0)) {
347 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
349 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
351 if (callback
== NULL
)
353 return ERROR_INVALID_ARGUMENTS
;
358 while ((*callbacks_p
)->next
)
359 callbacks_p
= &((*callbacks_p
)->next
);
360 callbacks_p
= &((*callbacks_p
)->next
);
363 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
364 (*callbacks_p
)->callback
= callback
;
365 (*callbacks_p
)->priv
= priv
;
366 (*callbacks_p
)->next
= NULL
;
371 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
373 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
375 if (callback
== NULL
)
377 return ERROR_INVALID_ARGUMENTS
;
382 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
383 if ((*callbacks_p
)->callback
== callback
)
386 *callbacks_p
= *next
;
394 int jtag_call_event_callbacks(enum jtag_event event
)
396 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
398 LOG_DEBUG("jtag event: %s", jtag_event_strings
[event
]);
402 callback
->callback(event
, callback
->priv
);
403 callback
= callback
->next
;
409 /* returns a pointer to the pointer of the last command in queue
410 * this may be a pointer to the root pointer (jtag_command_queue)
411 * or to the next member of the last but one command
413 jtag_command_t
** jtag_get_last_command_p(void)
415 /* jtag_command_t *cmd = jtag_command_queue;
421 return &jtag_command_queue;
425 return last_comand_pointer
;
428 void* cmd_queue_alloc(size_t size
)
430 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
436 * We align/round the *SIZE* per below
437 * so that all pointers returned by
438 * this function are reasonably well
441 * If we did not, then an "odd-length" request would cause the
442 * *next* allocation to be at an *odd* address, and because
443 * this function has the same type of api as malloc() - we
444 * must also return pointers that have the same type of
447 * What I do not/have is a reasonable portable means
450 * The solution here, is based on these suggestions.
451 * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
454 union worse_case_align
{
460 #define ALIGN_SIZE (sizeof(union worse_case_align))
462 /* The alignment process. */
463 size
= (size
+ ALIGN_SIZE
-1) & (~(ALIGN_SIZE
-1));
468 while ((*p_page
)->next
)
469 p_page
= &((*p_page
)->next
);
470 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
471 p_page
= &((*p_page
)->next
);
476 *p_page
= malloc(sizeof(cmd_queue_page_t
));
478 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
479 (*p_page
)->next
= NULL
;
482 offset
= (*p_page
)->used
;
483 (*p_page
)->used
+= size
;
485 t
=(u8
*)((*p_page
)->address
);
489 void cmd_queue_free(void)
491 cmd_queue_page_t
*page
= cmd_queue_pages
;
495 cmd_queue_page_t
*last
= page
;
501 cmd_queue_pages
= NULL
;
504 static void jtag_prelude1(void)
508 LOG_WARNING("JTAG command queued, while TRST is low (TAP in reset)");
509 jtag_error
=ERROR_JTAG_TRST_ASSERTED
;
513 if (cmd_queue_end_state
== TAP_RESET
)
514 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
517 static void jtag_prelude(tap_state_t state
)
521 if (state
!= TAP_INVALID
)
522 jtag_add_end_state(state
);
524 cmd_queue_cur_state
= cmd_queue_end_state
;
527 void jtag_add_ir_scan_noverify(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
532 retval
=interface_jtag_add_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
533 if (retval
!=ERROR_OK
)
539 void jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
541 /* 8 x 32 bit id's is enough for all invoations */
545 /* if we are to run a verification of the ir scan, we need to get the input back.
546 * We may have to allocate space if the caller didn't ask for the input back.
549 if (jtag_verify_capture_ir
)
552 for (j
= 0; j
< num_fields
; j
++)
555 if ((fields
[j
].in_value
==NULL
)&&(fields
[j
].num_bits
<=32))
560 fields
[j
].in_value
=(u8
*)(id
+j
);
563 LOG_DEBUG("caller must provide in_value space for verify_capture_ir to work");
569 jtag_add_ir_scan_noverify(num_fields
, fields
, state
);
571 if (jtag_verify_capture_ir
)
574 for (j
= 0; j
< num_fields
; j
++)
576 jtag_tap_t
*tap
=fields
[j
].tap
;
577 if (fields
[j
].in_value
!=NULL
)
579 /* we verify max 32 bit long irlens. */
580 jtag_check_value_mask(fields
+j
, tap
->expected
, tap
->expected_mask
);
585 fields
[j
].in_value
=NULL
;
592 int MINIDRIVER(interface_jtag_add_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
594 jtag_command_t
**last_cmd
;
601 last_cmd
= jtag_get_last_command_p();
603 /* allocate memory for a new list member */
604 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
605 (*last_cmd
)->next
= NULL
;
606 last_comand_pointer
= &((*last_cmd
)->next
);
607 (*last_cmd
)->type
= JTAG_SCAN
;
609 /* allocate memory for ir scan command */
610 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
611 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
612 x
= jtag_NumEnabledTaps();
613 (*last_cmd
)->cmd
.scan
->num_fields
= x
; /* one field per device */
614 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(x
* sizeof(scan_field_t
));
615 (*last_cmd
)->cmd
.scan
->end_state
= state
;
622 /* do this here so it is not forgotten */
623 tap
= jtag_NextEnabledTap(tap
);
629 assert(nth_tap
< x
);
631 scan_size
= tap
->ir_length
;
632 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].tap
= tap
;
633 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].num_bits
= scan_size
;
634 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_value
= NULL
; /* do not collect input for tap's in bypass */
636 /* search the list */
637 for (j
= 0; j
< num_fields
; j
++)
639 if (tap
== fields
[j
].tap
)
642 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_value
= fields
[j
].in_value
;
643 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
652 /* if a tap isn't listed, set it to BYPASS */
653 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
657 /* update device information */
658 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
, tap
->cur_instr
, scan_size
);
660 assert(nth_tap
== (x
-1));
665 void jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
671 retval
=interface_jtag_add_plain_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
672 if (retval
!=ERROR_OK
)
676 int MINIDRIVER(interface_jtag_add_plain_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
679 jtag_command_t
**last_cmd
;
681 last_cmd
= jtag_get_last_command_p();
683 /* allocate memory for a new list member */
684 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
685 (*last_cmd
)->next
= NULL
;
686 last_comand_pointer
= &((*last_cmd
)->next
);
687 (*last_cmd
)->type
= JTAG_SCAN
;
689 /* allocate memory for ir scan command */
690 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
691 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
692 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
693 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
694 (*last_cmd
)->cmd
.scan
->end_state
= state
;
696 for( i
= 0 ; i
< num_fields
; i
++ ){
697 int num_bits
= fields
[i
].num_bits
;
698 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
699 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
700 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
701 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
702 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
707 void jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
713 retval
=interface_jtag_add_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
714 if (retval
!=ERROR_OK
)
718 void jtag_add_dr_scan_now(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
720 jtag_add_dr_scan(num_fields
, fields
, state
);
721 jtag_execute_queue_noclear();
724 int MINIDRIVER(interface_jtag_add_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
728 int bypass_devices
= 0;
732 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
735 /* count devices in bypass */
739 tap
= jtag_NextEnabledTap(tap
);
748 /* allocate memory for a new list member */
749 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
750 last_comand_pointer
= &((*last_cmd
)->next
);
751 (*last_cmd
)->next
= NULL
;
752 (*last_cmd
)->type
= JTAG_SCAN
;
754 /* allocate memory for dr scan command */
755 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
756 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
757 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
758 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
759 (*last_cmd
)->cmd
.scan
->end_state
= state
;
765 tap
= jtag_NextEnabledTap(tap
);
770 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
772 for (j
= 0; j
< num_fields
; j
++)
774 if (tap
== fields
[j
].tap
)
777 scan_size
= fields
[j
].num_bits
;
778 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
779 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
780 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= fields
[j
].in_value
;
786 #ifdef _DEBUG_JTAG_IO_
787 /* if a device isn't listed, the BYPASS register should be selected */
790 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
794 /* program the scan field to 1 bit length, and ignore it's value */
795 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
796 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
797 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
802 #ifdef _DEBUG_JTAG_IO_
803 /* if a device is listed, the BYPASS register must not be selected */
806 LOG_ERROR("BUG: scan data for a device in BYPASS");
815 void MINIDRIVER(interface_jtag_add_dr_out
)(jtag_tap_t
*target_tap
,
819 tap_state_t end_state
)
824 int bypass_devices
= 0;
826 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
829 /* count devices in bypass */
833 tap
= jtag_NextEnabledTap(tap
);
842 /* allocate memory for a new list member */
843 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
844 last_comand_pointer
= &((*last_cmd
)->next
);
845 (*last_cmd
)->next
= NULL
;
846 (*last_cmd
)->type
= JTAG_SCAN
;
848 /* allocate memory for dr scan command */
849 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
850 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
851 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
852 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
853 (*last_cmd
)->cmd
.scan
->end_state
= end_state
;
858 tap
= jtag_NextEnabledTap(tap
);
863 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
865 if (tap
== target_tap
)
868 #ifdef _DEBUG_JTAG_IO_
869 /* if a device is listed, the BYPASS register must not be selected */
872 LOG_ERROR("BUG: scan data for a device in BYPASS");
876 for (j
= 0; j
< num_fields
; j
++)
879 scan_size
= num_bits
[j
];
880 buf_set_u32(out_value
, 0, scan_size
, value
[j
]);
881 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
882 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
883 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
888 #ifdef _DEBUG_JTAG_IO_
889 /* if a device isn't listed, the BYPASS register should be selected */
892 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
896 /* program the scan field to 1 bit length, and ignore it's value */
897 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
898 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
899 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
905 void jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
911 retval
=interface_jtag_add_plain_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
912 if (retval
!=ERROR_OK
)
916 int MINIDRIVER(interface_jtag_add_plain_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
919 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
921 /* allocate memory for a new list member */
922 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
923 last_comand_pointer
= &((*last_cmd
)->next
);
924 (*last_cmd
)->next
= NULL
;
925 (*last_cmd
)->type
= JTAG_SCAN
;
927 /* allocate memory for scan command */
928 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
929 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
930 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
931 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
932 (*last_cmd
)->cmd
.scan
->end_state
= state
;
934 for (i
= 0; i
< num_fields
; i
++)
936 int num_bits
= fields
[i
].num_bits
;
937 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
938 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
939 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
940 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
941 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
947 void jtag_add_tlr(void)
949 jtag_prelude(TAP_RESET
);
952 retval
=interface_jtag_add_tlr();
953 if (retval
!=ERROR_OK
)
957 int MINIDRIVER(interface_jtag_add_tlr
)(void)
959 tap_state_t state
= TAP_RESET
;
960 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
962 /* allocate memory for a new list member */
963 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
964 last_comand_pointer
= &((*last_cmd
)->next
);
965 (*last_cmd
)->next
= NULL
;
966 (*last_cmd
)->type
= JTAG_STATEMOVE
;
968 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
969 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
974 void jtag_add_pathmove(int num_states
, tap_state_t
*path
)
976 tap_state_t cur_state
= cmd_queue_cur_state
;
980 /* the last state has to be a stable state */
981 if (!tap_is_state_stable(path
[num_states
- 1]))
983 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
987 for (i
=0; i
<num_states
; i
++)
989 if (path
[i
] == TAP_RESET
)
991 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
995 if ( tap_state_transition(cur_state
, true) != path
[i
]
996 && tap_state_transition(cur_state
, false) != path
[i
])
998 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
1001 cur_state
= path
[i
];
1006 retval
= interface_jtag_add_pathmove(num_states
, path
);
1007 cmd_queue_cur_state
= path
[num_states
- 1];
1008 if (retval
!=ERROR_OK
)
1012 int MINIDRIVER(interface_jtag_add_pathmove
)(int num_states
, tap_state_t
*path
)
1014 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1017 /* allocate memory for a new list member */
1018 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1019 last_comand_pointer
= &((*last_cmd
)->next
);
1020 (*last_cmd
)->next
= NULL
;
1021 (*last_cmd
)->type
= JTAG_PATHMOVE
;
1023 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
1024 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
1025 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(tap_state_t
) * num_states
);
1027 for (i
= 0; i
< num_states
; i
++)
1028 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
1033 int MINIDRIVER(interface_jtag_add_runtest
)(int num_cycles
, tap_state_t state
)
1035 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1037 /* allocate memory for a new list member */
1038 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1039 (*last_cmd
)->next
= NULL
;
1040 last_comand_pointer
= &((*last_cmd
)->next
);
1041 (*last_cmd
)->type
= JTAG_RUNTEST
;
1043 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
1044 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
1045 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
1050 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
1054 jtag_prelude(state
);
1056 /* executed by sw or hw fifo */
1057 retval
=interface_jtag_add_runtest(num_cycles
, cmd_queue_end_state
);
1058 if (retval
!=ERROR_OK
)
1063 int MINIDRIVER(interface_jtag_add_clocks
)( int num_cycles
)
1065 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1067 /* allocate memory for a new list member */
1068 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1069 (*last_cmd
)->next
= NULL
;
1070 last_comand_pointer
= &((*last_cmd
)->next
);
1071 (*last_cmd
)->type
= JTAG_STABLECLOCKS
;
1073 (*last_cmd
)->cmd
.stableclocks
= cmd_queue_alloc(sizeof(stableclocks_command_t
));
1074 (*last_cmd
)->cmd
.stableclocks
->num_cycles
= num_cycles
;
1078 void jtag_add_clocks( int num_cycles
)
1082 if( !tap_is_state_stable(cmd_queue_cur_state
) )
1084 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
1085 tap_state_name(cmd_queue_cur_state
) );
1086 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
1090 if( num_cycles
> 0 )
1094 retval
= interface_jtag_add_clocks(num_cycles
);
1095 if (retval
!= ERROR_OK
)
1100 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
1102 int trst_with_tlr
= 0;
1105 /* FIX!!! there are *many* different cases here. A better
1106 * approach is needed for legal combinations of transitions...
1108 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
1109 (jtag_reset_config
& RESET_HAS_TRST
)&&
1110 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
1112 if (((req_tlr_or_trst
&&!jtag_trst
)||
1113 (!req_tlr_or_trst
&&jtag_trst
))&&
1114 ((req_srst
&&!jtag_srst
)||
1115 (!req_srst
&&jtag_srst
)))
1117 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
1118 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
1122 /* Make sure that jtag_reset_config allows the requested reset */
1123 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
1124 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
1126 LOG_ERROR("BUG: requested reset would assert trst");
1127 jtag_error
=ERROR_FAIL
;
1131 /* if TRST pulls SRST, we reset with TAP T-L-R */
1132 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
1137 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
1139 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
1140 jtag_error
=ERROR_FAIL
;
1144 if (req_tlr_or_trst
)
1146 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
1158 jtag_srst
= req_srst
;
1160 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
1161 if (retval
!=ERROR_OK
)
1169 LOG_DEBUG("SRST line asserted");
1173 LOG_DEBUG("SRST line released");
1174 if (jtag_nsrst_delay
)
1175 jtag_add_sleep(jtag_nsrst_delay
* 1000);
1180 LOG_DEBUG("JTAG reset with RESET instead of TRST");
1181 jtag_add_end_state(TAP_RESET
);
1183 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1189 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
1190 * and inform possible listeners about this
1192 LOG_DEBUG("TRST line asserted");
1193 cmd_queue_cur_state
= TAP_RESET
;
1194 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1198 if (jtag_ntrst_delay
)
1199 jtag_add_sleep(jtag_ntrst_delay
* 1000);
1203 int MINIDRIVER(interface_jtag_add_reset
)(int req_trst
, int req_srst
)
1205 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1207 /* allocate memory for a new list member */
1208 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1209 (*last_cmd
)->next
= NULL
;
1210 last_comand_pointer
= &((*last_cmd
)->next
);
1211 (*last_cmd
)->type
= JTAG_RESET
;
1213 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
1214 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
1215 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
1220 void jtag_add_end_state(tap_state_t state
)
1222 cmd_queue_end_state
= state
;
1223 if ((cmd_queue_end_state
== TAP_DRSHIFT
)||(cmd_queue_end_state
== TAP_IRSHIFT
))
1225 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
1229 int MINIDRIVER(interface_jtag_add_sleep
)(u32 us
)
1231 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1233 /* allocate memory for a new list member */
1234 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1235 (*last_cmd
)->next
= NULL
;
1236 last_comand_pointer
= &((*last_cmd
)->next
);
1237 (*last_cmd
)->type
= JTAG_SLEEP
;
1239 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
1240 (*last_cmd
)->cmd
.sleep
->us
= us
;
1245 void jtag_add_sleep(u32 us
)
1247 keep_alive(); /* we might be running on a very slow JTAG clk */
1248 int retval
=interface_jtag_add_sleep(us
);
1249 if (retval
!=ERROR_OK
)
1254 int jtag_scan_size(scan_command_t
*cmd
)
1259 /* count bits in scan command */
1260 for (i
= 0; i
< cmd
->num_fields
; i
++)
1262 bit_count
+= cmd
->fields
[i
].num_bits
;
1268 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
1273 bit_count
= jtag_scan_size(cmd
);
1274 *buffer
= malloc(CEIL(bit_count
, 8));
1278 #ifdef _DEBUG_JTAG_IO_
1279 LOG_DEBUG("%s num_fields: %i", cmd
->ir_scan
? "IRSCAN" : "DRSCAN", cmd
->num_fields
);
1282 for (i
= 0; i
< cmd
->num_fields
; i
++)
1284 if (cmd
->fields
[i
].out_value
)
1286 #ifdef _DEBUG_JTAG_IO_
1287 char* char_buf
= buf_to_str(cmd
->fields
[i
].out_value
, (cmd
->fields
[i
].num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: cmd
->fields
[i
].num_bits
, 16);
1289 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
1290 #ifdef _DEBUG_JTAG_IO_
1291 LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i
, cmd
->fields
[i
].num_bits
, char_buf
);
1297 #ifdef _DEBUG_JTAG_IO_
1298 LOG_DEBUG("fields[%i].out_value[%i]: NULL", i
, cmd
->fields
[i
].num_bits
);
1302 bit_count
+= cmd
->fields
[i
].num_bits
;
1305 #ifdef _DEBUG_JTAG_IO_
1306 //LOG_DEBUG("bit_count totalling: %i", bit_count );
1312 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1318 /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1321 for (i
= 0; i
< cmd
->num_fields
; i
++)
1323 /* if neither in_value nor in_handler
1324 * are specified we don't have to examine this field
1326 if (cmd
->fields
[i
].in_value
)
1328 int num_bits
= cmd
->fields
[i
].num_bits
;
1329 u8
*captured
= buf_set_buf(buffer
, bit_count
, malloc(CEIL(num_bits
, 8)), 0, num_bits
);
1331 #ifdef _DEBUG_JTAG_IO_
1332 char *char_buf
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1333 LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i
, num_bits
, char_buf
);
1337 if (cmd
->fields
[i
].in_value
)
1339 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1344 bit_count
+= cmd
->fields
[i
].num_bits
;
1350 static const char *jtag_tap_name(jtag_tap_t
*tap
)
1352 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
1355 int jtag_check_value_inner(u8
*captured
, scan_field_t
*field
, u8
*in_check_value
, u8
*in_check_mask
)
1357 int retval
= ERROR_OK
;
1358 int num_bits
= field
->num_bits
;
1360 int compare_failed
= 0;
1363 compare_failed
= buf_cmp_mask(captured
, in_check_value
, in_check_mask
, num_bits
);
1365 compare_failed
= buf_cmp(captured
, in_check_value
, num_bits
);
1367 if (compare_failed
){
1368 /* An error handler could have caught the failing check
1369 * only report a problem when there wasn't a handler, or if the handler
1370 * acknowledged the error
1372 LOG_WARNING("TAP %s:",
1373 jtag_tap_name(field
->tap
));
1376 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1377 char *in_check_value_char
= buf_to_str(in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1381 char *in_check_mask_char
;
1382 in_check_mask_char
= buf_to_str(in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1383 LOG_WARNING("value captured during scan didn't pass the requested check:");
1384 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
1385 captured_char
, in_check_value_char
, in_check_mask_char
);
1386 free(in_check_mask_char
);
1390 LOG_WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s", captured_char
, in_check_value_char
);
1393 free(captured_char
);
1394 free(in_check_value_char
);
1396 retval
= ERROR_JTAG_QUEUE_FAILED
;
1403 void jtag_check_value_mask(scan_field_t
*field
, u8
*value
, u8
*mask
)
1405 assert(field
->in_value
!= NULL
);
1409 /* no checking to do */
1413 jtag_execute_queue_noclear();
1415 int retval
=jtag_check_value_inner(field
->in_value
, field
, value
, mask
);
1416 jtag_set_error(retval
);
1421 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1426 for (i
= 0; i
< cmd
->num_fields
; i
++)
1428 if (cmd
->fields
[i
].in_value
)
1430 if (cmd
->fields
[i
].out_value
)
1437 int MINIDRIVER(interface_jtag_execute_queue
)(void)
1443 LOG_ERROR("No JTAG interface configured yet. Issue 'init' command in startup scripts before communicating with targets.");
1447 retval
= jtag
->execute_queue();
1451 jtag_command_queue
= NULL
;
1452 last_comand_pointer
= &jtag_command_queue
;
1457 void jtag_execute_queue_noclear(void)
1459 /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces.
1460 * E.g. a JTAG over TCP/IP or USB....
1462 jtag_flush_queue_count
++;
1464 int retval
=interface_jtag_execute_queue();
1465 /* we keep the first error */
1466 if ((jtag_error
==ERROR_OK
)&&(retval
!=ERROR_OK
))
1472 int jtag_execute_queue(void)
1475 jtag_execute_queue_noclear();
1477 jtag_error
=ERROR_OK
;
1481 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1483 jtag_tap_t
*tap
= priv
;
1487 if (event
== JTAG_TRST_ASSERTED
)
1489 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
1496 void jtag_sleep(u32 us
)
1498 alive_sleep(us
/1000);
1501 /* Try to examine chain layout according to IEEE 1149.1 §12
1503 int jtag_examine_chain(void)
1507 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1510 int device_count
= 0;
1511 u8 zero_check
= 0x0;
1512 u8 one_check
= 0xff;
1515 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1516 field
.out_value
= idcode_buffer
;
1518 field
.in_value
= idcode_buffer
;
1523 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1525 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
1528 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
1529 jtag_execute_queue();
1531 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1533 zero_check
|= idcode_buffer
[i
];
1534 one_check
&= idcode_buffer
[i
];
1537 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1538 if ((zero_check
== 0x00) || (one_check
== 0xff))
1540 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1541 return ERROR_JTAG_INIT_FAILED
;
1544 /* point at the 1st tap */
1545 tap
= jtag_NextEnabledTap(NULL
);
1547 LOG_ERROR("JTAG: No taps enabled?");
1548 return ERROR_JTAG_INIT_FAILED
;
1551 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1553 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1554 if ((idcode
& 1) == 0)
1556 /* LSB must not be 0, this indicates a device in bypass */
1557 LOG_WARNING("Tap/Device does not have IDCODE");
1568 /* some devices, such as AVR will output all 1's instead of TDI
1569 input value at end of chain. */
1570 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
1573 /* End of chain (invalid manufacturer ID)
1575 * The JTAG examine is the very first thing that happens
1577 * A single JTAG device requires only 64 bits to be read back correctly.
1579 * The code below adds a check that the rest of the data scanned (640 bits)
1580 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1582 * earlier and gives more helpful/explicit error messages.
1584 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1586 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1587 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1589 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1597 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1598 manufacturer
= EXTRACT_MFG(idcode
);
1599 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1600 part
= EXTRACT_PART(idcode
);
1601 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1602 version
= EXTRACT_VER(idcode
);
1604 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1605 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1606 idcode
, manufacturer
, part
, version
);
1612 tap
->idcode
= idcode
;
1614 if (tap
->expected_ids_cnt
> 0) {
1615 /* Loop over the expected identification codes and test for a match */
1617 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1618 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1623 /* If none of the expected ids matched, log an error */
1624 if (ii
== tap
->expected_ids_cnt
) {
1625 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1628 EXTRACT_MFG( tap
->idcode
),
1629 EXTRACT_PART( tap
->idcode
),
1630 EXTRACT_VER( tap
->idcode
) );
1631 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1632 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1635 tap
->expected_ids_cnt
,
1636 tap
->expected_ids
[ii
],
1637 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1638 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1639 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1642 return ERROR_JTAG_INIT_FAILED
;
1644 LOG_INFO("JTAG Tap/device matched");
1648 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1652 tap
= jtag_NextEnabledTap(tap
);
1657 /* see if number of discovered devices matches configuration */
1658 if (device_count
!= jtag_NumEnabledTaps())
1660 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1661 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1662 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1663 return ERROR_JTAG_INIT_FAILED
;
1669 int jtag_validate_chain(void)
1672 int total_ir_length
= 0;
1678 total_ir_length
= 0;
1680 tap
= jtag_NextEnabledTap(tap
);
1684 total_ir_length
+= tap
->ir_length
;
1687 total_ir_length
+= 2;
1688 ir_test
= malloc(CEIL(total_ir_length
, 8));
1689 buf_set_ones(ir_test
, total_ir_length
);
1692 field
.num_bits
= total_ir_length
;
1693 field
.out_value
= ir_test
;
1694 field
.in_value
= ir_test
;
1697 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1698 jtag_execute_queue();
1704 tap
= jtag_NextEnabledTap(tap
);
1709 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1712 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1713 LOG_ERROR("Could not validate JTAG scan chain, IR mismatch, scan returned 0x%s. tap=%s pos=%d expected 0x1 got %0x", cbuf
, jtag_tap_name(tap
), chain_pos
, val
);
1716 return ERROR_JTAG_INIT_FAILED
;
1718 chain_pos
+= tap
->ir_length
;
1721 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1724 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1725 LOG_ERROR("Could not validate end of JTAG scan chain, IR mismatch, scan returned 0x%s. pos=%d expected 0x3 got %0x", cbuf
, chain_pos
, val
);
1728 return ERROR_JTAG_INIT_FAILED
;
1736 enum jtag_tap_cfg_param
{
1740 static Jim_Nvp nvp_config_opts
[] = {
1741 { .name
= "-event", .value
= JCFG_EVENT
},
1743 { .name
= NULL
, .value
= -1 }
1746 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1752 /* parse config or cget options */
1753 while (goi
->argc
> 0) {
1754 Jim_SetEmptyResult (goi
->interp
);
1756 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1758 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1764 if (goi
->argc
== 0) {
1765 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1769 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1771 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1775 if (goi
->isconfigure
) {
1776 if (goi
->argc
!= 1) {
1777 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1781 if (goi
->argc
!= 0) {
1782 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1788 jtag_tap_event_action_t
*jteap
;
1790 jteap
= tap
->event_action
;
1791 /* replace existing? */
1793 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1796 jteap
= jteap
->next
;
1799 if (goi
->isconfigure
) {
1800 if (jteap
== NULL
) {
1802 jteap
= calloc(1, sizeof (*jteap
));
1804 jteap
->event
= n
->value
;
1805 Jim_GetOpt_Obj( goi
, &o
);
1807 Jim_DecrRefCount(interp
, jteap
->body
);
1809 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1810 Jim_IncrRefCount(jteap
->body
);
1812 /* add to head of event list */
1813 jteap
->next
= tap
->event_action
;
1814 tap
->event_action
= jteap
;
1815 Jim_SetEmptyResult(goi
->interp
);
1818 if (jteap
== NULL
) {
1819 Jim_SetEmptyResult(goi
->interp
);
1821 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1828 } /* while (goi->argc) */
1833 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1843 const Jim_Nvp opts
[] = {
1844 #define NTAP_OPT_IRLEN 0
1845 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1846 #define NTAP_OPT_IRMASK 1
1847 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1848 #define NTAP_OPT_IRCAPTURE 2
1849 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1850 #define NTAP_OPT_ENABLED 3
1851 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1852 #define NTAP_OPT_DISABLED 4
1853 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1854 #define NTAP_OPT_EXPECTED_ID 5
1855 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1856 { .name
= NULL
, .value
= -1 },
1859 pTap
= malloc( sizeof(jtag_tap_t
) );
1860 memset( pTap
, 0, sizeof(*pTap
) );
1862 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1866 * we expect CHIP + TAP + OPTIONS
1868 if( goi
->argc
< 3 ){
1869 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1872 Jim_GetOpt_String( goi
, &cp
, NULL
);
1873 pTap
->chip
= strdup(cp
);
1875 Jim_GetOpt_String( goi
, &cp
, NULL
);
1876 pTap
->tapname
= strdup(cp
);
1878 /* name + dot + name + null */
1879 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1881 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1882 pTap
->dotted_name
= cp
;
1884 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1885 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1887 /* default is enabled */
1890 /* deal with options */
1891 #define NTREQ_IRLEN 1
1892 #define NTREQ_IRCAPTURE 2
1893 #define NTREQ_IRMASK 4
1895 /* clear them as we find them */
1896 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1899 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1901 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1904 LOG_DEBUG("Processing option: %s", n
->name
);
1906 case NTAP_OPT_ENABLED
:
1909 case NTAP_OPT_DISABLED
:
1912 case NTAP_OPT_EXPECTED_ID
:
1914 u32
*new_expected_ids
;
1916 e
= Jim_GetOpt_Wide( goi
, &w
);
1918 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1922 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1923 if (new_expected_ids
== NULL
) {
1924 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1928 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1930 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1932 free(pTap
->expected_ids
);
1933 pTap
->expected_ids
= new_expected_ids
;
1934 pTap
->expected_ids_cnt
++;
1937 case NTAP_OPT_IRLEN
:
1938 case NTAP_OPT_IRMASK
:
1939 case NTAP_OPT_IRCAPTURE
:
1940 e
= Jim_GetOpt_Wide( goi
, &w
);
1942 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1945 if( (w
< 0) || (w
> 0xffff) ){
1947 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1948 n
->name
, (int)(w
), (int)(w
));
1952 case NTAP_OPT_IRLEN
:
1953 pTap
->ir_length
= w
;
1954 reqbits
&= (~(NTREQ_IRLEN
));
1956 case NTAP_OPT_IRMASK
:
1957 pTap
->ir_capture_mask
= w
;
1958 reqbits
&= (~(NTREQ_IRMASK
));
1960 case NTAP_OPT_IRCAPTURE
:
1961 pTap
->ir_capture_value
= w
;
1962 reqbits
&= (~(NTREQ_IRCAPTURE
));
1965 } /* switch(n->value) */
1966 } /* while( goi->argc ) */
1968 /* Did we get all the options? */
1971 Jim_SetResult_sprintf( goi
->interp
,
1972 "newtap: %s missing required parameters",
1974 /* TODO: Tell user what is missing :-( */
1975 /* no memory leaks pelase */
1976 free(((void *)(pTap
->expected_ids
)));
1977 free(((void *)(pTap
->chip
)));
1978 free(((void *)(pTap
->tapname
)));
1979 free(((void *)(pTap
->dotted_name
)));
1980 free(((void *)(pTap
)));
1984 pTap
->expected
= malloc( pTap
->ir_length
);
1985 pTap
->expected_mask
= malloc( pTap
->ir_length
);
1986 pTap
->cur_instr
= malloc( pTap
->ir_length
);
1988 buf_set_u32( pTap
->expected
,
1991 pTap
->ir_capture_value
);
1992 buf_set_u32( pTap
->expected_mask
,
1995 pTap
->ir_capture_mask
);
1996 buf_set_ones( pTap
->cur_instr
,
2001 jtag_register_event_callback(jtag_reset_callback
, pTap
);
2003 ppTap
= &(jtag_all_taps
);
2004 while( (*ppTap
) != NULL
){
2005 ppTap
= &((*ppTap
)->next_tap
);
2009 static int n_taps
= 0;
2010 pTap
->abs_chain_position
= n_taps
++;
2012 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
2013 (*ppTap
)->dotted_name
,
2014 (*ppTap
)->abs_chain_position
,
2015 (*ppTap
)->ir_length
,
2016 (*ppTap
)->ir_capture_value
,
2017 (*ppTap
)->ir_capture_mask
);
2022 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2028 struct command_context_s
*context
;
2032 JTAG_CMD_INIT_RESET
,
2035 JTAG_CMD_TAPDISABLE
,
2036 JTAG_CMD_TAPISENABLED
,
2041 const Jim_Nvp jtag_cmds
[] = {
2042 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
2043 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
2044 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
2045 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
2046 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
2047 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
2048 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
2049 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
2051 { .name
= NULL
, .value
= -1 },
2054 context
= Jim_GetAssocData(interp
, "context");
2055 /* go past the command */
2056 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
2058 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
2060 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
2063 Jim_SetEmptyResult( goi
.interp
);
2065 case JTAG_CMD_INTERFACE
:
2066 /* return the name of the interface */
2067 /* TCL code might need to know the exact type... */
2068 /* FUTURE: we allow this as a means to "set" the interface. */
2069 if( goi
.argc
!= 0 ){
2070 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2073 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
2075 case JTAG_CMD_INIT_RESET
:
2076 if( goi
.argc
!= 0 ){
2077 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2080 e
= jtag_init_reset(context
);
2081 if( e
!= ERROR_OK
){
2082 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
2086 case JTAG_CMD_NEWTAP
:
2087 return jim_newtap_cmd( &goi
);
2089 case JTAG_CMD_TAPISENABLED
:
2090 case JTAG_CMD_TAPENABLE
:
2091 case JTAG_CMD_TAPDISABLE
:
2092 if( goi
.argc
!= 1 ){
2093 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
2099 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
2104 case JTAG_CMD_TAPISENABLED
:
2107 case JTAG_CMD_TAPENABLE
:
2108 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
2112 case JTAG_CMD_TAPDISABLE
:
2113 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
2118 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
2125 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
2132 Jim_GetOpt_Obj(&goi
, &o
);
2133 t
= jtag_TapByJimObj( goi
.interp
, o
);
2138 goi
.isconfigure
= 0;
2139 return jtag_tap_configure_cmd( &goi
, t
);
2143 case JTAG_CMD_CONFIGURE
:
2145 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
2152 Jim_GetOpt_Obj(&goi
, &o
);
2153 t
= jtag_TapByJimObj( goi
.interp
, o
);
2158 goi
.isconfigure
= 1;
2159 return jtag_tap_configure_cmd( &goi
, t
);
2166 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
2168 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
2170 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
2171 COMMAND_CONFIG
, "try to configure interface");
2172 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
2173 COMMAND_ANY
, "set jtag speed (if supported)");
2174 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
2175 COMMAND_ANY
, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
2176 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
2177 COMMAND_CONFIG
, "jtag_device <ir_length> <ir_expected> <ir_mask>");
2178 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
2180 "[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]");
2181 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
2182 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
2183 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
2184 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
2186 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
2187 COMMAND_EXEC
, "print current scan chain configuration");
2189 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
2190 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
2191 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
2192 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
2193 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
2194 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
2195 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
2196 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
2197 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
2198 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
2200 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
2201 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
2205 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
2210 if (!jtag_interface
)
2212 /* nothing was previously specified by "interface" command */
2213 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
2214 return ERROR_JTAG_INVALID_INTERFACE
;
2218 jtag_interface
->khz(speed_khz
, &jtag_speed
);
2222 if (jtag_interface
->init() != ERROR_OK
)
2223 return ERROR_JTAG_INIT_FAILED
;
2225 jtag
= jtag_interface
;
2229 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
2234 LOG_DEBUG("Init JTAG chain");
2236 tap
= jtag_NextEnabledTap(NULL
);
2238 LOG_ERROR("There are no enabled taps?");
2239 return ERROR_JTAG_INIT_FAILED
;
2243 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
2246 /* examine chain first, as this could discover the real chain layout */
2247 if (jtag_examine_chain() != ERROR_OK
)
2249 LOG_ERROR("trying to validate configured JTAG chain anyway...");
2252 if (jtag_validate_chain() != ERROR_OK
)
2254 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
2260 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
2264 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2267 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
2269 /* Reset can happen after a power cycle.
2271 * Ideally we would only assert TRST or run RESET before the target reset.
2273 * However w/srst_pulls_trst, trst is asserted together with the target
2274 * reset whether we want it or not.
2276 * NB! Some targets have JTAG circuitry disabled until a
2277 * trst & srst has been asserted.
2279 * NB! here we assume nsrst/ntrst delay are sufficient!
2281 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
2284 jtag_add_reset(1, 0); /* RESET or TRST */
2285 if (jtag_reset_config
& RESET_HAS_SRST
)
2287 jtag_add_reset(1, 1);
2288 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
2289 jtag_add_reset(0, 1);
2291 jtag_add_reset(0, 0);
2292 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2295 /* Check that we can communication on the JTAG chain + eventually we want to
2296 * be able to perform enumeration only after OpenOCD has started
2297 * telnet and GDB server
2299 * That would allow users to more easily perform any magic they need to before
2302 return jtag_init_inner(cmd_ctx
);
2305 int jtag_init(struct command_context_s
*cmd_ctx
)
2308 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2310 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
2314 return jtag_init_reset(cmd_ctx
);
2317 static int default_khz(int khz
, int *jtag_speed
)
2319 LOG_ERROR("Translation from khz to jtag_speed not implemented");
2323 static int default_speed_div(int speed
, int *khz
)
2325 LOG_ERROR("Translation from jtag_speed to khz not implemented");
2329 static int default_power_dropout(int *dropout
)
2331 *dropout
=0; /* by default we can't detect power dropout */
2335 static int default_srst_asserted(int *srst_asserted
)
2337 *srst_asserted
=0; /* by default we can't detect srst asserted */
2341 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2346 /* check whether the interface is already configured */
2349 LOG_WARNING("Interface already configured, ignoring");
2353 /* interface name is a mandatory argument */
2354 if (argc
< 1 || args
[0][0] == '\0')
2356 return ERROR_COMMAND_SYNTAX_ERROR
;
2359 for (i
=0; jtag_interfaces
[i
]; i
++)
2361 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
2363 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
2368 jtag_interface
= jtag_interfaces
[i
];
2370 if (jtag_interface
->khz
== NULL
)
2372 jtag_interface
->khz
= default_khz
;
2374 if (jtag_interface
->speed_div
== NULL
)
2376 jtag_interface
->speed_div
= default_speed_div
;
2378 if (jtag_interface
->power_dropout
== NULL
)
2380 jtag_interface
->power_dropout
= default_power_dropout
;
2382 if (jtag_interface
->srst_asserted
== NULL
)
2384 jtag_interface
->srst_asserted
= default_srst_asserted
;
2391 /* no valid interface was found (i.e. the configuration option,
2392 * didn't match one of the compiled-in interfaces
2394 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
2395 LOG_ERROR("compiled-in jtag interfaces:");
2396 for (i
= 0; jtag_interfaces
[i
]; i
++)
2398 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
2401 return ERROR_JTAG_INVALID_INTERFACE
;
2404 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2408 Jim_Obj
*newargs
[ 10 ];
2411 * argv[-1] = command
2412 * argv[ 0] = ir length
2413 * argv[ 1] = ir capture
2414 * argv[ 2] = ir mask
2415 * argv[ 3] = not actually used by anything but in the docs
2419 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
2422 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
2423 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
2427 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
2428 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
2429 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
2430 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
2432 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
2433 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
2434 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
2435 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
2436 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
2437 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
2438 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
2439 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
2440 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
2441 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
2442 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
2443 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
2445 command_print( cmd_ctx
, "NEW COMMAND:");
2446 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
2447 Jim_GetString( newargs
[0], NULL
),
2448 Jim_GetString( newargs
[1], NULL
),
2449 Jim_GetString( newargs
[2], NULL
),
2450 Jim_GetString( newargs
[3], NULL
),
2451 Jim_GetString( newargs
[4], NULL
),
2452 Jim_GetString( newargs
[5], NULL
),
2453 Jim_GetString( newargs
[6], NULL
),
2454 Jim_GetString( newargs
[7], NULL
),
2455 Jim_GetString( newargs
[8], NULL
),
2456 Jim_GetString( newargs
[9], NULL
) );
2458 e
= jim_jtag_command( interp
, 10, newargs
);
2460 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
2465 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2469 tap
= jtag_all_taps
;
2470 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
2471 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
2474 u32 expected
, expected_mask
, cur_instr
, ii
;
2475 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
2476 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
2477 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
2479 command_print(cmd_ctx
,
2480 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
2481 tap
->abs_chain_position
,
2483 tap
->enabled
? 'Y' : 'n',
2485 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
2491 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
2492 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
2493 tap
->expected_ids
[ii
]);
2496 tap
= tap
->next_tap
;
2502 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2505 return ERROR_COMMAND_SYNTAX_ERROR
;
2509 if (strcmp(args
[0], "none") == 0)
2510 jtag_reset_config
= RESET_NONE
;
2511 else if (strcmp(args
[0], "trst_only") == 0)
2512 jtag_reset_config
= RESET_HAS_TRST
;
2513 else if (strcmp(args
[0], "srst_only") == 0)
2514 jtag_reset_config
= RESET_HAS_SRST
;
2515 else if (strcmp(args
[0], "trst_and_srst") == 0)
2516 jtag_reset_config
= RESET_TRST_AND_SRST
;
2519 LOG_ERROR("(1) invalid reset_config argument (%s), defaulting to none", args
[0]);
2520 jtag_reset_config
= RESET_NONE
;
2521 return ERROR_INVALID_ARGUMENTS
;
2527 if (strcmp(args
[1], "separate") == 0)
2529 /* seperate reset lines - default */
2532 if (strcmp(args
[1], "srst_pulls_trst") == 0)
2533 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
2534 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
2535 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
2536 else if (strcmp(args
[1], "combined") == 0)
2537 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
2540 LOG_ERROR("(2) invalid reset_config argument (%s), defaulting to none", args
[1]);
2541 jtag_reset_config
= RESET_NONE
;
2542 return ERROR_INVALID_ARGUMENTS
;
2549 if (strcmp(args
[2], "trst_open_drain") == 0)
2550 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
2551 else if (strcmp(args
[2], "trst_push_pull") == 0)
2552 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
2555 LOG_ERROR("(3) invalid reset_config argument (%s) defaulting to none", args
[2] );
2556 jtag_reset_config
= RESET_NONE
;
2557 return ERROR_INVALID_ARGUMENTS
;
2563 if (strcmp(args
[3], "srst_push_pull") == 0)
2564 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
2565 else if (strcmp(args
[3], "srst_open_drain") == 0)
2566 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
2569 LOG_ERROR("(4) invalid reset_config argument (%s), defaulting to none", args
[3]);
2570 jtag_reset_config
= RESET_NONE
;
2571 return ERROR_INVALID_ARGUMENTS
;
2578 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2582 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2587 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2593 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2597 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2602 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2608 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2610 int retval
=ERROR_OK
;
2614 LOG_DEBUG("handle jtag speed");
2617 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2619 /* this command can be called during CONFIG,
2620 * in which case jtag isn't initialized */
2623 retval
=jtag
->speed(cur_speed
);
2625 } else if (argc
== 0)
2629 return ERROR_COMMAND_SYNTAX_ERROR
;
2631 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2636 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2638 int retval
=ERROR_OK
;
2639 LOG_DEBUG("handle jtag khz");
2643 speed_khz
= strtoul(args
[0], NULL
, 0);
2647 LOG_DEBUG("have interface set up");
2649 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2655 cur_speed
= jtag_speed
= speed_div1
;
2657 retval
=jtag
->speed(cur_speed
);
2666 return ERROR_COMMAND_SYNTAX_ERROR
;
2671 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2677 command_print(cmd_ctx
, "RCLK - adaptive");
2680 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2686 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2692 return ERROR_COMMAND_SYNTAX_ERROR
;
2696 state
= tap_state_by_name( args
[0] );
2698 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2699 return ERROR_COMMAND_SYNTAX_ERROR
;
2701 jtag_add_end_state(state
);
2702 jtag_execute_queue();
2704 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2709 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2716 return ERROR_COMMAND_SYNTAX_ERROR
;
2719 if (args
[0][0] == '1')
2721 else if (args
[0][0] == '0')
2725 return ERROR_COMMAND_SYNTAX_ERROR
;
2728 if (args
[1][0] == '1')
2730 else if (args
[1][0] == '0')
2734 return ERROR_COMMAND_SYNTAX_ERROR
;
2737 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2738 return ERROR_JTAG_INIT_FAILED
;
2740 jtag_add_reset(trst
, srst
);
2741 jtag_execute_queue();
2746 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2750 return ERROR_COMMAND_SYNTAX_ERROR
;
2753 jtag_add_runtest(strtol(args
[0], NULL
, 0), TAP_INVALID
);
2754 jtag_execute_queue();
2760 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2763 scan_field_t
*fields
;
2765 tap_state_t endstate
;
2767 if ((argc
< 2) || (argc
% 2))
2769 return ERROR_COMMAND_SYNTAX_ERROR
;
2772 /* optional "-endstate" */
2774 /* at the end of the arguments. */
2776 endstate
= TAP_INVALID
;
2778 /* have at least one pair of numbers. */
2779 /* is last pair the magic text? */
2780 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2783 cpA
= args
[ argc
-1 ];
2784 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2785 cpS
= tap_state_name( endstate
);
2786 if( 0 == strcmp( cpA
, cpS
) ){
2790 if( endstate
>= TAP_NUM_STATES
){
2791 return ERROR_COMMAND_SYNTAX_ERROR
;
2793 /* found - remove the last 2 args */
2799 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
2801 for (i
= 0; i
< argc
/ 2; i
++)
2803 tap
= jtag_TapByString( args
[i
*2] );
2806 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2809 int field_size
= tap
->ir_length
;
2810 fields
[i
].tap
= tap
;
2811 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2812 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2813 fields
[i
].in_value
= NULL
;
2816 jtag_add_ir_scan(argc
/ 2, fields
, TAP_INVALID
);
2817 /* did we have an endstate? */
2818 if (endstate
!= TAP_INVALID
)
2819 jtag_add_end_state(endstate
);
2821 jtag_execute_queue();
2823 for (i
= 0; i
< argc
/ 2; i
++)
2824 free(fields
[i
].out_value
);
2831 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2834 scan_field_t
*fields
;
2836 int field_count
= 0;
2839 tap_state_t endstate
;
2842 * args[2] = num_bits
2843 * args[3] = hex string
2844 * ... repeat num bits and hex string ...
2847 * args[N-2] = "-endstate"
2848 * args[N-1] = statename
2850 if ((argc
< 4) || ((argc
% 2)!=0))
2852 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2856 /* assume no endstate */
2857 endstate
= TAP_INVALID
;
2858 /* validate arguments as numbers */
2860 for (i
= 2; i
< argc
; i
+=2)
2865 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2866 /* If valid - try next arg */
2871 /* Not valid.. are we at the end? */
2872 if ( ((i
+2) != argc
) ){
2873 /* nope, then error */
2877 /* it could be: "-endstate FOO" */
2879 /* get arg as a string. */
2880 cp
= Jim_GetString( args
[i
], NULL
);
2881 /* is it the magic? */
2882 if( 0 == strcmp( "-endstate", cp
) ){
2883 /* is the statename valid? */
2884 cp
= Jim_GetString( args
[i
+1], NULL
);
2886 /* see if it is a valid state name */
2887 endstate
= tap_state_by_name(cp
);
2889 /* update the error message */
2890 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2892 /* valid - so clear the error */
2894 /* and remove the last 2 args */
2899 /* Still an error? */
2901 return e
; /* too bad */
2903 } /* validate args */
2905 tap
= jtag_TapByJimObj( interp
, args
[1] );
2910 num_fields
=(argc
-2)/2;
2911 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2912 for (i
= 2; i
< argc
; i
+=2)
2918 Jim_GetLong(interp
, args
[i
], &bits
);
2919 str
= Jim_GetString(args
[i
+1], &len
);
2921 fields
[field_count
].tap
= tap
;
2922 fields
[field_count
].num_bits
= bits
;
2923 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2924 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2925 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2929 jtag_add_dr_scan(num_fields
, fields
, TAP_INVALID
);
2930 /* did we get an end state? */
2931 if (endstate
!= TAP_INVALID
)
2932 jtag_add_end_state(endstate
);
2934 retval
= jtag_execute_queue();
2935 if (retval
!= ERROR_OK
)
2937 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2942 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2943 for (i
= 2; i
< argc
; i
+=2)
2948 Jim_GetLong(interp
, args
[i
], &bits
);
2949 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
2950 free(fields
[field_count
].out_value
);
2952 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
2957 Jim_SetResult(interp
, list
);
2965 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2967 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_flush_queue_count
));
2973 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2977 if (strcmp(args
[0], "enable") == 0)
2979 jtag_verify_capture_ir
= 1;
2981 else if (strcmp(args
[0], "disable") == 0)
2983 jtag_verify_capture_ir
= 0;
2986 return ERROR_COMMAND_SYNTAX_ERROR
;
2988 } else if (argc
!= 0)
2990 return ERROR_COMMAND_SYNTAX_ERROR
;
2993 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
2998 int jtag_power_dropout(int *dropout
)
3000 return jtag
->power_dropout(dropout
);
3003 int jtag_srst_asserted(int *srst_asserted
)
3005 return jtag
->srst_asserted(srst_asserted
);
3008 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
3010 jtag_tap_event_action_t
* jteap
;
3013 jteap
= tap
->event_action
;
3017 if (jteap
->event
== e
) {
3019 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
3022 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
3023 Jim_GetString(jteap
->body
, NULL
) );
3024 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
3025 Jim_PrintErrorMessage(interp
);
3029 jteap
= jteap
->next
;
3033 LOG_DEBUG( "event %d %s - no action",
3035 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
3039 /*-----<Cable Helper API>---------------------------------------*/
3041 /* these Cable Helper API functions are all documented in the jtag.h header file,
3042 using a Doxygen format. And since Doxygen's configuration file "Doxyfile",
3043 is setup to prefer its docs in the header file, no documentation is here, for
3044 if it were, it would have to be doubly maintained.
3048 * @see tap_set_state() and tap_get_state() accessors.
3049 * Actual name is not important since accessors hide it.
3051 static tap_state_t state_follower
= TAP_RESET
;
3053 void tap_set_state_impl( tap_state_t new_state
)
3055 /* this is the state we think the TAPs are in now, was cur_state */
3056 state_follower
= new_state
;
3059 tap_state_t
tap_get_state()
3061 return state_follower
;
3065 * @see tap_set_end_state() and tap_get_end_state() accessors.
3066 * Actual name is not important because accessors hide it.
3068 static tap_state_t end_state_follower
= TAP_RESET
;
3070 void tap_set_end_state( tap_state_t new_end_state
)
3072 /* this is the state we think the TAPs will be in at completion of the
3073 current TAP operation, was end_state
3075 end_state_follower
= new_end_state
;
3078 tap_state_t
tap_get_end_state()
3080 return end_state_follower
;
3084 int tap_move_ndx( tap_state_t astate
)
3086 /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
3092 case TAP_RESET
: ndx
= 0; break;
3093 case TAP_DRSHIFT
: ndx
= 2; break;
3094 case TAP_DRPAUSE
: ndx
= 3; break;
3095 case TAP_IDLE
: ndx
= 1; break;
3096 case TAP_IRSHIFT
: ndx
= 4; break;
3097 case TAP_IRPAUSE
: ndx
= 5; break;
3099 LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate
) );
3107 /* tap_move[i][j]: tap movement command to go from state i to state j
3108 * 0: Test-Logic-Reset
3115 * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
3122 } tms_seqs
[6][6] = /* [from_state_ndx][to_state_ndx] */
3124 /* value clocked to TMS to move from one of six stable states to another.
3125 * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
3126 * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
3127 * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
3128 * These extra ones cause no TAP state problem, because we go into reset and stay in reset.
3132 * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
3133 * Read the bits from LSBit first to MSBit last (right-to-left).
3135 #define HEX__(n) 0x##n##LU
3138 (((x) & 0x0000000FLU)?(1<<0):0) \
3139 +(((x) & 0x000000F0LU)?(1<<1):0) \
3140 +(((x) & 0x00000F00LU)?(1<<2):0) \
3141 +(((x) & 0x0000F000LU)?(1<<3):0) \
3142 +(((x) & 0x000F0000LU)?(1<<4):0) \
3143 +(((x) & 0x00F00000LU)?(1<<5):0) \
3144 +(((x) & 0x0F000000LU)?(1<<6):0) \
3145 +(((x) & 0xF0000000LU)?(1<<7):0)
3147 #define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
3149 #if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1) || (BUILD_JLINK==1))
3150 /* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
3152 OK, I added Peter's version of the state table, and it works OK for
3153 me on MC1322x. I've recreated the jlink portion of patch with this
3154 new state table. His changes to my state table are pretty minor in
3155 terms of total transitions, but Peter feels that his version fixes
3156 some long-standing problems.
3159 I added the bit count into the table, reduced RESET column to 7 bits from 8.
3162 state specific comments:
3163 ------------------------
3164 *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to
3165 work better on ARM9 with ft2232 driver. (Dick)
3167 RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3168 needed on ARM9 with ft2232 driver. (Dick)
3170 RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3171 needed on ARM9 with ft2232 driver. (Dick)
3175 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3176 { B8(1111111,7), B8(0,1), B8(00101,5), B8(01010,5), B8(001101,6), B8(010110,6) }, /* RESET */
3177 { B8(1111111,7), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
3178 { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
3179 { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
3180 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
3181 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
3183 #else /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
3186 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3187 { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
3188 { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
3189 { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
3190 { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
3191 { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
3192 { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
3196 #if 0 /* keeping old hex stuff for awhile, for reference */
3197 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
3198 { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
3199 { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
3200 { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
3201 { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
3202 { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
3203 { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
3208 int tap_get_tms_path( tap_state_t from
, tap_state_t to
)
3210 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bits
;
3214 int tap_get_tms_path_len( tap_state_t from
, tap_state_t to
)
3216 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bit_count
;
3220 bool tap_is_state_stable(tap_state_t astate
)
3224 /* A switch() is used because it is symbol dependent
3225 (not value dependent like an array), and can also check bounds.
3244 tap_state_t
tap_state_transition(tap_state_t cur_state
, bool tms
)
3246 tap_state_t new_state
;
3248 /* A switch is used because it is symbol dependent and not value dependent
3249 like an array. Also it can check for out of range conditions.
3257 new_state
= cur_state
;
3262 new_state
= TAP_DRSELECT
;
3265 new_state
= TAP_IRSELECT
;
3269 new_state
= TAP_DREXIT1
;
3273 new_state
= TAP_DRUPDATE
;
3276 new_state
= TAP_DREXIT2
;
3279 new_state
= TAP_RESET
;
3283 new_state
= TAP_IREXIT1
;
3287 new_state
= TAP_IRUPDATE
;
3290 new_state
= TAP_IREXIT2
;
3293 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3306 new_state
= TAP_IDLE
;
3309 new_state
= TAP_DRCAPTURE
;
3314 new_state
= TAP_DRSHIFT
;
3318 new_state
= TAP_DRPAUSE
;
3321 new_state
= TAP_IRCAPTURE
;
3326 new_state
= TAP_IRSHIFT
;
3330 new_state
= TAP_IRPAUSE
;
3333 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3342 const char* tap_state_name(tap_state_t state
)
3348 case TAP_RESET
: ret
= "RESET"; break;
3349 case TAP_IDLE
: ret
= "RUN/IDLE"; break;
3350 case TAP_DRSELECT
: ret
= "DRSELECT"; break;
3351 case TAP_DRCAPTURE
: ret
= "DRCAPTURE"; break;
3352 case TAP_DRSHIFT
: ret
= "DRSHIFT"; break;
3353 case TAP_DREXIT1
: ret
= "DREXIT1"; break;
3354 case TAP_DRPAUSE
: ret
= "DRPAUSE"; break;
3355 case TAP_DREXIT2
: ret
= "DREXIT2"; break;
3356 case TAP_DRUPDATE
: ret
= "DRUPDATE"; break;
3357 case TAP_IRSELECT
: ret
= "IRSELECT"; break;
3358 case TAP_IRCAPTURE
: ret
= "IRCAPTURE"; break;
3359 case TAP_IRSHIFT
: ret
= "IRSHIFT"; break;
3360 case TAP_IREXIT1
: ret
= "IREXIT1"; break;
3361 case TAP_IRPAUSE
: ret
= "IRPAUSE"; break;
3362 case TAP_IREXIT2
: ret
= "IREXIT2"; break;
3363 case TAP_IRUPDATE
: ret
= "IRUPDATE"; break;
3364 default: ret
= "???";
3370 static tap_state_t
tap_state_by_name( const char *name
)
3374 for( x
= 0 ; x
< TAP_NUM_STATES
; x
++ ){
3375 /* be nice to the human */
3376 if( 0 == strcasecmp( name
, tap_state_name(x
) ) ){
3384 #ifdef _DEBUG_JTAG_IO_
3386 #define JTAG_DEBUG_STATE_APPEND(buf, len, bit) \
3387 do { buf[len] = bit ? '1' : '0'; } while(0)
3388 #define JTAG_DEBUG_STATE_PRINT(a, b, astr, bstr) \
3389 DEBUG_JTAG_IO("TAP/SM: %9s -> %5s\tTMS: %s\tTDI: %s", \
3390 tap_state_name(a), tap_state_name(b), astr, bstr)
3392 tap_state_t
jtag_debug_state_machine(const void *tms_buf
, const void *tdi_buf
,
3393 unsigned tap_bits
, tap_state_t next_state
)
3395 const u8
*tms_buffer
;
3396 const u8
*tdi_buffer
;
3401 unsigned tap_out_bits
;
3405 tap_state_t last_state
;
3407 // set startstate (and possibly last, if tap_bits == 0)
3408 last_state
= next_state
;
3409 DEBUG_JTAG_IO("TAP/SM: START state: %s", tap_state_name(next_state
));
3411 tms_buffer
= (const u8
*)tms_buf
;
3412 tdi_buffer
= (const u8
*)tdi_buf
;
3414 tap_bytes
= TAP_SCAN_BYTES(tap_bits
);
3415 DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits
, tap_bytes
);
3418 for(cur_byte
= 0; cur_byte
< tap_bytes
; cur_byte
++)
3420 for(cur_bit
= 0; cur_bit
< 8; cur_bit
++)
3422 // make sure we do not run off the end of the buffers
3423 unsigned tap_bit
= cur_byte
* 8 + cur_bit
;
3424 if (tap_bit
== tap_bits
)
3427 // check and save TMS bit
3428 tap_bit
= !!(tms_buffer
[cur_byte
] & (1 << cur_bit
));
3429 JTAG_DEBUG_STATE_APPEND(tms_str
, tap_out_bits
, tap_bit
);
3431 // use TMS bit to find the next TAP state
3432 next_state
= tap_state_transition(last_state
, tap_bit
);
3434 // check and store TDI bit
3435 tap_bit
= !!(tdi_buffer
[cur_byte
] & (1 << cur_bit
));
3436 JTAG_DEBUG_STATE_APPEND(tdi_str
, tap_out_bits
, tap_bit
);
3438 // increment TAP bits
3441 // Only show TDO bits on state transitions, or
3442 // after some number of bits in the same state.
3443 if ((next_state
== last_state
) && (tap_out_bits
< 32))
3446 // terminate strings and display state transition
3447 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3448 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3451 last_state
= next_state
;
3458 // terminate strings and display state transition
3459 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3460 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3463 DEBUG_JTAG_IO("TAP/SM: FINAL state: %s", tap_state_name(next_state
));
3467 #endif // _DEBUG_JTAG_IO_
3469 /*-----</Cable Helper API>--------------------------------------*/
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)