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"
47 /* note that this is not marked as static as it must be available from outside jtag.c for those
48 that implement the jtag_xxx() minidriver layer
50 int jtag_error
=ERROR_OK
;
52 typedef struct cmd_queue_page_s
56 struct cmd_queue_page_s
*next
;
59 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
60 static cmd_queue_page_t
*cmd_queue_pages
= NULL
;
62 char* jtag_event_strings
[] =
64 "JTAG controller reset (RESET or TRST)"
67 const Jim_Nvp nvp_jtag_tap_event
[] = {
68 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
69 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
71 { .name
= NULL
, .value
= -1 }
77 jtag_command_t
*jtag_command_queue
= NULL
;
78 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
79 static jtag_tap_t
*jtag_all_taps
= NULL
;
81 enum reset_types jtag_reset_config
= RESET_NONE
;
82 tap_state_t cmd_queue_end_state
= TAP_RESET
;
83 tap_state_t cmd_queue_cur_state
= TAP_RESET
;
85 int jtag_verify_capture_ir
= 1;
87 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
88 static int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
89 static int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
91 /* maximum number of JTAG devices expected in the chain
93 #define JTAG_MAX_CHAIN_SIZE 20
95 /* callbacks to inform high-level handlers about JTAG state changes */
96 jtag_event_callback_t
*jtag_event_callbacks
;
99 static int speed_khz
= 0;
100 /* flag if the kHz speed was defined */
101 static int hasKHz
= 0;
103 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
106 #if BUILD_ECOSBOARD == 1
107 extern jtag_interface_t zy1000_interface
;
110 #if BUILD_PARPORT == 1
111 extern jtag_interface_t parport_interface
;
115 extern jtag_interface_t dummy_interface
;
118 #if BUILD_FT2232_FTD2XX == 1
119 extern jtag_interface_t ft2232_interface
;
122 #if BUILD_FT2232_LIBFTDI == 1
123 extern jtag_interface_t ft2232_interface
;
126 #if BUILD_AMTJTAGACCEL == 1
127 extern jtag_interface_t amt_jtagaccel_interface
;
130 #if BUILD_EP93XX == 1
131 extern jtag_interface_t ep93xx_interface
;
134 #if BUILD_AT91RM9200 == 1
135 extern jtag_interface_t at91rm9200_interface
;
138 #if BUILD_GW16012 == 1
139 extern jtag_interface_t gw16012_interface
;
142 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
143 extern jtag_interface_t presto_interface
;
146 #if BUILD_USBPROG == 1
147 extern jtag_interface_t usbprog_interface
;
151 extern jtag_interface_t jlink_interface
;
154 #if BUILD_VSLLINK == 1
155 extern jtag_interface_t vsllink_interface
;
159 extern jtag_interface_t rlink_interface
;
162 #if BUILD_ARMJTAGEW == 1
163 extern jtag_interface_t armjtagew_interface
;
166 jtag_interface_t
*jtag_interfaces
[] = {
167 #if BUILD_ECOSBOARD == 1
170 #if BUILD_PARPORT == 1
176 #if BUILD_FT2232_FTD2XX == 1
179 #if BUILD_FT2232_LIBFTDI == 1
182 #if BUILD_AMTJTAGACCEL == 1
183 &amt_jtagaccel_interface
,
185 #if BUILD_EP93XX == 1
188 #if BUILD_AT91RM9200 == 1
189 &at91rm9200_interface
,
191 #if BUILD_GW16012 == 1
194 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
197 #if BUILD_USBPROG == 1
203 #if BUILD_VSLLINK == 1
209 #if BUILD_ARMJTAGEW == 1
210 &armjtagew_interface
,
215 jtag_interface_t
*jtag
= NULL
;
218 static jtag_interface_t
*jtag_interface
= NULL
;
221 /* forward declarations */
222 //void jtag_add_pathmove(int num_states, tap_state_t *path);
223 //void jtag_add_runtest(int num_cycles, tap_state_t endstate);
224 //void jtag_add_end_state(tap_state_t endstate);
225 //void jtag_add_sleep(u32 us);
226 //int jtag_execute_queue(void);
227 static tap_state_t
tap_state_by_name(const char *name
);
230 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
231 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
232 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
233 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
234 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
235 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
236 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
238 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
240 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
241 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
242 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
243 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
244 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
246 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
248 jtag_tap_t
*jtag_AllTaps(void)
250 return jtag_all_taps
;
253 int jtag_NumTotalTaps(void)
267 int jtag_NumEnabledTaps(void)
283 jtag_tap_t
*jtag_TapByString( const char *s
)
291 if( 0 == strcmp( t
->dotted_name
, s
) ){
297 /* backup plan is by number */
299 /* ok - is "s" a number? */
301 n
= strtol( s
, &cp
, 0 );
302 if( (s
!= cp
) && (*cp
== 0) ){
304 t
= jtag_TapByAbsPosition(n
);
310 jtag_tap_t
* jtag_TapByJimObj( Jim_Interp
*interp
, Jim_Obj
*o
)
315 cp
= Jim_GetString( o
, NULL
);
320 t
= jtag_TapByString( cp
);
323 Jim_SetResult_sprintf(interp
,"Tap: %s is unknown", cp
);
328 /* returns a pointer to the n-th device in the scan chain */
329 jtag_tap_t
* jtag_TapByAbsPosition( int n
)
337 while( t
&& (n
> 0)) {
344 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
346 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
348 if (callback
== NULL
)
350 return ERROR_INVALID_ARGUMENTS
;
355 while ((*callbacks_p
)->next
)
356 callbacks_p
= &((*callbacks_p
)->next
);
357 callbacks_p
= &((*callbacks_p
)->next
);
360 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
361 (*callbacks_p
)->callback
= callback
;
362 (*callbacks_p
)->priv
= priv
;
363 (*callbacks_p
)->next
= NULL
;
368 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
370 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
372 if (callback
== NULL
)
374 return ERROR_INVALID_ARGUMENTS
;
379 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
380 if ((*callbacks_p
)->callback
== callback
)
383 *callbacks_p
= *next
;
391 int jtag_call_event_callbacks(enum jtag_event event
)
393 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
395 LOG_DEBUG("jtag event: %s", jtag_event_strings
[event
]);
399 callback
->callback(event
, callback
->priv
);
400 callback
= callback
->next
;
406 /* returns a pointer to the pointer of the last command in queue
407 * this may be a pointer to the root pointer (jtag_command_queue)
408 * or to the next member of the last but one command
410 jtag_command_t
** jtag_get_last_command_p(void)
412 /* jtag_command_t *cmd = jtag_command_queue;
418 return &jtag_command_queue;
422 return last_comand_pointer
;
425 void* cmd_queue_alloc(size_t size
)
427 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
433 * We align/round the *SIZE* per below
434 * so that all pointers returned by
435 * this function are reasonably well
438 * If we did not, then an "odd-length" request would cause the
439 * *next* allocation to be at an *odd* address, and because
440 * this function has the same type of api as malloc() - we
441 * must also return pointers that have the same type of
444 * What I do not/have is a reasonable portable means
447 * The solution here, is based on these suggestions.
448 * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
451 union worse_case_align
{
457 #define ALIGN_SIZE (sizeof(union worse_case_align))
459 /* The alignment process. */
460 size
= (size
+ ALIGN_SIZE
-1) & (~(ALIGN_SIZE
-1));
465 while ((*p_page
)->next
)
466 p_page
= &((*p_page
)->next
);
467 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
468 p_page
= &((*p_page
)->next
);
473 *p_page
= malloc(sizeof(cmd_queue_page_t
));
475 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
476 (*p_page
)->next
= NULL
;
479 offset
= (*p_page
)->used
;
480 (*p_page
)->used
+= size
;
482 t
=(u8
*)((*p_page
)->address
);
486 void cmd_queue_free(void)
488 cmd_queue_page_t
*page
= cmd_queue_pages
;
492 cmd_queue_page_t
*last
= page
;
498 cmd_queue_pages
= NULL
;
501 static void jtag_prelude1(void)
505 LOG_WARNING("JTAG command queued, while TRST is low (TAP in reset)");
506 jtag_error
=ERROR_JTAG_TRST_ASSERTED
;
510 if (cmd_queue_end_state
== TAP_RESET
)
511 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
514 static void jtag_prelude(tap_state_t state
)
518 if (state
!= TAP_INVALID
)
519 jtag_add_end_state(state
);
521 cmd_queue_cur_state
= cmd_queue_end_state
;
524 void jtag_add_ir_scan_noverify(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
529 retval
=interface_jtag_add_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
530 if (retval
!=ERROR_OK
)
536 void jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
538 /* 8 x 32 bit id's is enough for all invoations */
542 /* if we are to run a verification of the ir scan, we need to get the input back.
543 * We may have to allocate space if the caller didn't ask for the input back.
546 if (jtag_verify_capture_ir
)
549 for (j
= 0; j
< num_fields
; j
++)
552 if ((fields
[j
].in_value
==NULL
)&&(fields
[j
].num_bits
<=32))
557 fields
[j
].in_value
=(u8
*)(id
+j
);
560 LOG_DEBUG("caller must provide in_value space for verify_capture_ir to work");
566 jtag_add_ir_scan_noverify(num_fields
, fields
, state
);
568 if (jtag_verify_capture_ir
)
571 for (j
= 0; j
< num_fields
; j
++)
573 jtag_tap_t
*tap
=fields
[j
].tap
;
574 jtag_check_value_mask(fields
+j
, tap
->expected
, tap
->expected_mask
);
578 fields
[j
].in_value
=NULL
;
585 int MINIDRIVER(interface_jtag_add_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
587 jtag_command_t
**last_cmd
;
594 last_cmd
= jtag_get_last_command_p();
596 /* allocate memory for a new list member */
597 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
598 (*last_cmd
)->next
= NULL
;
599 last_comand_pointer
= &((*last_cmd
)->next
);
600 (*last_cmd
)->type
= JTAG_SCAN
;
602 /* allocate memory for ir scan command */
603 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
604 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
605 x
= jtag_NumEnabledTaps();
606 (*last_cmd
)->cmd
.scan
->num_fields
= x
; /* one field per device */
607 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(x
* sizeof(scan_field_t
));
608 (*last_cmd
)->cmd
.scan
->end_state
= state
;
615 /* do this here so it is not forgotten */
616 tap
= jtag_NextEnabledTap(tap
);
621 scan_size
= tap
->ir_length
;
622 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].tap
= tap
;
623 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].num_bits
= scan_size
;
624 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_value
= NULL
;
625 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler
= NULL
; /* disable verification by default */
627 /* search the list */
628 for (j
= 0; j
< num_fields
; j
++)
630 if (tap
== fields
[j
].tap
)
633 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
642 /* if a tap isn't listed, set it to BYPASS */
643 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
647 /* update device information */
648 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
, tap
->cur_instr
, scan_size
);
654 void jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
660 retval
=interface_jtag_add_plain_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
661 if (retval
!=ERROR_OK
)
665 int MINIDRIVER(interface_jtag_add_plain_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
668 jtag_command_t
**last_cmd
;
670 last_cmd
= jtag_get_last_command_p();
672 /* allocate memory for a new list member */
673 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
674 (*last_cmd
)->next
= NULL
;
675 last_comand_pointer
= &((*last_cmd
)->next
);
676 (*last_cmd
)->type
= JTAG_SCAN
;
678 /* allocate memory for ir scan command */
679 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
680 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
681 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
682 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
683 (*last_cmd
)->cmd
.scan
->end_state
= state
;
685 for( i
= 0 ; i
< num_fields
; i
++ ){
686 int num_bits
= fields
[i
].num_bits
;
687 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
688 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
689 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
690 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
691 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
692 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
693 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
694 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
;
695 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= NULL
;
700 void jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
706 retval
=interface_jtag_add_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
707 if (retval
!=ERROR_OK
)
711 void jtag_add_dr_scan_now(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
713 jtag_add_dr_scan(num_fields
, fields
, state
);
714 jtag_execute_queue_noclear();
717 int MINIDRIVER(interface_jtag_add_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
721 int bypass_devices
= 0;
725 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
728 /* count devices in bypass */
732 tap
= jtag_NextEnabledTap(tap
);
741 /* allocate memory for a new list member */
742 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
743 last_comand_pointer
= &((*last_cmd
)->next
);
744 (*last_cmd
)->next
= NULL
;
745 (*last_cmd
)->type
= JTAG_SCAN
;
747 /* allocate memory for dr scan command */
748 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
749 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
750 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
751 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
752 (*last_cmd
)->cmd
.scan
->end_state
= state
;
758 tap
= jtag_NextEnabledTap(tap
);
763 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
765 for (j
= 0; j
< num_fields
; j
++)
767 if (tap
== fields
[j
].tap
)
770 scan_size
= fields
[j
].num_bits
;
771 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
772 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
773 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= fields
[j
].in_value
;
774 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= fields
[j
].in_check_value
;
775 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= fields
[j
].in_check_mask
;
776 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= fields
[j
].in_handler
;
777 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= fields
[j
].in_handler_priv
;
782 #ifdef _DEBUG_JTAG_IO_
783 /* if a device isn't listed, the BYPASS register should be selected */
786 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
790 /* program the scan field to 1 bit length, and ignore it's value */
791 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
792 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
793 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
794 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
795 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
796 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
797 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
801 #ifdef _DEBUG_JTAG_IO_
802 /* if a device is listed, the BYPASS register must not be selected */
805 LOG_ERROR("BUG: scan data for a device in BYPASS");
814 void MINIDRIVER(interface_jtag_add_dr_out
)(jtag_tap_t
*target_tap
,
818 tap_state_t end_state
)
823 int bypass_devices
= 0;
825 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
828 /* count devices in bypass */
832 tap
= jtag_NextEnabledTap(tap
);
841 /* allocate memory for a new list member */
842 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
843 last_comand_pointer
= &((*last_cmd
)->next
);
844 (*last_cmd
)->next
= NULL
;
845 (*last_cmd
)->type
= JTAG_SCAN
;
847 /* allocate memory for dr scan command */
848 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
849 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
850 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
851 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
852 (*last_cmd
)->cmd
.scan
->end_state
= end_state
;
857 tap
= jtag_NextEnabledTap(tap
);
862 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
864 if (tap
== target_tap
)
867 #ifdef _DEBUG_JTAG_IO_
868 /* if a device is listed, the BYPASS register must not be selected */
871 LOG_ERROR("BUG: scan data for a device in BYPASS");
875 for (j
= 0; j
< num_fields
; j
++)
878 scan_size
= num_bits
[j
];
879 buf_set_u32(out_value
, 0, scan_size
, value
[j
]);
880 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
881 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
882 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
883 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
884 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
885 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
886 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
890 #ifdef _DEBUG_JTAG_IO_
891 /* if a device isn't listed, the BYPASS register should be selected */
894 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
898 /* program the scan field to 1 bit length, and ignore it's value */
899 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
900 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
901 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
902 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
903 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
904 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
905 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
910 void jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
916 retval
=interface_jtag_add_plain_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
917 if (retval
!=ERROR_OK
)
921 int MINIDRIVER(interface_jtag_add_plain_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
924 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
926 /* allocate memory for a new list member */
927 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
928 last_comand_pointer
= &((*last_cmd
)->next
);
929 (*last_cmd
)->next
= NULL
;
930 (*last_cmd
)->type
= JTAG_SCAN
;
932 /* allocate memory for scan command */
933 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
934 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
935 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
936 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
937 (*last_cmd
)->cmd
.scan
->end_state
= state
;
939 for (i
= 0; i
< num_fields
; i
++)
941 int num_bits
= fields
[i
].num_bits
;
942 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
943 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
944 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
945 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
946 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
947 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
948 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
949 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[i
].in_handler
;
950 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[i
].in_handler_priv
;
956 void jtag_add_tlr(void)
958 jtag_prelude(TAP_RESET
);
961 retval
=interface_jtag_add_tlr();
962 if (retval
!=ERROR_OK
)
966 int MINIDRIVER(interface_jtag_add_tlr
)(void)
968 tap_state_t state
= TAP_RESET
;
969 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
971 /* allocate memory for a new list member */
972 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
973 last_comand_pointer
= &((*last_cmd
)->next
);
974 (*last_cmd
)->next
= NULL
;
975 (*last_cmd
)->type
= JTAG_STATEMOVE
;
977 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
978 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
983 void jtag_add_pathmove(int num_states
, tap_state_t
*path
)
985 tap_state_t cur_state
= cmd_queue_cur_state
;
989 /* the last state has to be a stable state */
990 if (!tap_is_state_stable(path
[num_states
- 1]))
992 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
996 for (i
=0; i
<num_states
; i
++)
998 if (path
[i
] == TAP_RESET
)
1000 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
1004 if ( tap_state_transition(cur_state
, true) != path
[i
]
1005 && tap_state_transition(cur_state
, false) != path
[i
])
1007 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
1010 cur_state
= path
[i
];
1015 retval
= interface_jtag_add_pathmove(num_states
, path
);
1016 cmd_queue_cur_state
= path
[num_states
- 1];
1017 if (retval
!=ERROR_OK
)
1021 int MINIDRIVER(interface_jtag_add_pathmove
)(int num_states
, tap_state_t
*path
)
1023 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1026 /* allocate memory for a new list member */
1027 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1028 last_comand_pointer
= &((*last_cmd
)->next
);
1029 (*last_cmd
)->next
= NULL
;
1030 (*last_cmd
)->type
= JTAG_PATHMOVE
;
1032 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
1033 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
1034 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(tap_state_t
) * num_states
);
1036 for (i
= 0; i
< num_states
; i
++)
1037 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
1042 int MINIDRIVER(interface_jtag_add_runtest
)(int num_cycles
, tap_state_t state
)
1044 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1046 /* allocate memory for a new list member */
1047 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1048 (*last_cmd
)->next
= NULL
;
1049 last_comand_pointer
= &((*last_cmd
)->next
);
1050 (*last_cmd
)->type
= JTAG_RUNTEST
;
1052 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
1053 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
1054 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
1059 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
1063 jtag_prelude(state
);
1065 /* executed by sw or hw fifo */
1066 retval
=interface_jtag_add_runtest(num_cycles
, cmd_queue_end_state
);
1067 if (retval
!=ERROR_OK
)
1072 int MINIDRIVER(interface_jtag_add_clocks
)( int num_cycles
)
1074 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1076 /* allocate memory for a new list member */
1077 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1078 (*last_cmd
)->next
= NULL
;
1079 last_comand_pointer
= &((*last_cmd
)->next
);
1080 (*last_cmd
)->type
= JTAG_STABLECLOCKS
;
1082 (*last_cmd
)->cmd
.stableclocks
= cmd_queue_alloc(sizeof(stableclocks_command_t
));
1083 (*last_cmd
)->cmd
.stableclocks
->num_cycles
= num_cycles
;
1087 void jtag_add_clocks( int num_cycles
)
1091 if( !tap_is_state_stable(cmd_queue_cur_state
) )
1093 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
1094 tap_state_name(cmd_queue_cur_state
) );
1095 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
1099 if( num_cycles
> 0 )
1103 retval
= interface_jtag_add_clocks(num_cycles
);
1104 if (retval
!= ERROR_OK
)
1109 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
1111 int trst_with_tlr
= 0;
1114 /* FIX!!! there are *many* different cases here. A better
1115 * approach is needed for legal combinations of transitions...
1117 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
1118 (jtag_reset_config
& RESET_HAS_TRST
)&&
1119 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
1121 if (((req_tlr_or_trst
&&!jtag_trst
)||
1122 (!req_tlr_or_trst
&&jtag_trst
))&&
1123 ((req_srst
&&!jtag_srst
)||
1124 (!req_srst
&&jtag_srst
)))
1126 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
1127 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
1131 /* Make sure that jtag_reset_config allows the requested reset */
1132 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
1133 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
1135 LOG_ERROR("BUG: requested reset would assert trst");
1136 jtag_error
=ERROR_FAIL
;
1140 /* if TRST pulls SRST, we reset with TAP T-L-R */
1141 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
1146 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
1148 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
1149 jtag_error
=ERROR_FAIL
;
1153 if (req_tlr_or_trst
)
1155 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
1167 jtag_srst
= req_srst
;
1169 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
1170 if (retval
!=ERROR_OK
)
1178 LOG_DEBUG("SRST line asserted");
1182 LOG_DEBUG("SRST line released");
1183 if (jtag_nsrst_delay
)
1184 jtag_add_sleep(jtag_nsrst_delay
* 1000);
1189 LOG_DEBUG("JTAG reset with RESET instead of TRST");
1190 jtag_add_end_state(TAP_RESET
);
1192 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1198 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
1199 * and inform possible listeners about this
1201 LOG_DEBUG("TRST line asserted");
1202 cmd_queue_cur_state
= TAP_RESET
;
1203 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1207 if (jtag_ntrst_delay
)
1208 jtag_add_sleep(jtag_ntrst_delay
* 1000);
1212 int MINIDRIVER(interface_jtag_add_reset
)(int req_trst
, int req_srst
)
1214 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1216 /* allocate memory for a new list member */
1217 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1218 (*last_cmd
)->next
= NULL
;
1219 last_comand_pointer
= &((*last_cmd
)->next
);
1220 (*last_cmd
)->type
= JTAG_RESET
;
1222 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
1223 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
1224 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
1229 void jtag_add_end_state(tap_state_t state
)
1231 cmd_queue_end_state
= state
;
1232 if ((cmd_queue_end_state
== TAP_DRSHIFT
)||(cmd_queue_end_state
== TAP_IRSHIFT
))
1234 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
1238 int MINIDRIVER(interface_jtag_add_sleep
)(u32 us
)
1240 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1242 /* allocate memory for a new list member */
1243 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1244 (*last_cmd
)->next
= NULL
;
1245 last_comand_pointer
= &((*last_cmd
)->next
);
1246 (*last_cmd
)->type
= JTAG_SLEEP
;
1248 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
1249 (*last_cmd
)->cmd
.sleep
->us
= us
;
1254 void jtag_add_sleep(u32 us
)
1256 keep_alive(); /* we might be running on a very slow JTAG clk */
1257 int retval
=interface_jtag_add_sleep(us
);
1258 if (retval
!=ERROR_OK
)
1263 int jtag_scan_size(scan_command_t
*cmd
)
1268 /* count bits in scan command */
1269 for (i
= 0; i
< cmd
->num_fields
; i
++)
1271 bit_count
+= cmd
->fields
[i
].num_bits
;
1277 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
1282 bit_count
= jtag_scan_size(cmd
);
1283 *buffer
= malloc(CEIL(bit_count
, 8));
1287 #ifdef _DEBUG_JTAG_IO_
1288 LOG_DEBUG("%s num_fields: %i", cmd
->ir_scan
? "IRSCAN" : "DRSCAN", cmd
->num_fields
);
1291 for (i
= 0; i
< cmd
->num_fields
; i
++)
1293 if (cmd
->fields
[i
].out_value
)
1295 #ifdef _DEBUG_JTAG_IO_
1296 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);
1298 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
1299 #ifdef _DEBUG_JTAG_IO_
1300 LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i
, cmd
->fields
[i
].num_bits
, char_buf
);
1306 #ifdef _DEBUG_JTAG_IO_
1307 LOG_DEBUG("fields[%i].out_value[%i]: NULL", i
, cmd
->fields
[i
].num_bits
);
1311 bit_count
+= cmd
->fields
[i
].num_bits
;
1314 #ifdef _DEBUG_JTAG_IO_
1315 //LOG_DEBUG("bit_count totalling: %i", bit_count );
1321 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1327 /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1330 for (i
= 0; i
< cmd
->num_fields
; i
++)
1332 /* if neither in_value nor in_handler
1333 * are specified we don't have to examine this field
1335 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1337 int num_bits
= cmd
->fields
[i
].num_bits
;
1338 u8
*captured
= buf_set_buf(buffer
, bit_count
, malloc(CEIL(num_bits
, 8)), 0, num_bits
);
1340 #ifdef _DEBUG_JTAG_IO_
1341 char *char_buf
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1342 LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i
, num_bits
, char_buf
);
1346 if (cmd
->fields
[i
].in_value
)
1348 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1350 if (cmd
->fields
[i
].in_handler
)
1352 if (cmd
->fields
[i
].in_handler(cmd
->fields
[i
].in_value
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1354 LOG_WARNING("in_handler: with \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1355 retval
= ERROR_JTAG_QUEUE_FAILED
;
1360 /* no in_value specified, but a handler takes care of the scanned data */
1361 if (cmd
->fields
[i
].in_handler
&& (!cmd
->fields
[i
].in_value
))
1363 if (cmd
->fields
[i
].in_handler(captured
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1365 /* We're going to call the error:handler later, but if the in_handler
1366 * reported an error we report this failure upstream
1368 LOG_WARNING("in_handler: w/o \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1369 retval
= ERROR_JTAG_QUEUE_FAILED
;
1375 bit_count
+= cmd
->fields
[i
].num_bits
;
1381 static const char *jtag_tap_name(jtag_tap_t
*tap
)
1383 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
1386 int jtag_check_value_inner(u8
*captured
, scan_field_t
*field
, u8
*in_check_value
, u8
*in_check_mask
)
1388 int retval
= ERROR_OK
;
1389 int num_bits
= field
->num_bits
;
1391 int compare_failed
= 0;
1393 if (field
->in_check_mask
)
1394 compare_failed
= buf_cmp_mask(captured
, in_check_value
, in_check_mask
, num_bits
);
1396 compare_failed
= buf_cmp(captured
, in_check_value
, num_bits
);
1398 if (compare_failed
){
1399 /* An error handler could have caught the failing check
1400 * only report a problem when there wasn't a handler, or if the handler
1401 * acknowledged the error
1403 LOG_WARNING("TAP %s:",
1404 jtag_tap_name(field
->tap
));
1407 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1408 char *in_check_value_char
= buf_to_str(in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1412 char *in_check_mask_char
;
1413 in_check_mask_char
= buf_to_str(in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1414 LOG_WARNING("value captured during scan didn't pass the requested check:");
1415 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
1416 captured_char
, in_check_value_char
, in_check_mask_char
);
1417 free(in_check_mask_char
);
1421 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
);
1424 free(captured_char
);
1425 free(in_check_value_char
);
1427 retval
= ERROR_JTAG_QUEUE_FAILED
;
1434 int jtag_check_value(u8
*captured
, void *priv
, scan_field_t
*field
)
1436 return jtag_check_value_inner(captured
, field
, field
->in_check_value
, field
->in_check_mask
);
1440 set up checking of this field using the in_handler. The values passed in must be valid until
1441 after jtag_execute() has completed.
1443 void jtag_set_check_value(scan_field_t
*field
, u8
*value
, u8
*mask
, struct invalidstruct
*obsolete
)
1446 field
->in_handler
= jtag_check_value
;
1448 field
->in_handler
= NULL
; /* No check, e.g. embeddedice uses value==NULL to indicate no check */
1449 field
->in_handler_priv
= NULL
;
1450 field
->in_check_value
= value
;
1451 field
->in_check_mask
= mask
;
1454 void jtag_check_value_mask(scan_field_t
*field
, u8
*value
, u8
*mask
)
1456 if (field
->in_value
==NULL
)
1458 LOG_ERROR("remember to fill in in_value for jtag_check_value_mask() to work!");
1464 /* no checking to do */
1468 jtag_execute_queue_noclear();
1470 int retval
=jtag_check_value_inner(field
->in_value
, field
, value
, mask
);
1471 jtag_set_error(retval
);
1477 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1482 for (i
= 0; i
< cmd
->num_fields
; i
++)
1484 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1486 if (cmd
->fields
[i
].out_value
)
1493 int MINIDRIVER(interface_jtag_execute_queue
)(void)
1499 LOG_ERROR("No JTAG interface configured yet. Issue 'init' command in startup scripts before communicating with targets.");
1503 retval
= jtag
->execute_queue();
1507 jtag_command_queue
= NULL
;
1508 last_comand_pointer
= &jtag_command_queue
;
1513 void jtag_execute_queue_noclear(void)
1515 int retval
=interface_jtag_execute_queue();
1516 /* we keep the first error */
1517 if ((jtag_error
==ERROR_OK
)&&(retval
!=ERROR_OK
))
1523 int jtag_execute_queue(void)
1526 jtag_execute_queue_noclear();
1528 jtag_error
=ERROR_OK
;
1532 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1534 jtag_tap_t
*tap
= priv
;
1538 if (event
== JTAG_TRST_ASSERTED
)
1540 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
1547 void jtag_sleep(u32 us
)
1549 alive_sleep(us
/1000);
1552 /* Try to examine chain layout according to IEEE 1149.1 §12
1554 int jtag_examine_chain(void)
1558 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1561 int device_count
= 0;
1562 u8 zero_check
= 0x0;
1563 u8 one_check
= 0xff;
1566 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1567 field
.out_value
= idcode_buffer
;
1569 field
.in_value
= idcode_buffer
;
1572 field
.in_handler
= NULL
;
1574 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1576 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
1579 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
1580 jtag_execute_queue();
1582 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1584 zero_check
|= idcode_buffer
[i
];
1585 one_check
&= idcode_buffer
[i
];
1588 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1589 if ((zero_check
== 0x00) || (one_check
== 0xff))
1591 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1592 return ERROR_JTAG_INIT_FAILED
;
1595 /* point at the 1st tap */
1596 tap
= jtag_NextEnabledTap(NULL
);
1598 LOG_ERROR("JTAG: No taps enabled?");
1599 return ERROR_JTAG_INIT_FAILED
;
1602 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1604 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1605 if ((idcode
& 1) == 0)
1607 /* LSB must not be 0, this indicates a device in bypass */
1608 LOG_WARNING("Tap/Device does not have IDCODE");
1619 /* some devices, such as AVR will output all 1's instead of TDI
1620 input value at end of chain. */
1621 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
1624 /* End of chain (invalid manufacturer ID)
1626 * The JTAG examine is the very first thing that happens
1628 * A single JTAG device requires only 64 bits to be read back correctly.
1630 * The code below adds a check that the rest of the data scanned (640 bits)
1631 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1633 * earlier and gives more helpful/explicit error messages.
1635 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1637 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1638 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1640 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1648 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1649 manufacturer
= EXTRACT_MFG(idcode
);
1650 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1651 part
= EXTRACT_PART(idcode
);
1652 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1653 version
= EXTRACT_VER(idcode
);
1655 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1656 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1657 idcode
, manufacturer
, part
, version
);
1663 tap
->idcode
= idcode
;
1665 if (tap
->expected_ids_cnt
> 0) {
1666 /* Loop over the expected identification codes and test for a match */
1668 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1669 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1674 /* If none of the expected ids matched, log an error */
1675 if (ii
== tap
->expected_ids_cnt
) {
1676 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1679 EXTRACT_MFG( tap
->idcode
),
1680 EXTRACT_PART( tap
->idcode
),
1681 EXTRACT_VER( tap
->idcode
) );
1682 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1683 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1686 tap
->expected_ids_cnt
,
1687 tap
->expected_ids
[ii
],
1688 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1689 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1690 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1693 return ERROR_JTAG_INIT_FAILED
;
1695 LOG_INFO("JTAG Tap/device matched");
1699 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1703 tap
= jtag_NextEnabledTap(tap
);
1708 /* see if number of discovered devices matches configuration */
1709 if (device_count
!= jtag_NumEnabledTaps())
1711 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1712 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1713 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1714 return ERROR_JTAG_INIT_FAILED
;
1720 int jtag_validate_chain(void)
1723 int total_ir_length
= 0;
1729 total_ir_length
= 0;
1731 tap
= jtag_NextEnabledTap(tap
);
1735 total_ir_length
+= tap
->ir_length
;
1738 total_ir_length
+= 2;
1739 ir_test
= malloc(CEIL(total_ir_length
, 8));
1740 buf_set_ones(ir_test
, total_ir_length
);
1743 field
.num_bits
= total_ir_length
;
1744 field
.out_value
= ir_test
;
1745 field
.in_value
= ir_test
;
1746 field
.in_handler
= NULL
;
1748 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1749 jtag_execute_queue();
1755 tap
= jtag_NextEnabledTap(tap
);
1760 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1763 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1764 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
);
1767 return ERROR_JTAG_INIT_FAILED
;
1769 chain_pos
+= tap
->ir_length
;
1772 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1775 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1776 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
);
1779 return ERROR_JTAG_INIT_FAILED
;
1787 enum jtag_tap_cfg_param
{
1791 static Jim_Nvp nvp_config_opts
[] = {
1792 { .name
= "-event", .value
= JCFG_EVENT
},
1794 { .name
= NULL
, .value
= -1 }
1797 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1803 /* parse config or cget options */
1804 while (goi
->argc
> 0) {
1805 Jim_SetEmptyResult (goi
->interp
);
1807 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1809 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1815 if (goi
->argc
== 0) {
1816 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1820 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1822 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1826 if (goi
->isconfigure
) {
1827 if (goi
->argc
!= 1) {
1828 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1832 if (goi
->argc
!= 0) {
1833 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1839 jtag_tap_event_action_t
*jteap
;
1841 jteap
= tap
->event_action
;
1842 /* replace existing? */
1844 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1847 jteap
= jteap
->next
;
1850 if (goi
->isconfigure
) {
1851 if (jteap
== NULL
) {
1853 jteap
= calloc(1, sizeof (*jteap
));
1855 jteap
->event
= n
->value
;
1856 Jim_GetOpt_Obj( goi
, &o
);
1858 Jim_DecrRefCount(interp
, jteap
->body
);
1860 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1861 Jim_IncrRefCount(jteap
->body
);
1863 /* add to head of event list */
1864 jteap
->next
= tap
->event_action
;
1865 tap
->event_action
= jteap
;
1866 Jim_SetEmptyResult(goi
->interp
);
1869 if (jteap
== NULL
) {
1870 Jim_SetEmptyResult(goi
->interp
);
1872 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1879 } /* while (goi->argc) */
1884 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1894 const Jim_Nvp opts
[] = {
1895 #define NTAP_OPT_IRLEN 0
1896 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1897 #define NTAP_OPT_IRMASK 1
1898 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1899 #define NTAP_OPT_IRCAPTURE 2
1900 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1901 #define NTAP_OPT_ENABLED 3
1902 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1903 #define NTAP_OPT_DISABLED 4
1904 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1905 #define NTAP_OPT_EXPECTED_ID 5
1906 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1907 { .name
= NULL
, .value
= -1 },
1910 pTap
= malloc( sizeof(jtag_tap_t
) );
1911 memset( pTap
, 0, sizeof(*pTap
) );
1913 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1917 * we expect CHIP + TAP + OPTIONS
1919 if( goi
->argc
< 3 ){
1920 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1923 Jim_GetOpt_String( goi
, &cp
, NULL
);
1924 pTap
->chip
= strdup(cp
);
1926 Jim_GetOpt_String( goi
, &cp
, NULL
);
1927 pTap
->tapname
= strdup(cp
);
1929 /* name + dot + name + null */
1930 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1932 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1933 pTap
->dotted_name
= cp
;
1935 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1936 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1938 /* default is enabled */
1941 /* deal with options */
1942 #define NTREQ_IRLEN 1
1943 #define NTREQ_IRCAPTURE 2
1944 #define NTREQ_IRMASK 4
1946 /* clear them as we find them */
1947 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1950 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1952 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1955 LOG_DEBUG("Processing option: %s", n
->name
);
1957 case NTAP_OPT_ENABLED
:
1960 case NTAP_OPT_DISABLED
:
1963 case NTAP_OPT_EXPECTED_ID
:
1965 u32
*new_expected_ids
;
1967 e
= Jim_GetOpt_Wide( goi
, &w
);
1969 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1973 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1974 if (new_expected_ids
== NULL
) {
1975 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1979 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1981 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1983 free(pTap
->expected_ids
);
1984 pTap
->expected_ids
= new_expected_ids
;
1985 pTap
->expected_ids_cnt
++;
1988 case NTAP_OPT_IRLEN
:
1989 case NTAP_OPT_IRMASK
:
1990 case NTAP_OPT_IRCAPTURE
:
1991 e
= Jim_GetOpt_Wide( goi
, &w
);
1993 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1996 if( (w
< 0) || (w
> 0xffff) ){
1998 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1999 n
->name
, (int)(w
), (int)(w
));
2003 case NTAP_OPT_IRLEN
:
2004 pTap
->ir_length
= w
;
2005 reqbits
&= (~(NTREQ_IRLEN
));
2007 case NTAP_OPT_IRMASK
:
2008 pTap
->ir_capture_mask
= w
;
2009 reqbits
&= (~(NTREQ_IRMASK
));
2011 case NTAP_OPT_IRCAPTURE
:
2012 pTap
->ir_capture_value
= w
;
2013 reqbits
&= (~(NTREQ_IRCAPTURE
));
2016 } /* switch(n->value) */
2017 } /* while( goi->argc ) */
2019 /* Did we get all the options? */
2022 Jim_SetResult_sprintf( goi
->interp
,
2023 "newtap: %s missing required parameters",
2025 /* TODO: Tell user what is missing :-( */
2026 /* no memory leaks pelase */
2027 free(((void *)(pTap
->expected_ids
)));
2028 free(((void *)(pTap
->chip
)));
2029 free(((void *)(pTap
->tapname
)));
2030 free(((void *)(pTap
->dotted_name
)));
2031 free(((void *)(pTap
)));
2035 pTap
->expected
= malloc( pTap
->ir_length
);
2036 pTap
->expected_mask
= malloc( pTap
->ir_length
);
2037 pTap
->cur_instr
= malloc( pTap
->ir_length
);
2039 buf_set_u32( pTap
->expected
,
2042 pTap
->ir_capture_value
);
2043 buf_set_u32( pTap
->expected_mask
,
2046 pTap
->ir_capture_mask
);
2047 buf_set_ones( pTap
->cur_instr
,
2052 jtag_register_event_callback(jtag_reset_callback
, pTap
);
2054 ppTap
= &(jtag_all_taps
);
2055 while( (*ppTap
) != NULL
){
2056 ppTap
= &((*ppTap
)->next_tap
);
2060 static int n_taps
= 0;
2061 pTap
->abs_chain_position
= n_taps
++;
2063 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
2064 (*ppTap
)->dotted_name
,
2065 (*ppTap
)->abs_chain_position
,
2066 (*ppTap
)->ir_length
,
2067 (*ppTap
)->ir_capture_value
,
2068 (*ppTap
)->ir_capture_mask
);
2073 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2079 struct command_context_s
*context
;
2083 JTAG_CMD_INIT_RESET
,
2086 JTAG_CMD_TAPDISABLE
,
2087 JTAG_CMD_TAPISENABLED
,
2092 const Jim_Nvp jtag_cmds
[] = {
2093 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
2094 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
2095 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
2096 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
2097 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
2098 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
2099 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
2100 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
2102 { .name
= NULL
, .value
= -1 },
2105 context
= Jim_GetAssocData(interp
, "context");
2106 /* go past the command */
2107 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
2109 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
2111 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
2114 Jim_SetEmptyResult( goi
.interp
);
2116 case JTAG_CMD_INTERFACE
:
2117 /* return the name of the interface */
2118 /* TCL code might need to know the exact type... */
2119 /* FUTURE: we allow this as a means to "set" the interface. */
2120 if( goi
.argc
!= 0 ){
2121 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2124 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
2126 case JTAG_CMD_INIT_RESET
:
2127 if( goi
.argc
!= 0 ){
2128 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2131 e
= jtag_init_reset(context
);
2132 if( e
!= ERROR_OK
){
2133 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
2137 case JTAG_CMD_NEWTAP
:
2138 return jim_newtap_cmd( &goi
);
2140 case JTAG_CMD_TAPISENABLED
:
2141 case JTAG_CMD_TAPENABLE
:
2142 case JTAG_CMD_TAPDISABLE
:
2143 if( goi
.argc
!= 1 ){
2144 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
2150 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
2155 case JTAG_CMD_TAPISENABLED
:
2158 case JTAG_CMD_TAPENABLE
:
2159 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
2163 case JTAG_CMD_TAPDISABLE
:
2164 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
2169 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
2176 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
2183 Jim_GetOpt_Obj(&goi
, &o
);
2184 t
= jtag_TapByJimObj( goi
.interp
, o
);
2189 goi
.isconfigure
= 0;
2190 return jtag_tap_configure_cmd( &goi
, t
);
2194 case JTAG_CMD_CONFIGURE
:
2196 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
2203 Jim_GetOpt_Obj(&goi
, &o
);
2204 t
= jtag_TapByJimObj( goi
.interp
, o
);
2209 goi
.isconfigure
= 1;
2210 return jtag_tap_configure_cmd( &goi
, t
);
2217 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
2219 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
2221 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
2222 COMMAND_CONFIG
, "try to configure interface");
2223 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
2224 COMMAND_ANY
, "set jtag speed (if supported)");
2225 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
2226 COMMAND_ANY
, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
2227 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
2228 COMMAND_CONFIG
, "jtag_device <ir_length> <ir_expected> <ir_mask>");
2229 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
2231 "[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]");
2232 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
2233 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
2234 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
2235 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
2237 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
2238 COMMAND_EXEC
, "print current scan chain configuration");
2240 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
2241 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
2242 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
2243 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
2244 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
2245 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
2246 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
2247 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
2248 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
2250 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
2251 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
2255 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
2260 if (!jtag_interface
)
2262 /* nothing was previously specified by "interface" command */
2263 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
2264 return ERROR_JTAG_INVALID_INTERFACE
;
2268 jtag_interface
->khz(speed_khz
, &jtag_speed
);
2272 if (jtag_interface
->init() != ERROR_OK
)
2273 return ERROR_JTAG_INIT_FAILED
;
2275 jtag
= jtag_interface
;
2279 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
2284 LOG_DEBUG("Init JTAG chain");
2286 tap
= jtag_NextEnabledTap(NULL
);
2288 LOG_ERROR("There are no enabled taps?");
2289 return ERROR_JTAG_INIT_FAILED
;
2293 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
2296 /* examine chain first, as this could discover the real chain layout */
2297 if (jtag_examine_chain() != ERROR_OK
)
2299 LOG_ERROR("trying to validate configured JTAG chain anyway...");
2302 if (jtag_validate_chain() != ERROR_OK
)
2304 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
2310 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
2314 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2317 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
2319 /* Reset can happen after a power cycle.
2321 * Ideally we would only assert TRST or run RESET before the target reset.
2323 * However w/srst_pulls_trst, trst is asserted together with the target
2324 * reset whether we want it or not.
2326 * NB! Some targets have JTAG circuitry disabled until a
2327 * trst & srst has been asserted.
2329 * NB! here we assume nsrst/ntrst delay are sufficient!
2331 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
2334 jtag_add_reset(1, 0); /* RESET or TRST */
2335 if (jtag_reset_config
& RESET_HAS_SRST
)
2337 jtag_add_reset(1, 1);
2338 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
2339 jtag_add_reset(0, 1);
2341 jtag_add_reset(0, 0);
2342 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2345 /* Check that we can communication on the JTAG chain + eventually we want to
2346 * be able to perform enumeration only after OpenOCD has started
2347 * telnet and GDB server
2349 * That would allow users to more easily perform any magic they need to before
2352 return jtag_init_inner(cmd_ctx
);
2355 int jtag_init(struct command_context_s
*cmd_ctx
)
2358 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2360 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
2364 return jtag_init_reset(cmd_ctx
);
2367 static int default_khz(int khz
, int *jtag_speed
)
2369 LOG_ERROR("Translation from khz to jtag_speed not implemented");
2373 static int default_speed_div(int speed
, int *khz
)
2375 LOG_ERROR("Translation from jtag_speed to khz not implemented");
2379 static int default_power_dropout(int *dropout
)
2381 *dropout
=0; /* by default we can't detect power dropout */
2385 static int default_srst_asserted(int *srst_asserted
)
2387 *srst_asserted
=0; /* by default we can't detect srst asserted */
2391 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2396 /* check whether the interface is already configured */
2399 LOG_WARNING("Interface already configured, ignoring");
2403 /* interface name is a mandatory argument */
2404 if (argc
< 1 || args
[0][0] == '\0')
2406 return ERROR_COMMAND_SYNTAX_ERROR
;
2409 for (i
=0; jtag_interfaces
[i
]; i
++)
2411 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
2413 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
2418 jtag_interface
= jtag_interfaces
[i
];
2420 if (jtag_interface
->khz
== NULL
)
2422 jtag_interface
->khz
= default_khz
;
2424 if (jtag_interface
->speed_div
== NULL
)
2426 jtag_interface
->speed_div
= default_speed_div
;
2428 if (jtag_interface
->power_dropout
== NULL
)
2430 jtag_interface
->power_dropout
= default_power_dropout
;
2432 if (jtag_interface
->srst_asserted
== NULL
)
2434 jtag_interface
->srst_asserted
= default_srst_asserted
;
2441 /* no valid interface was found (i.e. the configuration option,
2442 * didn't match one of the compiled-in interfaces
2444 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
2445 LOG_ERROR("compiled-in jtag interfaces:");
2446 for (i
= 0; jtag_interfaces
[i
]; i
++)
2448 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
2451 return ERROR_JTAG_INVALID_INTERFACE
;
2454 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2458 Jim_Obj
*newargs
[ 10 ];
2461 * argv[-1] = command
2462 * argv[ 0] = ir length
2463 * argv[ 1] = ir capture
2464 * argv[ 2] = ir mask
2465 * argv[ 3] = not actually used by anything but in the docs
2469 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
2472 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
2473 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
2477 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
2478 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
2479 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
2480 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
2482 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
2483 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
2484 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
2485 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
2486 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
2487 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
2488 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
2489 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
2490 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
2491 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
2492 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
2493 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
2495 command_print( cmd_ctx
, "NEW COMMAND:");
2496 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
2497 Jim_GetString( newargs
[0], NULL
),
2498 Jim_GetString( newargs
[1], NULL
),
2499 Jim_GetString( newargs
[2], NULL
),
2500 Jim_GetString( newargs
[3], NULL
),
2501 Jim_GetString( newargs
[4], NULL
),
2502 Jim_GetString( newargs
[5], NULL
),
2503 Jim_GetString( newargs
[6], NULL
),
2504 Jim_GetString( newargs
[7], NULL
),
2505 Jim_GetString( newargs
[8], NULL
),
2506 Jim_GetString( newargs
[9], NULL
) );
2508 e
= jim_jtag_command( interp
, 10, newargs
);
2510 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
2515 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2519 tap
= jtag_all_taps
;
2520 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
2521 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
2524 u32 expected
, expected_mask
, cur_instr
, ii
;
2525 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
2526 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
2527 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
2529 command_print(cmd_ctx
,
2530 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
2531 tap
->abs_chain_position
,
2533 tap
->enabled
? 'Y' : 'n',
2535 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
2541 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
2542 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
2543 tap
->expected_ids
[ii
]);
2546 tap
= tap
->next_tap
;
2552 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2555 return ERROR_COMMAND_SYNTAX_ERROR
;
2559 if (strcmp(args
[0], "none") == 0)
2560 jtag_reset_config
= RESET_NONE
;
2561 else if (strcmp(args
[0], "trst_only") == 0)
2562 jtag_reset_config
= RESET_HAS_TRST
;
2563 else if (strcmp(args
[0], "srst_only") == 0)
2564 jtag_reset_config
= RESET_HAS_SRST
;
2565 else if (strcmp(args
[0], "trst_and_srst") == 0)
2566 jtag_reset_config
= RESET_TRST_AND_SRST
;
2569 LOG_ERROR("(1) invalid reset_config argument (%s), defaulting to none", args
[0]);
2570 jtag_reset_config
= RESET_NONE
;
2571 return ERROR_INVALID_ARGUMENTS
;
2577 if (strcmp(args
[1], "separate") == 0)
2579 /* seperate reset lines - default */
2582 if (strcmp(args
[1], "srst_pulls_trst") == 0)
2583 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
2584 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
2585 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
2586 else if (strcmp(args
[1], "combined") == 0)
2587 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
2590 LOG_ERROR("(2) invalid reset_config argument (%s), defaulting to none", args
[1]);
2591 jtag_reset_config
= RESET_NONE
;
2592 return ERROR_INVALID_ARGUMENTS
;
2599 if (strcmp(args
[2], "trst_open_drain") == 0)
2600 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
2601 else if (strcmp(args
[2], "trst_push_pull") == 0)
2602 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
2605 LOG_ERROR("(3) invalid reset_config argument (%s) defaulting to none", args
[2] );
2606 jtag_reset_config
= RESET_NONE
;
2607 return ERROR_INVALID_ARGUMENTS
;
2613 if (strcmp(args
[3], "srst_push_pull") == 0)
2614 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
2615 else if (strcmp(args
[3], "srst_open_drain") == 0)
2616 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
2619 LOG_ERROR("(4) invalid reset_config argument (%s), defaulting to none", args
[3]);
2620 jtag_reset_config
= RESET_NONE
;
2621 return ERROR_INVALID_ARGUMENTS
;
2628 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2632 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2637 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2643 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2647 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2652 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2658 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2660 int retval
=ERROR_OK
;
2664 LOG_DEBUG("handle jtag speed");
2667 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2669 /* this command can be called during CONFIG,
2670 * in which case jtag isn't initialized */
2673 retval
=jtag
->speed(cur_speed
);
2675 } else if (argc
== 0)
2679 return ERROR_COMMAND_SYNTAX_ERROR
;
2681 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2686 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2688 int retval
=ERROR_OK
;
2689 LOG_DEBUG("handle jtag khz");
2693 speed_khz
= strtoul(args
[0], NULL
, 0);
2697 LOG_DEBUG("have interface set up");
2699 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2705 cur_speed
= jtag_speed
= speed_div1
;
2707 retval
=jtag
->speed(cur_speed
);
2716 return ERROR_COMMAND_SYNTAX_ERROR
;
2721 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2727 command_print(cmd_ctx
, "RCLK - adaptive");
2730 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2736 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2742 return ERROR_COMMAND_SYNTAX_ERROR
;
2746 state
= tap_state_by_name( args
[0] );
2748 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2749 return ERROR_COMMAND_SYNTAX_ERROR
;
2751 jtag_add_end_state(state
);
2752 jtag_execute_queue();
2754 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2759 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2766 return ERROR_COMMAND_SYNTAX_ERROR
;
2769 if (args
[0][0] == '1')
2771 else if (args
[0][0] == '0')
2775 return ERROR_COMMAND_SYNTAX_ERROR
;
2778 if (args
[1][0] == '1')
2780 else if (args
[1][0] == '0')
2784 return ERROR_COMMAND_SYNTAX_ERROR
;
2787 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2788 return ERROR_JTAG_INIT_FAILED
;
2790 jtag_add_reset(trst
, srst
);
2791 jtag_execute_queue();
2796 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2800 return ERROR_COMMAND_SYNTAX_ERROR
;
2803 jtag_add_runtest(strtol(args
[0], NULL
, 0), TAP_INVALID
);
2804 jtag_execute_queue();
2810 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2813 scan_field_t
*fields
;
2815 tap_state_t endstate
;
2817 if ((argc
< 2) || (argc
% 2))
2819 return ERROR_COMMAND_SYNTAX_ERROR
;
2822 /* optional "-endstate" */
2824 /* at the end of the arguments. */
2826 endstate
= TAP_INVALID
;
2828 /* have at least one pair of numbers. */
2829 /* is last pair the magic text? */
2830 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2833 cpA
= args
[ argc
-1 ];
2834 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2835 cpS
= tap_state_name( endstate
);
2836 if( 0 == strcmp( cpA
, cpS
) ){
2840 if( endstate
>= TAP_NUM_STATES
){
2841 return ERROR_COMMAND_SYNTAX_ERROR
;
2843 /* found - remove the last 2 args */
2849 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
2851 for (i
= 0; i
< argc
/ 2; i
++)
2853 tap
= jtag_TapByString( args
[i
*2] );
2856 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2859 int field_size
= tap
->ir_length
;
2860 fields
[i
].tap
= tap
;
2861 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2862 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2863 fields
[i
].in_value
= NULL
;
2864 fields
[i
].in_check_mask
= NULL
;
2865 fields
[i
].in_handler
= NULL
;
2866 fields
[i
].in_handler_priv
= NULL
;
2869 jtag_add_ir_scan(argc
/ 2, fields
, TAP_INVALID
);
2870 /* did we have an endstate? */
2871 if (endstate
!= TAP_INVALID
)
2872 jtag_add_end_state(endstate
);
2874 jtag_execute_queue();
2876 for (i
= 0; i
< argc
/ 2; i
++)
2877 free(fields
[i
].out_value
);
2884 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2887 scan_field_t
*fields
;
2889 int field_count
= 0;
2892 tap_state_t endstate
;
2895 * args[2] = num_bits
2896 * args[3] = hex string
2897 * ... repeat num bits and hex string ...
2900 * args[N-2] = "-endstate"
2901 * args[N-1] = statename
2903 if ((argc
< 4) || ((argc
% 2)!=0))
2905 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2909 /* assume no endstate */
2910 endstate
= TAP_INVALID
;
2911 /* validate arguments as numbers */
2913 for (i
= 2; i
< argc
; i
+=2)
2918 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2919 /* If valid - try next arg */
2924 /* Not valid.. are we at the end? */
2925 if ( ((i
+2) != argc
) ){
2926 /* nope, then error */
2930 /* it could be: "-endstate FOO" */
2932 /* get arg as a string. */
2933 cp
= Jim_GetString( args
[i
], NULL
);
2934 /* is it the magic? */
2935 if( 0 == strcmp( "-endstate", cp
) ){
2936 /* is the statename valid? */
2937 cp
= Jim_GetString( args
[i
+1], NULL
);
2939 /* see if it is a valid state name */
2940 endstate
= tap_state_by_name(cp
);
2942 /* update the error message */
2943 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2945 /* valid - so clear the error */
2947 /* and remove the last 2 args */
2952 /* Still an error? */
2954 return e
; /* too bad */
2956 } /* validate args */
2958 tap
= jtag_TapByJimObj( interp
, args
[1] );
2963 num_fields
=(argc
-2)/2;
2964 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2965 for (i
= 2; i
< argc
; i
+=2)
2971 Jim_GetLong(interp
, args
[i
], &bits
);
2972 str
= Jim_GetString(args
[i
+1], &len
);
2974 fields
[field_count
].tap
= tap
;
2975 fields
[field_count
].num_bits
= bits
;
2976 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2977 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2978 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2979 fields
[field_count
].in_check_mask
= NULL
;
2980 fields
[field_count
].in_check_value
= NULL
;
2981 fields
[field_count
].in_handler
= NULL
;
2982 fields
[field_count
++].in_handler_priv
= NULL
;
2985 jtag_add_dr_scan(num_fields
, fields
, TAP_INVALID
);
2986 /* did we get an end state? */
2987 if (endstate
!= TAP_INVALID
)
2988 jtag_add_end_state(endstate
);
2990 retval
= jtag_execute_queue();
2991 if (retval
!= ERROR_OK
)
2993 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2998 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2999 for (i
= 2; i
< argc
; i
+=2)
3004 Jim_GetLong(interp
, args
[i
], &bits
);
3005 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
3006 free(fields
[field_count
].out_value
);
3008 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
3013 Jim_SetResult(interp
, list
);
3020 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
3024 if (strcmp(args
[0], "enable") == 0)
3026 jtag_verify_capture_ir
= 1;
3028 else if (strcmp(args
[0], "disable") == 0)
3030 jtag_verify_capture_ir
= 0;
3033 return ERROR_COMMAND_SYNTAX_ERROR
;
3035 } else if (argc
!= 0)
3037 return ERROR_COMMAND_SYNTAX_ERROR
;
3040 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
3045 int jtag_power_dropout(int *dropout
)
3047 return jtag
->power_dropout(dropout
);
3050 int jtag_srst_asserted(int *srst_asserted
)
3052 return jtag
->srst_asserted(srst_asserted
);
3055 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
3057 jtag_tap_event_action_t
* jteap
;
3060 jteap
= tap
->event_action
;
3064 if (jteap
->event
== e
) {
3066 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
3069 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
3070 Jim_GetString(jteap
->body
, NULL
) );
3071 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
3072 Jim_PrintErrorMessage(interp
);
3076 jteap
= jteap
->next
;
3080 LOG_DEBUG( "event %d %s - no action",
3082 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
3086 /*-----<Cable Helper API>---------------------------------------*/
3088 /* these Cable Helper API functions are all documented in the jtag.h header file,
3089 using a Doxygen format. And since Doxygen's configuration file "Doxyfile",
3090 is setup to prefer its docs in the header file, no documentation is here, for
3091 if it were, it would have to be doubly maintained.
3095 * @see tap_set_state() and tap_get_state() accessors.
3096 * Actual name is not important since accessors hide it.
3098 static tap_state_t state_follower
= TAP_RESET
;
3100 void tap_set_state_impl( tap_state_t new_state
)
3102 /* this is the state we think the TAPs are in now, was cur_state */
3103 state_follower
= new_state
;
3106 tap_state_t
tap_get_state()
3108 return state_follower
;
3112 * @see tap_set_end_state() and tap_get_end_state() accessors.
3113 * Actual name is not important because accessors hide it.
3115 static tap_state_t end_state_follower
= TAP_RESET
;
3117 void tap_set_end_state( tap_state_t new_end_state
)
3119 /* this is the state we think the TAPs will be in at completion of the
3120 current TAP operation, was end_state
3122 end_state_follower
= new_end_state
;
3125 tap_state_t
tap_get_end_state()
3127 return end_state_follower
;
3131 int tap_move_ndx( tap_state_t astate
)
3133 /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
3139 case TAP_RESET
: ndx
= 0; break;
3140 case TAP_DRSHIFT
: ndx
= 2; break;
3141 case TAP_DRPAUSE
: ndx
= 3; break;
3142 case TAP_IDLE
: ndx
= 1; break;
3143 case TAP_IRSHIFT
: ndx
= 4; break;
3144 case TAP_IRPAUSE
: ndx
= 5; break;
3146 LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate
) );
3154 /* tap_move[i][j]: tap movement command to go from state i to state j
3155 * 0: Test-Logic-Reset
3162 * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
3169 } tms_seqs
[6][6] = /* [from_state_ndx][to_state_ndx] */
3171 /* value clocked to TMS to move from one of six stable states to another.
3172 * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
3173 * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
3174 * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
3175 * These extra ones cause no TAP state problem, because we go into reset and stay in reset.
3179 * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
3180 * Read the bits from LSBit first to MSBit last (right-to-left).
3182 #define HEX__(n) 0x##n##LU
3185 (((x) & 0x0000000FLU)?(1<<0):0) \
3186 +(((x) & 0x000000F0LU)?(1<<1):0) \
3187 +(((x) & 0x00000F00LU)?(1<<2):0) \
3188 +(((x) & 0x0000F000LU)?(1<<3):0) \
3189 +(((x) & 0x000F0000LU)?(1<<4):0) \
3190 +(((x) & 0x00F00000LU)?(1<<5):0) \
3191 +(((x) & 0x0F000000LU)?(1<<6):0) \
3192 +(((x) & 0xF0000000LU)?(1<<7):0)
3194 #define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
3196 #if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1) || (BUILD_JLINK==1))
3197 /* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
3199 OK, I added Peter's version of the state table, and it works OK for
3200 me on MC1322x. I've recreated the jlink portion of patch with this
3201 new state table. His changes to my state table are pretty minor in
3202 terms of total transitions, but Peter feels that his version fixes
3203 some long-standing problems.
3206 I added the bit count into the table, reduced RESET column to 7 bits from 8.
3209 state specific comments:
3210 ------------------------
3211 *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to
3212 work better on ARM9 with ft2232 driver. (Dick)
3214 RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3215 needed on ARM9 with ft2232 driver. (Dick)
3217 RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3218 needed on ARM9 with ft2232 driver. (Dick)
3222 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3223 { B8(1111111,7), B8(0,1), B8(00101,5), B8(01010,5), B8(001101,6), B8(010110,6) }, /* RESET */
3224 { B8(1111111,7), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
3225 { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
3226 { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
3227 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
3228 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
3230 #else /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
3233 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3234 { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
3235 { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
3236 { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
3237 { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
3238 { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
3239 { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
3243 #if 0 /* keeping old hex stuff for awhile, for reference */
3244 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
3245 { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
3246 { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
3247 { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
3248 { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
3249 { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
3250 { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
3255 int tap_get_tms_path( tap_state_t from
, tap_state_t to
)
3257 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bits
;
3261 int tap_get_tms_path_len( tap_state_t from
, tap_state_t to
)
3263 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bit_count
;
3267 bool tap_is_state_stable(tap_state_t astate
)
3271 /* A switch() is used because it is symbol dependent
3272 (not value dependent like an array), and can also check bounds.
3291 tap_state_t
tap_state_transition(tap_state_t cur_state
, bool tms
)
3293 tap_state_t new_state
;
3295 /* A switch is used because it is symbol dependent and not value dependent
3296 like an array. Also it can check for out of range conditions.
3304 new_state
= cur_state
;
3309 new_state
= TAP_DRSELECT
;
3312 new_state
= TAP_IRSELECT
;
3316 new_state
= TAP_DREXIT1
;
3320 new_state
= TAP_DRUPDATE
;
3323 new_state
= TAP_DREXIT2
;
3326 new_state
= TAP_RESET
;
3330 new_state
= TAP_IREXIT1
;
3334 new_state
= TAP_IRUPDATE
;
3337 new_state
= TAP_IREXIT2
;
3340 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3353 new_state
= TAP_IDLE
;
3356 new_state
= TAP_DRCAPTURE
;
3361 new_state
= TAP_DRSHIFT
;
3365 new_state
= TAP_DRPAUSE
;
3368 new_state
= TAP_IRCAPTURE
;
3373 new_state
= TAP_IRSHIFT
;
3377 new_state
= TAP_IRPAUSE
;
3380 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3389 const char* tap_state_name(tap_state_t state
)
3395 case TAP_RESET
: ret
= "RESET"; break;
3396 case TAP_IDLE
: ret
= "RUN/IDLE"; break;
3397 case TAP_DRSELECT
: ret
= "DRSELECT"; break;
3398 case TAP_DRCAPTURE
: ret
= "DRCAPTURE"; break;
3399 case TAP_DRSHIFT
: ret
= "DRSHIFT"; break;
3400 case TAP_DREXIT1
: ret
= "DREXIT1"; break;
3401 case TAP_DRPAUSE
: ret
= "DRPAUSE"; break;
3402 case TAP_DREXIT2
: ret
= "DREXIT2"; break;
3403 case TAP_DRUPDATE
: ret
= "DRUPDATE"; break;
3404 case TAP_IRSELECT
: ret
= "IRSELECT"; break;
3405 case TAP_IRCAPTURE
: ret
= "IRCAPTURE"; break;
3406 case TAP_IRSHIFT
: ret
= "IRSHIFT"; break;
3407 case TAP_IREXIT1
: ret
= "IREXIT1"; break;
3408 case TAP_IRPAUSE
: ret
= "IRPAUSE"; break;
3409 case TAP_IREXIT2
: ret
= "IREXIT2"; break;
3410 case TAP_IRUPDATE
: ret
= "IRUPDATE"; break;
3411 default: ret
= "???";
3417 static tap_state_t
tap_state_by_name( const char *name
)
3421 for( x
= 0 ; x
< TAP_NUM_STATES
; x
++ ){
3422 /* be nice to the human */
3423 if( 0 == strcasecmp( name
, tap_state_name(x
) ) ){
3431 #ifdef _DEBUG_JTAG_IO_
3433 #define JTAG_DEBUG_STATE_APPEND(buf, len, bit) \
3434 do { buf[len] = bit ? '1' : '0'; } while(0)
3435 #define JTAG_DEBUG_STATE_PRINT(a, b, astr, bstr) \
3436 DEBUG_JTAG_IO("TAP/SM: %9s -> %5s\tTMS: %s\tTDI: %s", \
3437 tap_state_name(a), tap_state_name(b), astr, bstr)
3439 tap_state_t
jtag_debug_state_machine(const void *tms_buf
, const void *tdi_buf
,
3440 unsigned tap_bits
, tap_state_t next_state
)
3442 const u8
*tms_buffer
;
3443 const u8
*tdi_buffer
;
3448 unsigned tap_out_bits
;
3452 tap_state_t last_state
;
3454 // set startstate (and possibly last, if tap_bits == 0)
3455 last_state
= next_state
;
3456 DEBUG_JTAG_IO("TAP/SM: START state: %s", tap_state_name(next_state
));
3458 tms_buffer
= (const u8
*)tms_buf
;
3459 tdi_buffer
= (const u8
*)tdi_buf
;
3461 tap_bytes
= TAP_SCAN_BYTES(tap_bits
);
3462 DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits
, tap_bytes
);
3465 for(cur_byte
= 0; cur_byte
< tap_bytes
; cur_byte
++)
3467 for(cur_bit
= 0; cur_bit
< 8; cur_bit
++)
3469 // make sure we do not run off the end of the buffers
3470 unsigned tap_bit
= cur_byte
* 8 + cur_bit
;
3471 if (tap_bit
== tap_bits
)
3474 // check and save TMS bit
3475 tap_bit
= !!(tms_buffer
[cur_byte
] & (1 << cur_bit
));
3476 JTAG_DEBUG_STATE_APPEND(tms_str
, tap_out_bits
, tap_bit
);
3478 // use TMS bit to find the next TAP state
3479 next_state
= tap_state_transition(last_state
, tap_bit
);
3481 // check and store TDI bit
3482 tap_bit
= !!(tdi_buffer
[cur_byte
] & (1 << cur_bit
));
3483 JTAG_DEBUG_STATE_APPEND(tdi_str
, tap_out_bits
, tap_bit
);
3485 // increment TAP bits
3488 // Only show TDO bits on state transitions, or
3489 // after some number of bits in the same state.
3490 if ((next_state
== last_state
) && (tap_out_bits
< 32))
3493 // terminate strings and display state transition
3494 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3495 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3498 last_state
= next_state
;
3505 // terminate strings and display state transition
3506 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3507 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3510 DEBUG_JTAG_IO("TAP/SM: FINAL state: %s", tap_state_name(next_state
));
3514 #endif // _DEBUG_JTAG_IO_
3516 /*-----</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)