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 assert(state
!=TAP_INVALID
);
399 cmd_queue_cur_state
= state
;
402 void jtag_alloc_in_value32(scan_field_t
*field
)
404 interface_jtag_alloc_in_value32(field
);
407 void jtag_add_ir_scan_noverify(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
412 retval
=interface_jtag_add_ir_scan(in_num_fields
, in_fields
, state
);
413 if (retval
!=ERROR_OK
)
420 * Generate an IR SCAN with a list of scan fields with one entry for each enabled TAP.
422 * If the input field list contains an instruction value for a TAP then that is used
423 * otherwise the TAP is set to bypass.
425 * TAPs for which no fields are passed are marked as bypassed for subsequent DR SCANs.
428 void jtag_add_ir_scan(int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
430 if (jtag_verify
&&jtag_verify_capture_ir
)
432 /* 8 x 32 bit id's is enough for all invocations */
434 for (int j
= 0; j
< in_num_fields
; j
++)
436 /* if we are to run a verification of the ir scan, we need to get the input back.
437 * We may have to allocate space if the caller didn't ask for the input back.
439 in_fields
[j
].check_value
=in_fields
[j
].tap
->expected
;
440 in_fields
[j
].check_mask
=in_fields
[j
].tap
->expected_mask
;
442 jtag_add_scan_check(jtag_add_ir_scan_noverify
, in_num_fields
, in_fields
, state
);
445 jtag_add_ir_scan_noverify(in_num_fields
, in_fields
, state
);
450 * Duplicate the scan fields passed into the function into an IR SCAN command
452 * This function assumes that the caller handles extra fields for bypassed TAPs
455 void jtag_add_plain_ir_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
461 retval
=interface_jtag_add_plain_ir_scan(in_num_fields
, in_fields
, state
);
462 if (retval
!=ERROR_OK
)
466 void jtag_add_callback(jtag_callback1_t f
, u8
*in
)
468 interface_jtag_add_callback(f
, in
);
471 void jtag_add_callback4(jtag_callback_t f
, u8
*in
,
472 jtag_callback_data_t data1
, jtag_callback_data_t data2
,
473 jtag_callback_data_t data3
)
475 interface_jtag_add_callback4(f
, in
, data1
, data2
, data3
);
478 int jtag_check_value_inner(u8
*captured
, u8
*in_check_value
, u8
*in_check_mask
, int num_bits
);
480 static int jtag_check_value_mask_callback(u8
*in
, jtag_callback_data_t data1
, jtag_callback_data_t data2
, jtag_callback_data_t data3
)
482 return jtag_check_value_inner(in
, (u8
*)data1
, (u8
*)data2
, (int)data3
);
485 static void jtag_add_scan_check(void (*jtag_add_scan
)(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
),
486 int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
488 for (int i
= 0; i
< in_num_fields
; i
++)
490 struct scan_field_s
*field
= &in_fields
[i
];
491 field
->allocated
= 0;
493 if (field
->check_value
|| field
->in_value
)
495 interface_jtag_add_scan_check_alloc(field
);
499 jtag_add_scan(in_num_fields
, in_fields
, state
);
501 for (int i
= 0; i
< in_num_fields
; i
++)
503 if ((in_fields
[i
].check_value
!= NULL
) && (in_fields
[i
].in_value
!= NULL
))
505 /* this is synchronous for a minidriver */
506 jtag_add_callback4(jtag_check_value_mask_callback
, in_fields
[i
].in_value
,
507 (jtag_callback_data_t
)in_fields
[i
].check_value
,
508 (jtag_callback_data_t
)in_fields
[i
].check_mask
,
509 (jtag_callback_data_t
)in_fields
[i
].num_bits
);
511 if (in_fields
[i
].allocated
)
513 free(in_fields
[i
].in_value
);
515 if (in_fields
[i
].modified
)
517 in_fields
[i
].in_value
= NULL
;
522 void jtag_add_dr_scan_check(int in_num_fields
, scan_field_t
*in_fields
, tap_state_t state
)
526 jtag_add_scan_check(jtag_add_dr_scan
, in_num_fields
, in_fields
, state
);
529 jtag_add_dr_scan(in_num_fields
, in_fields
, state
);
535 * Generate a DR SCAN using the fields passed to the function
537 * For not bypassed TAPs the function checks in_fields and uses fields specified there.
538 * For bypassed TAPs the function generates a dummy 1bit field.
540 * The bypass status of TAPs is set by jtag_add_ir_scan().
543 void jtag_add_dr_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
549 retval
=interface_jtag_add_dr_scan(in_num_fields
, in_fields
, state
);
550 if (retval
!=ERROR_OK
)
557 * Duplicate the scan fields passed into the function into a DR SCAN command
559 * This function assumes that the caller handles extra fields for bypassed TAPs
562 void jtag_add_plain_dr_scan(int in_num_fields
, const scan_field_t
*in_fields
, tap_state_t state
)
568 retval
=interface_jtag_add_plain_dr_scan(in_num_fields
, in_fields
, state
);
569 if (retval
!=ERROR_OK
)
573 void jtag_add_dr_out(jtag_tap_t
* tap
,
574 int num_fields
, const int* num_bits
, const u32
* value
,
575 tap_state_t end_state
)
577 assert(end_state
!= TAP_INVALID
);
579 cmd_queue_cur_state
= end_state
;
581 interface_jtag_add_dr_out(tap
,
582 num_fields
, num_bits
, value
,
586 void jtag_add_tlr(void)
588 jtag_prelude(TAP_RESET
);
591 retval
=interface_jtag_add_tlr();
592 if (retval
!=ERROR_OK
)
595 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
598 void jtag_add_pathmove(int num_states
, const tap_state_t
*path
)
600 tap_state_t cur_state
= cmd_queue_cur_state
;
604 /* the last state has to be a stable state */
605 if (!tap_is_state_stable(path
[num_states
- 1]))
607 LOG_ERROR("BUG: TAP path doesn't finish in a stable state");
611 for (i
=0; i
<num_states
; i
++)
613 if (path
[i
] == TAP_RESET
)
615 LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
619 if ( tap_state_transition(cur_state
, true) != path
[i
]
620 && tap_state_transition(cur_state
, false) != path
[i
])
622 LOG_ERROR("BUG: %s -> %s isn't a valid TAP transition", tap_state_name(cur_state
), tap_state_name(path
[i
]));
630 retval
= interface_jtag_add_pathmove(num_states
, path
);
631 cmd_queue_cur_state
= path
[num_states
- 1];
632 if (retval
!=ERROR_OK
)
636 void jtag_add_runtest(int num_cycles
, tap_state_t state
)
642 /* executed by sw or hw fifo */
643 retval
=interface_jtag_add_runtest(num_cycles
, state
);
644 if (retval
!=ERROR_OK
)
649 void jtag_add_clocks( int num_cycles
)
653 if( !tap_is_state_stable(cmd_queue_cur_state
) )
655 LOG_ERROR( "jtag_add_clocks() was called with TAP in non-stable state \"%s\"",
656 tap_state_name(cmd_queue_cur_state
) );
657 jtag_error
= ERROR_JTAG_NOT_STABLE_STATE
;
665 retval
= interface_jtag_add_clocks(num_cycles
);
666 if (retval
!= ERROR_OK
)
671 void jtag_add_reset(int req_tlr_or_trst
, int req_srst
)
673 int trst_with_tlr
= 0;
676 /* FIX!!! there are *many* different cases here. A better
677 * approach is needed for legal combinations of transitions...
679 if ((jtag_reset_config
& RESET_HAS_SRST
)&&
680 (jtag_reset_config
& RESET_HAS_TRST
)&&
681 ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0))
683 if (((req_tlr_or_trst
&&!jtag_trst
)||
684 (!req_tlr_or_trst
&&jtag_trst
))&&
685 ((req_srst
&&!jtag_srst
)||
686 (!req_srst
&&jtag_srst
)))
688 /* FIX!!! srst_pulls_trst allows 1,1 => 0,0 transition.... */
689 //LOG_ERROR("BUG: transition of req_tlr_or_trst and req_srst in the same jtag_add_reset() call is undefined");
693 /* Make sure that jtag_reset_config allows the requested reset */
694 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
695 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (!req_tlr_or_trst
))
697 LOG_ERROR("BUG: requested reset would assert trst");
698 jtag_error
=ERROR_FAIL
;
702 /* if TRST pulls SRST, we reset with TAP T-L-R */
703 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_tlr_or_trst
)) && (req_srst
== 0))
708 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
710 LOG_ERROR("BUG: requested SRST assertion, but the current configuration doesn't support this");
711 jtag_error
=ERROR_FAIL
;
717 if (!trst_with_tlr
&& (jtag_reset_config
& RESET_HAS_TRST
))
729 jtag_srst
= req_srst
;
731 retval
= interface_jtag_add_reset(jtag_trst
, jtag_srst
);
732 if (retval
!=ERROR_OK
)
737 jtag_execute_queue();
741 LOG_DEBUG("SRST line asserted");
745 LOG_DEBUG("SRST line released");
746 if (jtag_nsrst_delay
)
747 jtag_add_sleep(jtag_nsrst_delay
* 1000);
752 LOG_DEBUG("JTAG reset with RESET instead of TRST");
753 jtag_set_end_state(TAP_RESET
);
760 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
761 * and inform possible listeners about this
763 LOG_DEBUG("TRST line asserted");
764 tap_set_state(TAP_RESET
);
765 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
769 if (jtag_ntrst_delay
)
770 jtag_add_sleep(jtag_ntrst_delay
* 1000);
774 tap_state_t
jtag_set_end_state(tap_state_t state
)
776 if ((state
== TAP_DRSHIFT
)||(state
== TAP_IRSHIFT
))
778 LOG_ERROR("BUG: TAP_DRSHIFT/IRSHIFT can't be end state. Calling code should use a larger scan field");
781 if (state
!=TAP_INVALID
)
782 cmd_queue_end_state
= state
;
783 return cmd_queue_end_state
;
786 tap_state_t
jtag_get_end_state(void)
788 return cmd_queue_end_state
;
791 void jtag_add_sleep(u32 us
)
793 keep_alive(); /* we might be running on a very slow JTAG clk */
794 int retval
=interface_jtag_add_sleep(us
);
795 if (retval
!=ERROR_OK
)
800 static const char *jtag_tap_name(const jtag_tap_t
*tap
)
802 return (tap
== NULL
) ? "(unknown)" : tap
->dotted_name
;
805 int jtag_check_value_inner(u8
*captured
, u8
*in_check_value
, u8
*in_check_mask
, int num_bits
)
807 int retval
= ERROR_OK
;
809 int compare_failed
= 0;
812 compare_failed
= buf_cmp_mask(captured
, in_check_value
, in_check_mask
, num_bits
);
814 compare_failed
= buf_cmp(captured
, in_check_value
, num_bits
);
817 /* An error handler could have caught the failing check
818 * only report a problem when there wasn't a handler, or if the handler
819 * acknowledged the error
822 LOG_WARNING("TAP %s:",
823 jtag_tap_name(field->tap));
827 char *captured_char
= buf_to_str(captured
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
828 char *in_check_value_char
= buf_to_str(in_check_value
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
832 char *in_check_mask_char
;
833 in_check_mask_char
= buf_to_str(in_check_mask
, (num_bits
> DEBUG_JTAG_IOZ
) ? DEBUG_JTAG_IOZ
: num_bits
, 16);
834 LOG_WARNING("value captured during scan didn't pass the requested check:");
835 LOG_WARNING("captured: 0x%s check_value: 0x%s check_mask: 0x%s",
836 captured_char
, in_check_value_char
, in_check_mask_char
);
837 free(in_check_mask_char
);
841 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
);
845 free(in_check_value_char
);
847 retval
= ERROR_JTAG_QUEUE_FAILED
;
854 void jtag_check_value_mask(scan_field_t
*field
, u8
*value
, u8
*mask
)
856 assert(field
->in_value
!= NULL
);
860 /* no checking to do */
864 jtag_execute_queue_noclear();
866 int retval
=jtag_check_value_inner(field
->in_value
, value
, mask
, field
->num_bits
);
867 jtag_set_error(retval
);
872 int default_interface_jtag_execute_queue(void)
876 LOG_ERROR("No JTAG interface configured yet. "
877 "Issue 'init' command in startup scripts "
878 "before communicating with targets.");
882 return jtag
->execute_queue();
885 void jtag_execute_queue_noclear(void)
887 /* each flush can take as much as 1-2ms on high bandwidth low latency interfaces.
888 * E.g. a JTAG over TCP/IP or USB....
890 jtag_flush_queue_count
++;
892 int retval
=interface_jtag_execute_queue();
893 /* we keep the first error */
894 if ((jtag_error
==ERROR_OK
)&&(retval
!=ERROR_OK
))
900 int jtag_execute_queue(void)
903 jtag_execute_queue_noclear();
909 int jtag_reset_callback(enum jtag_event event
, void *priv
)
911 jtag_tap_t
*tap
= priv
;
915 if (event
== JTAG_TRST_ASSERTED
)
917 buf_set_ones(tap
->cur_instr
, tap
->ir_length
);
924 void jtag_sleep(u32 us
)
926 alive_sleep(us
/1000);
929 /* Try to examine chain layout according to IEEE 1149.1 §12
931 int jtag_examine_chain(void)
935 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
938 int device_count
= 0;
943 field
.num_bits
= sizeof(idcode_buffer
) * 8;
944 field
.out_value
= idcode_buffer
;
946 field
.in_value
= idcode_buffer
;
951 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
953 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
956 jtag_add_plain_dr_scan(1, &field
, TAP_RESET
);
957 jtag_execute_queue();
959 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
961 zero_check
|= idcode_buffer
[i
];
962 one_check
&= idcode_buffer
[i
];
965 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
966 if ((zero_check
== 0x00) || (one_check
== 0xff))
968 LOG_ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
969 return ERROR_JTAG_INIT_FAILED
;
972 /* point at the 1st tap */
973 tap
= jtag_NextEnabledTap(NULL
);
975 LOG_ERROR("JTAG: No taps enabled?");
976 return ERROR_JTAG_INIT_FAILED
;
979 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
981 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
982 if ((idcode
& 1) == 0)
984 /* LSB must not be 0, this indicates a device in bypass */
985 LOG_WARNING("Tap/Device does not have IDCODE");
996 /* some devices, such as AVR will output all 1's instead of TDI
997 input value at end of chain. */
998 if ((idcode
== 0x000000FF)||(idcode
== 0xFFFFFFFF))
1001 /* End of chain (invalid manufacturer ID)
1003 * The JTAG examine is the very first thing that happens
1005 * A single JTAG device requires only 64 bits to be read back correctly.
1007 * The code below adds a check that the rest of the data scanned (640 bits)
1008 * are all as expected. This helps diagnose/catch problems with the JTAG chain
1010 * earlier and gives more helpful/explicit error messages.
1012 for (bit_count
+= 32; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;bit_count
+= 32)
1014 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1015 if (unexpected
||((idcode
!= 0x000000FF)&&(idcode
!= 0xFFFFFFFF)))
1017 LOG_WARNING("Unexpected idcode after end of chain! %d 0x%08x", bit_count
, idcode
);
1025 #define EXTRACT_MFG(X) (((X) & 0xffe) >> 1)
1026 manufacturer
= EXTRACT_MFG(idcode
);
1027 #define EXTRACT_PART(X) (((X) & 0xffff000) >> 12)
1028 part
= EXTRACT_PART(idcode
);
1029 #define EXTRACT_VER(X) (((X) & 0xf0000000) >> 28)
1030 version
= EXTRACT_VER(idcode
);
1032 LOG_INFO("JTAG tap: %s tap/device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1033 ((tap
!= NULL
) ? (tap
->dotted_name
) : "(not-named)"),
1034 idcode
, manufacturer
, part
, version
);
1040 tap
->idcode
= idcode
;
1042 if (tap
->expected_ids_cnt
> 0) {
1043 /* Loop over the expected identification codes and test for a match */
1045 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1046 if( tap
->idcode
== tap
->expected_ids
[ii
] ){
1051 /* If none of the expected ids matched, log an error */
1052 if (ii
== tap
->expected_ids_cnt
) {
1053 LOG_ERROR("JTAG tap: %s got: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1056 EXTRACT_MFG( tap
->idcode
),
1057 EXTRACT_PART( tap
->idcode
),
1058 EXTRACT_VER( tap
->idcode
) );
1059 for (ii
= 0; ii
< tap
->expected_ids_cnt
; ii
++) {
1060 LOG_ERROR("JTAG tap: %s expected %hhu of %hhu: 0x%08x (mfg: 0x%3.3x, part: 0x%4.4x, ver: 0x%1.1x)",
1063 tap
->expected_ids_cnt
,
1064 tap
->expected_ids
[ii
],
1065 EXTRACT_MFG( tap
->expected_ids
[ii
] ),
1066 EXTRACT_PART( tap
->expected_ids
[ii
] ),
1067 EXTRACT_VER( tap
->expected_ids
[ii
] ) );
1070 return ERROR_JTAG_INIT_FAILED
;
1072 LOG_INFO("JTAG Tap/device matched");
1076 LOG_INFO("JTAG TAP ID: 0x%08x - Unknown - please report (A) chipname and (B) idcode to the openocd project",
1080 tap
= jtag_NextEnabledTap(tap
);
1085 /* see if number of discovered devices matches configuration */
1086 if (device_count
!= jtag_NumEnabledTaps())
1088 LOG_ERROR("number of discovered devices in JTAG chain (%i) doesn't match (enabled) configuration (%i), total taps: %d",
1089 device_count
, jtag_NumEnabledTaps(), jtag_NumTotalTaps());
1090 LOG_ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1091 return ERROR_JTAG_INIT_FAILED
;
1097 int jtag_validate_chain(void)
1100 int total_ir_length
= 0;
1106 total_ir_length
= 0;
1108 tap
= jtag_NextEnabledTap(tap
);
1112 total_ir_length
+= tap
->ir_length
;
1115 total_ir_length
+= 2;
1116 ir_test
= malloc(CEIL(total_ir_length
, 8));
1117 buf_set_ones(ir_test
, total_ir_length
);
1120 field
.num_bits
= total_ir_length
;
1121 field
.out_value
= ir_test
;
1122 field
.in_value
= ir_test
;
1125 jtag_add_plain_ir_scan(1, &field
, TAP_RESET
);
1126 jtag_execute_queue();
1132 tap
= jtag_NextEnabledTap(tap
);
1137 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1140 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1141 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
);
1144 return ERROR_JTAG_INIT_FAILED
;
1146 chain_pos
+= tap
->ir_length
;
1149 val
= buf_get_u32(ir_test
, chain_pos
, 2);
1152 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1153 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
);
1156 return ERROR_JTAG_INIT_FAILED
;
1164 enum jtag_tap_cfg_param
{
1168 static Jim_Nvp nvp_config_opts
[] = {
1169 { .name
= "-event", .value
= JCFG_EVENT
},
1171 { .name
= NULL
, .value
= -1 }
1174 static int jtag_tap_configure_cmd( Jim_GetOptInfo
*goi
, jtag_tap_t
* tap
)
1180 /* parse config or cget options */
1181 while (goi
->argc
> 0) {
1182 Jim_SetEmptyResult (goi
->interp
);
1184 e
= Jim_GetOpt_Nvp(goi
, nvp_config_opts
, &n
);
1186 Jim_GetOpt_NvpUnknown(goi
, nvp_config_opts
, 0);
1192 if (goi
->argc
== 0) {
1193 Jim_WrongNumArgs( goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ..." );
1197 e
= Jim_GetOpt_Nvp( goi
, nvp_jtag_tap_event
, &n
);
1199 Jim_GetOpt_NvpUnknown(goi
, nvp_jtag_tap_event
, 1);
1203 if (goi
->isconfigure
) {
1204 if (goi
->argc
!= 1) {
1205 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name? ?EVENT-BODY?");
1209 if (goi
->argc
!= 0) {
1210 Jim_WrongNumArgs(goi
->interp
, goi
->argc
, goi
->argv
, "-event ?event-name?");
1216 jtag_tap_event_action_t
*jteap
;
1218 jteap
= tap
->event_action
;
1219 /* replace existing? */
1221 if (jteap
->event
== (enum jtag_tap_event
)n
->value
) {
1224 jteap
= jteap
->next
;
1227 if (goi
->isconfigure
) {
1228 if (jteap
== NULL
) {
1230 jteap
= calloc(1, sizeof (*jteap
));
1232 jteap
->event
= n
->value
;
1233 Jim_GetOpt_Obj( goi
, &o
);
1235 Jim_DecrRefCount(interp
, jteap
->body
);
1237 jteap
->body
= Jim_DuplicateObj(goi
->interp
, o
);
1238 Jim_IncrRefCount(jteap
->body
);
1240 /* add to head of event list */
1241 jteap
->next
= tap
->event_action
;
1242 tap
->event_action
= jteap
;
1243 Jim_SetEmptyResult(goi
->interp
);
1246 if (jteap
== NULL
) {
1247 Jim_SetEmptyResult(goi
->interp
);
1249 Jim_SetResult(goi
->interp
, Jim_DuplicateObj(goi
->interp
, jteap
->body
));
1256 } /* while (goi->argc) */
1261 static int jim_newtap_cmd( Jim_GetOptInfo
*goi
)
1271 const Jim_Nvp opts
[] = {
1272 #define NTAP_OPT_IRLEN 0
1273 { .name
= "-irlen" , .value
= NTAP_OPT_IRLEN
},
1274 #define NTAP_OPT_IRMASK 1
1275 { .name
= "-irmask" , .value
= NTAP_OPT_IRMASK
},
1276 #define NTAP_OPT_IRCAPTURE 2
1277 { .name
= "-ircapture" , .value
= NTAP_OPT_IRCAPTURE
},
1278 #define NTAP_OPT_ENABLED 3
1279 { .name
= "-enable" , .value
= NTAP_OPT_ENABLED
},
1280 #define NTAP_OPT_DISABLED 4
1281 { .name
= "-disable" , .value
= NTAP_OPT_DISABLED
},
1282 #define NTAP_OPT_EXPECTED_ID 5
1283 { .name
= "-expected-id" , .value
= NTAP_OPT_EXPECTED_ID
},
1284 { .name
= NULL
, .value
= -1 },
1287 pTap
= malloc( sizeof(jtag_tap_t
) );
1288 memset( pTap
, 0, sizeof(*pTap
) );
1290 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1294 * we expect CHIP + TAP + OPTIONS
1296 if( goi
->argc
< 3 ){
1297 Jim_SetResult_sprintf(goi
->interp
, "Missing CHIP TAP OPTIONS ....");
1300 Jim_GetOpt_String( goi
, &cp
, NULL
);
1301 pTap
->chip
= strdup(cp
);
1303 Jim_GetOpt_String( goi
, &cp
, NULL
);
1304 pTap
->tapname
= strdup(cp
);
1306 /* name + dot + name + null */
1307 x
= strlen(pTap
->chip
) + 1 + strlen(pTap
->tapname
) + 1;
1309 sprintf( cp
, "%s.%s", pTap
->chip
, pTap
->tapname
);
1310 pTap
->dotted_name
= cp
;
1312 LOG_DEBUG("Creating New Tap, Chip: %s, Tap: %s, Dotted: %s, %d params",
1313 pTap
->chip
, pTap
->tapname
, pTap
->dotted_name
, goi
->argc
);
1315 /* default is enabled */
1318 /* deal with options */
1319 #define NTREQ_IRLEN 1
1320 #define NTREQ_IRCAPTURE 2
1321 #define NTREQ_IRMASK 4
1323 /* clear them as we find them */
1324 reqbits
= (NTREQ_IRLEN
| NTREQ_IRCAPTURE
| NTREQ_IRMASK
);
1327 e
= Jim_GetOpt_Nvp( goi
, opts
, &n
);
1329 Jim_GetOpt_NvpUnknown( goi
, opts
, 0 );
1332 LOG_DEBUG("Processing option: %s", n
->name
);
1334 case NTAP_OPT_ENABLED
:
1337 case NTAP_OPT_DISABLED
:
1340 case NTAP_OPT_EXPECTED_ID
:
1342 u32
*new_expected_ids
;
1344 e
= Jim_GetOpt_Wide( goi
, &w
);
1346 Jim_SetResult_sprintf(goi
->interp
, "option: %s bad parameter", n
->name
);
1350 new_expected_ids
= malloc(sizeof(u32
) * (pTap
->expected_ids_cnt
+ 1));
1351 if (new_expected_ids
== NULL
) {
1352 Jim_SetResult_sprintf( goi
->interp
, "no memory");
1356 memcpy(new_expected_ids
, pTap
->expected_ids
, sizeof(u32
) * pTap
->expected_ids_cnt
);
1358 new_expected_ids
[pTap
->expected_ids_cnt
] = w
;
1360 free(pTap
->expected_ids
);
1361 pTap
->expected_ids
= new_expected_ids
;
1362 pTap
->expected_ids_cnt
++;
1365 case NTAP_OPT_IRLEN
:
1366 case NTAP_OPT_IRMASK
:
1367 case NTAP_OPT_IRCAPTURE
:
1368 e
= Jim_GetOpt_Wide( goi
, &w
);
1370 Jim_SetResult_sprintf( goi
->interp
, "option: %s bad parameter", n
->name
);
1373 if( (w
< 0) || (w
> 0xffff) ){
1375 Jim_SetResult_sprintf( goi
->interp
, "option: %s - wacky value: %d (0x%x)",
1376 n
->name
, (int)(w
), (int)(w
));
1380 case NTAP_OPT_IRLEN
:
1381 pTap
->ir_length
= w
;
1382 reqbits
&= (~(NTREQ_IRLEN
));
1384 case NTAP_OPT_IRMASK
:
1385 pTap
->ir_capture_mask
= w
;
1386 reqbits
&= (~(NTREQ_IRMASK
));
1388 case NTAP_OPT_IRCAPTURE
:
1389 pTap
->ir_capture_value
= w
;
1390 reqbits
&= (~(NTREQ_IRCAPTURE
));
1393 } /* switch(n->value) */
1394 } /* while( goi->argc ) */
1396 /* Did we get all the options? */
1399 Jim_SetResult_sprintf( goi
->interp
,
1400 "newtap: %s missing required parameters",
1402 /* TODO: Tell user what is missing :-( */
1403 /* no memory leaks pelase */
1404 free(((void *)(pTap
->expected_ids
)));
1405 free(((void *)(pTap
->chip
)));
1406 free(((void *)(pTap
->tapname
)));
1407 free(((void *)(pTap
->dotted_name
)));
1408 free(((void *)(pTap
)));
1412 pTap
->expected
= malloc( pTap
->ir_length
);
1413 pTap
->expected_mask
= malloc( pTap
->ir_length
);
1414 pTap
->cur_instr
= malloc( pTap
->ir_length
);
1416 buf_set_u32( pTap
->expected
,
1419 pTap
->ir_capture_value
);
1420 buf_set_u32( pTap
->expected_mask
,
1423 pTap
->ir_capture_mask
);
1424 buf_set_ones( pTap
->cur_instr
,
1429 jtag_register_event_callback(jtag_reset_callback
, pTap
);
1431 ppTap
= &(jtag_all_taps
);
1432 while( (*ppTap
) != NULL
){
1433 ppTap
= &((*ppTap
)->next_tap
);
1437 static int n_taps
= 0;
1438 pTap
->abs_chain_position
= n_taps
++;
1440 LOG_DEBUG( "Created Tap: %s @ abs position %d, irlen %d, capture: 0x%x mask: 0x%x",
1441 (*ppTap
)->dotted_name
,
1442 (*ppTap
)->abs_chain_position
,
1443 (*ppTap
)->ir_length
,
1444 (*ppTap
)->ir_capture_value
,
1445 (*ppTap
)->ir_capture_mask
);
1450 static int jim_jtag_command( Jim_Interp
*interp
, int argc
, Jim_Obj
*const *argv
)
1456 struct command_context_s
*context
;
1460 JTAG_CMD_INIT_RESET
,
1463 JTAG_CMD_TAPDISABLE
,
1464 JTAG_CMD_TAPISENABLED
,
1469 const Jim_Nvp jtag_cmds
[] = {
1470 { .name
= "interface" , .value
= JTAG_CMD_INTERFACE
},
1471 { .name
= "arp_init-reset", .value
= JTAG_CMD_INIT_RESET
},
1472 { .name
= "newtap" , .value
= JTAG_CMD_NEWTAP
},
1473 { .name
= "tapisenabled" , .value
= JTAG_CMD_TAPISENABLED
},
1474 { .name
= "tapenable" , .value
= JTAG_CMD_TAPENABLE
},
1475 { .name
= "tapdisable" , .value
= JTAG_CMD_TAPDISABLE
},
1476 { .name
= "configure" , .value
= JTAG_CMD_CONFIGURE
},
1477 { .name
= "cget" , .value
= JTAG_CMD_CGET
},
1479 { .name
= NULL
, .value
= -1 },
1482 context
= Jim_GetAssocData(interp
, "context");
1483 /* go past the command */
1484 Jim_GetOpt_Setup( &goi
, interp
, argc
-1, argv
+1 );
1486 e
= Jim_GetOpt_Nvp( &goi
, jtag_cmds
, &n
);
1488 Jim_GetOpt_NvpUnknown( &goi
, jtag_cmds
, 0 );
1491 Jim_SetEmptyResult( goi
.interp
);
1493 case JTAG_CMD_INTERFACE
:
1494 /* return the name of the interface */
1495 /* TCL code might need to know the exact type... */
1496 /* FUTURE: we allow this as a means to "set" the interface. */
1497 if( goi
.argc
!= 0 ){
1498 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
1501 Jim_SetResultString( goi
.interp
, jtag_interface
->name
, -1 );
1503 case JTAG_CMD_INIT_RESET
:
1504 if( goi
.argc
!= 0 ){
1505 Jim_WrongNumArgs( goi
.interp
, 1, goi
.argv
-1, "(no params)");
1508 e
= jtag_init_reset(context
);
1509 if( e
!= ERROR_OK
){
1510 Jim_SetResult_sprintf( goi
.interp
, "error: %d", e
);
1514 case JTAG_CMD_NEWTAP
:
1515 return jim_newtap_cmd( &goi
);
1517 case JTAG_CMD_TAPISENABLED
:
1518 case JTAG_CMD_TAPENABLE
:
1519 case JTAG_CMD_TAPDISABLE
:
1520 if( goi
.argc
!= 1 ){
1521 Jim_SetResultString( goi
.interp
, "Too many parameters",-1 );
1527 t
= jtag_TapByJimObj( goi
.interp
, goi
.argv
[0] );
1532 case JTAG_CMD_TAPISENABLED
:
1535 case JTAG_CMD_TAPENABLE
:
1536 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_ENABLE
);
1540 case JTAG_CMD_TAPDISABLE
:
1541 jtag_tap_handle_event( t
, JTAG_TAP_EVENT_DISABLE
);
1546 Jim_SetResult( goi
.interp
, Jim_NewIntObj( goi
.interp
, e
) );
1553 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ...");
1560 Jim_GetOpt_Obj(&goi
, &o
);
1561 t
= jtag_TapByJimObj( goi
.interp
, o
);
1566 goi
.isconfigure
= 0;
1567 return jtag_tap_configure_cmd( &goi
, t
);
1571 case JTAG_CMD_CONFIGURE
:
1573 Jim_WrongNumArgs( goi
.interp
, 0, NULL
, "?tap-name? -option ?VALUE? ...");
1580 Jim_GetOpt_Obj(&goi
, &o
);
1581 t
= jtag_TapByJimObj( goi
.interp
, o
);
1586 goi
.isconfigure
= 1;
1587 return jtag_tap_configure_cmd( &goi
, t
);
1594 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
1596 register_jim( cmd_ctx
, "jtag", jim_jtag_command
, "perform jtag tap actions");
1598 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
1599 COMMAND_CONFIG
, "try to configure interface");
1600 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
1601 COMMAND_ANY
, "(DEPRECATED) set jtag speed (if supported)");
1602 register_command(cmd_ctx
, NULL
, "jtag_khz", handle_jtag_khz_command
,
1603 COMMAND_ANY
, "set maximum jtag speed (if supported); "
1604 "parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
1605 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
1606 COMMAND_CONFIG
, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
1607 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
1609 "[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]");
1610 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
1611 COMMAND_ANY
, "jtag_nsrst_delay <ms> - delay after deasserting srst in ms");
1612 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
1613 COMMAND_ANY
, "jtag_ntrst_delay <ms> - delay after deasserting trst in ms");
1615 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
1616 COMMAND_EXEC
, "print current scan chain configuration");
1618 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
1619 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
1620 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
1621 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
1622 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
1623 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
1624 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
1625 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
1626 register_jim(cmd_ctx
, "drscan", Jim_Command_drscan
, "execute DR scan <device> <num_bits> <value> <num_bits1> <value2> ...");
1627 register_jim(cmd_ctx
, "flush_count", Jim_Command_flush_count
, "returns number of times the JTAG queue has been flushed");
1629 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
1630 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
1631 register_command(cmd_ctx
, NULL
, "verify_jtag", handle_verify_jtag_command
,
1632 COMMAND_ANY
, "verify value capture <enable|disable>");
1633 register_command(cmd_ctx
, NULL
, "tms_sequence", handle_tms_sequence_command
,
1634 COMMAND_ANY
, "choose short(default) or long tms_sequence <short|long>");
1638 int jtag_interface_init(struct command_context_s
*cmd_ctx
)
1643 if (!jtag_interface
)
1645 /* nothing was previously specified by "interface" command */
1646 LOG_ERROR("JTAG interface has to be specified, see \"interface\" command");
1647 return ERROR_JTAG_INVALID_INTERFACE
;
1651 jtag_interface
->khz(speed_khz
, &jtag_speed
);
1655 if (jtag_interface
->init() != ERROR_OK
)
1656 return ERROR_JTAG_INIT_FAILED
;
1658 jtag
= jtag_interface
;
1662 static int jtag_init_inner(struct command_context_s
*cmd_ctx
)
1667 LOG_DEBUG("Init JTAG chain");
1669 tap
= jtag_NextEnabledTap(NULL
);
1671 LOG_ERROR("There are no enabled taps?");
1672 return ERROR_JTAG_INIT_FAILED
;
1676 if ((retval
=jtag_execute_queue())!=ERROR_OK
)
1679 /* examine chain first, as this could discover the real chain layout */
1680 if (jtag_examine_chain() != ERROR_OK
)
1682 LOG_ERROR("trying to validate configured JTAG chain anyway...");
1685 if (jtag_validate_chain() != ERROR_OK
)
1687 LOG_WARNING("Could not validate JTAG chain, continuing anyway...");
1693 int jtag_interface_quit(void)
1695 if (!jtag
|| !jtag
->quit
)
1698 // close the JTAG interface
1699 int result
= jtag
->quit();
1700 if (ERROR_OK
!= result
)
1701 LOG_ERROR("failed: %d", result
);
1707 int jtag_init_reset(struct command_context_s
*cmd_ctx
)
1711 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
1714 LOG_DEBUG("Trying to bring the JTAG controller to life by asserting TRST / RESET");
1716 /* Reset can happen after a power cycle.
1718 * Ideally we would only assert TRST or run RESET before the target reset.
1720 * However w/srst_pulls_trst, trst is asserted together with the target
1721 * reset whether we want it or not.
1723 * NB! Some targets have JTAG circuitry disabled until a
1724 * trst & srst has been asserted.
1726 * NB! here we assume nsrst/ntrst delay are sufficient!
1728 * NB! order matters!!!! srst *can* disconnect JTAG circuitry
1731 jtag_add_reset(1, 0); /* RESET or TRST */
1732 if (jtag_reset_config
& RESET_HAS_SRST
)
1734 jtag_add_reset(1, 1);
1735 if ((jtag_reset_config
& RESET_SRST_PULLS_TRST
)==0)
1736 jtag_add_reset(0, 1);
1738 jtag_add_reset(0, 0);
1739 if ((retval
= jtag_execute_queue()) != ERROR_OK
)
1742 /* Check that we can communication on the JTAG chain + eventually we want to
1743 * be able to perform enumeration only after OpenOCD has started
1744 * telnet and GDB server
1746 * That would allow users to more easily perform any magic they need to before
1749 return jtag_init_inner(cmd_ctx
);
1752 int jtag_init(struct command_context_s
*cmd_ctx
)
1755 if ((retval
=jtag_interface_init(cmd_ctx
)) != ERROR_OK
)
1757 if (jtag_init_inner(cmd_ctx
)==ERROR_OK
)
1761 return jtag_init_reset(cmd_ctx
);
1764 static int default_khz(int khz
, int *jtag_speed
)
1766 LOG_ERROR("Translation from khz to jtag_speed not implemented");
1770 static int default_speed_div(int speed
, int *khz
)
1772 LOG_ERROR("Translation from jtag_speed to khz not implemented");
1776 static int default_power_dropout(int *dropout
)
1778 *dropout
=0; /* by default we can't detect power dropout */
1782 static int default_srst_asserted(int *srst_asserted
)
1784 *srst_asserted
=0; /* by default we can't detect srst asserted */
1788 static int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1793 /* check whether the interface is already configured */
1796 LOG_WARNING("Interface already configured, ignoring");
1800 /* interface name is a mandatory argument */
1801 if (argc
< 1 || args
[0][0] == '\0')
1803 return ERROR_COMMAND_SYNTAX_ERROR
;
1806 for (i
=0; jtag_interfaces
[i
]; i
++)
1808 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
1810 if ((retval
= jtag_interfaces
[i
]->register_commands(cmd_ctx
)) != ERROR_OK
)
1815 jtag_interface
= jtag_interfaces
[i
];
1817 if (jtag_interface
->khz
== NULL
)
1819 jtag_interface
->khz
= default_khz
;
1821 if (jtag_interface
->speed_div
== NULL
)
1823 jtag_interface
->speed_div
= default_speed_div
;
1825 if (jtag_interface
->power_dropout
== NULL
)
1827 jtag_interface
->power_dropout
= default_power_dropout
;
1829 if (jtag_interface
->srst_asserted
== NULL
)
1831 jtag_interface
->srst_asserted
= default_srst_asserted
;
1838 /* no valid interface was found (i.e. the configuration option,
1839 * didn't match one of the compiled-in interfaces
1841 LOG_ERROR("No valid jtag interface found (%s)", args
[0]);
1842 LOG_ERROR("compiled-in jtag interfaces:");
1843 for (i
= 0; jtag_interfaces
[i
]; i
++)
1845 LOG_ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
1848 return ERROR_JTAG_INVALID_INTERFACE
;
1851 static int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1855 Jim_Obj
*newargs
[ 10 ];
1858 * argv[-1] = command
1859 * argv[ 0] = ir length
1860 * argv[ 1] = ir capture
1861 * argv[ 2] = ir mask
1862 * argv[ 3] = not actually used by anything but in the docs
1866 command_print( cmd_ctx
, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
1869 command_print( cmd_ctx
, "OLD SYNTAX: DEPRECATED - translating to new syntax");
1870 command_print( cmd_ctx
, "jtag newtap CHIP TAP -irlen %s -ircapture %s -irvalue %s",
1874 command_print( cmd_ctx
, "Example: STM32 has 2 taps, the cortexM3(len4) + boundaryscan(len5)");
1875 command_print( cmd_ctx
, "jtag newtap stm32 cortexm3 ....., thus creating the tap: \"stm32.cortexm3\"");
1876 command_print( cmd_ctx
, "jtag newtap stm32 boundary ....., and the tap: \"stm32.boundary\"");
1877 command_print( cmd_ctx
, "And then refer to the taps by the dotted name.");
1879 newargs
[0] = Jim_NewStringObj( interp
, "jtag", -1 );
1880 newargs
[1] = Jim_NewStringObj( interp
, "newtap", -1 );
1881 sprintf( buf
, "chip%d", jtag_NumTotalTaps() );
1882 newargs
[2] = Jim_NewStringObj( interp
, buf
, -1 );
1883 sprintf( buf
, "tap%d", jtag_NumTotalTaps() );
1884 newargs
[3] = Jim_NewStringObj( interp
, buf
, -1 );
1885 newargs
[4] = Jim_NewStringObj( interp
, "-irlen", -1 );
1886 newargs
[5] = Jim_NewStringObj( interp
, args
[0], -1 );
1887 newargs
[6] = Jim_NewStringObj( interp
, "-ircapture", -1 );
1888 newargs
[7] = Jim_NewStringObj( interp
, args
[1], -1 );
1889 newargs
[8] = Jim_NewStringObj( interp
, "-irmask", -1 );
1890 newargs
[9] = Jim_NewStringObj( interp
, args
[2], -1 );
1892 command_print( cmd_ctx
, "NEW COMMAND:");
1893 sprintf( buf
, "%s %s %s %s %s %s %s %s %s %s",
1894 Jim_GetString( newargs
[0], NULL
),
1895 Jim_GetString( newargs
[1], NULL
),
1896 Jim_GetString( newargs
[2], NULL
),
1897 Jim_GetString( newargs
[3], NULL
),
1898 Jim_GetString( newargs
[4], NULL
),
1899 Jim_GetString( newargs
[5], NULL
),
1900 Jim_GetString( newargs
[6], NULL
),
1901 Jim_GetString( newargs
[7], NULL
),
1902 Jim_GetString( newargs
[8], NULL
),
1903 Jim_GetString( newargs
[9], NULL
) );
1905 e
= jim_jtag_command( interp
, 10, newargs
);
1907 command_print( cmd_ctx
, "%s", Jim_GetString( Jim_GetResult(interp
), NULL
) );
1912 static int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1916 tap
= jtag_all_taps
;
1917 command_print(cmd_ctx
, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
1918 command_print(cmd_ctx
, "---|--------------------|---------|------------|------------|------|------|------|---------");
1921 u32 expected
, expected_mask
, cur_instr
, ii
;
1922 expected
= buf_get_u32(tap
->expected
, 0, tap
->ir_length
);
1923 expected_mask
= buf_get_u32(tap
->expected_mask
, 0, tap
->ir_length
);
1924 cur_instr
= buf_get_u32(tap
->cur_instr
, 0, tap
->ir_length
);
1926 command_print(cmd_ctx
,
1927 "%2d | %-18s | %c | 0x%08x | 0x%08x | 0x%02x | 0x%02x | 0x%02x | 0x%02x",
1928 tap
->abs_chain_position
,
1930 tap
->enabled
? 'Y' : 'n',
1932 (tap
->expected_ids_cnt
> 0 ? tap
->expected_ids
[0] : 0),
1938 for (ii
= 1; ii
< tap
->expected_ids_cnt
; ii
++) {
1939 command_print(cmd_ctx
, " | | | | 0x%08x | | | | ",
1940 tap
->expected_ids
[ii
]);
1943 tap
= tap
->next_tap
;
1949 static int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1955 return ERROR_COMMAND_SYNTAX_ERROR
;
1957 /* Original versions cared about the order of these tokens:
1958 * reset_config signals [combination [trst_type [srst_type]]]
1959 * They also clobbered the previous configuration even on error.
1961 * Here we don't care about the order, and only change values
1962 * which have been explicitly specified.
1964 for (; argc
; argc
--, args
++) {
1969 m
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1970 if (strcmp(*args
, "none") == 0)
1972 else if (strcmp(*args
, "trst_only") == 0)
1973 tmp
= RESET_HAS_TRST
;
1974 else if (strcmp(*args
, "srst_only") == 0)
1975 tmp
= RESET_HAS_SRST
;
1976 else if (strcmp(*args
, "trst_and_srst") == 0)
1977 tmp
= RESET_HAS_TRST
| RESET_HAS_SRST
;
1981 LOG_ERROR("extra reset_config %s spec (%s)",
1983 return ERROR_INVALID_ARGUMENTS
;
1988 /* combination (options for broken wiring) */
1989 m
= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1990 if (strcmp(*args
, "separate") == 0)
1991 /* separate reset lines - default */;
1992 else if (strcmp(*args
, "srst_pulls_trst") == 0)
1993 tmp
|= RESET_SRST_PULLS_TRST
;
1994 else if (strcmp(*args
, "trst_pulls_srst") == 0)
1995 tmp
|= RESET_TRST_PULLS_SRST
;
1996 else if (strcmp(*args
, "combined") == 0)
1997 tmp
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
2001 LOG_ERROR("extra reset_config %s spec (%s)",
2002 "combination", *args
);
2003 return ERROR_INVALID_ARGUMENTS
;
2008 /* trst_type (NOP without HAS_TRST) */
2009 m
= RESET_TRST_OPEN_DRAIN
;
2010 if (strcmp(*args
, "trst_open_drain") == 0)
2011 tmp
|= RESET_TRST_OPEN_DRAIN
;
2012 else if (strcmp(*args
, "trst_push_pull") == 0)
2013 /* push/pull from adapter - default */;
2017 LOG_ERROR("extra reset_config %s spec (%s)",
2018 "trst_type", *args
);
2019 return ERROR_INVALID_ARGUMENTS
;
2024 /* srst_type (NOP without HAS_SRST) */
2025 m
|= RESET_SRST_PUSH_PULL
;
2026 if (strcmp(*args
, "srst_push_pull") == 0)
2027 tmp
|= RESET_SRST_PUSH_PULL
;
2028 else if (strcmp(*args
, "srst_open_drain") == 0)
2029 /* open drain from adapter - default */;
2033 LOG_ERROR("extra reset_config %s spec (%s)",
2034 "srst_type", *args
);
2035 return ERROR_INVALID_ARGUMENTS
;
2040 /* caller provided nonsense; fail */
2041 LOG_ERROR("unknown reset_config flag (%s)", *args
);
2042 return ERROR_INVALID_ARGUMENTS
;
2045 /* Remember the bits which were specified (mask)
2046 * and their new values (new_cfg).
2052 /* clear previous values of those bits, save new values */
2053 jtag_reset_config
&= ~mask
;
2054 jtag_reset_config
|= new_cfg
;
2059 static int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2063 LOG_ERROR("jtag_nsrst_delay <ms> command takes one required argument");
2068 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
2074 static int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2078 LOG_ERROR("jtag_ntrst_delay <ms> command takes one required argument");
2083 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
2089 static int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2091 int retval
=ERROR_OK
;
2095 LOG_DEBUG("handle jtag speed");
2098 cur_speed
= jtag_speed
= strtoul(args
[0], NULL
, 0);
2100 /* this command can be called during CONFIG,
2101 * in which case jtag isn't initialized */
2104 retval
=jtag
->speed(cur_speed
);
2106 } else if (argc
== 0)
2110 return ERROR_COMMAND_SYNTAX_ERROR
;
2112 command_print(cmd_ctx
, "jtag_speed: %d", jtag_speed
);
2117 static int handle_jtag_khz_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2119 int retval
=ERROR_OK
;
2120 LOG_DEBUG("handle jtag khz");
2124 speed_khz
= strtoul(args
[0], NULL
, 0);
2128 LOG_DEBUG("have interface set up");
2130 if ((retval
=jtag
->khz(speed_khz
, &speed_div1
))!=ERROR_OK
)
2136 cur_speed
= jtag_speed
= speed_div1
;
2138 retval
=jtag
->speed(cur_speed
);
2147 return ERROR_COMMAND_SYNTAX_ERROR
;
2152 if ((retval
=jtag
->speed_div(jtag_speed
, &speed_khz
))!=ERROR_OK
)
2158 command_print(cmd_ctx
, "RCLK - adaptive");
2161 command_print(cmd_ctx
, "%d kHz", speed_khz
);
2167 static int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2173 return ERROR_COMMAND_SYNTAX_ERROR
;
2177 state
= tap_state_by_name( args
[0] );
2179 command_print( cmd_ctx
, "Invalid state name: %s\n", args
[0] );
2180 return ERROR_COMMAND_SYNTAX_ERROR
;
2182 jtag_set_end_state(state
);
2183 jtag_execute_queue();
2185 command_print(cmd_ctx
, "current endstate: %s", tap_state_name(cmd_queue_end_state
));
2190 static int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2197 return ERROR_COMMAND_SYNTAX_ERROR
;
2200 if (args
[0][0] == '1')
2202 else if (args
[0][0] == '0')
2206 return ERROR_COMMAND_SYNTAX_ERROR
;
2209 if (args
[1][0] == '1')
2211 else if (args
[1][0] == '0')
2215 return ERROR_COMMAND_SYNTAX_ERROR
;
2218 if (jtag_interface_init(cmd_ctx
) != ERROR_OK
)
2219 return ERROR_JTAG_INIT_FAILED
;
2221 jtag_add_reset(trst
, srst
);
2222 jtag_execute_queue();
2227 static int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2231 return ERROR_COMMAND_SYNTAX_ERROR
;
2234 jtag_add_runtest(strtol(args
[0], NULL
, 0), jtag_get_end_state());
2235 jtag_execute_queue();
2242 * For "irscan" or "drscan" commands, the "end" (really, "next") state
2243 * should be stable ... and *NOT* a shift state, otherwise free-running
2244 * jtag clocks could change the values latched by the update state.
2246 static bool scan_is_safe(tap_state_t state
)
2261 static int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2264 scan_field_t
*fields
;
2266 tap_state_t endstate
;
2268 if ((argc
< 2) || (argc
% 2))
2270 return ERROR_COMMAND_SYNTAX_ERROR
;
2273 /* optional "-endstate" "statename" at the end of the arguments,
2274 * so that e.g. IRPAUSE can let us load the data register before
2275 * entering RUN/IDLE to execute the instruction we load here.
2277 endstate
= TAP_IDLE
;
2280 /* have at least one pair of numbers. */
2281 /* is last pair the magic text? */
2282 if( 0 == strcmp( "-endstate", args
[ argc
- 2 ] ) ){
2285 cpA
= args
[ argc
-1 ];
2286 for( endstate
= 0 ; endstate
< TAP_NUM_STATES
; endstate
++ ){
2287 cpS
= tap_state_name( endstate
);
2288 if( 0 == strcmp( cpA
, cpS
) ){
2292 if( endstate
>= TAP_NUM_STATES
){
2293 return ERROR_COMMAND_SYNTAX_ERROR
;
2295 if (!scan_is_safe(endstate
))
2296 LOG_WARNING("irscan with unsafe "
2297 "endstate \"%s\"", cpA
);
2298 /* found - remove the last 2 args */
2304 int num_fields
= argc
/ 2;
2306 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2308 for (i
= 0; i
< num_fields
; i
++)
2310 tap
= jtag_TapByString( args
[i
*2] );
2313 command_print( cmd_ctx
, "Tap: %s unknown", args
[i
*2] );
2316 int field_size
= tap
->ir_length
;
2317 fields
[i
].tap
= tap
;
2318 fields
[i
].num_bits
= field_size
;
2319 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
2320 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
2321 fields
[i
].in_value
= NULL
;
2324 /* did we have an endstate? */
2325 jtag_add_ir_scan(num_fields
, fields
, endstate
);
2327 int retval
=jtag_execute_queue();
2329 for (i
= 0; i
< num_fields
; i
++)
2330 free(fields
[i
].out_value
);
2337 static int Jim_Command_drscan(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2340 scan_field_t
*fields
;
2342 int field_count
= 0;
2345 tap_state_t endstate
;
2348 * args[2] = num_bits
2349 * args[3] = hex string
2350 * ... repeat num bits and hex string ...
2353 * args[N-2] = "-endstate"
2354 * args[N-1] = statename
2356 if ((argc
< 4) || ((argc
% 2)!=0))
2358 Jim_WrongNumArgs(interp
, 1, args
, "wrong arguments");
2362 endstate
= TAP_IDLE
;
2364 /* validate arguments as numbers */
2366 for (i
= 2; i
< argc
; i
+=2)
2371 e
= Jim_GetLong(interp
, args
[i
], &bits
);
2372 /* If valid - try next arg */
2377 /* Not valid.. are we at the end? */
2378 if ( ((i
+2) != argc
) ){
2379 /* nope, then error */
2383 /* it could be: "-endstate FOO"
2384 * e.g. DRPAUSE so we can issue more instructions
2385 * before entering RUN/IDLE and executing them.
2388 /* get arg as a string. */
2389 cp
= Jim_GetString( args
[i
], NULL
);
2390 /* is it the magic? */
2391 if( 0 == strcmp( "-endstate", cp
) ){
2392 /* is the statename valid? */
2393 cp
= Jim_GetString( args
[i
+1], NULL
);
2395 /* see if it is a valid state name */
2396 endstate
= tap_state_by_name(cp
);
2398 /* update the error message */
2399 Jim_SetResult_sprintf(interp
,"endstate: %s invalid", cp
);
2401 if (!scan_is_safe(endstate
))
2402 LOG_WARNING("drscan with unsafe "
2403 "endstate \"%s\"", cp
);
2405 /* valid - so clear the error */
2407 /* and remove the last 2 args */
2412 /* Still an error? */
2414 return e
; /* too bad */
2416 } /* validate args */
2418 tap
= jtag_TapByJimObj( interp
, args
[1] );
2423 num_fields
=(argc
-2)/2;
2424 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
2425 for (i
= 2; i
< argc
; i
+=2)
2431 Jim_GetLong(interp
, args
[i
], &bits
);
2432 str
= Jim_GetString(args
[i
+1], &len
);
2434 fields
[field_count
].tap
= tap
;
2435 fields
[field_count
].num_bits
= bits
;
2436 fields
[field_count
].out_value
= malloc(CEIL(bits
, 8));
2437 str_to_buf(str
, len
, fields
[field_count
].out_value
, bits
, 0);
2438 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
2442 jtag_add_dr_scan(num_fields
, fields
, endstate
);
2444 retval
= jtag_execute_queue();
2445 if (retval
!= ERROR_OK
)
2447 Jim_SetResultString(interp
, "drscan: jtag execute failed",-1);
2452 Jim_Obj
*list
= Jim_NewListObj(interp
, NULL
, 0);
2453 for (i
= 2; i
< argc
; i
+=2)
2458 Jim_GetLong(interp
, args
[i
], &bits
);
2459 str
= buf_to_str(fields
[field_count
].in_value
, bits
, 16);
2460 free(fields
[field_count
].out_value
);
2462 Jim_ListAppendElement(interp
, list
, Jim_NewStringObj(interp
, str
, strlen(str
)));
2467 Jim_SetResult(interp
, list
);
2475 static int Jim_Command_flush_count(Jim_Interp
*interp
, int argc
, Jim_Obj
*const *args
)
2477 Jim_SetResult(interp
, Jim_NewIntObj(interp
, jtag_flush_queue_count
));
2483 static int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2487 if (strcmp(args
[0], "enable") == 0)
2489 jtag_verify_capture_ir
= 1;
2491 else if (strcmp(args
[0], "disable") == 0)
2493 jtag_verify_capture_ir
= 0;
2496 return ERROR_COMMAND_SYNTAX_ERROR
;
2498 } else if (argc
!= 0)
2500 return ERROR_COMMAND_SYNTAX_ERROR
;
2503 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
2508 static int handle_verify_jtag_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2512 if (strcmp(args
[0], "enable") == 0)
2516 else if (strcmp(args
[0], "disable") == 0)
2521 return ERROR_COMMAND_SYNTAX_ERROR
;
2523 } else if (argc
!= 0)
2525 return ERROR_COMMAND_SYNTAX_ERROR
;
2528 command_print(cmd_ctx
, "verify jtag capture is %s", (jtag_verify
) ? "enabled": "disabled");
2534 int jtag_power_dropout(int *dropout
)
2536 return jtag
->power_dropout(dropout
);
2539 int jtag_srst_asserted(int *srst_asserted
)
2541 return jtag
->srst_asserted(srst_asserted
);
2544 void jtag_tap_handle_event( jtag_tap_t
* tap
, enum jtag_tap_event e
)
2546 jtag_tap_event_action_t
* jteap
;
2549 jteap
= tap
->event_action
;
2553 if (jteap
->event
== e
) {
2555 LOG_DEBUG( "JTAG tap: %s event: %d (%s) action: %s\n",
2558 Jim_Nvp_value2name_simple(nvp_jtag_tap_event
, e
)->name
,
2559 Jim_GetString(jteap
->body
, NULL
) );
2560 if (Jim_EvalObj(interp
, jteap
->body
) != JIM_OK
) {
2561 Jim_PrintErrorMessage(interp
);
2565 jteap
= jteap
->next
;
2569 LOG_DEBUG( "event %d %s - no action",
2571 Jim_Nvp_value2name_simple( nvp_jtag_tap_event
, e
)->name
);
2575 static int handle_tms_sequence_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
2578 return ERROR_COMMAND_SYNTAX_ERROR
;
2583 if (strcmp(args
[0], "short") == 0)
2584 use_new_table
= true;
2585 else if (strcmp(args
[0], "long") == 0)
2586 use_new_table
= false;
2588 return ERROR_COMMAND_SYNTAX_ERROR
;
2590 tap_use_new_tms_table(use_new_table
);
2593 command_print(cmd_ctx
, "tms sequence is %s",
2594 tap_uses_new_tms_table() ? "short": "long");
2600 * Function jtag_add_statemove
2601 * moves from the current state to the goal \a state. This needs
2602 * to be handled according to the xsvf spec, see the XSTATE command
2605 int jtag_add_statemove(tap_state_t goal_state
)
2607 int retval
= ERROR_OK
;
2609 tap_state_t moves
[8];
2610 tap_state_t cur_state
= cmd_queue_cur_state
;
2615 LOG_DEBUG( "cur_state=%s goal_state=%s",
2616 tap_state_name(cur_state
),
2617 tap_state_name(goal_state
) );
2620 /* From the XSVF spec, pertaining to XSTATE:
2622 For special states known as stable states (Test-Logic-Reset,
2623 Run-Test/Idle, Pause-DR, Pause- IR), an XSVF interpreter follows
2624 predefined TAP state paths when the starting state is a stable state and
2625 when the XSTATE specifies a new stable state (see the STATE command in
2626 the [Ref 5] for the TAP state paths between stable states). For
2627 non-stable states, XSTATE should specify a state that is only one TAP
2628 state transition distance from the current TAP state to avoid undefined
2629 TAP state paths. A sequence of multiple XSTATE commands can be issued to
2630 transition the TAP through a specific state path.
2633 if (goal_state
==cur_state
)
2634 ; /* nothing to do */
2636 else if( goal_state
==TAP_RESET
)
2641 else if( tap_is_state_stable(cur_state
) && tap_is_state_stable(goal_state
) )
2643 /* note: unless tms_bits holds a path that agrees with [Ref 5] in above
2644 spec, then this code is not fully conformant to the xsvf spec. This
2645 puts a burden on tap_get_tms_path() function from the xsvf spec.
2646 If in doubt, you should confirm that that burden is being met.
2649 tms_bits
= tap_get_tms_path(cur_state
, goal_state
);
2650 tms_count
= tap_get_tms_path_len(cur_state
, goal_state
);
2652 assert( (unsigned) tms_count
< DIM(moves
) );
2654 for (i
=0; i
<tms_count
; i
++, tms_bits
>>=1)
2656 bool bit
= tms_bits
& 1;
2658 cur_state
= tap_state_transition(cur_state
, bit
);
2659 moves
[i
] = cur_state
;
2662 jtag_add_pathmove(tms_count
, moves
);
2665 /* else state must be immediately reachable in one clock cycle, and does not
2666 need to be a stable state.
2668 else if( tap_state_transition(cur_state
, true) == goal_state
2669 || tap_state_transition(cur_state
, false) == goal_state
)
2671 /* move a single state */
2672 moves
[0] = goal_state
;
2673 jtag_add_pathmove( 1, moves
);
2678 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)