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 ***************************************************************************/
32 #include "minidriver.h"
33 #include "interface.h"
40 int jtag_flush_queue_count
; /* count # of flushes for profiling / debugging purposes */
42 static void jtag_add_scan_check(void (*jtag_add_scan
)(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
),
43 int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
);
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 char* jtag_event_strings
[] =
52 "JTAG controller reset (RESET or TRST)"
55 const Jim_Nvp nvp_jtag_tap_event
[] = {
56 { .value
= JTAG_TAP_EVENT_ENABLE
, .name
= "tap-enable" },
57 { .value
= JTAG_TAP_EVENT_DISABLE
, .name
= "tap-disable" },
59 { .name
= NULL
, .value
= -1 }
65 static jtag_tap_t
*jtag_all_taps
= NULL
;
67 enum reset_types jtag_reset_config
= RESET_NONE
;
68 tap_state_t cmd_queue_end_state
= TAP_RESET
;
69 tap_state_t cmd_queue_cur_state
= TAP_RESET
;
71 int jtag_verify_capture_ir
= 1;
74 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
75 static int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
76 static int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
78 /* maximum number of JTAG devices expected in the chain
80 #define JTAG_MAX_CHAIN_SIZE 20
82 /* callbacks to inform high-level handlers about JTAG state changes */
83 jtag_event_callback_t
*jtag_event_callbacks
;
86 static int speed_khz
= 0;
87 /* flag if the kHz speed was defined */
88 static int hasKHz
= 0;
90 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
93 #if BUILD_ECOSBOARD == 1
94 extern jtag_interface_t zy1000_interface
;
97 #if BUILD_PARPORT == 1
98 extern jtag_interface_t parport_interface
;
102 extern jtag_interface_t dummy_interface
;
105 #if BUILD_FT2232_FTD2XX == 1
106 extern jtag_interface_t ft2232_interface
;
109 #if BUILD_FT2232_LIBFTDI == 1
110 extern jtag_interface_t ft2232_interface
;
113 #if BUILD_AMTJTAGACCEL == 1
114 extern jtag_interface_t amt_jtagaccel_interface
;
117 #if BUILD_EP93XX == 1
118 extern jtag_interface_t ep93xx_interface
;
121 #if BUILD_AT91RM9200 == 1
122 extern jtag_interface_t at91rm9200_interface
;
125 #if BUILD_GW16012 == 1
126 extern jtag_interface_t gw16012_interface
;
129 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
130 extern jtag_interface_t presto_interface
;
133 #if BUILD_USBPROG == 1
134 extern jtag_interface_t usbprog_interface
;
138 extern jtag_interface_t jlink_interface
;
141 #if BUILD_VSLLINK == 1
142 extern jtag_interface_t vsllink_interface
;
146 extern jtag_interface_t rlink_interface
;
149 #if BUILD_ARMJTAGEW == 1
150 extern jtag_interface_t armjtagew_interface
;
153 jtag_interface_t
*jtag_interfaces
[] = {
154 #if BUILD_ECOSBOARD == 1
157 #if BUILD_PARPORT == 1
163 #if BUILD_FT2232_FTD2XX == 1
166 #if BUILD_FT2232_LIBFTDI == 1
169 #if BUILD_AMTJTAGACCEL == 1
170 &amt_jtagaccel_interface
,
172 #if BUILD_EP93XX == 1
175 #if BUILD_AT91RM9200 == 1
176 &at91rm9200_interface
,
178 #if BUILD_GW16012 == 1
181 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
184 #if BUILD_USBPROG == 1
190 #if BUILD_VSLLINK == 1
196 #if BUILD_ARMJTAGEW == 1
197 &armjtagew_interface
,
202 struct jtag_interface_s
*jtag
= NULL
;
205 static jtag_interface_t
*jtag_interface
= NULL
;
209 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
210 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
211 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
212 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
213 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
214 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
215 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
217 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
219 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
220 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
221 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
222 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
223 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
);
224 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
);
226 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
227 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
228 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
230 jtag_tap_t
*jtag_AllTaps(void)
232 return jtag_all_taps
;
235 int jtag_NumTotalTaps(void)
249 int jtag_NumEnabledTaps(void)
265 jtag_tap_t
*jtag_TapByString( const char *s
)
273 if( 0 == strcmp( t
->dotted_name
, s
) ){
279 /* backup plan is by number */
281 /* ok - is "s" a number? */
283 n
= strtol( s
, &cp
, 0 );
284 if( (s
!= cp
) && (*cp
== 0) ){
286 t
= jtag_TapByAbsPosition(n
);
292 jtag_tap_t
* jtag_TapByJimObj( Jim_Interp
*interp
, Jim_Obj
*o
)
297 cp
= Jim_GetString( o
, NULL
);
302 t
= jtag_TapByString( cp
);
305 Jim_SetResult_sprintf(interp
,"Tap: %s is unknown", cp
);
310 /* returns a pointer to the n-th device in the scan chain */
311 jtag_tap_t
* jtag_TapByAbsPosition( int n
)
319 while( t
&& (n
> 0)) {
326 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
328 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
330 if (callback
== NULL
)
332 return ERROR_INVALID_ARGUMENTS
;
337 while ((*callbacks_p
)->next
)
338 callbacks_p
= &((*callbacks_p
)->next
);
339 callbacks_p
= &((*callbacks_p
)->next
);
342 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
343 (*callbacks_p
)->callback
= callback
;
344 (*callbacks_p
)->priv
= priv
;
345 (*callbacks_p
)->next
= NULL
;
350 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
352 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
354 if (callback
== NULL
)
356 return ERROR_INVALID_ARGUMENTS
;
361 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
362 if ((*callbacks_p
)->callback
== callback
)
365 *callbacks_p
= *next
;
373 int jtag_call_event_callbacks(enum jtag_event event
)
375 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
377 LOG_DEBUG("jtag event: %s", jtag_event_strings
[event
]);
381 callback
->callback(event
, callback
->priv
);
382 callback
= callback
->next
;
388 static void jtag_checks(void)
390 assert(jtag_trst
== 0);
393 static void jtag_prelude(tap_state_t state
)
397 if (state
!= TAP_INVALID
)
398 jtag_add_end_state(state
);
400 cmd_queue_cur_state
= cmd_queue_end_state
;
403 void jtag_alloc_in_value32(scan_field_t
*field
)
405 interface_jtag_alloc_in_value32(field
);
408 void jtag_add_ir_scan_noverify(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
413 retval
=interface_jtag_add_ir_scan(in_num_fields
, in_fields
, cmd_queue_end_state
);
414 if (retval
!=ERROR_OK
)
421 * Generate an IR SCAN with a list of scan fields with one entry for each enabled TAP.
423 * If the input field list contains an instruction value for a TAP then that is used
424 * otherwise the TAP is set to bypass.
426 * TAPs for which no fields are passed are marked as bypassed for subsequent DR SCANs.
429 void jtag_add_ir_scan(int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
431 if (jtag_verify
&&jtag_verify_capture_ir
)
433 /* 8 x 32 bit id's is enough for all invocations */
435 for (int j
= 0; j
< in_num_fields
; j
++)
437 /* if we are to run a verification of the ir scan, we need to get the input back.
438 * We may have to allocate space if the caller didn't ask for the input back.
440 in_fields
[j
].check_value
=in_fields
[j
].tap
->expected
;
441 in_fields
[j
].check_mask
=in_fields
[j
].tap
->expected_mask
;
443 jtag_add_scan_check(jtag_add_ir_scan_noverify
, in_num_fields
, in_fields
, state
);
446 jtag_add_ir_scan_noverify(in_num_fields
, in_fields
, state
);
451 * Duplicate the scan fields passed into the function into an IR SCAN command
453 * This function assumes that the caller handles extra fields for bypassed TAPs
456 void jtag_add_plain_ir_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
462 retval
=interface_jtag_add_plain_ir_scan(in_num_fields
, in_fields
, cmd_queue_end_state
);
463 if (retval
!=ERROR_OK
)
467 void jtag_add_callback(jtag_callback1_t f
, u8
*in
)
469 interface_jtag_add_callback(f
, in
);
472 void jtag_add_callback4(jtag_callback_t f
, u8
*in
,
473 jtag_callback_data_t data1
, jtag_callback_data_t data2
,
474 jtag_callback_data_t data3
)
476 interface_jtag_add_callback4(f
, in
, data1
, data2
, data3
);
479 int jtag_check_value_inner(u8
*captured
, u8
*in_check_value
, u8
*in_check_mask
, int num_bits
);
481 static int jtag_check_value_mask_callback(u8
*in
, jtag_callback_data_t data1
, jtag_callback_data_t data2
, jtag_callback_data_t data3
)
483 return jtag_check_value_inner(in
, (u8
*)data1
, (u8
*)data2
, (int)data3
);
486 static void jtag_add_scan_check(void (*jtag_add_scan
)(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
),
487 int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
489 for (int i
= 0; i
< in_num_fields
; i
++)
491 struct scan_field_s
*field
= &in_fields
[i
];
492 field
->allocated
= 0;
494 if (field
->check_value
|| field
->in_value
)
496 interface_jtag_add_scan_check_alloc(field
);
500 jtag_add_scan(in_num_fields
, in_fields
, state
);
502 for (int i
= 0; i
< in_num_fields
; i
++)
504 if ((in_fields
[i
].check_value
!= NULL
) && (in_fields
[i
].in_value
!= NULL
))
506 /* this is synchronous for a minidriver */
507 jtag_add_callback4(jtag_check_value_mask_callback
, in_fields
[i
].in_value
,
508 (jtag_callback_data_t
)in_fields
[i
].check_value
,
509 (jtag_callback_data_t
)in_fields
[i
].check_mask
,
510 (jtag_callback_data_t
)in_fields
[i
].num_bits
);
512 if (in_fields
[i
].allocated
)
514 free(in_fields
[i
].in_value
);
516 if (in_fields
[i
].modified
)
518 in_fields
[i
].in_value
= NULL
;
523 void jtag_add_dr_scan_check(int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
527 jtag_add_scan_check(jtag_add_dr_scan
, in_num_fields
, in_fields
, state
);
530 jtag_add_dr_scan(in_num_fields
, in_fields
, state
);
536 * Generate a DR SCAN using the fields passed to the function
538 * For not bypassed TAPs the function checks in_fields and uses fields specified there.
539 * For bypassed TAPs the function generates a dummy 1bit field.
541 * The bypass status of TAPs is set by jtag_add_ir_scan().
544 void jtag_add_dr_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
550 retval
=interface_jtag_add_dr_scan(in_num_fields
, in_fields
, cmd_queue_end_state
);
551 if (retval
!=ERROR_OK
)
558 * Duplicate the scan fields passed into the function into a DR SCAN command
560 * This function assumes that the caller handles extra fields for bypassed TAPs
563 void jtag_add_plain_dr_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
569 retval
=interface_jtag_add_plain_dr_scan(in_num_fields
, in_fields
, cmd_queue_end_state
);
570 if (retval
!=ERROR_OK
)
574 void jtag_add_dr_out(jtag_tap_t
* tap
,
575 int num_fields
, const int* num_bits
, const u32
* value
,
576 tap_state_t end_state
)
578 if (end_state
!= TAP_INVALID
)
579 cmd_queue_end_state
= end_state
;
581 cmd_queue_cur_state
= cmd_queue_end_state
;
583 interface_jtag_add_dr_out(tap
,
584 num_fields
, num_bits
, value
,
585 cmd_queue_end_state
);
588 void jtag_add_tlr(void)
590 jtag_prelude(TAP_RESET
);
593 retval
=interface_jtag_add_tlr();
594 if (retval
!=ERROR_OK
)
597 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
600 void jtag_add_pathmove(int num_states
, const tap_state_t
*path
)
602 tap_state_t cur_state
= cmd_queue_cur_state
;
606 /* the last state has to be a stable state */
607 if (!tap_is_state_stable(path
[num_states
- 1]))
609 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
613 for (i
=0; i
<num_states
; i
++)
615 if (path
[i
] == TAP_RESET
)
617 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
621 if ( tap_state_transition(cur_state
, true) != path
[i
]
622 && tap_state_transition(cur_state
, false) != path
[i
])
624 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
632 retval
= interface_jtag_add_pathmove(num_states
, path
);
633 cmd_queue_cur_state
= path
[num_states
- 1];
634 if (retval
!=ERROR_OK
)
638 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
644 /* executed by sw or hw fifo */
645 retval
=interface_jtag_add_runtest(num_cycles
, cmd_queue_end_state
);
646 if (retval
!=ERROR_OK
)
651 void jtag_add_clocks( int num_cycles
)
655 if( !tap_is_state_stable(cmd_queue_cur_state
) )
657 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
658 tap_state_name(cmd_queue_cur_state
) );
659 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
667 retval
= interface_jtag_add_clocks(num_cycles
);
668 if (retval
!= ERROR_OK
)
673 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
675 int trst_with_tlr
= 0;
678 /* FIX!!! there are *many* different cases here. A better
679 * approach is needed for legal combinations of transitions...
681 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
682 (jtag_reset_config
& RESET_HAS_TRST
)&&
683 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
685 if (((req_tlr_or_trst
&&!jtag_trst
)||
686 (!req_tlr_or_trst
&&jtag_trst
))&&
687 ((req_srst
&&!jtag_srst
)||
688 (!req_srst
&&jtag_srst
)))
690 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
691 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
695 /* Make sure that jtag_reset_config allows the requested reset */
696 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
697 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
699 LOG_ERROR("BUG: requested reset would assert trst");
700 jtag_error
=ERROR_FAIL
;
704 /* if TRST pulls SRST, we reset with TAP T-L-R */
705 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
710 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
712 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
713 jtag_error
=ERROR_FAIL
;
719 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
731 jtag_srst
= req_srst
;
733 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
734 if (retval
!=ERROR_OK
)
739 jtag_execute_queue();
743 LOG_DEBUG("SRST line asserted");
747 LOG_DEBUG("SRST line released");
748 if (jtag_nsrst_delay
)
749 jtag_add_sleep(jtag_nsrst_delay
* 1000);
754 LOG_DEBUG("JTAG reset with RESET instead of TRST");
755 jtag_add_end_state(TAP_RESET
);
762 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
763 * and inform possible listeners about this
765 LOG_DEBUG("TRST line asserted");
766 tap_set_state(TAP_RESET
);
767 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
771 if (jtag_ntrst_delay
)
772 jtag_add_sleep(jtag_ntrst_delay
* 1000);
776 void jtag_add_end_state(tap_state_t state
)
778 cmd_queue_end_state
= state
;
779 if ((cmd_queue_end_state
== TAP_DRSHIFT
)||(cmd_queue_end_state
== TAP_IRSHIFT
))
781 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
785 void jtag_add_sleep(u32 us
)
787 keep_alive(); /* we might be running on a very slow JTAG clk */
788 int retval
=interface_jtag_add_sleep(us
);
789 if (retval
!=ERROR_OK
)
794 static const char *jtag_tap_name(const jtag_tap_t
*tap
)
796 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
799 int jtag_check_value_inner(u8
*captured
, u8
*in_check_value
, u8
*in_check_mask
, int num_bits
)
801 int retval
= ERROR_OK
;
803 int compare_failed
= 0;
806 compare_failed
= buf_cmp_mask(captured
, in_check_value
, in_check_mask
, num_bits
);
808 compare_failed
= buf_cmp(captured
, in_check_value
, num_bits
);
811 /* An error handler could have caught the failing check
812 * only report a problem when there wasn't a handler, or if the handler
813 * acknowledged the error
816 LOG_WARNING("TAP %s:",
817 jtag_tap_name(field->tap));
821 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
822 char *in_check_value_char
= buf_to_str(in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
826 char *in_check_mask_char
;
827 in_check_mask_char
= buf_to_str(in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
828 LOG_WARNING("value captured during scan didn't pass the requested check:");
829 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
830 captured_char
, in_check_value_char
, in_check_mask_char
);
831 free(in_check_mask_char
);
835 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
);
839 free(in_check_value_char
);
841 retval
= ERROR_JTAG_QUEUE_FAILED
;
848 void jtag_check_value_mask(scan_field_t
*field
, u8
*value
, u8
*mask
)
850 assert(field
->in_value
!= NULL
);
854 /* no checking to do */
858 jtag_execute_queue_noclear();
860 int retval
=jtag_check_value_inner(field
->in_value
, value
, mask
, field
->num_bits
);
861 jtag_set_error(retval
);
866 int default_interface_jtag_execute_queue(void)
870 LOG_ERROR("No JTAG interface configured yet. "
871 "Issue 'init' command in startup scripts "
872 "before communicating with targets.");
876 return jtag
->execute_queue();
879 void jtag_execute_queue_noclear(void)
881 /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces.
882 * E.g. a JTAG over TCP/IP or USB....
884 jtag_flush_queue_count
++;
886 int retval
=interface_jtag_execute_queue();
887 /* we keep the first error */
888 if ((jtag_error
==ERROR_OK
)&&(retval
!=ERROR_OK
))
894 int jtag_execute_queue(void)
897 jtag_execute_queue_noclear();
903 int jtag_reset_callback(enum jtag_event event
, void *priv
)
905 jtag_tap_t
*tap
= priv
;
909 if (event
== JTAG_TRST_ASSERTED
)
911 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
918 void jtag_sleep(u32 us
)
920 alive_sleep(us
/1000);
923 /* Try to examine chain layout according to IEEE 1149.1 §12
925 int jtag_examine_chain(void)
929 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
932 int device_count
= 0;
937 field
.num_bits
= sizeof(idcode_buffer
) * 8;
938 field
.out_value
= idcode_buffer
;
940 field
.in_value
= idcode_buffer
;
945 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
947 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
950 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
951 jtag_execute_queue();
953 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
955 zero_check
|= idcode_buffer
[i
];
956 one_check
&= idcode_buffer
[i
];
959 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
960 if ((zero_check
== 0x00) || (one_check
== 0xff))
962 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
963 return ERROR_JTAG_INIT_FAILED
;
966 /* point at the 1st tap */
967 tap
= jtag_NextEnabledTap(NULL
);
969 LOG_ERROR("JTAG: No taps enabled?");
970 return ERROR_JTAG_INIT_FAILED
;
973 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
975 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
976 if ((idcode
& 1) == 0)
978 /* LSB must not be 0, this indicates a device in bypass */
979 LOG_WARNING("Tap/Device does not have IDCODE");
990 /* some devices, such as AVR will output all 1's instead of TDI
991 input value at end of chain. */
992 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
995 /* End of chain (invalid manufacturer ID)
997 * The JTAG examine is the very first thing that happens
999 * A single JTAG device requires only 64 bits to be read back correctly.
1001 * The code below adds a check that the rest of the data scanned (640 bits)
1002 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1004 * earlier and gives more helpful/explicit error messages.
1006 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1008 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1009 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1011 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1019 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1020 manufacturer
= EXTRACT_MFG(idcode
);
1021 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1022 part
= EXTRACT_PART(idcode
);
1023 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1024 version
= EXTRACT_VER(idcode
);
1026 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1027 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1028 idcode
, manufacturer
, part
, version
);
1034 tap
->idcode
= idcode
;
1036 if (tap
->expected_ids_cnt
> 0) {
1037 /* Loop over the expected identification codes and test for a match */
1039 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1040 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1045 /* If none of the expected ids matched, log an error */
1046 if (ii
== tap
->expected_ids_cnt
) {
1047 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1050 EXTRACT_MFG( tap
->idcode
),
1051 EXTRACT_PART( tap
->idcode
),
1052 EXTRACT_VER( tap
->idcode
) );
1053 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1054 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1057 tap
->expected_ids_cnt
,
1058 tap
->expected_ids
[ii
],
1059 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1060 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1061 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1064 return ERROR_JTAG_INIT_FAILED
;
1066 LOG_INFO("JTAG Tap/device matched");
1070 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1074 tap
= jtag_NextEnabledTap(tap
);
1079 /* see if number of discovered devices matches configuration */
1080 if (device_count
!= jtag_NumEnabledTaps())
1082 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1083 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1084 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1085 return ERROR_JTAG_INIT_FAILED
;
1091 int jtag_validate_chain(void)
1094 int total_ir_length
= 0;
1100 total_ir_length
= 0;
1102 tap
= jtag_NextEnabledTap(tap
);
1106 total_ir_length
+= tap
->ir_length
;
1109 total_ir_length
+= 2;
1110 ir_test
= malloc(CEIL(total_ir_length
, 8));
1111 buf_set_ones(ir_test
, total_ir_length
);
1114 field
.num_bits
= total_ir_length
;
1115 field
.out_value
= ir_test
;
1116 field
.in_value
= ir_test
;
1119 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1120 jtag_execute_queue();
1126 tap
= jtag_NextEnabledTap(tap
);
1131 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1134 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1135 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
);
1138 return ERROR_JTAG_INIT_FAILED
;
1140 chain_pos
+= tap
->ir_length
;
1143 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1146 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1147 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
);
1150 return ERROR_JTAG_INIT_FAILED
;
1158 enum jtag_tap_cfg_param
{
1162 static Jim_Nvp nvp_config_opts
[] = {
1163 { .name
= "-event", .value
= JCFG_EVENT
},
1165 { .name
= NULL
, .value
= -1 }
1168 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1174 /* parse config or cget options */
1175 while (goi
->argc
> 0) {
1176 Jim_SetEmptyResult (goi
->interp
);
1178 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1180 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1186 if (goi
->argc
== 0) {
1187 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1191 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1193 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1197 if (goi
->isconfigure
) {
1198 if (goi
->argc
!= 1) {
1199 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1203 if (goi
->argc
!= 0) {
1204 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1210 jtag_tap_event_action_t
*jteap
;
1212 jteap
= tap
->event_action
;
1213 /* replace existing? */
1215 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1218 jteap
= jteap
->next
;
1221 if (goi
->isconfigure
) {
1222 if (jteap
== NULL
) {
1224 jteap
= calloc(1, sizeof (*jteap
));
1226 jteap
->event
= n
->value
;
1227 Jim_GetOpt_Obj( goi
, &o
);
1229 Jim_DecrRefCount(interp
, jteap
->body
);
1231 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1232 Jim_IncrRefCount(jteap
->body
);
1234 /* add to head of event list */
1235 jteap
->next
= tap
->event_action
;
1236 tap
->event_action
= jteap
;
1237 Jim_SetEmptyResult(goi
->interp
);
1240 if (jteap
== NULL
) {
1241 Jim_SetEmptyResult(goi
->interp
);
1243 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1250 } /* while (goi->argc) */
1255 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1265 const Jim_Nvp opts
[] = {
1266 #define NTAP_OPT_IRLEN 0
1267 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1268 #define NTAP_OPT_IRMASK 1
1269 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1270 #define NTAP_OPT_IRCAPTURE 2
1271 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1272 #define NTAP_OPT_ENABLED 3
1273 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1274 #define NTAP_OPT_DISABLED 4
1275 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1276 #define NTAP_OPT_EXPECTED_ID 5
1277 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1278 { .name
= NULL
, .value
= -1 },
1281 pTap
= malloc( sizeof(jtag_tap_t
) );
1282 memset( pTap
, 0, sizeof(*pTap
) );
1284 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1288 * we expect CHIP + TAP + OPTIONS
1290 if( goi
->argc
< 3 ){
1291 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1294 Jim_GetOpt_String( goi
, &cp
, NULL
);
1295 pTap
->chip
= strdup(cp
);
1297 Jim_GetOpt_String( goi
, &cp
, NULL
);
1298 pTap
->tapname
= strdup(cp
);
1300 /* name + dot + name + null */
1301 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1303 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1304 pTap
->dotted_name
= cp
;
1306 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1307 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1309 /* default is enabled */
1312 /* deal with options */
1313 #define NTREQ_IRLEN 1
1314 #define NTREQ_IRCAPTURE 2
1315 #define NTREQ_IRMASK 4
1317 /* clear them as we find them */
1318 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1321 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1323 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1326 LOG_DEBUG("Processing option: %s", n
->name
);
1328 case NTAP_OPT_ENABLED
:
1331 case NTAP_OPT_DISABLED
:
1334 case NTAP_OPT_EXPECTED_ID
:
1336 u32
*new_expected_ids
;
1338 e
= Jim_GetOpt_Wide( goi
, &w
);
1340 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1344 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1345 if (new_expected_ids
== NULL
) {
1346 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1350 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1352 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1354 free(pTap
->expected_ids
);
1355 pTap
->expected_ids
= new_expected_ids
;
1356 pTap
->expected_ids_cnt
++;
1359 case NTAP_OPT_IRLEN
:
1360 case NTAP_OPT_IRMASK
:
1361 case NTAP_OPT_IRCAPTURE
:
1362 e
= Jim_GetOpt_Wide( goi
, &w
);
1364 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1367 if( (w
< 0) || (w
> 0xffff) ){
1369 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1370 n
->name
, (int)(w
), (int)(w
));
1374 case NTAP_OPT_IRLEN
:
1375 pTap
->ir_length
= w
;
1376 reqbits
&= (~(NTREQ_IRLEN
));
1378 case NTAP_OPT_IRMASK
:
1379 pTap
->ir_capture_mask
= w
;
1380 reqbits
&= (~(NTREQ_IRMASK
));
1382 case NTAP_OPT_IRCAPTURE
:
1383 pTap
->ir_capture_value
= w
;
1384 reqbits
&= (~(NTREQ_IRCAPTURE
));
1387 } /* switch(n->value) */
1388 } /* while( goi->argc ) */
1390 /* Did we get all the options? */
1393 Jim_SetResult_sprintf( goi
->interp
,
1394 "newtap: %s missing required parameters",
1396 /* TODO: Tell user what is missing :-( */
1397 /* no memory leaks pelase */
1398 free(((void *)(pTap
->expected_ids
)));
1399 free(((void *)(pTap
->chip
)));
1400 free(((void *)(pTap
->tapname
)));
1401 free(((void *)(pTap
->dotted_name
)));
1402 free(((void *)(pTap
)));
1406 pTap
->expected
= malloc( pTap
->ir_length
);
1407 pTap
->expected_mask
= malloc( pTap
->ir_length
);
1408 pTap
->cur_instr
= malloc( pTap
->ir_length
);
1410 buf_set_u32( pTap
->expected
,
1413 pTap
->ir_capture_value
);
1414 buf_set_u32( pTap
->expected_mask
,
1417 pTap
->ir_capture_mask
);
1418 buf_set_ones( pTap
->cur_instr
,
1423 jtag_register_event_callback(jtag_reset_callback
, pTap
);
1425 ppTap
= &(jtag_all_taps
);
1426 while( (*ppTap
) != NULL
){
1427 ppTap
= &((*ppTap
)->next_tap
);
1431 static int n_taps
= 0;
1432 pTap
->abs_chain_position
= n_taps
++;
1434 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
1435 (*ppTap
)->dotted_name
,
1436 (*ppTap
)->abs_chain_position
,
1437 (*ppTap
)->ir_length
,
1438 (*ppTap
)->ir_capture_value
,
1439 (*ppTap
)->ir_capture_mask
);
1444 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
1450 struct command_context_s
*context
;
1454 JTAG_CMD_INIT_RESET
,
1457 JTAG_CMD_TAPDISABLE
,
1458 JTAG_CMD_TAPISENABLED
,
1463 const Jim_Nvp jtag_cmds
[] = {
1464 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
1465 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
1466 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
1467 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
1468 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
1469 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
1470 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
1471 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
1473 { .name
= NULL
, .value
= -1 },
1476 context
= Jim_GetAssocData(interp
, "context");
1477 /* go past the command */
1478 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
1480 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
1482 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
1485 Jim_SetEmptyResult( goi
.interp
);
1487 case JTAG_CMD_INTERFACE
:
1488 /* return the name of the interface */
1489 /* TCL code might need to know the exact type... */
1490 /* FUTURE: we allow this as a means to "set" the interface. */
1491 if( goi
.argc
!= 0 ){
1492 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
1495 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
1497 case JTAG_CMD_INIT_RESET
:
1498 if( goi
.argc
!= 0 ){
1499 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
1502 e
= jtag_init_reset(context
);
1503 if( e
!= ERROR_OK
){
1504 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
1508 case JTAG_CMD_NEWTAP
:
1509 return jim_newtap_cmd( &goi
);
1511 case JTAG_CMD_TAPISENABLED
:
1512 case JTAG_CMD_TAPENABLE
:
1513 case JTAG_CMD_TAPDISABLE
:
1514 if( goi
.argc
!= 1 ){
1515 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
1521 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
1526 case JTAG_CMD_TAPISENABLED
:
1529 case JTAG_CMD_TAPENABLE
:
1530 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
1534 case JTAG_CMD_TAPDISABLE
:
1535 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
1540 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
1547 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
1554 Jim_GetOpt_Obj(&goi
, &o
);
1555 t
= jtag_TapByJimObj( goi
.interp
, o
);
1560 goi
.isconfigure
= 0;
1561 return jtag_tap_configure_cmd( &goi
, t
);
1565 case JTAG_CMD_CONFIGURE
:
1567 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
1574 Jim_GetOpt_Obj(&goi
, &o
);
1575 t
= jtag_TapByJimObj( goi
.interp
, o
);
1580 goi
.isconfigure
= 1;
1581 return jtag_tap_configure_cmd( &goi
, t
);
1588 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
1590 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
1592 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
1593 COMMAND_CONFIG
, "try to configure interface");
1594 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
1595 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
1596 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
1597 COMMAND_ANY
, "set maximum jtag speed (if supported); "
1598 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
1599 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
1600 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
1601 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
1603 "[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]");
1604 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
1605 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
1606 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
1607 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
1609 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
1610 COMMAND_EXEC
, "print current scan chain configuration");
1612 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
1613 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
1614 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
1615 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
1616 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
1617 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
1618 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
1619 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
1620 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
1621 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
1623 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
1624 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
1625 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
1626 COMMAND_ANY
, "verify value capture <enable|disable>");
1627 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
1628 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
1632 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
1637 if (!jtag_interface
)
1639 /* nothing was previously specified by "interface" command */
1640 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
1641 return ERROR_JTAG_INVALID_INTERFACE
;
1645 jtag_interface
->khz(speed_khz
, &jtag_speed
);
1649 if (jtag_interface
->init() != ERROR_OK
)
1650 return ERROR_JTAG_INIT_FAILED
;
1652 jtag
= jtag_interface
;
1656 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
1661 LOG_DEBUG("Init JTAG chain");
1663 tap
= jtag_NextEnabledTap(NULL
);
1665 LOG_ERROR("There are no enabled taps?");
1666 return ERROR_JTAG_INIT_FAILED
;
1670 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
1673 /* examine chain first, as this could discover the real chain layout */
1674 if (jtag_examine_chain() != ERROR_OK
)
1676 LOG_ERROR("trying to validate configured JTAG chain anyway...");
1679 if (jtag_validate_chain() != ERROR_OK
)
1681 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
1687 int jtag_interface_quit(void)
1689 if (!jtag
|| !jtag
->quit
)
1692 // close the JTAG interface
1693 int result
= jtag
->quit();
1694 if (ERROR_OK
!= result
)
1695 LOG_ERROR("failed: %d", result
);
1701 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
1705 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
1708 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
1710 /* Reset can happen after a power cycle.
1712 * Ideally we would only assert TRST or run RESET before the target reset.
1714 * However w/srst_pulls_trst, trst is asserted together with the target
1715 * reset whether we want it or not.
1717 * NB! Some targets have JTAG circuitry disabled until a
1718 * trst & srst has been asserted.
1720 * NB! here we assume nsrst/ntrst delay are sufficient!
1722 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
1725 jtag_add_reset(1, 0); /* RESET or TRST */
1726 if (jtag_reset_config
& RESET_HAS_SRST
)
1728 jtag_add_reset(1, 1);
1729 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
1730 jtag_add_reset(0, 1);
1732 jtag_add_reset(0, 0);
1733 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1736 /* Check that we can communication on the JTAG chain + eventually we want to
1737 * be able to perform enumeration only after OpenOCD has started
1738 * telnet and GDB server
1740 * That would allow users to more easily perform any magic they need to before
1743 return jtag_init_inner(cmd_ctx
);
1746 int jtag_init(struct command_context_s
*cmd_ctx
)
1749 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
1751 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
1755 return jtag_init_reset(cmd_ctx
);
1758 static int default_khz(int khz
, int *jtag_speed
)
1760 LOG_ERROR("Translation from khz to jtag_speed not implemented");
1764 static int default_speed_div(int speed
, int *khz
)
1766 LOG_ERROR("Translation from jtag_speed to khz not implemented");
1770 static int default_power_dropout(int *dropout
)
1772 *dropout
=0; /* by default we can't detect power dropout */
1776 static int default_srst_asserted(int *srst_asserted
)
1778 *srst_asserted
=0; /* by default we can't detect srst asserted */
1782 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1787 /* check whether the interface is already configured */
1790 LOG_WARNING("Interface already configured, ignoring");
1794 /* interface name is a mandatory argument */
1795 if (argc
< 1 || args
[0][0] == '\0')
1797 return ERROR_COMMAND_SYNTAX_ERROR
;
1800 for (i
=0; jtag_interfaces
[i
]; i
++)
1802 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
1804 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
1809 jtag_interface
= jtag_interfaces
[i
];
1811 if (jtag_interface
->khz
== NULL
)
1813 jtag_interface
->khz
= default_khz
;
1815 if (jtag_interface
->speed_div
== NULL
)
1817 jtag_interface
->speed_div
= default_speed_div
;
1819 if (jtag_interface
->power_dropout
== NULL
)
1821 jtag_interface
->power_dropout
= default_power_dropout
;
1823 if (jtag_interface
->srst_asserted
== NULL
)
1825 jtag_interface
->srst_asserted
= default_srst_asserted
;
1832 /* no valid interface was found (i.e. the configuration option,
1833 * didn't match one of the compiled-in interfaces
1835 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
1836 LOG_ERROR("compiled-in jtag interfaces:");
1837 for (i
= 0; jtag_interfaces
[i
]; i
++)
1839 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
1842 return ERROR_JTAG_INVALID_INTERFACE
;
1845 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1849 Jim_Obj
*newargs
[ 10 ];
1852 * argv[-1] = command
1853 * argv[ 0] = ir length
1854 * argv[ 1] = ir capture
1855 * argv[ 2] = ir mask
1856 * argv[ 3] = not actually used by anything but in the docs
1860 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
1863 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
1864 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
1868 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
1869 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
1870 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
1871 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
1873 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
1874 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
1875 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
1876 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
1877 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
1878 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
1879 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
1880 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
1881 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
1882 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
1883 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
1884 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
1886 command_print( cmd_ctx
, "NEW COMMAND:");
1887 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
1888 Jim_GetString( newargs
[0], NULL
),
1889 Jim_GetString( newargs
[1], NULL
),
1890 Jim_GetString( newargs
[2], NULL
),
1891 Jim_GetString( newargs
[3], NULL
),
1892 Jim_GetString( newargs
[4], NULL
),
1893 Jim_GetString( newargs
[5], NULL
),
1894 Jim_GetString( newargs
[6], NULL
),
1895 Jim_GetString( newargs
[7], NULL
),
1896 Jim_GetString( newargs
[8], NULL
),
1897 Jim_GetString( newargs
[9], NULL
) );
1899 e
= jim_jtag_command( interp
, 10, newargs
);
1901 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
1906 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1910 tap
= jtag_all_taps
;
1911 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
1912 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
1915 u32 expected
, expected_mask
, cur_instr
, ii
;
1916 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
1917 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
1918 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
1920 command_print(cmd_ctx
,
1921 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
1922 tap
->abs_chain_position
,
1924 tap
->enabled
? 'Y' : 'n',
1926 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
1932 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
1933 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
1934 tap
->expected_ids
[ii
]);
1937 tap
= tap
->next_tap
;
1943 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1949 return ERROR_COMMAND_SYNTAX_ERROR
;
1951 /* Original versions cared about the order of these tokens:
1952 * reset_config signals [combination [trst_type [srst_type]]]
1953 * They also clobbered the previous configuration even on error.
1955 * Here we don't care about the order, and only change values
1956 * which have been explicitly specified.
1958 for (; argc
; argc
--, args
++) {
1963 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1964 if (strcmp(*args
, "none") == 0)
1966 else if (strcmp(*args
, "trst_only") == 0)
1967 tmp
= RESET_HAS_TRST
;
1968 else if (strcmp(*args
, "srst_only") == 0)
1969 tmp
= RESET_HAS_SRST
;
1970 else if (strcmp(*args
, "trst_and_srst") == 0)
1971 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1975 LOG_ERROR("extra reset_config %s spec (%s)",
1977 return ERROR_INVALID_ARGUMENTS
;
1982 /* combination (options for broken wiring) */
1983 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1984 if (strcmp(*args
, "separate") == 0)
1985 /* separate reset lines - default */;
1986 else if (strcmp(*args
, "srst_pulls_trst") == 0)
1987 tmp
|= RESET_SRST_PULLS_TRST
;
1988 else if (strcmp(*args
, "trst_pulls_srst") == 0)
1989 tmp
|= RESET_TRST_PULLS_SRST
;
1990 else if (strcmp(*args
, "combined") == 0)
1991 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1995 LOG_ERROR("extra reset_config %s spec (%s)",
1996 "combination", *args
);
1997 return ERROR_INVALID_ARGUMENTS
;
2002 /* trst_type (NOP without HAS_TRST) */
2003 m
= RESET_TRST_OPEN_DRAIN
;
2004 if (strcmp(*args
, "trst_open_drain") == 0)
2005 tmp
|= RESET_TRST_OPEN_DRAIN
;
2006 else if (strcmp(*args
, "trst_push_pull") == 0)
2007 /* push/pull from adapter - default */;
2011 LOG_ERROR("extra reset_config %s spec (%s)",
2012 "trst_type", *args
);
2013 return ERROR_INVALID_ARGUMENTS
;
2018 /* srst_type (NOP without HAS_SRST) */
2019 m
|= RESET_SRST_PUSH_PULL
;
2020 if (strcmp(*args
, "srst_push_pull") == 0)
2021 tmp
|= RESET_SRST_PUSH_PULL
;
2022 else if (strcmp(*args
, "srst_open_drain") == 0)
2023 /* open drain from adapter - default */;
2027 LOG_ERROR("extra reset_config %s spec (%s)",
2028 "srst_type", *args
);
2029 return ERROR_INVALID_ARGUMENTS
;
2034 /* caller provided nonsense; fail */
2035 LOG_ERROR("unknown reset_config flag (%s)", *args
);
2036 return ERROR_INVALID_ARGUMENTS
;
2039 /* Remember the bits which were specified (mask)
2040 * and their new values (new_cfg).
2046 /* clear previous values of those bits, save new values */
2047 jtag_reset_config
&= ~mask
;
2048 jtag_reset_config
|= new_cfg
;
2053 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2057 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2062 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2068 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2072 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2077 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2083 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2085 int retval
=ERROR_OK
;
2089 LOG_DEBUG("handle jtag speed");
2092 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2094 /* this command can be called during CONFIG,
2095 * in which case jtag isn't initialized */
2098 retval
=jtag
->speed(cur_speed
);
2100 } else if (argc
== 0)
2104 return ERROR_COMMAND_SYNTAX_ERROR
;
2106 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2111 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2113 int retval
=ERROR_OK
;
2114 LOG_DEBUG("handle jtag khz");
2118 speed_khz
= strtoul(args
[0], NULL
, 0);
2122 LOG_DEBUG("have interface set up");
2124 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2130 cur_speed
= jtag_speed
= speed_div1
;
2132 retval
=jtag
->speed(cur_speed
);
2141 return ERROR_COMMAND_SYNTAX_ERROR
;
2146 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2152 command_print(cmd_ctx
, "RCLK - adaptive");
2155 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2161 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2167 return ERROR_COMMAND_SYNTAX_ERROR
;
2171 state
= tap_state_by_name( args
[0] );
2173 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2174 return ERROR_COMMAND_SYNTAX_ERROR
;
2176 jtag_add_end_state(state
);
2177 jtag_execute_queue();
2179 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2184 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2191 return ERROR_COMMAND_SYNTAX_ERROR
;
2194 if (args
[0][0] == '1')
2196 else if (args
[0][0] == '0')
2200 return ERROR_COMMAND_SYNTAX_ERROR
;
2203 if (args
[1][0] == '1')
2205 else if (args
[1][0] == '0')
2209 return ERROR_COMMAND_SYNTAX_ERROR
;
2212 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2213 return ERROR_JTAG_INIT_FAILED
;
2215 jtag_add_reset(trst
, srst
);
2216 jtag_execute_queue();
2221 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2225 return ERROR_COMMAND_SYNTAX_ERROR
;
2228 jtag_add_runtest(strtol(args
[0], NULL
, 0), TAP_INVALID
);
2229 jtag_execute_queue();
2236 * For "irscan" or "drscan" commands, the "end" (really, "next") state
2237 * should be stable ... and *NOT* a shift state, otherwise free-running
2238 * jtag clocks could change the values latched by the update state.
2240 static bool scan_is_safe(tap_state_t state
)
2255 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2258 scan_field_t
*fields
;
2260 tap_state_t endstate
;
2262 if ((argc
< 2) || (argc
% 2))
2264 return ERROR_COMMAND_SYNTAX_ERROR
;
2267 /* optional "-endstate" "statename" at the end of the arguments,
2268 * so that e.g. IRPAUSE can let us load the data register before
2269 * entering RUN/IDLE to execute the instruction we load here.
2271 endstate
= TAP_IDLE
;
2274 /* have at least one pair of numbers. */
2275 /* is last pair the magic text? */
2276 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2279 cpA
= args
[ argc
-1 ];
2280 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2281 cpS
= tap_state_name( endstate
);
2282 if( 0 == strcmp( cpA
, cpS
) ){
2286 if( endstate
>= TAP_NUM_STATES
){
2287 return ERROR_COMMAND_SYNTAX_ERROR
;
2289 if (!scan_is_safe(endstate
))
2290 LOG_WARNING("irscan with unsafe "
2291 "endstate \"%s\"", cpA
);
2292 /* found - remove the last 2 args */
2298 int num_fields
= argc
/ 2;
2300 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2302 for (i
= 0; i
< num_fields
; i
++)
2304 tap
= jtag_TapByString( args
[i
*2] );
2307 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2310 int field_size
= tap
->ir_length
;
2311 fields
[i
].tap
= tap
;
2312 fields
[i
].num_bits
= field_size
;
2313 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2314 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2315 fields
[i
].in_value
= NULL
;
2318 /* did we have an endstate? */
2319 jtag_add_ir_scan(num_fields
, fields
, endstate
);
2321 int retval
=jtag_execute_queue();
2323 for (i
= 0; i
< num_fields
; i
++)
2324 free(fields
[i
].out_value
);
2331 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2334 scan_field_t
*fields
;
2336 int field_count
= 0;
2339 tap_state_t endstate
;
2342 * args[2] = num_bits
2343 * args[3] = hex string
2344 * ... repeat num bits and hex string ...
2347 * args[N-2] = "-endstate"
2348 * args[N-1] = statename
2350 if ((argc
< 4) || ((argc
% 2)!=0))
2352 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2356 endstate
= TAP_IDLE
;
2358 /* validate arguments as numbers */
2360 for (i
= 2; i
< argc
; i
+=2)
2365 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2366 /* If valid - try next arg */
2371 /* Not valid.. are we at the end? */
2372 if ( ((i
+2) != argc
) ){
2373 /* nope, then error */
2377 /* it could be: "-endstate FOO"
2378 * e.g. DRPAUSE so we can issue more instructions
2379 * before entering RUN/IDLE and executing them.
2382 /* get arg as a string. */
2383 cp
= Jim_GetString( args
[i
], NULL
);
2384 /* is it the magic? */
2385 if( 0 == strcmp( "-endstate", cp
) ){
2386 /* is the statename valid? */
2387 cp
= Jim_GetString( args
[i
+1], NULL
);
2389 /* see if it is a valid state name */
2390 endstate
= tap_state_by_name(cp
);
2392 /* update the error message */
2393 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2395 if (!scan_is_safe(endstate
))
2396 LOG_WARNING("drscan with unsafe "
2397 "endstate \"%s\"", cp
);
2399 /* valid - so clear the error */
2401 /* and remove the last 2 args */
2406 /* Still an error? */
2408 return e
; /* too bad */
2410 } /* validate args */
2412 tap
= jtag_TapByJimObj( interp
, args
[1] );
2417 num_fields
=(argc
-2)/2;
2418 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2419 for (i
= 2; i
< argc
; i
+=2)
2425 Jim_GetLong(interp
, args
[i
], &bits
);
2426 str
= Jim_GetString(args
[i
+1], &len
);
2428 fields
[field_count
].tap
= tap
;
2429 fields
[field_count
].num_bits
= bits
;
2430 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2431 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2432 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2436 jtag_add_dr_scan(num_fields
, fields
, endstate
);
2438 retval
= jtag_execute_queue();
2439 if (retval
!= ERROR_OK
)
2441 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2446 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2447 for (i
= 2; i
< argc
; i
+=2)
2452 Jim_GetLong(interp
, args
[i
], &bits
);
2453 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
2454 free(fields
[field_count
].out_value
);
2456 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
2461 Jim_SetResult(interp
, list
);
2469 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2471 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_flush_queue_count
));
2477 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2481 if (strcmp(args
[0], "enable") == 0)
2483 jtag_verify_capture_ir
= 1;
2485 else if (strcmp(args
[0], "disable") == 0)
2487 jtag_verify_capture_ir
= 0;
2490 return ERROR_COMMAND_SYNTAX_ERROR
;
2492 } else if (argc
!= 0)
2494 return ERROR_COMMAND_SYNTAX_ERROR
;
2497 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
2502 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2506 if (strcmp(args
[0], "enable") == 0)
2510 else if (strcmp(args
[0], "disable") == 0)
2515 return ERROR_COMMAND_SYNTAX_ERROR
;
2517 } else if (argc
!= 0)
2519 return ERROR_COMMAND_SYNTAX_ERROR
;
2522 command_print(cmd_ctx
, "verify jtag capture is %s", (jtag_verify
) ? "enabled": "disabled");
2528 int jtag_power_dropout(int *dropout
)
2530 return jtag
->power_dropout(dropout
);
2533 int jtag_srst_asserted(int *srst_asserted
)
2535 return jtag
->srst_asserted(srst_asserted
);
2538 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
2540 jtag_tap_event_action_t
* jteap
;
2543 jteap
= tap
->event_action
;
2547 if (jteap
->event
== e
) {
2549 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
2552 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
2553 Jim_GetString(jteap
->body
, NULL
) );
2554 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
2555 Jim_PrintErrorMessage(interp
);
2559 jteap
= jteap
->next
;
2563 LOG_DEBUG( "event %d %s - no action",
2565 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
2569 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2572 return ERROR_COMMAND_SYNTAX_ERROR
;
2577 if (strcmp(args
[0], "short") == 0)
2578 use_new_table
= true;
2579 else if (strcmp(args
[0], "long") == 0)
2580 use_new_table
= false;
2582 return ERROR_COMMAND_SYNTAX_ERROR
;
2584 tap_use_new_tms_table(use_new_table
);
2587 command_print(cmd_ctx
, "tms sequence is %s",
2588 tap_uses_new_tms_table() ? "short": "long");
2594 * Function jtag_add_statemove
2595 * moves from the current state to the goal \a state. This needs
2596 * to be handled according to the xsvf spec, see the XSTATE command
2599 int jtag_add_statemove(tap_state_t goal_state
)
2601 int retval
= ERROR_OK
;
2603 tap_state_t moves
[8];
2604 tap_state_t cur_state
= cmd_queue_cur_state
;
2609 LOG_DEBUG( "cur_state=%s goal_state=%s",
2610 tap_state_name(cur_state
),
2611 tap_state_name(goal_state
) );
2614 /* From the XSVF spec, pertaining to XSTATE:
2616 For special states known as stable states (Test-Logic-Reset,
2617 Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows
2618 predefined TAP state paths when the starting state is a stable state and
2619 when the XSTATE specifies a new stable state (see the STATE command in
2620 the [Ref 5] for the TAP state paths between stable states). For
2621 non-stable states, XSTATE should specify a state that is only one TAP
2622 state transition distance from the current TAP state to avoid undefined
2623 TAP state paths. A sequence of multiple XSTATE commands can be issued to
2624 transition the TAP through a specific state path.
2627 if (goal_state
==cur_state
)
2628 ; /* nothing to do */
2630 else if( goal_state
==TAP_RESET
)
2635 else if( tap_is_state_stable(cur_state
) && tap_is_state_stable(goal_state
) )
2637 /* note: unless tms_bits holds a path that agrees with [Ref 5] in above
2638 spec, then this code is not fully conformant to the xsvf spec. This
2639 puts a burden on tap_get_tms_path() function from the xsvf spec.
2640 If in doubt, you should confirm that that burden is being met.
2643 tms_bits
= tap_get_tms_path(cur_state
, goal_state
);
2644 tms_count
= tap_get_tms_path_len(cur_state
, goal_state
);
2646 assert( (unsigned) tms_count
< DIM(moves
) );
2648 for (i
=0; i
<tms_count
; i
++, tms_bits
>>=1)
2650 bool bit
= tms_bits
& 1;
2652 cur_state
= tap_state_transition(cur_state
, bit
);
2653 moves
[i
] = cur_state
;
2656 jtag_add_pathmove(tms_count
, moves
);
2659 /* else state must be immediately reachable in one clock cycle, and does not
2660 need to be a stable state.
2662 else if( tap_state_transition(cur_state
, true) == goal_state
2663 || tap_state_transition(cur_state
, false) == goal_state
)
2665 /* move a single state */
2666 moves
[0] = goal_state
;
2667 jtag_add_pathmove( 1, moves
);
2672 retval
= ERROR_FAIL
;
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)