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"
45 /* note that this is not marked as static as it must be available from outside jtag.c for those
46 that implement the jtag_xxx() minidriver layer
48 int jtag_error
=ERROR_OK
;
50 typedef struct cmd_queue_page_s
54 struct cmd_queue_page_s
*next
;
57 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
58 static cmd_queue_page_t
*cmd_queue_pages
= NULL
;
60 char* jtag_event_strings
[] =
62 "JTAG controller reset (RESET or TRST)"
65 const Jim_Nvp nvp_jtag_tap_event
[] = {
66 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
67 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
69 { .name
= NULL
, .value
= -1 }
75 jtag_command_t
*jtag_command_queue
= NULL
;
76 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
77 static jtag_tap_t
*jtag_all_taps
= NULL
;
79 enum reset_types jtag_reset_config
= RESET_NONE
;
80 tap_state_t cmd_queue_end_state
= TAP_RESET
;
81 tap_state_t cmd_queue_cur_state
= TAP_RESET
;
83 int jtag_verify_capture_ir
= 1;
85 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
86 static int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
87 static int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
89 /* maximum number of JTAG devices expected in the chain
91 #define JTAG_MAX_CHAIN_SIZE 20
93 /* callbacks to inform high-level handlers about JTAG state changes */
94 jtag_event_callback_t
*jtag_event_callbacks
;
97 static int speed_khz
= 0;
98 /* flag if the kHz speed was defined */
99 static int hasKHz
= 0;
101 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
104 #if BUILD_ECOSBOARD == 1
105 extern jtag_interface_t zy1000_interface
;
108 #if BUILD_PARPORT == 1
109 extern jtag_interface_t parport_interface
;
113 extern jtag_interface_t dummy_interface
;
116 #if BUILD_FT2232_FTD2XX == 1
117 extern jtag_interface_t ft2232_interface
;
120 #if BUILD_FT2232_LIBFTDI == 1
121 extern jtag_interface_t ft2232_interface
;
124 #if BUILD_AMTJTAGACCEL == 1
125 extern jtag_interface_t amt_jtagaccel_interface
;
128 #if BUILD_EP93XX == 1
129 extern jtag_interface_t ep93xx_interface
;
132 #if BUILD_AT91RM9200 == 1
133 extern jtag_interface_t at91rm9200_interface
;
136 #if BUILD_GW16012 == 1
137 extern jtag_interface_t gw16012_interface
;
140 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
141 extern jtag_interface_t presto_interface
;
144 #if BUILD_USBPROG == 1
145 extern jtag_interface_t usbprog_interface
;
149 extern jtag_interface_t jlink_interface
;
152 #if BUILD_VSLLINK == 1
153 extern jtag_interface_t vsllink_interface
;
157 extern jtag_interface_t rlink_interface
;
160 #if BUILD_ARMJTAGEW == 1
161 extern jtag_interface_t armjtagew_interface
;
164 jtag_interface_t
*jtag_interfaces
[] = {
165 #if BUILD_ECOSBOARD == 1
168 #if BUILD_PARPORT == 1
174 #if BUILD_FT2232_FTD2XX == 1
177 #if BUILD_FT2232_LIBFTDI == 1
180 #if BUILD_AMTJTAGACCEL == 1
181 &amt_jtagaccel_interface
,
183 #if BUILD_EP93XX == 1
186 #if BUILD_AT91RM9200 == 1
187 &at91rm9200_interface
,
189 #if BUILD_GW16012 == 1
192 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
195 #if BUILD_USBPROG == 1
201 #if BUILD_VSLLINK == 1
207 #if BUILD_ARMJTAGEW == 1
208 &armjtagew_interface
,
213 jtag_interface_t
*jtag
= NULL
;
216 static jtag_interface_t
*jtag_interface
= NULL
;
219 /* forward declarations */
220 //void jtag_add_pathmove(int num_states, tap_state_t *path);
221 //void jtag_add_runtest(int num_cycles, tap_state_t endstate);
222 //void jtag_add_end_state(tap_state_t endstate);
223 //void jtag_add_sleep(u32 us);
224 //int jtag_execute_queue(void);
225 static tap_state_t
tap_state_by_name(const char *name
);
228 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
229 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
230 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
231 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
232 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
233 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
234 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
236 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
238 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
239 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
240 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
241 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
242 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
244 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
246 jtag_tap_t
*jtag_AllTaps(void)
248 return jtag_all_taps
;
251 int jtag_NumTotalTaps(void)
265 int jtag_NumEnabledTaps(void)
281 jtag_tap_t
*jtag_TapByString( const char *s
)
289 if( 0 == strcmp( t
->dotted_name
, s
) ){
295 /* backup plan is by number */
297 /* ok - is "s" a number? */
299 n
= strtol( s
, &cp
, 0 );
300 if( (s
!= cp
) && (*cp
== 0) ){
302 t
= jtag_TapByAbsPosition(n
);
308 jtag_tap_t
* jtag_TapByJimObj( Jim_Interp
*interp
, Jim_Obj
*o
)
313 cp
= Jim_GetString( o
, NULL
);
318 t
= jtag_TapByString( cp
);
321 Jim_SetResult_sprintf(interp
,"Tap: %s is unknown", cp
);
326 /* returns a pointer to the n-th device in the scan chain */
327 jtag_tap_t
* jtag_TapByAbsPosition( int n
)
335 while( t
&& (n
> 0)) {
342 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
344 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
346 if (callback
== NULL
)
348 return ERROR_INVALID_ARGUMENTS
;
353 while ((*callbacks_p
)->next
)
354 callbacks_p
= &((*callbacks_p
)->next
);
355 callbacks_p
= &((*callbacks_p
)->next
);
358 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
359 (*callbacks_p
)->callback
= callback
;
360 (*callbacks_p
)->priv
= priv
;
361 (*callbacks_p
)->next
= NULL
;
366 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
368 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
370 if (callback
== NULL
)
372 return ERROR_INVALID_ARGUMENTS
;
377 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
378 if ((*callbacks_p
)->callback
== callback
)
381 *callbacks_p
= *next
;
389 int jtag_call_event_callbacks(enum jtag_event event
)
391 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
393 LOG_DEBUG("jtag event: %s", jtag_event_strings
[event
]);
397 callback
->callback(event
, callback
->priv
);
398 callback
= callback
->next
;
404 /* returns a pointer to the pointer of the last command in queue
405 * this may be a pointer to the root pointer (jtag_command_queue)
406 * or to the next member of the last but one command
408 jtag_command_t
** jtag_get_last_command_p(void)
410 /* jtag_command_t *cmd = jtag_command_queue;
416 return &jtag_command_queue;
420 return last_comand_pointer
;
423 void* cmd_queue_alloc(size_t size
)
425 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
431 * We align/round the *SIZE* per below
432 * so that all pointers returned by
433 * this function are reasonably well
436 * If we did not, then an "odd-length" request would cause the
437 * *next* allocation to be at an *odd* address, and because
438 * this function has the same type of api as malloc() - we
439 * must also return pointers that have the same type of
442 * What I do not/have is a reasonable portable means
445 * The solution here, is based on these suggestions.
446 * http://gcc.gnu.org/ml/gcc-help/2008-12/msg00041.html
449 union worse_case_align
{
455 #define ALIGN_SIZE (sizeof(union worse_case_align))
457 /* The alignment process. */
458 size
= (size
+ ALIGN_SIZE
-1) & (~(ALIGN_SIZE
-1));
463 while ((*p_page
)->next
)
464 p_page
= &((*p_page
)->next
);
465 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
466 p_page
= &((*p_page
)->next
);
471 *p_page
= malloc(sizeof(cmd_queue_page_t
));
473 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
474 (*p_page
)->next
= NULL
;
477 offset
= (*p_page
)->used
;
478 (*p_page
)->used
+= size
;
480 t
=(u8
*)((*p_page
)->address
);
484 void cmd_queue_free(void)
486 cmd_queue_page_t
*page
= cmd_queue_pages
;
490 cmd_queue_page_t
*last
= page
;
496 cmd_queue_pages
= NULL
;
499 static void jtag_prelude1(void)
503 LOG_WARNING("JTAG command queued, while TRST is low (TAP in reset)");
504 jtag_error
=ERROR_JTAG_TRST_ASSERTED
;
508 if (cmd_queue_end_state
== TAP_RESET
)
509 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
512 static void jtag_prelude(tap_state_t state
)
516 if (state
!= TAP_INVALID
)
517 jtag_add_end_state(state
);
519 cmd_queue_cur_state
= cmd_queue_end_state
;
522 void jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
528 retval
=interface_jtag_add_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
529 if (retval
!=ERROR_OK
)
533 int MINIDRIVER(interface_jtag_add_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
535 jtag_command_t
**last_cmd
;
542 last_cmd
= jtag_get_last_command_p();
544 /* allocate memory for a new list member */
545 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
546 (*last_cmd
)->next
= NULL
;
547 last_comand_pointer
= &((*last_cmd
)->next
);
548 (*last_cmd
)->type
= JTAG_SCAN
;
550 /* allocate memory for ir scan command */
551 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
552 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
553 x
= jtag_NumEnabledTaps();
554 (*last_cmd
)->cmd
.scan
->num_fields
= x
; /* one field per device */
555 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(x
* sizeof(scan_field_t
));
556 (*last_cmd
)->cmd
.scan
->end_state
= state
;
563 /* do this here so it is not forgotten */
564 tap
= jtag_NextEnabledTap(tap
);
569 scan_size
= tap
->ir_length
;
570 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].tap
= tap
;
571 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].num_bits
= scan_size
;
572 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_value
= NULL
;
573 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler
= NULL
; /* disable verification by default */
575 /* search the list */
576 for (j
= 0; j
< num_fields
; j
++)
578 if (tap
== fields
[j
].tap
)
581 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
583 if (jtag_verify_capture_ir
)
585 if (fields
[j
].in_handler
==NULL
)
587 jtag_set_check_value((*last_cmd
)->cmd
.scan
->fields
+nth_tap
, tap
->expected
, tap
->expected_mask
, NULL
);
590 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler
= fields
[j
].in_handler
;
591 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_handler_priv
= fields
[j
].in_handler_priv
;
592 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_check_value
= tap
->expected
;
593 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].in_check_mask
= tap
->expected_mask
;
604 /* if a tap isn't listed, set it to BYPASS */
605 (*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
609 /* update device information */
610 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[nth_tap
].out_value
, tap
->cur_instr
, scan_size
);
616 void jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
622 retval
=interface_jtag_add_plain_ir_scan(num_fields
, fields
, cmd_queue_end_state
);
623 if (retval
!=ERROR_OK
)
627 int MINIDRIVER(interface_jtag_add_plain_ir_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
630 jtag_command_t
**last_cmd
;
632 last_cmd
= jtag_get_last_command_p();
634 /* allocate memory for a new list member */
635 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
636 (*last_cmd
)->next
= NULL
;
637 last_comand_pointer
= &((*last_cmd
)->next
);
638 (*last_cmd
)->type
= JTAG_SCAN
;
640 /* allocate memory for ir scan command */
641 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
642 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
643 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
644 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
645 (*last_cmd
)->cmd
.scan
->end_state
= state
;
647 for( i
= 0 ; i
< num_fields
; i
++ ){
648 int num_bits
= fields
[i
].num_bits
;
649 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
650 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
651 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
652 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, 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
].in_value
= fields
[j
].in_value
;
730 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= fields
[j
].in_check_value
;
731 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= fields
[j
].in_check_mask
;
732 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= fields
[j
].in_handler
;
733 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= fields
[j
].in_handler_priv
;
738 #ifdef _DEBUG_JTAG_IO_
739 /* if a device isn't listed, the BYPASS register should be selected */
742 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
746 /* program the scan field to 1 bit length, and ignore it's value */
747 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
748 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
749 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
750 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
751 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
752 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
753 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
757 #ifdef _DEBUG_JTAG_IO_
758 /* if a device is listed, the BYPASS register must not be selected */
761 LOG_ERROR("BUG: scan data for a device in BYPASS");
770 void MINIDRIVER(interface_jtag_add_dr_out
)(jtag_tap_t
*target_tap
,
774 tap_state_t end_state
)
779 int bypass_devices
= 0;
781 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
784 /* count devices in bypass */
788 tap
= jtag_NextEnabledTap(tap
);
797 /* allocate memory for a new list member */
798 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
799 last_comand_pointer
= &((*last_cmd
)->next
);
800 (*last_cmd
)->next
= NULL
;
801 (*last_cmd
)->type
= JTAG_SCAN
;
803 /* allocate memory for dr scan command */
804 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
805 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
806 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
807 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
808 (*last_cmd
)->cmd
.scan
->end_state
= end_state
;
813 tap
= jtag_NextEnabledTap(tap
);
818 (*last_cmd
)->cmd
.scan
->fields
[field_count
].tap
= tap
;
820 if (tap
== target_tap
)
823 #ifdef _DEBUG_JTAG_IO_
824 /* if a device is listed, the BYPASS register must not be selected */
827 LOG_ERROR("BUG: scan data for a device in BYPASS");
831 for (j
= 0; j
< num_fields
; j
++)
834 scan_size
= num_bits
[j
];
835 buf_set_u32(out_value
, 0, scan_size
, value
[j
]);
836 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
837 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
838 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
839 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
840 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
841 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
842 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
846 #ifdef _DEBUG_JTAG_IO_
847 /* if a device isn't listed, the BYPASS register should be selected */
850 LOG_ERROR("BUG: no scan data for a device not in BYPASS");
854 /* program the scan field to 1 bit length, and ignore it's value */
855 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
856 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
857 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
858 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
859 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
860 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
861 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
866 void jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
872 retval
=interface_jtag_add_plain_dr_scan(num_fields
, fields
, cmd_queue_end_state
);
873 if (retval
!=ERROR_OK
)
877 int MINIDRIVER(interface_jtag_add_plain_dr_scan
)(int num_fields
, scan_field_t
*fields
, tap_state_t state
)
880 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
882 /* allocate memory for a new list member */
883 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
884 last_comand_pointer
= &((*last_cmd
)->next
);
885 (*last_cmd
)->next
= NULL
;
886 (*last_cmd
)->type
= JTAG_SCAN
;
888 /* allocate memory for scan command */
889 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
890 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
891 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
892 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
893 (*last_cmd
)->cmd
.scan
->end_state
= state
;
895 for (i
= 0; i
< num_fields
; i
++)
897 int num_bits
= fields
[i
].num_bits
;
898 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
899 (*last_cmd
)->cmd
.scan
->fields
[i
].tap
= fields
[i
].tap
;
900 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
901 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
902 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
903 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
904 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
905 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[i
].in_handler
;
906 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[i
].in_handler_priv
;
912 void jtag_add_tlr(void)
914 jtag_prelude(TAP_RESET
);
917 retval
=interface_jtag_add_tlr();
918 if (retval
!=ERROR_OK
)
922 int MINIDRIVER(interface_jtag_add_tlr
)(void)
924 tap_state_t state
= TAP_RESET
;
925 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
927 /* allocate memory for a new list member */
928 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
929 last_comand_pointer
= &((*last_cmd
)->next
);
930 (*last_cmd
)->next
= NULL
;
931 (*last_cmd
)->type
= JTAG_STATEMOVE
;
933 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
934 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
939 void jtag_add_pathmove(int num_states
, tap_state_t
*path
)
941 tap_state_t cur_state
= cmd_queue_cur_state
;
945 /* the last state has to be a stable state */
946 if (!tap_is_state_stable(path
[num_states
- 1]))
948 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
952 for (i
=0; i
<num_states
; i
++)
954 if (path
[i
] == TAP_RESET
)
956 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
960 if ( tap_state_transition(cur_state
, true) != path
[i
]
961 && tap_state_transition(cur_state
, false) != path
[i
])
963 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
971 retval
= interface_jtag_add_pathmove(num_states
, path
);
972 cmd_queue_cur_state
= path
[num_states
- 1];
973 if (retval
!=ERROR_OK
)
977 int MINIDRIVER(interface_jtag_add_pathmove
)(int num_states
, tap_state_t
*path
)
979 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
982 /* allocate memory for a new list member */
983 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
984 last_comand_pointer
= &((*last_cmd
)->next
);
985 (*last_cmd
)->next
= NULL
;
986 (*last_cmd
)->type
= JTAG_PATHMOVE
;
988 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
989 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
990 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(tap_state_t
) * num_states
);
992 for (i
= 0; i
< num_states
; i
++)
993 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
998 int MINIDRIVER(interface_jtag_add_runtest
)(int num_cycles
, tap_state_t state
)
1000 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1002 /* allocate memory for a new list member */
1003 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1004 (*last_cmd
)->next
= NULL
;
1005 last_comand_pointer
= &((*last_cmd
)->next
);
1006 (*last_cmd
)->type
= JTAG_RUNTEST
;
1008 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
1009 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
1010 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
1015 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
1019 jtag_prelude(state
);
1021 /* executed by sw or hw fifo */
1022 retval
=interface_jtag_add_runtest(num_cycles
, cmd_queue_end_state
);
1023 if (retval
!=ERROR_OK
)
1028 int MINIDRIVER(interface_jtag_add_clocks
)( int num_cycles
)
1030 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1032 /* allocate memory for a new list member */
1033 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1034 (*last_cmd
)->next
= NULL
;
1035 last_comand_pointer
= &((*last_cmd
)->next
);
1036 (*last_cmd
)->type
= JTAG_STABLECLOCKS
;
1038 (*last_cmd
)->cmd
.stableclocks
= cmd_queue_alloc(sizeof(stableclocks_command_t
));
1039 (*last_cmd
)->cmd
.stableclocks
->num_cycles
= num_cycles
;
1043 void jtag_add_clocks( int num_cycles
)
1047 if( !tap_is_state_stable(cmd_queue_cur_state
) )
1049 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
1050 tap_state_name(cmd_queue_cur_state
) );
1051 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
1055 if( num_cycles
> 0 )
1059 retval
= interface_jtag_add_clocks(num_cycles
);
1060 if (retval
!= ERROR_OK
)
1065 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
1067 int trst_with_tlr
= 0;
1070 /* FIX!!! there are *many* different cases here. A better
1071 * approach is needed for legal combinations of transitions...
1073 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
1074 (jtag_reset_config
& RESET_HAS_TRST
)&&
1075 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
1077 if (((req_tlr_or_trst
&&!jtag_trst
)||
1078 (!req_tlr_or_trst
&&jtag_trst
))&&
1079 ((req_srst
&&!jtag_srst
)||
1080 (!req_srst
&&jtag_srst
)))
1082 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
1083 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
1087 /* Make sure that jtag_reset_config allows the requested reset */
1088 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
1089 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
1091 LOG_ERROR("BUG: requested reset would assert trst");
1092 jtag_error
=ERROR_FAIL
;
1096 /* if TRST pulls SRST, we reset with TAP T-L-R */
1097 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
1102 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
1104 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
1105 jtag_error
=ERROR_FAIL
;
1109 if (req_tlr_or_trst
)
1111 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
1123 jtag_srst
= req_srst
;
1125 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
1126 if (retval
!=ERROR_OK
)
1134 LOG_DEBUG("SRST line asserted");
1138 LOG_DEBUG("SRST line released");
1139 if (jtag_nsrst_delay
)
1140 jtag_add_sleep(jtag_nsrst_delay
* 1000);
1145 LOG_DEBUG("JTAG reset with RESET instead of TRST");
1146 jtag_add_end_state(TAP_RESET
);
1148 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1154 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
1155 * and inform possible listeners about this
1157 LOG_DEBUG("TRST line asserted");
1158 cmd_queue_cur_state
= TAP_RESET
;
1159 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
1163 if (jtag_ntrst_delay
)
1164 jtag_add_sleep(jtag_ntrst_delay
* 1000);
1168 int MINIDRIVER(interface_jtag_add_reset
)(int req_trst
, int req_srst
)
1170 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1172 /* allocate memory for a new list member */
1173 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1174 (*last_cmd
)->next
= NULL
;
1175 last_comand_pointer
= &((*last_cmd
)->next
);
1176 (*last_cmd
)->type
= JTAG_RESET
;
1178 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
1179 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
1180 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
1185 void jtag_add_end_state(tap_state_t state
)
1187 cmd_queue_end_state
= state
;
1188 if ((cmd_queue_end_state
== TAP_DRSHIFT
)||(cmd_queue_end_state
== TAP_IRSHIFT
))
1190 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
1194 int MINIDRIVER(interface_jtag_add_sleep
)(u32 us
)
1196 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
1198 /* allocate memory for a new list member */
1199 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1200 (*last_cmd
)->next
= NULL
;
1201 last_comand_pointer
= &((*last_cmd
)->next
);
1202 (*last_cmd
)->type
= JTAG_SLEEP
;
1204 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
1205 (*last_cmd
)->cmd
.sleep
->us
= us
;
1210 void jtag_add_sleep(u32 us
)
1212 keep_alive(); /* we might be running on a very slow JTAG clk */
1213 int retval
=interface_jtag_add_sleep(us
);
1214 if (retval
!=ERROR_OK
)
1219 int jtag_scan_size(scan_command_t
*cmd
)
1224 /* count bits in scan command */
1225 for (i
= 0; i
< cmd
->num_fields
; i
++)
1227 bit_count
+= cmd
->fields
[i
].num_bits
;
1233 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
1238 bit_count
= jtag_scan_size(cmd
);
1239 *buffer
= malloc(CEIL(bit_count
, 8));
1243 #ifdef _DEBUG_JTAG_IO_
1244 LOG_DEBUG("%s num_fields: %i", cmd
->ir_scan
? "IRSCAN" : "DRSCAN", cmd
->num_fields
);
1247 for (i
= 0; i
< cmd
->num_fields
; i
++)
1249 if (cmd
->fields
[i
].out_value
)
1251 #ifdef _DEBUG_JTAG_IO_
1252 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);
1254 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
1255 #ifdef _DEBUG_JTAG_IO_
1256 LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i
, cmd
->fields
[i
].num_bits
, char_buf
);
1262 #ifdef _DEBUG_JTAG_IO_
1263 LOG_DEBUG("fields[%i].out_value[%i]: NULL", i
, cmd
->fields
[i
].num_bits
);
1267 bit_count
+= cmd
->fields
[i
].num_bits
;
1270 #ifdef _DEBUG_JTAG_IO_
1271 //LOG_DEBUG("bit_count totalling: %i", bit_count );
1277 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1283 /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1286 for (i
= 0; i
< cmd
->num_fields
; i
++)
1288 /* if neither in_value nor in_handler
1289 * are specified we don't have to examine this field
1291 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1293 int num_bits
= cmd
->fields
[i
].num_bits
;
1294 u8
*captured
= buf_set_buf(buffer
, bit_count
, malloc(CEIL(num_bits
, 8)), 0, num_bits
);
1296 #ifdef _DEBUG_JTAG_IO_
1297 char *char_buf
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1298 LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", i
, num_bits
, char_buf
);
1302 if (cmd
->fields
[i
].in_value
)
1304 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1306 if (cmd
->fields
[i
].in_handler
)
1308 if (cmd
->fields
[i
].in_handler(cmd
->fields
[i
].in_value
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1310 LOG_WARNING("in_handler: with \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1311 retval
= ERROR_JTAG_QUEUE_FAILED
;
1316 /* no in_value specified, but a handler takes care of the scanned data */
1317 if (cmd
->fields
[i
].in_handler
&& (!cmd
->fields
[i
].in_value
))
1319 if (cmd
->fields
[i
].in_handler(captured
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1321 /* We're going to call the error:handler later, but if the in_handler
1322 * reported an error we report this failure upstream
1324 LOG_WARNING("in_handler: w/o \"in_value\", mismatch in %s", cmd
->ir_scan
? "SIR" : "SDR" );
1325 retval
= ERROR_JTAG_QUEUE_FAILED
;
1331 bit_count
+= cmd
->fields
[i
].num_bits
;
1337 static const char *jtag_tap_name(jtag_tap_t
*tap
)
1339 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
1342 int jtag_check_value(u8
*captured
, void *priv
, scan_field_t
*field
)
1344 int retval
= ERROR_OK
;
1345 int num_bits
= field
->num_bits
;
1347 int compare_failed
= 0;
1349 if (field
->in_check_mask
)
1350 compare_failed
= buf_cmp_mask(captured
, field
->in_check_value
, field
->in_check_mask
, num_bits
);
1352 compare_failed
= buf_cmp(captured
, field
->in_check_value
, num_bits
);
1354 if (compare_failed
){
1355 /* An error handler could have caught the failing check
1356 * only report a problem when there wasn't a handler, or if the handler
1357 * acknowledged the error
1359 LOG_WARNING("TAP %s:",
1360 jtag_tap_name(field
->tap
));
1363 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1364 char *in_check_value_char
= buf_to_str(field
->in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1366 if (field
->in_check_mask
)
1368 char *in_check_mask_char
;
1369 in_check_mask_char
= buf_to_str(field
->in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
1370 LOG_WARNING("value captured during scan didn't pass the requested check:");
1371 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
1372 captured_char
, in_check_value_char
, in_check_mask_char
);
1373 free(in_check_mask_char
);
1377 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
);
1380 free(captured_char
);
1381 free(in_check_value_char
);
1383 retval
= ERROR_JTAG_QUEUE_FAILED
;
1391 set up checking of this field using the in_handler. The values passed in must be valid until
1392 after jtag_execute() has completed.
1394 void jtag_set_check_value(scan_field_t
*field
, u8
*value
, u8
*mask
, error_handler_t
*in_error_handler
)
1397 field
->in_handler
= jtag_check_value
;
1399 field
->in_handler
= NULL
; /* No check, e.g. embeddedice uses value==NULL to indicate no check */
1400 field
->in_handler_priv
= NULL
;
1401 field
->in_check_value
= value
;
1402 field
->in_check_mask
= mask
;
1405 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1410 for (i
= 0; i
< cmd
->num_fields
; i
++)
1412 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1414 if (cmd
->fields
[i
].out_value
)
1421 int MINIDRIVER(interface_jtag_execute_queue
)(void)
1427 LOG_ERROR("No JTAG interface configured yet. Issue 'init' command in startup scripts before communicating with targets.");
1431 retval
= jtag
->execute_queue();
1435 jtag_command_queue
= NULL
;
1436 last_comand_pointer
= &jtag_command_queue
;
1441 int jtag_execute_queue(void)
1443 int retval
=interface_jtag_execute_queue();
1444 if (retval
==ERROR_OK
)
1448 jtag_error
=ERROR_OK
;
1452 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1454 jtag_tap_t
*tap
= priv
;
1458 if (event
== JTAG_TRST_ASSERTED
)
1460 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
1467 void jtag_sleep(u32 us
)
1469 alive_sleep(us
/1000);
1472 /* Try to examine chain layout according to IEEE 1149.1 §12
1474 int jtag_examine_chain(void)
1478 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1481 int device_count
= 0;
1482 u8 zero_check
= 0x0;
1483 u8 one_check
= 0xff;
1486 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1487 field
.out_value
= idcode_buffer
;
1489 field
.in_value
= idcode_buffer
;
1492 field
.in_handler
= NULL
;
1494 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1496 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
1499 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
1500 jtag_execute_queue();
1502 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1504 zero_check
|= idcode_buffer
[i
];
1505 one_check
&= idcode_buffer
[i
];
1508 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1509 if ((zero_check
== 0x00) || (one_check
== 0xff))
1511 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1512 return ERROR_JTAG_INIT_FAILED
;
1515 /* point at the 1st tap */
1516 tap
= jtag_NextEnabledTap(NULL
);
1518 LOG_ERROR("JTAG: No taps enabled?");
1519 return ERROR_JTAG_INIT_FAILED
;
1522 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1524 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1525 if ((idcode
& 1) == 0)
1527 /* LSB must not be 0, this indicates a device in bypass */
1528 LOG_WARNING("Tap/Device does not have IDCODE");
1539 /* some devices, such as AVR will output all 1's instead of TDI
1540 input value at end of chain. */
1541 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
1544 /* End of chain (invalid manufacturer ID)
1546 * The JTAG examine is the very first thing that happens
1548 * A single JTAG device requires only 64 bits to be read back correctly.
1550 * The code below adds a check that the rest of the data scanned (640 bits)
1551 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1553 * earlier and gives more helpful/explicit error messages.
1555 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1557 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1558 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1560 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1568 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1569 manufacturer
= EXTRACT_MFG(idcode
);
1570 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1571 part
= EXTRACT_PART(idcode
);
1572 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1573 version
= EXTRACT_VER(idcode
);
1575 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1576 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1577 idcode
, manufacturer
, part
, version
);
1583 tap
->idcode
= idcode
;
1585 if (tap
->expected_ids_cnt
> 0) {
1586 /* Loop over the expected identification codes and test for a match */
1588 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1589 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1594 /* If none of the expected ids matched, log an error */
1595 if (ii
== tap
->expected_ids_cnt
) {
1596 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1599 EXTRACT_MFG( tap
->idcode
),
1600 EXTRACT_PART( tap
->idcode
),
1601 EXTRACT_VER( tap
->idcode
) );
1602 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1603 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1606 tap
->expected_ids_cnt
,
1607 tap
->expected_ids
[ii
],
1608 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1609 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1610 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1613 return ERROR_JTAG_INIT_FAILED
;
1615 LOG_INFO("JTAG Tap/device matched");
1619 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1623 tap
= jtag_NextEnabledTap(tap
);
1628 /* see if number of discovered devices matches configuration */
1629 if (device_count
!= jtag_NumEnabledTaps())
1631 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1632 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1633 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1634 return ERROR_JTAG_INIT_FAILED
;
1640 int jtag_validate_chain(void)
1643 int total_ir_length
= 0;
1649 total_ir_length
= 0;
1651 tap
= jtag_NextEnabledTap(tap
);
1655 total_ir_length
+= tap
->ir_length
;
1658 total_ir_length
+= 2;
1659 ir_test
= malloc(CEIL(total_ir_length
, 8));
1660 buf_set_ones(ir_test
, total_ir_length
);
1663 field
.num_bits
= total_ir_length
;
1664 field
.out_value
= ir_test
;
1666 field
.in_value
= ir_test
;
1669 field
.in_handler
= NULL
;
1671 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1672 jtag_execute_queue();
1678 tap
= jtag_NextEnabledTap(tap
);
1683 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1686 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1687 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
);
1690 return ERROR_JTAG_INIT_FAILED
;
1692 chain_pos
+= tap
->ir_length
;
1695 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1698 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1699 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
);
1702 return ERROR_JTAG_INIT_FAILED
;
1710 enum jtag_tap_cfg_param
{
1714 static Jim_Nvp nvp_config_opts
[] = {
1715 { .name
= "-event", .value
= JCFG_EVENT
},
1717 { .name
= NULL
, .value
= -1 }
1720 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1726 /* parse config or cget options */
1727 while (goi
->argc
> 0) {
1728 Jim_SetEmptyResult (goi
->interp
);
1730 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1732 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1738 if (goi
->argc
== 0) {
1739 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1743 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1745 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1749 if (goi
->isconfigure
) {
1750 if (goi
->argc
!= 1) {
1751 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1755 if (goi
->argc
!= 0) {
1756 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1762 jtag_tap_event_action_t
*jteap
;
1764 jteap
= tap
->event_action
;
1765 /* replace existing? */
1767 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1770 jteap
= jteap
->next
;
1773 if (goi
->isconfigure
) {
1774 if (jteap
== NULL
) {
1776 jteap
= calloc(1, sizeof (*jteap
));
1778 jteap
->event
= n
->value
;
1779 Jim_GetOpt_Obj( goi
, &o
);
1781 Jim_DecrRefCount(interp
, jteap
->body
);
1783 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1784 Jim_IncrRefCount(jteap
->body
);
1786 /* add to head of event list */
1787 jteap
->next
= tap
->event_action
;
1788 tap
->event_action
= jteap
;
1789 Jim_SetEmptyResult(goi
->interp
);
1792 if (jteap
== NULL
) {
1793 Jim_SetEmptyResult(goi
->interp
);
1795 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1802 } /* while (goi->argc) */
1807 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1817 const Jim_Nvp opts
[] = {
1818 #define NTAP_OPT_IRLEN 0
1819 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1820 #define NTAP_OPT_IRMASK 1
1821 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1822 #define NTAP_OPT_IRCAPTURE 2
1823 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1824 #define NTAP_OPT_ENABLED 3
1825 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1826 #define NTAP_OPT_DISABLED 4
1827 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1828 #define NTAP_OPT_EXPECTED_ID 5
1829 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1830 { .name
= NULL
, .value
= -1 },
1833 pTap
= malloc( sizeof(jtag_tap_t
) );
1834 memset( pTap
, 0, sizeof(*pTap
) );
1836 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1840 * we expect CHIP + TAP + OPTIONS
1842 if( goi
->argc
< 3 ){
1843 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1846 Jim_GetOpt_String( goi
, &cp
, NULL
);
1847 pTap
->chip
= strdup(cp
);
1849 Jim_GetOpt_String( goi
, &cp
, NULL
);
1850 pTap
->tapname
= strdup(cp
);
1852 /* name + dot + name + null */
1853 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1855 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1856 pTap
->dotted_name
= cp
;
1858 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1859 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1861 /* default is enabled */
1864 /* deal with options */
1865 #define NTREQ_IRLEN 1
1866 #define NTREQ_IRCAPTURE 2
1867 #define NTREQ_IRMASK 4
1869 /* clear them as we find them */
1870 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1873 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1875 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1878 LOG_DEBUG("Processing option: %s", n
->name
);
1880 case NTAP_OPT_ENABLED
:
1883 case NTAP_OPT_DISABLED
:
1886 case NTAP_OPT_EXPECTED_ID
:
1888 u32
*new_expected_ids
;
1890 e
= Jim_GetOpt_Wide( goi
, &w
);
1892 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1896 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1897 if (new_expected_ids
== NULL
) {
1898 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1902 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1904 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1906 free(pTap
->expected_ids
);
1907 pTap
->expected_ids
= new_expected_ids
;
1908 pTap
->expected_ids_cnt
++;
1911 case NTAP_OPT_IRLEN
:
1912 case NTAP_OPT_IRMASK
:
1913 case NTAP_OPT_IRCAPTURE
:
1914 e
= Jim_GetOpt_Wide( goi
, &w
);
1916 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1919 if( (w
< 0) || (w
> 0xffff) ){
1921 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1922 n
->name
, (int)(w
), (int)(w
));
1926 case NTAP_OPT_IRLEN
:
1927 pTap
->ir_length
= w
;
1928 reqbits
&= (~(NTREQ_IRLEN
));
1930 case NTAP_OPT_IRMASK
:
1931 pTap
->ir_capture_mask
= w
;
1932 reqbits
&= (~(NTREQ_IRMASK
));
1934 case NTAP_OPT_IRCAPTURE
:
1935 pTap
->ir_capture_value
= w
;
1936 reqbits
&= (~(NTREQ_IRCAPTURE
));
1939 } /* switch(n->value) */
1940 } /* while( goi->argc ) */
1942 /* Did we get all the options? */
1945 Jim_SetResult_sprintf( goi
->interp
,
1946 "newtap: %s missing required parameters",
1948 /* TODO: Tell user what is missing :-( */
1949 /* no memory leaks pelase */
1950 free(((void *)(pTap
->expected_ids
)));
1951 free(((void *)(pTap
->chip
)));
1952 free(((void *)(pTap
->tapname
)));
1953 free(((void *)(pTap
->dotted_name
)));
1954 free(((void *)(pTap
)));
1958 pTap
->expected
= malloc( pTap
->ir_length
);
1959 pTap
->expected_mask
= malloc( pTap
->ir_length
);
1960 pTap
->cur_instr
= malloc( pTap
->ir_length
);
1962 buf_set_u32( pTap
->expected
,
1965 pTap
->ir_capture_value
);
1966 buf_set_u32( pTap
->expected_mask
,
1969 pTap
->ir_capture_mask
);
1970 buf_set_ones( pTap
->cur_instr
,
1975 jtag_register_event_callback(jtag_reset_callback
, pTap
);
1977 ppTap
= &(jtag_all_taps
);
1978 while( (*ppTap
) != NULL
){
1979 ppTap
= &((*ppTap
)->next_tap
);
1983 static int n_taps
= 0;
1984 pTap
->abs_chain_position
= n_taps
++;
1986 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
1987 (*ppTap
)->dotted_name
,
1988 (*ppTap
)->abs_chain_position
,
1989 (*ppTap
)->ir_length
,
1990 (*ppTap
)->ir_capture_value
,
1991 (*ppTap
)->ir_capture_mask
);
1996 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
2002 struct command_context_s
*context
;
2006 JTAG_CMD_INIT_RESET
,
2009 JTAG_CMD_TAPDISABLE
,
2010 JTAG_CMD_TAPISENABLED
,
2015 const Jim_Nvp jtag_cmds
[] = {
2016 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
2017 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
2018 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
2019 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
2020 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
2021 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
2022 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
2023 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
2025 { .name
= NULL
, .value
= -1 },
2028 context
= Jim_GetAssocData(interp
, "context");
2029 /* go past the command */
2030 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
2032 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
2034 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
2037 Jim_SetEmptyResult( goi
.interp
);
2039 case JTAG_CMD_INTERFACE
:
2040 /* return the name of the interface */
2041 /* TCL code might need to know the exact type... */
2042 /* FUTURE: we allow this as a means to "set" the interface. */
2043 if( goi
.argc
!= 0 ){
2044 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2047 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
2049 case JTAG_CMD_INIT_RESET
:
2050 if( goi
.argc
!= 0 ){
2051 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
2054 e
= jtag_init_reset(context
);
2055 if( e
!= ERROR_OK
){
2056 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
2060 case JTAG_CMD_NEWTAP
:
2061 return jim_newtap_cmd( &goi
);
2063 case JTAG_CMD_TAPISENABLED
:
2064 case JTAG_CMD_TAPENABLE
:
2065 case JTAG_CMD_TAPDISABLE
:
2066 if( goi
.argc
!= 1 ){
2067 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
2073 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
2078 case JTAG_CMD_TAPISENABLED
:
2081 case JTAG_CMD_TAPENABLE
:
2082 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
2086 case JTAG_CMD_TAPDISABLE
:
2087 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
2092 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
2099 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
2106 Jim_GetOpt_Obj(&goi
, &o
);
2107 t
= jtag_TapByJimObj( goi
.interp
, o
);
2112 goi
.isconfigure
= 0;
2113 return jtag_tap_configure_cmd( &goi
, t
);
2117 case JTAG_CMD_CONFIGURE
:
2119 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
2126 Jim_GetOpt_Obj(&goi
, &o
);
2127 t
= jtag_TapByJimObj( goi
.interp
, o
);
2132 goi
.isconfigure
= 1;
2133 return jtag_tap_configure_cmd( &goi
, t
);
2140 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
2142 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
2144 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
2145 COMMAND_CONFIG
, "try to configure interface");
2146 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
2147 COMMAND_ANY
, "set jtag speed (if supported)");
2148 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
2149 COMMAND_ANY
, "same as jtag_speed, except it takes maximum khz as arguments. 0 KHz = RTCK.");
2150 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
2151 COMMAND_CONFIG
, "jtag_device <ir_length> <ir_expected> <ir_mask>");
2152 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
2154 "[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]");
2155 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
2156 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
2157 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
2158 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
2160 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
2161 COMMAND_EXEC
, "print current scan chain configuration");
2163 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
2164 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
2165 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
2166 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
2167 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
2168 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
2169 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
2170 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
2171 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
2173 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
2174 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
2178 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
2183 if (!jtag_interface
)
2185 /* nothing was previously specified by "interface" command */
2186 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
2187 return ERROR_JTAG_INVALID_INTERFACE
;
2191 jtag_interface
->khz(speed_khz
, &jtag_speed
);
2195 if (jtag_interface
->init() != ERROR_OK
)
2196 return ERROR_JTAG_INIT_FAILED
;
2198 jtag
= jtag_interface
;
2202 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
2207 LOG_DEBUG("Init JTAG chain");
2209 tap
= jtag_NextEnabledTap(NULL
);
2211 LOG_ERROR("There are no enabled taps?");
2212 return ERROR_JTAG_INIT_FAILED
;
2216 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
2219 /* examine chain first, as this could discover the real chain layout */
2220 if (jtag_examine_chain() != ERROR_OK
)
2222 LOG_ERROR("trying to validate configured JTAG chain anyway...");
2225 if (jtag_validate_chain() != ERROR_OK
)
2227 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
2233 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
2237 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2240 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
2242 /* Reset can happen after a power cycle.
2244 * Ideally we would only assert TRST or run RESET before the target reset.
2246 * However w/srst_pulls_trst, trst is asserted together with the target
2247 * reset whether we want it or not.
2249 * NB! Some targets have JTAG circuitry disabled until a
2250 * trst & srst has been asserted.
2252 * NB! here we assume nsrst/ntrst delay are sufficient!
2254 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
2257 jtag_add_reset(1, 0); /* RESET or TRST */
2258 if (jtag_reset_config
& RESET_HAS_SRST
)
2260 jtag_add_reset(1, 1);
2261 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
2262 jtag_add_reset(0, 1);
2264 jtag_add_reset(0, 0);
2265 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
2268 /* Check that we can communication on the JTAG chain + eventually we want to
2269 * be able to perform enumeration only after OpenOCD has started
2270 * telnet and GDB server
2272 * That would allow users to more easily perform any magic they need to before
2275 return jtag_init_inner(cmd_ctx
);
2278 int jtag_init(struct command_context_s
*cmd_ctx
)
2281 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
2283 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
2287 return jtag_init_reset(cmd_ctx
);
2290 static int default_khz(int khz
, int *jtag_speed
)
2292 LOG_ERROR("Translation from khz to jtag_speed not implemented");
2296 static int default_speed_div(int speed
, int *khz
)
2298 LOG_ERROR("Translation from jtag_speed to khz not implemented");
2302 static int default_power_dropout(int *dropout
)
2304 *dropout
=0; /* by default we can't detect power dropout */
2308 static int default_srst_asserted(int *srst_asserted
)
2310 *srst_asserted
=0; /* by default we can't detect srst asserted */
2314 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2319 /* check whether the interface is already configured */
2322 LOG_WARNING("Interface already configured, ignoring");
2326 /* interface name is a mandatory argument */
2327 if (argc
< 1 || args
[0][0] == '\0')
2329 return ERROR_COMMAND_SYNTAX_ERROR
;
2332 for (i
=0; jtag_interfaces
[i
]; i
++)
2334 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
2336 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
2341 jtag_interface
= jtag_interfaces
[i
];
2343 if (jtag_interface
->khz
== NULL
)
2345 jtag_interface
->khz
= default_khz
;
2347 if (jtag_interface
->speed_div
== NULL
)
2349 jtag_interface
->speed_div
= default_speed_div
;
2351 if (jtag_interface
->power_dropout
== NULL
)
2353 jtag_interface
->power_dropout
= default_power_dropout
;
2355 if (jtag_interface
->srst_asserted
== NULL
)
2357 jtag_interface
->srst_asserted
= default_srst_asserted
;
2364 /* no valid interface was found (i.e. the configuration option,
2365 * didn't match one of the compiled-in interfaces
2367 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
2368 LOG_ERROR("compiled-in jtag interfaces:");
2369 for (i
= 0; jtag_interfaces
[i
]; i
++)
2371 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
2374 return ERROR_JTAG_INVALID_INTERFACE
;
2377 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2381 Jim_Obj
*newargs
[ 10 ];
2384 * argv[-1] = command
2385 * argv[ 0] = ir length
2386 * argv[ 1] = ir capture
2387 * argv[ 2] = ir mask
2388 * argv[ 3] = not actually used by anything but in the docs
2392 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
2395 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
2396 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
2400 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
2401 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
2402 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
2403 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
2405 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
2406 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
2407 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
2408 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
2409 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
2410 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
2411 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
2412 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
2413 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
2414 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
2415 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
2416 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
2418 command_print( cmd_ctx
, "NEW COMMAND:");
2419 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
2420 Jim_GetString( newargs
[0], NULL
),
2421 Jim_GetString( newargs
[1], NULL
),
2422 Jim_GetString( newargs
[2], NULL
),
2423 Jim_GetString( newargs
[3], NULL
),
2424 Jim_GetString( newargs
[4], NULL
),
2425 Jim_GetString( newargs
[5], NULL
),
2426 Jim_GetString( newargs
[6], NULL
),
2427 Jim_GetString( newargs
[7], NULL
),
2428 Jim_GetString( newargs
[8], NULL
),
2429 Jim_GetString( newargs
[9], NULL
) );
2431 e
= jim_jtag_command( interp
, 10, newargs
);
2433 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
2438 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2442 tap
= jtag_all_taps
;
2443 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
2444 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
2447 u32 expected
, expected_mask
, cur_instr
, ii
;
2448 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
2449 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
2450 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
2452 command_print(cmd_ctx
,
2453 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
2454 tap
->abs_chain_position
,
2456 tap
->enabled
? 'Y' : 'n',
2458 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
2464 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
2465 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
2466 tap
->expected_ids
[ii
]);
2469 tap
= tap
->next_tap
;
2475 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2478 return ERROR_COMMAND_SYNTAX_ERROR
;
2482 if (strcmp(args
[0], "none") == 0)
2483 jtag_reset_config
= RESET_NONE
;
2484 else if (strcmp(args
[0], "trst_only") == 0)
2485 jtag_reset_config
= RESET_HAS_TRST
;
2486 else if (strcmp(args
[0], "srst_only") == 0)
2487 jtag_reset_config
= RESET_HAS_SRST
;
2488 else if (strcmp(args
[0], "trst_and_srst") == 0)
2489 jtag_reset_config
= RESET_TRST_AND_SRST
;
2492 LOG_ERROR("(1) invalid reset_config argument (%s), defaulting to none", args
[0]);
2493 jtag_reset_config
= RESET_NONE
;
2494 return ERROR_INVALID_ARGUMENTS
;
2500 if (strcmp(args
[1], "separate") == 0)
2502 /* seperate reset lines - default */
2505 if (strcmp(args
[1], "srst_pulls_trst") == 0)
2506 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
2507 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
2508 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
2509 else if (strcmp(args
[1], "combined") == 0)
2510 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
2513 LOG_ERROR("(2) invalid reset_config argument (%s), defaulting to none", args
[1]);
2514 jtag_reset_config
= RESET_NONE
;
2515 return ERROR_INVALID_ARGUMENTS
;
2522 if (strcmp(args
[2], "trst_open_drain") == 0)
2523 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
2524 else if (strcmp(args
[2], "trst_push_pull") == 0)
2525 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
2528 LOG_ERROR("(3) invalid reset_config argument (%s) defaulting to none", args
[2] );
2529 jtag_reset_config
= RESET_NONE
;
2530 return ERROR_INVALID_ARGUMENTS
;
2536 if (strcmp(args
[3], "srst_push_pull") == 0)
2537 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
2538 else if (strcmp(args
[3], "srst_open_drain") == 0)
2539 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
2542 LOG_ERROR("(4) invalid reset_config argument (%s), defaulting to none", args
[3]);
2543 jtag_reset_config
= RESET_NONE
;
2544 return ERROR_INVALID_ARGUMENTS
;
2551 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2555 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2560 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2566 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2570 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2575 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2581 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2583 int retval
=ERROR_OK
;
2587 LOG_DEBUG("handle jtag speed");
2590 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2592 /* this command can be called during CONFIG,
2593 * in which case jtag isn't initialized */
2596 retval
=jtag
->speed(cur_speed
);
2598 } else if (argc
== 0)
2602 return ERROR_COMMAND_SYNTAX_ERROR
;
2604 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2609 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2611 int retval
=ERROR_OK
;
2612 LOG_DEBUG("handle jtag khz");
2616 speed_khz
= strtoul(args
[0], NULL
, 0);
2620 LOG_DEBUG("have interface set up");
2622 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2628 cur_speed
= jtag_speed
= speed_div1
;
2630 retval
=jtag
->speed(cur_speed
);
2639 return ERROR_COMMAND_SYNTAX_ERROR
;
2644 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2650 command_print(cmd_ctx
, "RCLK - adaptive");
2653 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2659 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2665 return ERROR_COMMAND_SYNTAX_ERROR
;
2669 state
= tap_state_by_name( args
[0] );
2671 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2672 return ERROR_COMMAND_SYNTAX_ERROR
;
2674 jtag_add_end_state(state
);
2675 jtag_execute_queue();
2677 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2682 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2689 return ERROR_COMMAND_SYNTAX_ERROR
;
2692 if (args
[0][0] == '1')
2694 else if (args
[0][0] == '0')
2698 return ERROR_COMMAND_SYNTAX_ERROR
;
2701 if (args
[1][0] == '1')
2703 else if (args
[1][0] == '0')
2707 return ERROR_COMMAND_SYNTAX_ERROR
;
2710 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2711 return ERROR_JTAG_INIT_FAILED
;
2713 jtag_add_reset(trst
, srst
);
2714 jtag_execute_queue();
2719 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2723 return ERROR_COMMAND_SYNTAX_ERROR
;
2726 jtag_add_runtest(strtol(args
[0], NULL
, 0), TAP_INVALID
);
2727 jtag_execute_queue();
2733 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2736 scan_field_t
*fields
;
2738 tap_state_t endstate
;
2740 if ((argc
< 2) || (argc
% 2))
2742 return ERROR_COMMAND_SYNTAX_ERROR
;
2745 /* optional "-endstate" */
2747 /* at the end of the arguments. */
2749 endstate
= TAP_INVALID
;
2751 /* have at least one pair of numbers. */
2752 /* is last pair the magic text? */
2753 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2756 cpA
= args
[ argc
-1 ];
2757 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2758 cpS
= tap_state_name( endstate
);
2759 if( 0 == strcmp( cpA
, cpS
) ){
2763 if( endstate
>= TAP_NUM_STATES
){
2764 return ERROR_COMMAND_SYNTAX_ERROR
;
2766 /* found - remove the last 2 args */
2772 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
2774 for (i
= 0; i
< argc
/ 2; i
++)
2776 tap
= jtag_TapByString( args
[i
*2] );
2779 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2782 int field_size
= tap
->ir_length
;
2783 fields
[i
].tap
= tap
;
2784 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2785 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2786 fields
[i
].in_value
= NULL
;
2787 fields
[i
].in_check_mask
= NULL
;
2788 fields
[i
].in_handler
= NULL
;
2789 fields
[i
].in_handler_priv
= NULL
;
2792 jtag_add_ir_scan(argc
/ 2, fields
, TAP_INVALID
);
2793 /* did we have an endstate? */
2794 if (endstate
!= TAP_INVALID
)
2795 jtag_add_end_state(endstate
);
2797 jtag_execute_queue();
2799 for (i
= 0; i
< argc
/ 2; i
++)
2800 free(fields
[i
].out_value
);
2807 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2810 scan_field_t
*fields
;
2812 int field_count
= 0;
2815 tap_state_t endstate
;
2818 * args[2] = num_bits
2819 * args[3] = hex string
2820 * ... repeat num bits and hex string ...
2823 * args[N-2] = "-endstate"
2824 * args[N-1] = statename
2826 if ((argc
< 4) || ((argc
% 2)!=0))
2828 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2832 /* assume no endstate */
2833 endstate
= TAP_INVALID
;
2834 /* validate arguments as numbers */
2836 for (i
= 2; i
< argc
; i
+=2)
2841 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2842 /* If valid - try next arg */
2847 /* Not valid.. are we at the end? */
2848 if ( ((i
+2) != argc
) ){
2849 /* nope, then error */
2853 /* it could be: "-endstate FOO" */
2855 /* get arg as a string. */
2856 cp
= Jim_GetString( args
[i
], NULL
);
2857 /* is it the magic? */
2858 if( 0 == strcmp( "-endstate", cp
) ){
2859 /* is the statename valid? */
2860 cp
= Jim_GetString( args
[i
+1], NULL
);
2862 /* see if it is a valid state name */
2863 endstate
= tap_state_by_name(cp
);
2865 /* update the error message */
2866 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2868 /* valid - so clear the error */
2870 /* and remove the last 2 args */
2875 /* Still an error? */
2877 return e
; /* too bad */
2879 } /* validate args */
2881 tap
= jtag_TapByJimObj( interp
, args
[1] );
2886 num_fields
=(argc
-2)/2;
2887 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2888 for (i
= 2; i
< argc
; i
+=2)
2894 Jim_GetLong(interp
, args
[i
], &bits
);
2895 str
= Jim_GetString(args
[i
+1], &len
);
2897 fields
[field_count
].tap
= tap
;
2898 fields
[field_count
].num_bits
= bits
;
2899 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2900 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2901 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2902 fields
[field_count
].in_check_mask
= NULL
;
2903 fields
[field_count
].in_check_value
= NULL
;
2904 fields
[field_count
].in_handler
= NULL
;
2905 fields
[field_count
++].in_handler_priv
= NULL
;
2908 jtag_add_dr_scan(num_fields
, fields
, TAP_INVALID
);
2909 /* did we get an end state? */
2910 if (endstate
!= TAP_INVALID
)
2911 jtag_add_end_state(endstate
);
2913 retval
= jtag_execute_queue();
2914 if (retval
!= ERROR_OK
)
2916 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2921 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2922 for (i
= 2; i
< argc
; i
+=2)
2927 Jim_GetLong(interp
, args
[i
], &bits
);
2928 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
2929 free(fields
[field_count
].out_value
);
2931 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
2936 Jim_SetResult(interp
, list
);
2943 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2947 if (strcmp(args
[0], "enable") == 0)
2949 jtag_verify_capture_ir
= 1;
2951 else if (strcmp(args
[0], "disable") == 0)
2953 jtag_verify_capture_ir
= 0;
2956 return ERROR_COMMAND_SYNTAX_ERROR
;
2958 } else if (argc
!= 0)
2960 return ERROR_COMMAND_SYNTAX_ERROR
;
2963 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
2968 int jtag_power_dropout(int *dropout
)
2970 return jtag
->power_dropout(dropout
);
2973 int jtag_srst_asserted(int *srst_asserted
)
2975 return jtag
->srst_asserted(srst_asserted
);
2978 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
2980 jtag_tap_event_action_t
* jteap
;
2983 jteap
= tap
->event_action
;
2987 if (jteap
->event
== e
) {
2989 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
2992 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
2993 Jim_GetString(jteap
->body
, NULL
) );
2994 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
2995 Jim_PrintErrorMessage(interp
);
2999 jteap
= jteap
->next
;
3003 LOG_DEBUG( "event %d %s - no action",
3005 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
3009 /*-----<Cable Helper API>---------------------------------------*/
3011 /* these Cable Helper API functions are all documented in the jtag.h header file,
3012 using a Doxygen format. And since Doxygen's configuration file "Doxyfile",
3013 is setup to prefer its docs in the header file, no documentation is here, for
3014 if it were, it would have to be doubly maintained.
3018 * @see tap_set_state() and tap_get_state() accessors.
3019 * Actual name is not important since accessors hide it.
3021 static tap_state_t state_follower
= TAP_RESET
;
3023 void tap_set_state_impl( tap_state_t new_state
)
3025 /* this is the state we think the TAPs are in now, was cur_state */
3026 state_follower
= new_state
;
3029 tap_state_t
tap_get_state()
3031 return state_follower
;
3035 * @see tap_set_end_state() and tap_get_end_state() accessors.
3036 * Actual name is not important because accessors hide it.
3038 static tap_state_t end_state_follower
= TAP_RESET
;
3040 void tap_set_end_state( tap_state_t new_end_state
)
3042 /* this is the state we think the TAPs will be in at completion of the
3043 current TAP operation, was end_state
3045 end_state_follower
= new_end_state
;
3048 tap_state_t
tap_get_end_state()
3050 return end_state_follower
;
3054 int tap_move_ndx( tap_state_t astate
)
3056 /* given a stable state, return the index into the tms_seqs[] array within tap_get_tms_path() */
3062 case TAP_RESET
: ndx
= 0; break;
3063 case TAP_DRSHIFT
: ndx
= 2; break;
3064 case TAP_DRPAUSE
: ndx
= 3; break;
3065 case TAP_IDLE
: ndx
= 1; break;
3066 case TAP_IRSHIFT
: ndx
= 4; break;
3067 case TAP_IRPAUSE
: ndx
= 5; break;
3069 LOG_ERROR( "fatal: unstable state \"%s\" used in tap_move_ndx()", tap_state_name(astate
) );
3077 /* tap_move[i][j]: tap movement command to go from state i to state j
3078 * 0: Test-Logic-Reset
3085 * DRSHIFT->DRSHIFT and IRSHIFT->IRSHIFT have to be caught in interface specific code
3092 } tms_seqs
[6][6] = /* [from_state_ndx][to_state_ndx] */
3094 /* value clocked to TMS to move from one of six stable states to another.
3095 * N.B. OOCD clocks TMS from LSB first, so read these right-to-left.
3096 * N.B. These values are tightly bound to the table in tap_get_tms_path_len().
3097 * N.B. Reset only needs to be 0b11111, but in JLink an even byte of 1's is more stable.
3098 * These extra ones cause no TAP state problem, because we go into reset and stay in reset.
3102 * These macros allow us to specify TMS state transitions by bits rather than hex bytes.
3103 * Read the bits from LSBit first to MSBit last (right-to-left).
3105 #define HEX__(n) 0x##n##LU
3108 (((x) & 0x0000000FLU)?(1<<0):0) \
3109 +(((x) & 0x000000F0LU)?(1<<1):0) \
3110 +(((x) & 0x00000F00LU)?(1<<2):0) \
3111 +(((x) & 0x0000F000LU)?(1<<3):0) \
3112 +(((x) & 0x000F0000LU)?(1<<4):0) \
3113 +(((x) & 0x00F00000LU)?(1<<5):0) \
3114 +(((x) & 0x0F000000LU)?(1<<6):0) \
3115 +(((x) & 0xF0000000LU)?(1<<7):0)
3117 #define B8(bits,count) { ((u8)B8__(HEX__(bits))), (count) }
3119 #if 0 && ((BUILD_FT2232_FTD2XX==1) || (BUILD_FT2232_LIBFTDI==1))
3120 /* this is the table submitted by Jeff Williams on 3/30/2009 with this comment:
3122 OK, I added Peter's version of the state table, and it works OK for
3123 me on MC1322x. I've recreated the jlink portion of patch with this
3124 new state table. His changes to my state table are pretty minor in
3125 terms of total transitions, but Peter feels that his version fixes
3126 some long-standing problems.
3129 I added the bit count into the table, reduced RESET column to 7 bits from 8.
3132 state specific comments:
3133 ------------------------
3134 *->RESET tried the 5 bit reset and it gave me problems, 7 bits seems to
3135 work better on ARM9 with ft2232 driver. (Dick)
3137 RESET->DRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3138 needed on ARM9 with ft2232 driver. (Dick)
3140 RESET->IRSHIFT add 1 extra clock cycles in the RESET state before advancing.
3141 needed on ARM9 with ft2232 driver. (Dick)
3145 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3146 { B8(1111111,7), B8(0,1), B8(00101,5), B8(01010,5), B8(001101,6), B8(010110,6) }, /* RESET */
3147 { B8(1111111,7), B8(0,1), B8(001,3), B8(0101,4), B8(0011,4), B8(01011,5) }, /* IDLE */
3148 { B8(1111111,7), B8(011,3), B8(00111,5), B8(01,2), B8(001111,6), B8(0101111,7) }, /* DRSHIFT */
3149 { B8(1111111,7), B8(011,3), B8(01,2), B8(0,1), B8(001111,6), B8(0101111,7) }, /* DRPAUSE */
3150 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(001111,6), B8(01,2) }, /* IRSHIFT */
3151 { B8(1111111,7), B8(011,3), B8(00111,5), B8(010111,6), B8(01,2), B8(0,1) } /* IRPAUSE */
3153 #else /* this is the old table, converted from hex and with the bit_count set to 7 for each combo, like before */
3156 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */ /* from state: */
3157 { B8(1111111,7), B8(0000000,7), B8(0010111,7), B8(0001010,7), B8(0011011,7), B8(0010110,7) }, /* RESET */
3158 { B8(1111111,7), B8(0000000,7), B8(0100101,7), B8(0000101,7), B8(0101011,7), B8(0001011,7) }, /* IDLE */
3159 { B8(1111111,7), B8(0110001,7), B8(0000000,7), B8(0000001,7), B8(0001111,7), B8(0101111,7) }, /* DRSHIFT */
3160 { B8(1111111,7), B8(0110000,7), B8(0100000,7), B8(0010111,7), B8(0011110,7), B8(0101111,7) }, /* DRPAUSE */
3161 { B8(1111111,7), B8(0110001,7), B8(0000111,7), B8(0010111,7), B8(0000000,7), B8(0000001,7) }, /* IRSHIFT */
3162 { B8(1111111,7), B8(0110000,7), B8(0011100,7), B8(0010111,7), B8(0100000,7), B8(0101111,7) } /* IRPAUSE */
3166 #if 0 /* keeping old hex stuff for awhile, for reference */
3167 /* RESET IDLE DRSHIFT DRPAUSE IRSHIFT IRPAUSE */
3168 { 0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16 }, /* RESET */
3169 { 0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b }, /* IDLE */
3170 { 0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f }, /* DRSHIFT */
3171 { 0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f }, /* DRPAUSE */
3172 { 0x7f, 0x31, 0x07, 0x17, 0x00, 0x01 }, /* IRSHIFT */
3173 { 0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f } /* IRPAUSE */
3178 int tap_get_tms_path( tap_state_t from
, tap_state_t to
)
3180 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bits
;
3184 int tap_get_tms_path_len( tap_state_t from
, tap_state_t to
)
3186 return tms_seqs
[tap_move_ndx(from
)][tap_move_ndx(to
)].bit_count
;
3190 bool tap_is_state_stable(tap_state_t astate
)
3194 /* A switch() is used because it is symbol dependent
3195 (not value dependent like an array), and can also check bounds.
3214 tap_state_t
tap_state_transition(tap_state_t cur_state
, bool tms
)
3216 tap_state_t new_state
;
3218 /* A switch is used because it is symbol dependent and not value dependent
3219 like an array. Also it can check for out of range conditions.
3227 new_state
= cur_state
;
3232 new_state
= TAP_DRSELECT
;
3235 new_state
= TAP_IRSELECT
;
3239 new_state
= TAP_DREXIT1
;
3243 new_state
= TAP_DRUPDATE
;
3246 new_state
= TAP_DREXIT2
;
3249 new_state
= TAP_RESET
;
3253 new_state
= TAP_IREXIT1
;
3257 new_state
= TAP_IRUPDATE
;
3260 new_state
= TAP_IREXIT2
;
3263 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3276 new_state
= TAP_IDLE
;
3279 new_state
= TAP_DRCAPTURE
;
3284 new_state
= TAP_DRSHIFT
;
3288 new_state
= TAP_DRPAUSE
;
3291 new_state
= TAP_IRCAPTURE
;
3296 new_state
= TAP_IRSHIFT
;
3300 new_state
= TAP_IRPAUSE
;
3303 LOG_ERROR( "fatal: invalid argument cur_state=%d", cur_state
);
3312 const char* tap_state_name(tap_state_t state
)
3318 case TAP_RESET
: ret
= "RESET"; break;
3319 case TAP_IDLE
: ret
= "RUN/IDLE"; break;
3320 case TAP_DRSELECT
: ret
= "DRSELECT"; break;
3321 case TAP_DRCAPTURE
: ret
= "DRCAPTURE"; break;
3322 case TAP_DRSHIFT
: ret
= "DRSHIFT"; break;
3323 case TAP_DREXIT1
: ret
= "DREXIT1"; break;
3324 case TAP_DRPAUSE
: ret
= "DRPAUSE"; break;
3325 case TAP_DREXIT2
: ret
= "DREXIT2"; break;
3326 case TAP_DRUPDATE
: ret
= "DRUPDATE"; break;
3327 case TAP_IRSELECT
: ret
= "IRSELECT"; break;
3328 case TAP_IRCAPTURE
: ret
= "IRCAPTURE"; break;
3329 case TAP_IRSHIFT
: ret
= "IRSHIFT"; break;
3330 case TAP_IREXIT1
: ret
= "IREXIT1"; break;
3331 case TAP_IRPAUSE
: ret
= "IRPAUSE"; break;
3332 case TAP_IREXIT2
: ret
= "IREXIT2"; break;
3333 case TAP_IRUPDATE
: ret
= "IRUPDATE"; break;
3334 default: ret
= "???";
3340 static tap_state_t
tap_state_by_name( const char *name
)
3344 for( x
= 0 ; x
< TAP_NUM_STATES
; x
++ ){
3345 /* be nice to the human */
3346 if( 0 == strcasecmp( name
, tap_state_name(x
) ) ){
3354 #ifdef _DEBUG_JTAG_IO_
3356 #define JTAG_DEBUG_STATE_APPEND(buf, len, bit) \
3357 do { buf[len] = bit ? '1' : '0'; } while(0)
3358 #define JTAG_DEBUG_STATE_PRINT(a, b, astr, bstr) \
3359 DEBUG_JTAG_IO("TAP/SM: %9s -> %5s\tTMS: %s\tTDI: %s", \
3360 tap_state_name(a), tap_state_name(b), astr, bstr)
3362 tap_state_t
jtag_debug_state_machine(const void *tms_buf
, const void *tdi_buf
,
3363 unsigned tap_bits
, tap_state_t next_state
)
3365 const u8
*tms_buffer
;
3366 const u8
*tdi_buffer
;
3371 unsigned tap_out_bits
;
3375 tap_state_t last_state
;
3377 // set startstate (and possibly last, if tap_bits == 0)
3378 last_state
= next_state
;
3379 DEBUG_JTAG_IO("TAP/SM: START state: %s", tap_state_name(next_state
));
3381 tms_buffer
= (const u8
*)tms_buf
;
3382 tdi_buffer
= (const u8
*)tdi_buf
;
3384 tap_bytes
= TAP_SCAN_BYTES(tap_bits
);
3385 DEBUG_JTAG_IO("TAP/SM: TMS bits: %u (bytes: %u)", tap_bits
, tap_bytes
);
3388 for(cur_byte
= 0; cur_byte
< tap_bytes
; cur_byte
++)
3390 for(cur_bit
= 0; cur_bit
< 8; cur_bit
++)
3392 // make sure we do not run off the end of the buffers
3393 unsigned tap_bit
= cur_byte
* 8 + cur_bit
;
3394 if (tap_bit
== tap_bits
)
3397 // check and save TMS bit
3398 tap_bit
= !!(tms_buffer
[cur_byte
] & (1 << cur_bit
));
3399 JTAG_DEBUG_STATE_APPEND(tms_str
, tap_out_bits
, tap_bit
);
3401 // use TMS bit to find the next TAP state
3402 next_state
= tap_state_transition(last_state
, tap_bit
);
3404 // check and store TDI bit
3405 tap_bit
= !!(tdi_buffer
[cur_byte
] & (1 << cur_bit
));
3406 JTAG_DEBUG_STATE_APPEND(tdi_str
, tap_out_bits
, tap_bit
);
3408 // increment TAP bits
3411 // Only show TDO bits on state transitions, or
3412 // after some number of bits in the same state.
3413 if ((next_state
== last_state
) && (tap_out_bits
< 32))
3416 // terminate strings and display state transition
3417 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3418 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3421 last_state
= next_state
;
3428 // terminate strings and display state transition
3429 tms_str
[tap_out_bits
] = tdi_str
[tap_out_bits
] = 0;
3430 JTAG_DEBUG_STATE_PRINT(last_state
, next_state
, tms_str
, tdi_str
);
3433 DEBUG_JTAG_IO("TAP/SM: FINAL state: %s", tap_state_name(next_state
));
3437 #endif // _DEBUG_JTAG_IO_
3439 /*-----</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)