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"
42 /* note that this is not marked as static as it must be available from outside jtag.c for those
43 that implement the jtag_xxx() minidriver layer
45 int jtag_error
=ERROR_OK
;
47 typedef struct cmd_queue_page_s
51 struct cmd_queue_page_s
*next
;
54 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
55 static cmd_queue_page_t
*cmd_queue_pages
= NULL
;
57 char* jtag_event_strings
[] =
59 "JTAG controller reset (RESET or TRST)"
62 const Jim_Nvp nvp_jtag_tap_event
[] = {
63 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
64 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
66 { .name
= NULL
, .value
= -1 }
72 jtag_command_t
*jtag_command_queue
= NULL
;
73 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
74 static jtag_tap_t
*jtag_all_taps
= NULL
;
76 enum reset_types jtag_reset_config
= RESET_NONE
;
77 tap_state_t cmd_queue_end_state
= TAP_RESET
;
78 tap_state_t cmd_queue_cur_state
= TAP_RESET
;
80 int jtag_verify_capture_ir
= 1;
82 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
83 static int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
84 static int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
86 /* maximum number of JTAG devices expected in the chain
88 #define JTAG_MAX_CHAIN_SIZE 20
90 /* callbacks to inform high-level handlers about JTAG state changes */
91 jtag_event_callback_t
*jtag_event_callbacks
;
94 static int speed_khz
= 0;
95 /* flag if the kHz speed was defined */
96 static int hasKHz
= 0;
98 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
101 #if BUILD_ECOSBOARD == 1
102 extern jtag_interface_t zy1000_interface
;
105 #if BUILD_PARPORT == 1
106 extern jtag_interface_t parport_interface
;
110 extern jtag_interface_t dummy_interface
;
113 #if BUILD_FT2232_FTD2XX == 1
114 extern jtag_interface_t ft2232_interface
;
117 #if BUILD_FT2232_LIBFTDI == 1
118 extern jtag_interface_t ft2232_interface
;
121 #if BUILD_AMTJTAGACCEL == 1
122 extern jtag_interface_t amt_jtagaccel_interface
;
125 #if BUILD_EP93XX == 1
126 extern jtag_interface_t ep93xx_interface
;
129 #if BUILD_AT91RM9200 == 1
130 extern jtag_interface_t at91rm9200_interface
;
133 #if BUILD_GW16012 == 1
134 extern jtag_interface_t gw16012_interface
;
137 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
138 extern jtag_interface_t presto_interface
;
141 #if BUILD_USBPROG == 1
142 extern jtag_interface_t usbprog_interface
;
146 extern jtag_interface_t jlink_interface
;
149 #if BUILD_VSLLINK == 1
150 extern jtag_interface_t vsllink_interface
;
154 extern jtag_interface_t rlink_interface
;
157 #if BUILD_ARMJTAGEW == 1
158 extern jtag_interface_t armjtagew_interface
;
161 jtag_interface_t
*jtag_interfaces
[] = {
162 #if BUILD_ECOSBOARD == 1
165 #if BUILD_PARPORT == 1
171 #if BUILD_FT2232_FTD2XX == 1
174 #if BUILD_FT2232_LIBFTDI == 1
177 #if BUILD_AMTJTAGACCEL == 1
178 &amt_jtagaccel_interface
,
180 #if BUILD_EP93XX == 1
183 #if BUILD_AT91RM9200 == 1
184 &at91rm9200_interface
,
186 #if BUILD_GW16012 == 1
189 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
192 #if BUILD_USBPROG == 1
198 #if BUILD_VSLLINK == 1
204 #if BUILD_ARMJTAGEW == 1
205 &armjtagew_interface
,
210 jtag_interface_t
*jtag
= NULL
;
213 static jtag_interface_t
*jtag_interface
= NULL
;
216 /* forward declarations */
217 //void jtag_add_pathmove(int num_states, tap_state_t *path);
218 //void jtag_add_runtest(int num_cycles, tap_state_t endstate);
219 //void jtag_add_end_state(tap_state_t endstate);
220 //void jtag_add_sleep(u32 us);
221 //int jtag_execute_queue(void);
222 static tap_state_t
tap_state_by_name(const char *name
);
225 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
226 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
227 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
228 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
229 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
230 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
231 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
233 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
235 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
236 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
237 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
238 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
239 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
241 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
243 jtag_tap_t
*jtag_AllTaps(void)
245 return jtag_all_taps
;
248 int jtag_NumTotalTaps(void)
262 int jtag_NumEnabledTaps(void)
278 jtag_tap_t
*jtag_TapByString( const char *s
)
286 if( 0 == strcmp( t
->dotted_name
, s
) ){
292 /* backup plan is by number */
294 /* ok - is "s" a number? */
296 n
= strtol( s
, &cp
, 0 );
297 if( (s
!= cp
) && (*cp
== 0) ){
299 t
= jtag_TapByAbsPosition(n
);
305 jtag_tap_t
* jtag_TapByJimObj( Jim_Interp
*interp
, Jim_Obj
*o
)
310 cp
= Jim_GetString( o
, NULL
);
315 t
= jtag_TapByString( cp
);
318 Jim_SetResult_sprintf(interp
,"Tap: %s is unknown", cp
);
323 /* returns a pointer to the n-th device in the scan chain */
324 jtag_tap_t
* jtag_TapByAbsPosition( int n
)
332 while( t
&& (n
> 0)) {
339 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
341 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
343 if (callback
== NULL
)
345 return ERROR_INVALID_ARGUMENTS
;
350 while ((*callbacks_p
)->next
)
351 callbacks_p
= &((*callbacks_p
)->next
);
352 callbacks_p
= &((*callbacks_p
)->next
);
355 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
356 (*callbacks_p
)->callback
= callback
;
357 (*callbacks_p
)->priv
= priv
;
358 (*callbacks_p
)->next
= NULL
;
363 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
365 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
367 if (callback
== NULL
)
369 return ERROR_INVALID_ARGUMENTS
;
374 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
375 if ((*callbacks_p
)->callback
== callback
)
378 *callbacks_p
= *next
;
386 int jtag_call_event_callbacks(enum jtag_event event
)
388 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
390 LOG_DEBUG("jtag event: %s", jtag_event_strings
[event
]);
394 callback
->callback(event
, callback
->priv
);
395 callback
= callback
->next
;
401 /* returns a pointer to the pointer of the last command in queue
402 * this may be a pointer to the root pointer (jtag_command_queue)
403 * or to the next member of the last but one command
405 jtag_command_t
** jtag_get_last_command_p(void)
407 /* jtag_command_t *cmd = jtag_command_queue;
413 return &jtag_command_queue;
417 return last_comand_pointer
;
420 void* cmd_queue_alloc(size_t size
)
422 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
428 * We align/round the *SIZE* per below
429 * so that all pointers returned by
430 * this function are reasonably well
433 * If we did not, then an "odd-length" request would cause the
434 * *next* allocation to be at an *odd* address, and because
435 * this function has the same type of api as malloc() - we
436 * must also return pointers that have the same type of
439 * What I do not/have is a reasonable portable means
442 * The solution here, is based on these suggestions.
443 * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
446 union worse_case_align
{
452 #define ALIGN_SIZE (sizeof(union worse_case_align))
454 /* The alignment process. */
455 size
= (size
+ ALIGN_SIZE
-1) & (~(ALIGN_SIZE
-1));
460 while ((*p_page
)->next
)
461 p_page
= &((*p_page
)->next
);
462 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
463 p_page
= &((*p_page
)->next
);
468 *p_page
= malloc(sizeof(cmd_queue_page_t
));
470 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
471 (*p_page
)->next
= NULL
;
474 offset
= (*p_page
)->used
;
475 (*p_page
)->used
+= size
;
477 t
=(u8
*)((*p_page
)->address
);
481 void cmd_queue_free(void)
483 cmd_queue_page_t
*page
= cmd_queue_pages
;
487 cmd_queue_page_t
*last
= page
;
493 cmd_queue_pages
= NULL
;
496 static void jtag_prelude1(void)
500 LOG_WARNING("JTAG command queued, while TRST is low (TAP in reset)");
501 jtag_error
=ERROR_JTAG_TRST_ASSERTED
;
505 if (cmd_queue_end_state
== TAP_RESET
)
506 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
509 static void jtag_prelude(tap_state_t state
)
513 if (state
!= TAP_INVALID
)
514 jtag_add_end_state(state
);
516 cmd_queue_cur_state
= cmd_queue_end_state
;
519 void jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
525 retval
=interface_jtag_add_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
526 if (retval
!=ERROR_OK
)
530 int MINIDRIVER(interface_jtag_add_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
532 jtag_command_t
**last_cmd
;
539 last_cmd
= jtag_get_last_command_p();
541 /* allocate memory for a new list member */
542 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
543 (*last_cmd
)->next
= NULL
;
544 last_comand_pointer
= &((*last_cmd
)->next
);
545 (*last_cmd
)->type
= JTAG_SCAN
;
547 /* allocate memory for ir scan command */
548 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
549 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
550 x
= jtag_NumEnabledTaps();
551 (*last_cmd
)->cmd
.scan
->num_fields
= x
; /* one field per device */
552 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(x
* sizeof(scan_field_t
));
553 (*last_cmd
)->cmd
.scan
->end_state
= state
;
560 /* do this here so it is not forgotten */
561 tap
= jtag_NextEnabledTap(tap
);
566 scan_size
= tap
->ir_length
;
567 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].tap
= tap
;
568 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].num_bits
= scan_size
;
569 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_value
= NULL
;
570 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler
= NULL
; /* disable verification by default */
572 /* search the list */
573 for (j
= 0; j
< num_fields
; j
++)
575 if (tap
== fields
[j
].tap
)
578 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
579 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
581 if (jtag_verify_capture_ir
)
583 if (fields
[j
].in_handler
==NULL
)
585 jtag_set_check_value((*last_cmd
)->cmd
.scan
->fields
+nth_tap
, tap
->expected
, tap
->expected_mask
, NULL
);
588 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler
= fields
[j
].in_handler
;
589 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler_priv
= fields
[j
].in_handler_priv
;
590 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_check_value
= tap
->expected
;
591 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_check_mask
= tap
->expected_mask
;
602 /* if a tap isn't listed, set it to BYPASS */
603 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
604 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_mask
= NULL
;
608 /* update device information */
609 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
, tap
->cur_instr
, scan_size
);
615 void jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
621 retval
=interface_jtag_add_plain_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
622 if (retval
!=ERROR_OK
)
626 int MINIDRIVER(interface_jtag_add_plain_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
629 jtag_command_t
**last_cmd
;
631 last_cmd
= jtag_get_last_command_p();
633 /* allocate memory for a new list member */
634 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
635 (*last_cmd
)->next
= NULL
;
636 last_comand_pointer
= &((*last_cmd
)->next
);
637 (*last_cmd
)->type
= JTAG_SCAN
;
639 /* allocate memory for ir scan command */
640 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
641 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
642 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
643 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
644 (*last_cmd
)->cmd
.scan
->end_state
= state
;
646 for( i
= 0 ; i
< num_fields
; i
++ ){
647 int num_bits
= fields
[i
].num_bits
;
648 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
649 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
650 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
651 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
652 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
653 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
654 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
655 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
656 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
;
657 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= NULL
;
662 void jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
668 retval
=interface_jtag_add_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
669 if (retval
!=ERROR_OK
)
673 int MINIDRIVER(interface_jtag_add_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
677 int bypass_devices
= 0;
681 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
684 /* count devices in bypass */
688 tap
= jtag_NextEnabledTap(tap
);
697 /* allocate memory for a new list member */
698 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
699 last_comand_pointer
= &((*last_cmd
)->next
);
700 (*last_cmd
)->next
= NULL
;
701 (*last_cmd
)->type
= JTAG_SCAN
;
703 /* allocate memory for dr scan command */
704 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
705 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
706 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
707 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
708 (*last_cmd
)->cmd
.scan
->end_state
= state
;
714 tap
= jtag_NextEnabledTap(tap
);
719 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
721 for (j
= 0; j
< num_fields
; j
++)
723 if (tap
== fields
[j
].tap
)
726 scan_size
= fields
[j
].num_bits
;
727 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
728 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
729 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
730 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= fields
[j
].in_value
;
731 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= fields
[j
].in_check_value
;
732 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= fields
[j
].in_check_mask
;
733 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= fields
[j
].in_handler
;
734 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= fields
[j
].in_handler_priv
;
739 #ifdef _DEBUG_JTAG_IO_
740 /* if a device isn't listed, the BYPASS register should be selected */
743 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
747 /* program the scan field to 1 bit length, and ignore it's value */
748 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
749 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
750 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= NULL
;
751 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
752 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
753 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
754 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
755 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
759 #ifdef _DEBUG_JTAG_IO_
760 /* if a device is listed, the BYPASS register must not be selected */
763 LOG_ERROR("BUG: scan data for a device in BYPASS");
772 void MINIDRIVER(interface_jtag_add_dr_out
)(jtag_tap_t
*target_tap
,
776 tap_state_t end_state
)
781 int bypass_devices
= 0;
783 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
786 /* count devices in bypass */
790 tap
= jtag_NextEnabledTap(tap
);
799 /* allocate memory for a new list member */
800 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
801 last_comand_pointer
= &((*last_cmd
)->next
);
802 (*last_cmd
)->next
= NULL
;
803 (*last_cmd
)->type
= JTAG_SCAN
;
805 /* allocate memory for dr scan command */
806 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
807 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
808 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
809 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
810 (*last_cmd
)->cmd
.scan
->end_state
= end_state
;
815 tap
= jtag_NextEnabledTap(tap
);
820 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
822 if (tap
== target_tap
)
825 #ifdef _DEBUG_JTAG_IO_
826 /* if a device is listed, the BYPASS register must not be selected */
829 LOG_ERROR("BUG: scan data for a device in BYPASS");
833 for (j
= 0; j
< num_fields
; j
++)
836 scan_size
= num_bits
[j
];
837 buf_set_u32(out_value
, 0, scan_size
, value
[j
]);
838 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
839 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
840 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= NULL
;
841 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
842 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
843 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
844 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
845 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
849 #ifdef _DEBUG_JTAG_IO_
850 /* if a device isn't listed, the BYPASS register should be selected */
853 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
857 /* program the scan field to 1 bit length, and ignore it's value */
858 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
859 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
860 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= NULL
;
861 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
862 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
863 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
864 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
865 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
870 void jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
876 retval
=interface_jtag_add_plain_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
877 if (retval
!=ERROR_OK
)
881 int MINIDRIVER(interface_jtag_add_plain_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
884 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
886 /* allocate memory for a new list member */
887 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
888 last_comand_pointer
= &((*last_cmd
)->next
);
889 (*last_cmd
)->next
= NULL
;
890 (*last_cmd
)->type
= JTAG_SCAN
;
892 /* allocate memory for scan command */
893 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
894 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
895 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
896 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
897 (*last_cmd
)->cmd
.scan
->end_state
= state
;
899 for (i
= 0; i
< num_fields
; i
++)
901 int num_bits
= fields
[i
].num_bits
;
902 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
903 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
904 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
905 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
906 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
907 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
908 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
909 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
910 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[i
].in_handler
;
911 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[i
].in_handler_priv
;
917 void jtag_add_tlr(void)
919 jtag_prelude(TAP_RESET
);
922 retval
=interface_jtag_add_tlr();
923 if (retval
!=ERROR_OK
)
927 int MINIDRIVER(interface_jtag_add_tlr
)(void)
929 tap_state_t state
= TAP_RESET
;
930 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
932 /* allocate memory for a new list member */
933 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
934 last_comand_pointer
= &((*last_cmd
)->next
);
935 (*last_cmd
)->next
= NULL
;
936 (*last_cmd
)->type
= JTAG_STATEMOVE
;
938 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
939 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
944 void jtag_add_pathmove(int num_states
, tap_state_t
*path
)
946 tap_state_t cur_state
=cmd_queue_cur_state
;
950 /* the last state has to be a stable state */
951 if (!tap_is_state_stable(path
[num_states
- 1]))
953 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
957 for (i
=0; i
<num_states
; i
++)
959 if (path
[i
] == TAP_RESET
)
961 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
964 if ( tap_state_transition(cur_state
, true) != path
[i
]
965 && tap_state_transition(cur_state
, false) != path
[i
])
967 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
975 retval
=interface_jtag_add_pathmove(num_states
, path
);
976 cmd_queue_cur_state
= path
[num_states
- 1];
977 if (retval
!=ERROR_OK
)
981 int MINIDRIVER(interface_jtag_add_pathmove
)(int num_states
, tap_state_t
*path
)
983 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
986 /* allocate memory for a new list member */
987 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
988 last_comand_pointer
= &((*last_cmd
)->next
);
989 (*last_cmd
)->next
= NULL
;
990 (*last_cmd
)->type
= JTAG_PATHMOVE
;
992 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
993 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
994 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(tap_state_t
) * num_states
);
996 for (i
= 0; i
< num_states
; i
++)
997 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
1002 int MINIDRIVER(interface_jtag_add_runtest
)(int num_cycles
, tap_state_t state
)
1004 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1006 /* allocate memory for a new list member */
1007 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1008 (*last_cmd
)->next
= NULL
;
1009 last_comand_pointer
= &((*last_cmd
)->next
);
1010 (*last_cmd
)->type
= JTAG_RUNTEST
;
1012 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
1013 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
1014 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
1019 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
1023 jtag_prelude(state
);
1025 /* executed by sw or hw fifo */
1026 retval
=interface_jtag_add_runtest(num_cycles
, cmd_queue_end_state
);
1027 if (retval
!=ERROR_OK
)
1032 int MINIDRIVER(interface_jtag_add_clocks
)( int num_cycles
)
1034 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1036 /* allocate memory for a new list member */
1037 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1038 (*last_cmd
)->next
= NULL
;
1039 last_comand_pointer
= &((*last_cmd
)->next
);
1040 (*last_cmd
)->type
= JTAG_STABLECLOCKS
;
1042 (*last_cmd
)->cmd
.stableclocks
= cmd_queue_alloc(sizeof(stableclocks_command_t
));
1043 (*last_cmd
)->cmd
.stableclocks
->num_cycles
= num_cycles
;
1047 void jtag_add_clocks( int num_cycles
)
1051 if( !tap_is_state_stable(cmd_queue_cur_state
) )
1053 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
1054 tap_state_name(cmd_queue_cur_state
) );
1055 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
1059 if( num_cycles
> 0 )
1063 retval
= interface_jtag_add_clocks(num_cycles
);
1064 if (retval
!= ERROR_OK
)
1069 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
1071 int trst_with_tlr
= 0;
1074 /* FIX!!! there are *many* different cases here. A better
1075 * approach is needed for legal combinations of transitions...
1077 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
1078 (jtag_reset_config
& RESET_HAS_TRST
)&&
1079 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
1081 if (((req_tlr_or_trst
&&!jtag_trst
)||
1082 (!req_tlr_or_trst
&&jtag_trst
))&&
1083 ((req_srst
&&!jtag_srst
)||
1084 (!req_srst
&&jtag_srst
)))
1086 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
1087 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
1091 /* Make sure that jtag_reset_config allows the requested reset */
1092 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
1093 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
1095 LOG_ERROR("BUG: requested reset would assert trst");
1096 jtag_error
=ERROR_FAIL
;
1100 /* if TRST pulls SRST, we reset with TAP T-L-R */
1101 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
1106 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
1108 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
1109 jtag_error
=ERROR_FAIL
;
1113 if (req_tlr_or_trst
)
1115 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
1127 jtag_srst
= req_srst
;
1129 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
1130 if (retval
!=ERROR_OK
)
1138 LOG_DEBUG("SRST line asserted");
1142 LOG_DEBUG("SRST line released");
1143 if (jtag_nsrst_delay
)
1144 jtag_add_sleep(jtag_nsrst_delay
* 1000);
1149 LOG_DEBUG("JTAG reset with RESET instead of TRST");
1150 jtag_add_end_state(TAP_RESET
);
1152 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1158 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
1159 * and inform possible listeners about this
1161 LOG_DEBUG("TRST line asserted");
1162 cmd_queue_cur_state
= TAP_RESET
;
1163 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1167 if (jtag_ntrst_delay
)
1168 jtag_add_sleep(jtag_ntrst_delay
* 1000);
1172 int MINIDRIVER(interface_jtag_add_reset
)(int req_trst
, int req_srst
)
1174 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1176 /* allocate memory for a new list member */
1177 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1178 (*last_cmd
)->next
= NULL
;
1179 last_comand_pointer
= &((*last_cmd
)->next
);
1180 (*last_cmd
)->type
= JTAG_RESET
;
1182 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
1183 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
1184 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
1189 void jtag_add_end_state(tap_state_t state
)
1191 cmd_queue_end_state
= state
;
1192 if ((cmd_queue_end_state
== TAP_DRSHIFT
)||(cmd_queue_end_state
== TAP_IRSHIFT
))
1194 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
1198 int MINIDRIVER(interface_jtag_add_sleep
)(u32 us
)
1200 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1202 /* allocate memory for a new list member */
1203 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1204 (*last_cmd
)->next
= NULL
;
1205 last_comand_pointer
= &((*last_cmd
)->next
);
1206 (*last_cmd
)->type
= JTAG_SLEEP
;
1208 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
1209 (*last_cmd
)->cmd
.sleep
->us
= us
;
1214 void jtag_add_sleep(u32 us
)
1216 keep_alive(); /* we might be running on a very slow JTAG clk */
1217 int retval
=interface_jtag_add_sleep(us
);
1218 if (retval
!=ERROR_OK
)
1223 int jtag_scan_size(scan_command_t
*cmd
)
1228 /* count bits in scan command */
1229 for (i
= 0; i
< cmd
->num_fields
; i
++)
1231 bit_count
+= cmd
->fields
[i
].num_bits
;
1237 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
1242 bit_count
= jtag_scan_size(cmd
);
1243 *buffer
= malloc(CEIL(bit_count
, 8));
1247 #ifdef _DEBUG_JTAG_IO_
1248 LOG_DEBUG("%s num_fields: %i", cmd
->ir_scan
? "IRSCAN" : "DRSCAN", cmd
->num_fields
);
1251 for (i
= 0; i
< cmd
->num_fields
; i
++)
1253 if (cmd
->fields
[i
].out_value
)
1255 #ifdef _DEBUG_JTAG_IO_
1256 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);
1258 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
1259 #ifdef _DEBUG_JTAG_IO_
1260 LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i
, cmd
->fields
[i
].num_bits
, char_buf
);
1266 #ifdef _DEBUG_JTAG_IO_
1267 LOG_DEBUG("fields[%i].out_value[%i]: NULL", i
, cmd
->fields
[i
].num_bits
);
1271 bit_count
+= cmd
->fields
[i
].num_bits
;
1274 #ifdef _DEBUG_JTAG_IO_
1275 //LOG_DEBUG("bit_count totalling: %i", bit_count );
1281 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1287 /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1290 for (i
= 0; i
< cmd
->num_fields
; i
++)
1292 /* if neither in_value nor in_handler
1293 * are specified we don't have to examine this field
1295 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1297 int num_bits
= cmd
->fields
[i
].num_bits
;
1298 u8
*captured
= buf_set_buf(buffer
, bit_count
, malloc(CEIL(num_bits
, 8)), 0, num_bits
);
1300 #ifdef _DEBUG_JTAG_IO_
1301 char *char_buf
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1302 LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i
, num_bits
, char_buf
);
1306 if (cmd
->fields
[i
].in_value
)
1308 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1310 if (cmd
->fields
[i
].in_handler
)
1312 if (cmd
->fields
[i
].in_handler(cmd
->fields
[i
].in_value
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1314 LOG_WARNING("in_handler: with \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1315 retval
= ERROR_JTAG_QUEUE_FAILED
;
1320 /* no in_value specified, but a handler takes care of the scanned data */
1321 if (cmd
->fields
[i
].in_handler
&& (!cmd
->fields
[i
].in_value
))
1323 if (cmd
->fields
[i
].in_handler(captured
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1325 /* We're going to call the error:handler later, but if the in_handler
1326 * reported an error we report this failure upstream
1328 LOG_WARNING("in_handler: w/o \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1329 retval
= ERROR_JTAG_QUEUE_FAILED
;
1335 bit_count
+= cmd
->fields
[i
].num_bits
;
1341 static const char *jtag_tap_name(jtag_tap_t
*tap
)
1343 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
1346 int jtag_check_value(u8
*captured
, void *priv
, scan_field_t
*field
)
1348 int retval
= ERROR_OK
;
1349 int num_bits
= field
->num_bits
;
1351 int compare_failed
= 0;
1353 if (field
->in_check_mask
)
1354 compare_failed
= buf_cmp_mask(captured
, field
->in_check_value
, field
->in_check_mask
, num_bits
);
1356 compare_failed
= buf_cmp(captured
, field
->in_check_value
, num_bits
);
1358 if (compare_failed
){
1359 /* An error handler could have caught the failing check
1360 * only report a problem when there wasn't a handler, or if the handler
1361 * acknowledged the error
1363 LOG_WARNING("TAP %s:",
1364 jtag_tap_name(field
->tap
));
1367 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1368 char *in_check_value_char
= buf_to_str(field
->in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1370 if (field
->in_check_mask
)
1372 char *in_check_mask_char
;
1373 in_check_mask_char
= buf_to_str(field
->in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1374 LOG_WARNING("value captured during scan didn't pass the requested check:");
1375 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
1376 captured_char
, in_check_value_char
, in_check_mask_char
);
1377 free(in_check_mask_char
);
1381 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
);
1384 free(captured_char
);
1385 free(in_check_value_char
);
1387 retval
= ERROR_JTAG_QUEUE_FAILED
;
1395 set up checking of this field using the in_handler. The values passed in must be valid until
1396 after jtag_execute() has completed.
1398 void jtag_set_check_value(scan_field_t
*field
, u8
*value
, u8
*mask
, error_handler_t
*in_error_handler
)
1401 field
->in_handler
= jtag_check_value
;
1403 field
->in_handler
= NULL
; /* No check, e.g. embeddedice uses value==NULL to indicate no check */
1404 field
->in_handler_priv
= NULL
;
1405 field
->in_check_value
= value
;
1406 field
->in_check_mask
= mask
;
1409 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1414 for (i
= 0; i
< cmd
->num_fields
; i
++)
1416 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1418 if (cmd
->fields
[i
].out_value
)
1425 int MINIDRIVER(interface_jtag_execute_queue
)(void)
1431 LOG_ERROR("No JTAG interface configured yet. Issue 'init' command in startup scripts before communicating with targets.");
1435 retval
= jtag
->execute_queue();
1439 jtag_command_queue
= NULL
;
1440 last_comand_pointer
= &jtag_command_queue
;
1445 int jtag_execute_queue(void)
1447 int retval
=interface_jtag_execute_queue();
1448 if (retval
==ERROR_OK
)
1452 jtag_error
=ERROR_OK
;
1456 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1458 jtag_tap_t
*tap
= priv
;
1462 if (event
== JTAG_TRST_ASSERTED
)
1464 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
1471 void jtag_sleep(u32 us
)
1473 alive_sleep(us
/1000);
1476 /* Try to examine chain layout according to IEEE 1149.1 §12
1478 int jtag_examine_chain(void)
1482 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1485 int device_count
= 0;
1486 u8 zero_check
= 0x0;
1487 u8 one_check
= 0xff;
1490 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1491 field
.out_value
= idcode_buffer
;
1492 field
.out_mask
= NULL
;
1493 field
.in_value
= idcode_buffer
;
1494 field
.in_check_value
= NULL
;
1495 field
.in_check_mask
= NULL
;
1496 field
.in_handler
= NULL
;
1497 field
.in_handler_priv
= NULL
;
1499 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1501 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
1504 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
1505 jtag_execute_queue();
1507 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1509 zero_check
|= idcode_buffer
[i
];
1510 one_check
&= idcode_buffer
[i
];
1513 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1514 if ((zero_check
== 0x00) || (one_check
== 0xff))
1516 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1517 return ERROR_JTAG_INIT_FAILED
;
1520 /* point at the 1st tap */
1521 tap
= jtag_NextEnabledTap(NULL
);
1523 LOG_ERROR("JTAG: No taps enabled?");
1524 return ERROR_JTAG_INIT_FAILED
;
1527 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1529 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1530 if ((idcode
& 1) == 0)
1532 /* LSB must not be 0, this indicates a device in bypass */
1533 LOG_WARNING("Tap/Device does not have IDCODE");
1544 /* some devices, such as AVR will output all 1's instead of TDI
1545 input value at end of chain. */
1546 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
1549 /* End of chain (invalid manufacturer ID)
1551 * The JTAG examine is the very first thing that happens
1553 * A single JTAG device requires only 64 bits to be read back correctly.
1555 * The code below adds a check that the rest of the data scanned (640 bits)
1556 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1558 * earlier and gives more helpful/explicit error messages.
1560 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1562 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1563 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1565 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1573 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1574 manufacturer
= EXTRACT_MFG(idcode
);
1575 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1576 part
= EXTRACT_PART(idcode
);
1577 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1578 version
= EXTRACT_VER(idcode
);
1580 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1581 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1582 idcode
, manufacturer
, part
, version
);
1588 tap
->idcode
= idcode
;
1590 if (tap
->expected_ids_cnt
> 0) {
1591 /* Loop over the expected identification codes and test for a match */
1593 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1594 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1599 /* If none of the expected ids matched, log an error */
1600 if (ii
== tap
->expected_ids_cnt
) {
1601 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1604 EXTRACT_MFG( tap
->idcode
),
1605 EXTRACT_PART( tap
->idcode
),
1606 EXTRACT_VER( tap
->idcode
) );
1607 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1608 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1611 tap
->expected_ids_cnt
,
1612 tap
->expected_ids
[ii
],
1613 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1614 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1615 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1618 return ERROR_JTAG_INIT_FAILED
;
1620 LOG_INFO("JTAG Tap/device matched");
1624 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1628 tap
= jtag_NextEnabledTap(tap
);
1633 /* see if number of discovered devices matches configuration */
1634 if (device_count
!= jtag_NumEnabledTaps())
1636 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1637 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1638 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1639 return ERROR_JTAG_INIT_FAILED
;
1645 int jtag_validate_chain(void)
1648 int total_ir_length
= 0;
1654 total_ir_length
= 0;
1656 tap
= jtag_NextEnabledTap(tap
);
1660 total_ir_length
+= tap
->ir_length
;
1663 total_ir_length
+= 2;
1664 ir_test
= malloc(CEIL(total_ir_length
, 8));
1665 buf_set_ones(ir_test
, total_ir_length
);
1668 field
.num_bits
= total_ir_length
;
1669 field
.out_value
= ir_test
;
1670 field
.out_mask
= NULL
;
1671 field
.in_value
= ir_test
;
1672 field
.in_check_value
= NULL
;
1673 field
.in_check_mask
= NULL
;
1674 field
.in_handler
= NULL
;
1675 field
.in_handler_priv
= NULL
;
1677 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1678 jtag_execute_queue();
1684 tap
= jtag_NextEnabledTap(tap
);
1689 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1692 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1693 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
);
1696 return ERROR_JTAG_INIT_FAILED
;
1698 chain_pos
+= tap
->ir_length
;
1701 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1704 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1705 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
);
1708 return ERROR_JTAG_INIT_FAILED
;
1716 enum jtag_tap_cfg_param
{
1720 static Jim_Nvp nvp_config_opts
[] = {
1721 { .name
= "-event", .value
= JCFG_EVENT
},
1723 { .name
= NULL
, .value
= -1 }
1726 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1732 /* parse config or cget options */
1733 while (goi
->argc
> 0) {
1734 Jim_SetEmptyResult (goi
->interp
);
1736 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1738 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1744 if (goi
->argc
== 0) {
1745 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1749 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1751 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1755 if (goi
->isconfigure
) {
1756 if (goi
->argc
!= 1) {
1757 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1761 if (goi
->argc
!= 0) {
1762 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1768 jtag_tap_event_action_t
*jteap
;
1770 jteap
= tap
->event_action
;
1771 /* replace existing? */
1773 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1776 jteap
= jteap
->next
;
1779 if (goi
->isconfigure
) {
1780 if (jteap
== NULL
) {
1782 jteap
= calloc(1, sizeof (*jteap
));
1784 jteap
->event
= n
->value
;
1785 Jim_GetOpt_Obj( goi
, &o
);
1787 Jim_DecrRefCount(interp
, jteap
->body
);
1789 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1790 Jim_IncrRefCount(jteap
->body
);
1792 /* add to head of event list */
1793 jteap
->next
= tap
->event_action
;
1794 tap
->event_action
= jteap
;
1795 Jim_SetEmptyResult(goi
->interp
);
1798 if (jteap
== NULL
) {
1799 Jim_SetEmptyResult(goi
->interp
);
1801 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1808 } /* while (goi->argc) */
1813 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1823 const Jim_Nvp opts
[] = {
1824 #define NTAP_OPT_IRLEN 0
1825 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1826 #define NTAP_OPT_IRMASK 1
1827 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1828 #define NTAP_OPT_IRCAPTURE 2
1829 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1830 #define NTAP_OPT_ENABLED 3
1831 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1832 #define NTAP_OPT_DISABLED 4
1833 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1834 #define NTAP_OPT_EXPECTED_ID 5
1835 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1836 { .name
= NULL
, .value
= -1 },
1839 pTap
= malloc( sizeof(jtag_tap_t
) );
1840 memset( pTap
, 0, sizeof(*pTap
) );
1842 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1846 * we expect CHIP + TAP + OPTIONS
1848 if( goi
->argc
< 3 ){
1849 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1852 Jim_GetOpt_String( goi
, &cp
, NULL
);
1853 pTap
->chip
= strdup(cp
);
1855 Jim_GetOpt_String( goi
, &cp
, NULL
);
1856 pTap
->tapname
= strdup(cp
);
1858 /* name + dot + name + null */
1859 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1861 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1862 pTap
->dotted_name
= cp
;
1864 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1865 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1867 /* default is enabled */
1870 /* deal with options */
1871 #define NTREQ_IRLEN 1
1872 #define NTREQ_IRCAPTURE 2
1873 #define NTREQ_IRMASK 4
1875 /* clear them as we find them */
1876 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1879 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1881 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1884 LOG_DEBUG("Processing option: %s", n
->name
);
1886 case NTAP_OPT_ENABLED
:
1889 case NTAP_OPT_DISABLED
:
1892 case NTAP_OPT_EXPECTED_ID
:
1894 u32
*new_expected_ids
;
1896 e
= Jim_GetOpt_Wide( goi
, &w
);
1898 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1902 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1903 if (new_expected_ids
== NULL
) {
1904 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1908 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1910 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1912 free(pTap
->expected_ids
);
1913 pTap
->expected_ids
= new_expected_ids
;
1914 pTap
->expected_ids_cnt
++;
1917 case NTAP_OPT_IRLEN
:
1918 case NTAP_OPT_IRMASK
:
1919 case NTAP_OPT_IRCAPTURE
:
1920 e
= Jim_GetOpt_Wide( goi
, &w
);
1922 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1925 if( (w
< 0) || (w
> 0xffff) ){
1927 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1928 n
->name
, (int)(w
), (int)(w
));
1932 case NTAP_OPT_IRLEN
:
1933 pTap
->ir_length
= w
;
1934 reqbits
&= (~(NTREQ_IRLEN
));
1936 case NTAP_OPT_IRMASK
:
1937 pTap
->ir_capture_mask
= w
;
1938 reqbits
&= (~(NTREQ_IRMASK
));
1940 case NTAP_OPT_IRCAPTURE
:
1941 pTap
->ir_capture_value
= w
;
1942 reqbits
&= (~(NTREQ_IRCAPTURE
));
1945 } /* switch(n->value) */
1946 } /* while( goi->argc ) */
1948 /* Did we get all the options? */
1951 Jim_SetResult_sprintf( goi
->interp
,
1952 "newtap: %s missing required parameters",
1954 /* TODO: Tell user what is missing :-( */
1955 /* no memory leaks pelase */
1956 free(((void *)(pTap
->expected_ids
)));
1957 free(((void *)(pTap
->chip
)));
1958 free(((void *)(pTap
->tapname
)));
1959 free(((void *)(pTap
->dotted_name
)));
1960 free(((void *)(pTap
)));
1964 pTap
->expected
= malloc( pTap
->ir_length
);
1965 pTap
->expected_mask
= malloc( pTap
->ir_length
);
1966 pTap
->cur_instr
= malloc( pTap
->ir_length
);
1968 buf_set_u32( pTap
->expected
,
1971 pTap
->ir_capture_value
);
1972 buf_set_u32( pTap
->expected_mask
,
1975 pTap
->ir_capture_mask
);
1976 buf_set_ones( pTap
->cur_instr
,
1981 jtag_register_event_callback(jtag_reset_callback
, pTap
);
1983 ppTap
= &(jtag_all_taps
);
1984 while( (*ppTap
) != NULL
){
1985 ppTap
= &((*ppTap
)->next_tap
);
1989 static int n_taps
= 0;
1990 pTap
->abs_chain_position
= n_taps
++;
1992 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
1993 (*ppTap
)->dotted_name
,
1994 (*ppTap
)->abs_chain_position
,
1995 (*ppTap
)->ir_length
,
1996 (*ppTap
)->ir_capture_value
,
1997 (*ppTap
)->ir_capture_mask
);
2002 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2008 struct command_context_s
*context
;
2012 JTAG_CMD_INIT_RESET
,
2015 JTAG_CMD_TAPDISABLE
,
2016 JTAG_CMD_TAPISENABLED
,
2021 const Jim_Nvp jtag_cmds
[] = {
2022 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
2023 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
2024 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
2025 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
2026 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
2027 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
2028 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
2029 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
2031 { .name
= NULL
, .value
= -1 },
2034 context
= Jim_GetAssocData(interp
, "context");
2035 /* go past the command */
2036 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
2038 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
2040 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
2043 Jim_SetEmptyResult( goi
.interp
);
2045 case JTAG_CMD_INTERFACE
:
2046 /* return the name of the interface */
2047 /* TCL code might need to know the exact type... */
2048 /* FUTURE: we allow this as a means to "set" the interface. */
2049 if( goi
.argc
!= 0 ){
2050 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2053 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
2055 case JTAG_CMD_INIT_RESET
:
2056 if( goi
.argc
!= 0 ){
2057 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2060 e
= jtag_init_reset(context
);
2061 if( e
!= ERROR_OK
){
2062 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
2066 case JTAG_CMD_NEWTAP
:
2067 return jim_newtap_cmd( &goi
);
2069 case JTAG_CMD_TAPISENABLED
:
2070 case JTAG_CMD_TAPENABLE
:
2071 case JTAG_CMD_TAPDISABLE
:
2072 if( goi
.argc
!= 1 ){
2073 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
2079 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
2084 case JTAG_CMD_TAPISENABLED
:
2087 case JTAG_CMD_TAPENABLE
:
2088 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
2092 case JTAG_CMD_TAPDISABLE
:
2093 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
2098 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
2105 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
2112 Jim_GetOpt_Obj(&goi
, &o
);
2113 t
= jtag_TapByJimObj( goi
.interp
, o
);
2118 goi
.isconfigure
= 0;
2119 return jtag_tap_configure_cmd( &goi
, t
);
2123 case JTAG_CMD_CONFIGURE
:
2125 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
2132 Jim_GetOpt_Obj(&goi
, &o
);
2133 t
= jtag_TapByJimObj( goi
.interp
, o
);
2138 goi
.isconfigure
= 1;
2139 return jtag_tap_configure_cmd( &goi
, t
);
2146 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
2148 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
2150 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
2151 COMMAND_CONFIG
, "try to configure interface");
2152 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
2153 COMMAND_ANY
, "set jtag speed (if supported)");
2154 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
2155 COMMAND_ANY
, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
2156 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
2157 COMMAND_CONFIG
, "jtag_device <ir_length> <ir_expected> <ir_mask>");
2158 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
2160 "[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]");
2161 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
2162 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
2163 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
2164 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
2166 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
2167 COMMAND_EXEC
, "print current scan chain configuration");
2169 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
2170 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
2171 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
2172 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
2173 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
2174 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
2175 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
2176 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
2177 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
2179 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
2180 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
2184 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
2189 if (!jtag_interface
)
2191 /* nothing was previously specified by "interface" command */
2192 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
2193 return ERROR_JTAG_INVALID_INTERFACE
;
2197 jtag_interface
->khz(speed_khz
, &jtag_speed
);
2201 if (jtag_interface
->init() != ERROR_OK
)
2202 return ERROR_JTAG_INIT_FAILED
;
2204 jtag
= jtag_interface
;
2208 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
2213 LOG_DEBUG("Init JTAG chain");
2215 tap
= jtag_NextEnabledTap(NULL
);
2217 LOG_ERROR("There are no enabled taps?");
2218 return ERROR_JTAG_INIT_FAILED
;
2222 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
2225 /* examine chain first, as this could discover the real chain layout */
2226 if (jtag_examine_chain() != ERROR_OK
)
2228 LOG_ERROR("trying to validate configured JTAG chain anyway...");
2231 if (jtag_validate_chain() != ERROR_OK
)
2233 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
2239 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
2243 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2246 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
2248 /* Reset can happen after a power cycle.
2250 * Ideally we would only assert TRST or run RESET before the target reset.
2252 * However w/srst_pulls_trst, trst is asserted together with the target
2253 * reset whether we want it or not.
2255 * NB! Some targets have JTAG circuitry disabled until a
2256 * trst & srst has been asserted.
2258 * NB! here we assume nsrst/ntrst delay are sufficient!
2260 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
2263 jtag_add_reset(1, 0); /* RESET or TRST */
2264 if (jtag_reset_config
& RESET_HAS_SRST
)
2266 jtag_add_reset(1, 1);
2267 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
2268 jtag_add_reset(0, 1);
2270 jtag_add_reset(0, 0);
2271 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2274 /* Check that we can communication on the JTAG chain + eventually we want to
2275 * be able to perform enumeration only after OpenOCD has started
2276 * telnet and GDB server
2278 * That would allow users to more easily perform any magic they need to before
2281 return jtag_init_inner(cmd_ctx
);
2284 int jtag_init(struct command_context_s
*cmd_ctx
)
2287 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2289 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
2293 return jtag_init_reset(cmd_ctx
);
2296 static int default_khz(int khz
, int *jtag_speed
)
2298 LOG_ERROR("Translation from khz to jtag_speed not implemented");
2302 static int default_speed_div(int speed
, int *khz
)
2304 LOG_ERROR("Translation from jtag_speed to khz not implemented");
2308 static int default_power_dropout(int *dropout
)
2310 *dropout
=0; /* by default we can't detect power dropout */
2314 static int default_srst_asserted(int *srst_asserted
)
2316 *srst_asserted
=0; /* by default we can't detect srst asserted */
2320 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2325 /* check whether the interface is already configured */
2328 LOG_WARNING("Interface already configured, ignoring");
2332 /* interface name is a mandatory argument */
2333 if (argc
< 1 || args
[0][0] == '\0')
2335 return ERROR_COMMAND_SYNTAX_ERROR
;
2338 for (i
=0; jtag_interfaces
[i
]; i
++)
2340 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
2342 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
2347 jtag_interface
= jtag_interfaces
[i
];
2349 if (jtag_interface
->khz
== NULL
)
2351 jtag_interface
->khz
= default_khz
;
2353 if (jtag_interface
->speed_div
== NULL
)
2355 jtag_interface
->speed_div
= default_speed_div
;
2357 if (jtag_interface
->power_dropout
== NULL
)
2359 jtag_interface
->power_dropout
= default_power_dropout
;
2361 if (jtag_interface
->srst_asserted
== NULL
)
2363 jtag_interface
->srst_asserted
= default_srst_asserted
;
2370 /* no valid interface was found (i.e. the configuration option,
2371 * didn't match one of the compiled-in interfaces
2373 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
2374 LOG_ERROR("compiled-in jtag interfaces:");
2375 for (i
= 0; jtag_interfaces
[i
]; i
++)
2377 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
2380 return ERROR_JTAG_INVALID_INTERFACE
;
2383 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2387 Jim_Obj
*newargs
[ 10 ];
2390 * argv[-1] = command
2391 * argv[ 0] = ir length
2392 * argv[ 1] = ir capture
2393 * argv[ 2] = ir mask
2394 * argv[ 3] = not actually used by anything but in the docs
2398 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
2401 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
2402 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
2406 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
2407 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
2408 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
2409 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
2411 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
2412 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
2413 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
2414 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
2415 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
2416 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
2417 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
2418 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
2419 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
2420 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
2421 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
2422 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
2424 command_print( cmd_ctx
, "NEW COMMAND:");
2425 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
2426 Jim_GetString( newargs
[0], NULL
),
2427 Jim_GetString( newargs
[1], NULL
),
2428 Jim_GetString( newargs
[2], NULL
),
2429 Jim_GetString( newargs
[3], NULL
),
2430 Jim_GetString( newargs
[4], NULL
),
2431 Jim_GetString( newargs
[5], NULL
),
2432 Jim_GetString( newargs
[6], NULL
),
2433 Jim_GetString( newargs
[7], NULL
),
2434 Jim_GetString( newargs
[8], NULL
),
2435 Jim_GetString( newargs
[9], NULL
) );
2437 e
= jim_jtag_command( interp
, 10, newargs
);
2439 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
2444 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2448 tap
= jtag_all_taps
;
2449 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
2450 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
2453 u32 expected
, expected_mask
, cur_instr
, ii
;
2454 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
2455 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
2456 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
2458 command_print(cmd_ctx
,
2459 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
2460 tap
->abs_chain_position
,
2462 tap
->enabled
? 'Y' : 'n',
2464 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
2470 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
2471 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
2472 tap
->expected_ids
[ii
]);
2475 tap
= tap
->next_tap
;
2481 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2484 return ERROR_COMMAND_SYNTAX_ERROR
;
2488 if (strcmp(args
[0], "none") == 0)
2489 jtag_reset_config
= RESET_NONE
;
2490 else if (strcmp(args
[0], "trst_only") == 0)
2491 jtag_reset_config
= RESET_HAS_TRST
;
2492 else if (strcmp(args
[0], "srst_only") == 0)
2493 jtag_reset_config
= RESET_HAS_SRST
;
2494 else if (strcmp(args
[0], "trst_and_srst") == 0)
2495 jtag_reset_config
= RESET_TRST_AND_SRST
;
2498 LOG_ERROR("(1) invalid reset_config argument (%s), defaulting to none", args
[0]);
2499 jtag_reset_config
= RESET_NONE
;
2500 return ERROR_INVALID_ARGUMENTS
;
2506 if (strcmp(args
[1], "separate") == 0)
2508 /* seperate reset lines - default */
2511 if (strcmp(args
[1], "srst_pulls_trst") == 0)
2512 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
2513 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
2514 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
2515 else if (strcmp(args
[1], "combined") == 0)
2516 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
2519 LOG_ERROR("(2) invalid reset_config argument (%s), defaulting to none", args
[1]);
2520 jtag_reset_config
= RESET_NONE
;
2521 return ERROR_INVALID_ARGUMENTS
;
2528 if (strcmp(args
[2], "trst_open_drain") == 0)
2529 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
2530 else if (strcmp(args
[2], "trst_push_pull") == 0)
2531 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
2534 LOG_ERROR("(3) invalid reset_config argument (%s) defaulting to none", args
[2] );
2535 jtag_reset_config
= RESET_NONE
;
2536 return ERROR_INVALID_ARGUMENTS
;
2542 if (strcmp(args
[3], "srst_push_pull") == 0)
2543 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
2544 else if (strcmp(args
[3], "srst_open_drain") == 0)
2545 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
2548 LOG_ERROR("(4) invalid reset_config argument (%s), defaulting to none", args
[3]);
2549 jtag_reset_config
= RESET_NONE
;
2550 return ERROR_INVALID_ARGUMENTS
;
2557 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2561 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2566 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2572 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2576 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2581 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2587 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2589 int retval
=ERROR_OK
;
2593 LOG_DEBUG("handle jtag speed");
2596 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2598 /* this command can be called during CONFIG,
2599 * in which case jtag isn't initialized */
2602 retval
=jtag
->speed(cur_speed
);
2604 } else if (argc
== 0)
2608 return ERROR_COMMAND_SYNTAX_ERROR
;
2610 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2615 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2617 int retval
=ERROR_OK
;
2618 LOG_DEBUG("handle jtag khz");
2622 speed_khz
= strtoul(args
[0], NULL
, 0);
2626 LOG_DEBUG("have interface set up");
2628 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2634 cur_speed
= jtag_speed
= speed_div1
;
2636 retval
=jtag
->speed(cur_speed
);
2645 return ERROR_COMMAND_SYNTAX_ERROR
;
2650 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2656 command_print(cmd_ctx
, "RCLK - adaptive");
2659 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2665 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2671 return ERROR_COMMAND_SYNTAX_ERROR
;
2675 state
= tap_state_by_name( args
[0] );
2677 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2678 return ERROR_COMMAND_SYNTAX_ERROR
;
2680 jtag_add_end_state(state
);
2681 jtag_execute_queue();
2683 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2688 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2695 return ERROR_COMMAND_SYNTAX_ERROR
;
2698 if (args
[0][0] == '1')
2700 else if (args
[0][0] == '0')
2704 return ERROR_COMMAND_SYNTAX_ERROR
;
2707 if (args
[1][0] == '1')
2709 else if (args
[1][0] == '0')
2713 return ERROR_COMMAND_SYNTAX_ERROR
;
2716 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2717 return ERROR_JTAG_INIT_FAILED
;
2719 jtag_add_reset(trst
, srst
);
2720 jtag_execute_queue();
2725 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2729 return ERROR_COMMAND_SYNTAX_ERROR
;
2732 jtag_add_runtest(strtol(args
[0], NULL
, 0), TAP_INVALID
);
2733 jtag_execute_queue();
2739 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2742 scan_field_t
*fields
;
2744 tap_state_t endstate
;
2746 if ((argc
< 2) || (argc
% 2))
2748 return ERROR_COMMAND_SYNTAX_ERROR
;
2751 /* optional "-endstate" */
2753 /* at the end of the arguments. */
2755 endstate
= TAP_INVALID
;
2757 /* have at least one pair of numbers. */
2758 /* is last pair the magic text? */
2759 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2762 cpA
= args
[ argc
-1 ];
2763 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2764 cpS
= tap_state_name( endstate
);
2765 if( 0 == strcmp( cpA
, cpS
) ){
2769 if( endstate
>= TAP_NUM_STATES
){
2770 return ERROR_COMMAND_SYNTAX_ERROR
;
2772 /* found - remove the last 2 args */
2778 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
2780 for (i
= 0; i
< argc
/ 2; i
++)
2782 tap
= jtag_TapByString( args
[i
*2] );
2785 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2788 int field_size
= tap
->ir_length
;
2789 fields
[i
].tap
= tap
;
2790 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2791 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2792 fields
[i
].out_mask
= NULL
;
2793 fields
[i
].in_value
= NULL
;
2794 fields
[i
].in_check_mask
= NULL
;
2795 fields
[i
].in_handler
= NULL
;
2796 fields
[i
].in_handler_priv
= NULL
;
2799 jtag_add_ir_scan(argc
/ 2, fields
, TAP_INVALID
);
2800 /* did we have an endstate? */
2801 if (endstate
!= TAP_INVALID
)
2802 jtag_add_end_state(endstate
);
2804 jtag_execute_queue();
2806 for (i
= 0; i
< argc
/ 2; i
++)
2807 free(fields
[i
].out_value
);
2814 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2817 scan_field_t
*fields
;
2819 int field_count
= 0;
2822 tap_state_t endstate
;
2825 * args[2] = num_bits
2826 * args[3] = hex string
2827 * ... repeat num bits and hex string ...
2830 * args[N-2] = "-endstate"
2831 * args[N-1] = statename
2833 if ((argc
< 4) || ((argc
% 2)!=0))
2835 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2839 /* assume no endstate */
2840 endstate
= TAP_INVALID
;
2841 /* validate arguments as numbers */
2843 for (i
= 2; i
< argc
; i
+=2)
2848 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2849 /* If valid - try next arg */
2854 /* Not valid.. are we at the end? */
2855 if ( ((i
+2) != argc
) ){
2856 /* nope, then error */
2860 /* it could be: "-endstate FOO" */
2862 /* get arg as a string. */
2863 cp
= Jim_GetString( args
[i
], NULL
);
2864 /* is it the magic? */
2865 if( 0 == strcmp( "-endstate", cp
) ){
2866 /* is the statename valid? */
2867 cp
= Jim_GetString( args
[i
+1], NULL
);
2869 /* see if it is a valid state name */
2870 endstate
= tap_state_by_name(cp
);
2872 /* update the error message */
2873 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2875 /* valid - so clear the error */
2877 /* and remove the last 2 args */
2882 /* Still an error? */
2884 return e
; /* too bad */
2886 } /* validate args */
2888 tap
= jtag_TapByJimObj( interp
, args
[1] );
2893 num_fields
=(argc
-2)/2;
2894 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2895 for (i
= 2; i
< argc
; i
+=2)
2901 Jim_GetLong(interp
, args
[i
], &bits
);
2902 str
= Jim_GetString(args
[i
+1], &len
);
2904 fields
[field_count
].tap
= tap
;
2905 fields
[field_count
].num_bits
= bits
;
2906 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2907 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2908 fields
[field_count
].out_mask
= NULL
;
2909 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2910 fields
[field_count
].in_check_mask
= NULL
;
2911 fields
[field_count
].in_check_value
= NULL
;
2912 fields
[field_count
].in_handler
= NULL
;
2913 fields
[field_count
++].in_handler_priv
= NULL
;
2916 jtag_add_dr_scan(num_fields
, fields
, TAP_INVALID
);
2917 /* did we get an end state? */
2918 if (endstate
!= TAP_INVALID
)
2919 jtag_add_end_state(endstate
);
2921 retval
= jtag_execute_queue();
2922 if (retval
!= ERROR_OK
)
2924 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2929 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2930 for (i
= 2; i
< argc
; i
+=2)
2935 Jim_GetLong(interp
, args
[i
], &bits
);
2936 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
2937 free(fields
[field_count
].out_value
);
2939 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
2944 Jim_SetResult(interp
, list
);
2951 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2955 if (strcmp(args
[0], "enable") == 0)
2957 jtag_verify_capture_ir
= 1;
2959 else if (strcmp(args
[0], "disable") == 0)
2961 jtag_verify_capture_ir
= 0;
2964 return ERROR_COMMAND_SYNTAX_ERROR
;
2966 } else if (argc
!= 0)
2968 return ERROR_COMMAND_SYNTAX_ERROR
;
2971 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
2976 int jtag_power_dropout(int *dropout
)
2978 return jtag
->power_dropout(dropout
);
2981 int jtag_srst_asserted(int *srst_asserted
)
2983 return jtag
->srst_asserted(srst_asserted
);
2986 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
2988 jtag_tap_event_action_t
* jteap
;
2991 jteap
= tap
->event_action
;
2995 if (jteap
->event
== e
) {
2997 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
3000 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
3001 Jim_GetString(jteap
->body
, NULL
) );
3002 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
3003 Jim_PrintErrorMessage(interp
);
3007 jteap
= jteap
->next
;
3011 LOG_DEBUG( "event %d %s - no action",
3013 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
3017 /*-----<Cable Helper API>---------------------------------------*/
3019 /* these Cable Helper API functions are all documented in the jtag.h header file,
3020 using a Doxygen format. And since Doxygen's configuration file "Doxyfile",
3021 is setup to prefer its docs in the header file, no documentation is here, for
3022 if it were, it would have to be doubly maintained.
3026 * @see tap_set_state() and tap_get_state() accessors.
3027 * Actual name is not important since accessors hide it.
3029 static tap_state_t state_follower
= TAP_RESET
;
3031 void tap_set_state_impl( tap_state_t new_state
)
3033 /* this is the state we think the TAPs are in now, was cur_state */
3034 state_follower
= new_state
;
3037 tap_state_t
tap_get_state()
3039 return state_follower
;
3043 * @see tap_set_end_state() and tap_get_end_state() accessors.
3044 * Actual name is not important because accessors hide it.
3046 static tap_state_t end_state_follower
= TAP_RESET
;
3048 void tap_set_end_state( tap_state_t new_end_state
)
3050 /* this is the state we think the TAPs will be in at completion of the
3051 current TAP operation, was end_state
3053 end_state_follower
= new_end_state
;
3056 tap_state_t
tap_get_end_state()
3058 return end_state_follower
;
3062 int tap_move_ndx( tap_state_t astate
)
3064 /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
3070 case TAP_RESET
: ndx
= 0; break;
3071 case TAP_DRSHIFT
: ndx
= 2; break;
3072 case TAP_DRPAUSE
: ndx
= 3; break;
3073 case TAP_IDLE
: ndx
= 1; break;
3074 case TAP_IRSHIFT
: ndx
= 4; break;
3075 case TAP_IRPAUSE
: ndx
= 5; break;
3077 LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate
) );
3085 /* tap_move[i][j]: tap movement command to go from state i to state j
3086 * 0: Test-Logic-Reset
3093 * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
3100 } tms_seqs
[6][6] = /* [from_state_ndx][to_state_ndx] */
3102 /* value clocked to TMS to move from one of six stable states to another.
3103 * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
3104 * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
3105 * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
3106 * These extra ones cause no TAP state problem, because we go into reset and stay in reset.
3110 * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
3111 * Read the bits from LSBit first to MSBit last (right-to-left).
3113 #define HEX__(n) 0x##n##LU
3116 (((x) & 0x0000000FLU)?(1<<0):0) \
3117 +(((x) & 0x000000F0LU)?(1<<1):0) \
3118 +(((x) & 0x00000F00LU)?(1<<2):0) \
3119 +(((x) & 0x0000F000LU)?(1<<3):0) \
3120 +(((x) & 0x000F0000LU)?(1<<4):0) \
3121 +(((x) & 0x00F00000LU)?(1<<5):0) \
3122 +(((x) & 0x0F000000LU)?(1<<6):0) \
3123 +(((x) & 0xF0000000LU)?(1<<7):0)
3125 #define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
3127 #if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1))
3128 /* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
3130 OK, I added Peter's version of the state table, and it works OK for
3131 me on MC1322x. I've recreated the jlink portion of patch with this
3132 new state table. His changes to my state table are pretty minor in
3133 terms of total transitions, but Peter feels that his version fixes
3134 some long-standing problems.
3137 I added the bit count into the table
3142 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3143 { B8(11111,5), B8(0,1), B8(0010,4), B8(01010,5), B8(00110,5), B8(010110,6) }, /* RESET */
3144 { B8(11111,5), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
3145 { B8(11111,5), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
3146 { B8(11111,5), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
3147 { B8(11111,5), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
3148 { B8(11111,5), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
3150 #else /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
3153 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3154 { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
3155 { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
3156 { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
3157 { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
3158 { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
3159 { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
3163 #if 0 /* keeping old hex stuff for awhile, for reference */
3164 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
3165 { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
3166 { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
3167 { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
3168 { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
3169 { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
3170 { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
3175 int tap_get_tms_path( tap_state_t from
, tap_state_t to
)
3177 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bits
;
3181 int tap_get_tms_path_len( tap_state_t from
, tap_state_t to
)
3183 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bit_count
;
3187 bool tap_is_state_stable(tap_state_t astate
)
3191 /* A switch() is used because it is symbol dependent
3192 (not value dependent like an array), and can also check bounds.
3211 tap_state_t
tap_state_transition(tap_state_t cur_state
, bool tms
)
3213 tap_state_t new_state
;
3215 /* A switch is used because it is symbol dependent and not value dependent
3216 like an array. Also it can check for out of range conditions.
3224 new_state
= cur_state
;
3229 new_state
= TAP_DRSELECT
;
3232 new_state
= TAP_IRSELECT
;
3236 new_state
= TAP_DREXIT1
;
3240 new_state
= TAP_DRUPDATE
;
3243 new_state
= TAP_DREXIT2
;
3246 new_state
= TAP_RESET
;
3250 new_state
= TAP_IREXIT1
;
3254 new_state
= TAP_IRUPDATE
;
3257 new_state
= TAP_IREXIT2
;
3260 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3273 new_state
= TAP_IDLE
;
3276 new_state
= TAP_DRCAPTURE
;
3281 new_state
= TAP_DRSHIFT
;
3285 new_state
= TAP_DRPAUSE
;
3288 new_state
= TAP_IRCAPTURE
;
3293 new_state
= TAP_IRSHIFT
;
3297 new_state
= TAP_IRPAUSE
;
3300 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3309 const char* tap_state_name(tap_state_t state
)
3315 case TAP_RESET
: ret
= "RESET"; break;
3316 case TAP_IDLE
: ret
= "RUN/IDLE"; break;
3317 case TAP_DRSELECT
: ret
= "DRSELECT"; break;
3318 case TAP_DRCAPTURE
: ret
= "DRCAPTURE"; break;
3319 case TAP_DRSHIFT
: ret
= "DRSHIFT"; break;
3320 case TAP_DREXIT1
: ret
= "DREXIT1"; break;
3321 case TAP_DRPAUSE
: ret
= "DRPAUSE"; break;
3322 case TAP_DREXIT2
: ret
= "DREXIT2"; break;
3323 case TAP_DRUPDATE
: ret
= "DRUPDATE"; break;
3324 case TAP_IRSELECT
: ret
= "IRSELECT"; break;
3325 case TAP_IRCAPTURE
: ret
= "IRCAPTURE"; break;
3326 case TAP_IRSHIFT
: ret
= "IRSHIFT"; break;
3327 case TAP_IREXIT1
: ret
= "IREXIT1"; break;
3328 case TAP_IRPAUSE
: ret
= "IRPAUSE"; break;
3329 case TAP_IREXIT2
: ret
= "IREXIT2"; break;
3330 case TAP_IRUPDATE
: ret
= "IRUPDATE"; break;
3331 default: ret
= "???";
3337 static tap_state_t
tap_state_by_name( const char *name
)
3341 for( x
= 0 ; x
< TAP_NUM_STATES
; x
++ ){
3342 /* be nice to the human */
3343 if( 0 == strcasecmp( name
, tap_state_name(x
) ) ){
3351 #ifdef _DEBUG_JTAG_IO_
3353 #define JTAG_DEBUG_STATE_APPEND(buf, len, bit) \
3354 do { buf[len] = bit ? '1' : '0'; } while(0)
3355 #define JTAG_DEBUG_STATE_PRINT(a, b, astr, bstr) \
3356 DEBUG_JTAG_IO("TAP/SM: %9s -> %5s\tTMS: %s\tTDI: %s", \
3357 tap_state_name(a), tap_state_name(b), astr, bstr)
3359 tap_state_t
jtag_debug_state_machine(const void *tms_buf
, const void *tdi_buf
,
3360 unsigned tap_bits
, tap_state_t next_state
)
3362 const u8
*tms_buffer
;
3363 const u8
*tdi_buffer
;
3368 unsigned tap_out_bits
;
3372 tap_state_t last_state
;
3374 // set startstate (and possibly last, if tap_bits == 0)
3375 last_state
= next_state
;
3376 DEBUG_JTAG_IO("TAP/SM: START state: %s", tap_state_name(next_state
));
3378 tms_buffer
= (const u8
*)tms_buf
;
3379 tdi_buffer
= (const u8
*)tdi_buf
;
3381 tap_bytes
= TAP_SCAN_BYTES(tap_bits
);
3382 DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits
, tap_bytes
);
3385 for(cur_byte
= 0; cur_byte
< tap_bytes
; cur_byte
++)
3387 for(cur_bit
= 0; cur_bit
< 8; cur_bit
++)
3389 // make sure we do not run off the end of the buffers
3390 unsigned tap_bit
= cur_byte
* 8 + cur_bit
;
3391 if (tap_bit
== tap_bits
)
3394 // check and save TMS bit
3395 tap_bit
= !!(tms_buffer
[cur_byte
] & (1 << cur_bit
));
3396 JTAG_DEBUG_STATE_APPEND(tms_str
, tap_out_bits
, tap_bit
);
3398 // use TMS bit to find the next TAP state
3399 next_state
= tap_state_transition(last_state
, tap_bit
);
3401 // check and store TDI bit
3402 tap_bit
= !!(tdi_buffer
[cur_byte
] & (1 << cur_bit
));
3403 JTAG_DEBUG_STATE_APPEND(tdi_str
, tap_out_bits
, tap_bit
);
3405 // increment TAP bits
3408 // Only show TDO bits on state transitions, or
3409 // after some number of bits in the same state.
3410 if ((next_state
== last_state
) && (tap_out_bits
< 32))
3413 // terminate strings and display state transition
3414 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3415 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3418 last_state
= next_state
;
3425 // terminate strings and display state transition
3426 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3427 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3430 DEBUG_JTAG_IO("TAP/SM: FINAL state: %s", tap_state_name(next_state
));
3434 #endif // _DEBUG_JTAG_IO_
3436 /*-----</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)