1 /***************************************************************************
2 * Copyright (C) 2005 by Dominic Rath *
3 * Dominic.Rath@gmx.de *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
24 #include "replacements.h"
30 #include "interpreter.h"
36 char* tap_state_strings
[16] =
39 "sds", "cd", "sd", "e1d", "pd", "e2d", "ud",
41 "sis", "ci", "si", "e1i", "pi", "e2i", "ui"
44 typedef struct cmd_queue_page_s
48 struct cmd_queue_page_s
*next
;
51 #define CMD_QUEUE_PAGE_SIZE (1024 * 1024)
52 static cmd_queue_page_t
*cmd_queue_pages
= NULL
;
54 /* tap_move[i][j]: tap movement command to go from state i to state j
62 * SD->SD and SI->SI have to be caught in interface specific code
66 /* TLR RTI SD PD SI PI */
67 {0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16}, /* TLR */
68 {0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b}, /* RTI */
69 {0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f}, /* SD */
70 {0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f}, /* PD */
71 {0x7f, 0x31, 0x07, 0x17, 0x00, 0x01}, /* SI */
72 {0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f} /* PI */
75 int tap_move_map
[16] = {
76 0, -1, -1, 2, -1, 3, -1, -1,
77 1, -1, -1, 4, -1, 5, -1, -1
80 tap_transition_t tap_transitions
[16] =
82 {TAP_TLR
, TAP_RTI
}, /* TLR */
83 {TAP_SIS
, TAP_CD
}, /* SDS */
84 {TAP_E1D
, TAP_SD
}, /* CD */
85 {TAP_E1D
, TAP_SD
}, /* SD */
86 {TAP_UD
, TAP_PD
}, /* E1D */
87 {TAP_E2D
, TAP_PD
}, /* PD */
88 {TAP_UD
, TAP_SD
}, /* E2D */
89 {TAP_SDS
, TAP_RTI
}, /* UD */
90 {TAP_SDS
, TAP_RTI
}, /* RTI */
91 {TAP_TLR
, TAP_CI
}, /* SIS */
92 {TAP_E1I
, TAP_SI
}, /* CI */
93 {TAP_E1I
, TAP_SI
}, /* SI */
94 {TAP_UI
, TAP_PI
}, /* E1I */
95 {TAP_E2I
, TAP_PI
}, /* PI */
96 {TAP_UI
, TAP_SI
}, /* E2I */
97 {TAP_SDS
, TAP_RTI
} /* UI */
100 char* jtag_event_strings
[] =
108 enum tap_state end_state
= TAP_TLR
;
109 enum tap_state cur_state
= TAP_TLR
;
113 jtag_command_t
*jtag_command_queue
= NULL
;
114 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
115 jtag_device_t
*jtag_devices
= NULL
;
116 int jtag_num_devices
= 0;
117 int jtag_ir_scan_size
= 0;
118 enum reset_types jtag_reset_config
= RESET_NONE
;
119 enum tap_state cmd_queue_end_state
= TAP_TLR
;
120 enum tap_state cmd_queue_cur_state
= TAP_TLR
;
122 int jtag_verify_capture_ir
= 1;
124 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
125 int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
126 int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
128 /* maximum number of JTAG devices expected in the chain
130 #define JTAG_MAX_CHAIN_SIZE 20
132 /* callbacks to inform high-level handlers about JTAG state changes */
133 jtag_event_callback_t
*jtag_event_callbacks
;
135 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
137 #if BUILD_PARPORT == 1
138 extern jtag_interface_t parport_interface
;
141 #if BUILD_FT2232_FTD2XX == 1
142 extern jtag_interface_t ft2232_interface
;
145 #if BUILD_FT2232_LIBFTDI == 1
146 extern jtag_interface_t ft2232_interface
;
149 #if BUILD_AMTJTAGACCEL == 1
150 extern jtag_interface_t amt_jtagaccel_interface
;
153 #if BUILD_EP93XX == 1
154 extern jtag_interface_t ep93xx_interface
;
157 #if BUILD_AT91RM9200 == 1
158 extern jtag_interface_t at91rm9200_interface
;
161 #if BUILD_GW16012 == 1
162 extern jtag_interface_t gw16012_interface
;
165 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
166 extern jtag_interface_t presto_interface
;
169 #if BUILD_USBPROG == 1
170 extern jtag_interface_t usbprog_interface
;
173 jtag_interface_t
*jtag_interfaces
[] = {
174 #if BUILD_PARPORT == 1
177 #if BUILD_FT2232_FTD2XX == 1
180 #if BUILD_FT2232_LIBFTDI == 1
183 #if BUILD_AMTJTAGACCEL == 1
184 &amt_jtagaccel_interface
,
186 #if BUILD_EP93XX == 1
189 #if BUILD_AT91RM9200 == 1
190 &at91rm9200_interface
,
192 #if BUILD_GW16012 == 1
195 #if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
198 #if BUILD_USBPROG == 1
204 jtag_interface_t
*jtag
= NULL
;
207 char* jtag_interface
= NULL
;
211 /* forward declarations */
212 int jtag_add_statemove(enum tap_state endstate
);
213 int jtag_add_pathmove(int num_states
, enum tap_state
*path
);
214 int jtag_add_runtest(int num_cycles
, enum tap_state endstate
);
215 int jtag_add_reset(int trst
, int srst
);
216 int jtag_add_end_state(enum tap_state endstate
);
217 int jtag_add_sleep(u32 us
);
218 int jtag_execute_queue(void);
219 int jtag_cancel_queue(void);
222 int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
223 int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
224 int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
225 int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
226 int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
227 int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
229 int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
231 int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
232 int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
233 int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
234 int handle_statemove_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
235 int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
236 int handle_drscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
238 int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
240 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
242 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
244 if (callback
== NULL
)
246 return ERROR_INVALID_ARGUMENTS
;
251 while ((*callbacks_p
)->next
)
252 callbacks_p
= &((*callbacks_p
)->next
);
253 callbacks_p
= &((*callbacks_p
)->next
);
256 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
257 (*callbacks_p
)->callback
= callback
;
258 (*callbacks_p
)->priv
= priv
;
259 (*callbacks_p
)->next
= NULL
;
264 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
266 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
268 if (callback
== NULL
)
270 return ERROR_INVALID_ARGUMENTS
;
275 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
276 if ((*callbacks_p
)->callback
== callback
)
279 *callbacks_p
= *next
;
287 int jtag_call_event_callbacks(enum jtag_event event
)
289 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
291 DEBUG("jtag event: %s", jtag_event_strings
[event
]);
295 callback
->callback(event
, callback
->priv
);
296 callback
= callback
->next
;
302 /* returns a pointer to the pointer of the last command in queue
303 * this may be a pointer to the root pointer (jtag_command_queue)
304 * or to the next member of the last but one command
306 jtag_command_t
** jtag_get_last_command_p(void)
308 /* jtag_command_t *cmd = jtag_command_queue;
314 return &jtag_command_queue;
318 return last_comand_pointer
;
321 /* returns a pointer to the n-th device in the scan chain */
322 jtag_device_t
* jtag_get_device(int num
)
324 jtag_device_t
*device
= jtag_devices
;
331 device
= device
->next
;
338 void* cmd_queue_alloc(size_t size
)
340 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
345 while ((*p_page
)->next
)
346 p_page
= &((*p_page
)->next
);
347 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
348 p_page
= &((*p_page
)->next
);
353 *p_page
= malloc(sizeof(cmd_queue_page_t
));
355 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
356 (*p_page
)->next
= NULL
;
359 offset
= (*p_page
)->used
;
360 (*p_page
)->used
+= size
;
362 u8
*t
=(u8
*)((*p_page
)->address
);
366 void cmd_queue_free()
368 cmd_queue_page_t
*page
= cmd_queue_pages
;
372 cmd_queue_page_t
*last
= page
;
378 cmd_queue_pages
= NULL
;
381 int jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
, void *dummy_anachronism
)
383 jtag_command_t
**last_cmd
;
384 jtag_device_t
*device
;
390 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
391 return ERROR_JTAG_TRST_ASSERTED
;
394 last_cmd
= jtag_get_last_command_p();
396 /* allocate memory for a new list member */
397 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
398 (*last_cmd
)->next
= NULL
;
399 last_comand_pointer
= &((*last_cmd
)->next
);
400 (*last_cmd
)->type
= JTAG_SCAN
;
402 /* allocate memory for ir scan command */
403 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
404 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
405 (*last_cmd
)->cmd
.scan
->num_fields
= jtag_num_devices
; /* one field per device */
406 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(jtag_num_devices
* sizeof(scan_field_t
));
407 (*last_cmd
)->cmd
.scan
->end_state
= state
;
410 cmd_queue_end_state
= state
;
412 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
413 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
415 if (cmd_queue_end_state
== TAP_TLR
)
416 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
418 cmd_queue_cur_state
= cmd_queue_end_state
;
420 for (i
= 0; i
< jtag_num_devices
; i
++)
423 device
= jtag_get_device(i
);
424 scan_size
= device
->ir_length
;
425 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= i
;
426 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= scan_size
;
427 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= NULL
;
428 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
; /* disable verification by default */
430 /* search the list */
431 for (j
= 0; j
< num_fields
; j
++)
433 if (i
== fields
[j
].device
)
436 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
437 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
439 if (jtag_verify_capture_ir
)
441 if (fields
[j
].in_handler
==NULL
)
443 jtag_set_check_value((*last_cmd
)->cmd
.scan
->fields
+i
, device
->expected
, device
->expected_mask
, NULL
);
446 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[j
].in_handler
;
447 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[j
].in_handler_priv
;
448 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= device
->expected
;
449 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= device
->expected_mask
;
460 /* if a device isn't listed, set it to BYPASS */
461 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
462 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= NULL
;
467 /* update device information */
468 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[i
].out_value
, jtag_get_device(i
)->cur_instr
, scan_size
);
474 int jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
, void *dummy_anachronism
)
476 jtag_command_t
**last_cmd
;
481 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
482 return ERROR_JTAG_TRST_ASSERTED
;
485 last_cmd
= jtag_get_last_command_p();
487 /* allocate memory for a new list member */
488 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
489 (*last_cmd
)->next
= NULL
;
490 last_comand_pointer
= &((*last_cmd
)->next
);
491 (*last_cmd
)->type
= JTAG_SCAN
;
493 /* allocate memory for ir scan command */
494 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
495 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
496 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
497 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
498 (*last_cmd
)->cmd
.scan
->end_state
= state
;
501 cmd_queue_end_state
= state
;
503 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
504 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
506 if (cmd_queue_end_state
== TAP_TLR
)
507 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
509 cmd_queue_cur_state
= cmd_queue_end_state
;
511 for (i
= 0; i
< num_fields
; i
++)
513 int num_bits
= fields
[i
].num_bits
;
514 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
515 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= fields
[i
].device
;
516 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
517 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
518 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
519 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
520 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
521 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
522 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
;
523 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= NULL
;
528 int jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
, void *dummy_anachronism
)
531 int bypass_devices
= 0;
533 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
534 jtag_device_t
*device
= jtag_devices
;
539 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
540 return ERROR_JTAG_TRST_ASSERTED
;
543 /* count devices in bypass */
548 device
= device
->next
;
551 /* allocate memory for a new list member */
552 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
553 last_comand_pointer
= &((*last_cmd
)->next
);
554 (*last_cmd
)->next
= NULL
;
555 (*last_cmd
)->type
= JTAG_SCAN
;
557 /* allocate memory for dr scan command */
558 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
559 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
560 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
561 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
562 (*last_cmd
)->cmd
.scan
->end_state
= state
;
565 cmd_queue_end_state
= state
;
567 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
568 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
570 if (cmd_queue_end_state
== TAP_TLR
)
571 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
573 cmd_queue_cur_state
= cmd_queue_end_state
;
575 for (i
= 0; i
< jtag_num_devices
; i
++)
578 (*last_cmd
)->cmd
.scan
->fields
[field_count
].device
= i
;
580 for (j
= 0; j
< num_fields
; j
++)
582 if (i
== fields
[j
].device
)
585 scan_size
= fields
[j
].num_bits
;
586 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
587 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
588 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
589 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= fields
[j
].in_value
;
590 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= fields
[j
].in_check_value
;
591 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= fields
[j
].in_check_mask
;
592 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= fields
[j
].in_handler
;
593 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= fields
[j
].in_handler_priv
;
598 /* if a device isn't listed, the BYPASS register should be selected */
599 if (!jtag_get_device(i
)->bypass
)
601 ERROR("BUG: no scan data for a device not in BYPASS");
605 /* program the scan field to 1 bit length, and ignore it's value */
606 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
607 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
608 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= NULL
;
609 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
610 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
611 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
612 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
613 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
617 /* if a device is listed, the BYPASS register must not be selected */
618 if (jtag_get_device(i
)->bypass
)
620 WARNING("scan data for a device in BYPASS");
627 int jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
, void *dummy_anachronism
)
630 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
634 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
635 return ERROR_JTAG_TRST_ASSERTED
;
638 /* allocate memory for a new list member */
639 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
640 last_comand_pointer
= &((*last_cmd
)->next
);
641 (*last_cmd
)->next
= NULL
;
642 (*last_cmd
)->type
= JTAG_SCAN
;
644 /* allocate memory for scan command */
645 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
646 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
647 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
648 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
649 (*last_cmd
)->cmd
.scan
->end_state
= state
;
652 cmd_queue_end_state
= state
;
654 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
655 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
657 if (cmd_queue_end_state
== TAP_TLR
)
658 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
660 cmd_queue_cur_state
= cmd_queue_end_state
;
662 for (i
= 0; i
< num_fields
; i
++)
664 int num_bits
= fields
[i
].num_bits
;
665 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
666 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= fields
[i
].device
;
667 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
668 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
669 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
670 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
671 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= fields
[i
].in_check_value
;
672 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= fields
[i
].in_check_mask
;
673 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[i
].in_handler
;
674 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[i
].in_handler_priv
;
679 int jtag_add_statemove(enum tap_state state
)
681 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
685 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
686 return ERROR_JTAG_TRST_ASSERTED
;
689 /* allocate memory for a new list member */
690 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
691 last_comand_pointer
= &((*last_cmd
)->next
);
692 (*last_cmd
)->next
= NULL
;
693 (*last_cmd
)->type
= JTAG_STATEMOVE
;
695 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
696 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
699 cmd_queue_end_state
= state
;
701 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
702 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
704 if (cmd_queue_end_state
== TAP_TLR
)
705 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
707 cmd_queue_cur_state
= cmd_queue_end_state
;
712 int jtag_add_pathmove(int num_states
, enum tap_state
*path
)
714 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
719 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
720 return ERROR_JTAG_TRST_ASSERTED
;
723 /* the last state has to be a stable state */
724 if (tap_move_map
[path
[num_states
- 1]] == -1)
726 ERROR("TAP path doesn't finish in a stable state");
727 return ERROR_JTAG_NOT_IMPLEMENTED
;
730 if (jtag
->support_pathmove
)
732 /* allocate memory for a new list member */
733 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
734 last_comand_pointer
= &((*last_cmd
)->next
);
735 (*last_cmd
)->next
= NULL
;
736 (*last_cmd
)->type
= JTAG_PATHMOVE
;
738 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
739 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
740 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(enum tap_state
) * num_states
);
742 for (i
= 0; i
< num_states
; i
++)
743 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
747 /* validate the desired path, and see if it fits a default path */
752 for (i
= 0; i
< num_states
; i
++)
754 for (j
= i
; j
< num_states
; j
++)
756 if (tap_move_map
[path
[j
]] != -1)
763 if (begin
- end
<= 7) /* a default path spans no more than 7 states */
765 jtag_add_statemove(path
[end
]);
769 ERROR("encountered a TAP path that can't be fulfilled by default paths");
770 return ERROR_JTAG_NOT_IMPLEMENTED
;
777 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
778 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
780 if (cmd_queue_end_state
== TAP_TLR
)
781 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
783 cmd_queue_cur_state
= path
[num_states
- 1];
788 int jtag_add_runtest(int num_cycles
, enum tap_state state
)
790 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
794 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
795 return ERROR_JTAG_TRST_ASSERTED
;
798 /* allocate memory for a new list member */
799 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
800 (*last_cmd
)->next
= NULL
;
801 last_comand_pointer
= &((*last_cmd
)->next
);
802 (*last_cmd
)->type
= JTAG_RUNTEST
;
804 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
805 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
806 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
809 cmd_queue_end_state
= state
;
811 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
812 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
814 if (cmd_queue_end_state
== TAP_TLR
)
815 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
817 cmd_queue_cur_state
= cmd_queue_end_state
;
822 int jtag_add_reset(int req_trst
, int req_srst
)
824 int trst_with_tms
= 0;
826 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
829 req_trst
= jtag_trst
;
832 req_srst
= jtag_srst
;
834 /* Make sure that jtag_reset_config allows the requested reset */
835 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
836 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (req_trst
== 0))
837 return ERROR_JTAG_RESET_WOULD_ASSERT_TRST
;
839 /* if TRST pulls SRST, we reset with TAP T-L-R */
840 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_trst
== 1)) && (req_srst
== 0))
846 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
848 ERROR("requested nSRST assertion, but the current configuration doesn't support this");
849 return ERROR_JTAG_RESET_CANT_SRST
;
852 if (req_trst
&& !(jtag_reset_config
& RESET_HAS_TRST
))
858 /* allocate memory for a new list member */
859 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
860 (*last_cmd
)->next
= NULL
;
861 last_comand_pointer
= &((*last_cmd
)->next
);
862 (*last_cmd
)->type
= JTAG_RESET
;
864 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
865 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
866 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
868 jtag_trst
= req_trst
;
869 jtag_srst
= req_srst
;
873 jtag_call_event_callbacks(JTAG_SRST_ASSERTED
);
877 jtag_call_event_callbacks(JTAG_SRST_RELEASED
);
878 if (jtag_nsrst_delay
)
879 jtag_add_sleep(jtag_nsrst_delay
* 1000);
884 last_cmd
= &((*last_cmd
)->next
);
886 /* allocate memory for a new list member */
887 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
888 (*last_cmd
)->next
= NULL
;
889 last_comand_pointer
= &((*last_cmd
)->next
);
890 (*last_cmd
)->type
= JTAG_STATEMOVE
;
892 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
893 (*last_cmd
)->cmd
.statemove
->end_state
= TAP_TLR
;
895 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
896 cmd_queue_cur_state
= TAP_TLR
;
897 cmd_queue_end_state
= TAP_TLR
;
905 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
906 * and inform possible listeners about this
908 cmd_queue_cur_state
= TAP_TLR
;
909 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
913 /* the nTRST line got deasserted, so we're still in Test-Logic-Reset,
914 * but we might want to add a delay to give the TAP time to settle
916 if (jtag_ntrst_delay
)
917 jtag_add_sleep(jtag_ntrst_delay
* 1000);
924 int jtag_add_end_state(enum tap_state state
)
926 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
928 /* allocate memory for a new list member */
929 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
930 (*last_cmd
)->next
= NULL
;
931 last_comand_pointer
= &((*last_cmd
)->next
);
932 (*last_cmd
)->type
= JTAG_END_STATE
;
934 (*last_cmd
)->cmd
.end_state
= cmd_queue_alloc(sizeof(end_state_command_t
));
935 (*last_cmd
)->cmd
.end_state
->end_state
= state
;
938 cmd_queue_end_state
= state
;
943 int jtag_add_sleep(u32 us
)
945 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
947 /* allocate memory for a new list member */
948 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
949 (*last_cmd
)->next
= NULL
;
950 last_comand_pointer
= &((*last_cmd
)->next
);
951 (*last_cmd
)->type
= JTAG_SLEEP
;
953 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
954 (*last_cmd
)->cmd
.sleep
->us
= us
;
959 int jtag_scan_size(scan_command_t
*cmd
)
964 /* count bits in scan command */
965 for (i
= 0; i
< cmd
->num_fields
; i
++)
967 bit_count
+= cmd
->fields
[i
].num_bits
;
973 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
978 bit_count
= jtag_scan_size(cmd
);
979 *buffer
= malloc(CEIL(bit_count
, 8));
983 for (i
= 0; i
< cmd
->num_fields
; i
++)
985 if (cmd
->fields
[i
].out_value
)
987 #ifdef _DEBUG_JTAG_IO_
988 char* char_buf
= buf_to_str(cmd
->fields
[i
].out_value
, (cmd
->fields
[i
].num_bits
> 64) ? 64 : cmd
->fields
[i
].num_bits
, 16);
990 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
991 #ifdef _DEBUG_JTAG_IO_
992 DEBUG("fields[%i].out_value: 0x%s", i
, char_buf
);
997 bit_count
+= cmd
->fields
[i
].num_bits
;
1004 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1010 /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
1013 for (i
= 0; i
< cmd
->num_fields
; i
++)
1015 /* if neither in_value nor in_handler
1016 * are specified we don't have to examine this field
1018 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1020 int num_bits
= cmd
->fields
[i
].num_bits
;
1021 u8
*captured
= buf_set_buf(buffer
, bit_count
, malloc(CEIL(num_bits
, 8)), 0, num_bits
);
1023 #ifdef _DEBUG_JTAG_IO_
1026 char_buf
= buf_to_str(captured
, (num_bits
> 64) ? 64 : num_bits
, 16);
1027 DEBUG("fields[%i].in_value: 0x%s", i
, char_buf
);
1031 if (cmd
->fields
[i
].in_value
)
1033 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1035 if (cmd
->fields
[i
].in_handler
)
1037 if (cmd
->fields
[i
].in_handler(cmd
->fields
[i
].in_value
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1039 WARNING("in_handler reported a failed check");
1040 retval
= ERROR_JTAG_QUEUE_FAILED
;
1045 /* no in_value specified, but a handler takes care of the scanned data */
1046 if (cmd
->fields
[i
].in_handler
&& (!cmd
->fields
[i
].in_value
))
1048 if (cmd
->fields
[i
].in_handler(captured
, cmd
->fields
[i
].in_handler_priv
, cmd
->fields
+i
) != ERROR_OK
)
1050 /* We're going to call the error:handler later, but if the in_handler
1051 * reported an error we report this failure upstream
1053 WARNING("in_handler reported a failed check");
1054 retval
= ERROR_JTAG_QUEUE_FAILED
;
1060 bit_count
+= cmd
->fields
[i
].num_bits
;
1066 int jtag_check_value(u8
*captured
, void *priv
, scan_field_t
*field
)
1068 int retval
= ERROR_OK
;
1069 int num_bits
= field
->num_bits
;
1071 int compare_failed
= 0;
1073 if (field
->in_check_mask
)
1074 compare_failed
= buf_cmp_mask(captured
, field
->in_check_value
, field
->in_check_mask
, num_bits
);
1076 compare_failed
= buf_cmp(captured
, field
->in_check_value
, num_bits
);
1080 /* An error handler could have caught the failing check
1081 * only report a problem when there wasn't a handler, or if the handler
1082 * acknowledged the error
1086 char *captured_char
= buf_to_str(captured
, (num_bits
> 64) ? 64 : num_bits
, 16);
1087 char *in_check_value_char
= buf_to_str(field
->in_check_value
, (num_bits
> 64) ? 64 : num_bits
, 16);
1089 if (field
->in_check_mask
)
1091 char *in_check_mask_char
;
1092 in_check_mask_char
= buf_to_str(field
->in_check_mask
, (num_bits
> 64) ? 64 : num_bits
, 16);
1093 WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s check_mask: 0x%s", captured_char
, in_check_value_char
, in_check_mask_char
);
1094 free(in_check_mask_char
);
1098 WARNING("value captured during scan didn't pass the requested check: captured: 0x%s check_value: 0x%s", captured_char
, in_check_value_char
);
1101 free(captured_char
);
1102 free(in_check_value_char
);
1110 set up checking of this field using the in_handler. The values passed in must be valid until
1111 after jtag_execute() has completed.
1113 void jtag_set_check_value(scan_field_t
*field
, u8
*value
, u8
*mask
, error_handler_t
*in_error_handler
)
1116 field
->in_handler
= jtag_check_value
;
1118 field
->in_handler
= NULL
; /* No check, e.g. embeddedice uses value==NULL to indicate no check */
1119 field
->in_handler_priv
= NULL
; /* this will be filled in at the invocation site to point to the field duplicate */
1120 field
->in_check_value
= value
;
1121 field
->in_check_mask
= mask
;
1124 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1129 for (i
= 0; i
< cmd
->num_fields
; i
++)
1131 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1133 if (cmd
->fields
[i
].out_value
)
1140 int jtag_execute_queue(void)
1144 retval
= jtag
->execute_queue();
1148 jtag_command_queue
= NULL
;
1149 last_comand_pointer
= &jtag_command_queue
;
1154 int jtag_cancel_queue(void)
1157 jtag_command_queue
= NULL
;
1158 last_comand_pointer
= &jtag_command_queue
;
1163 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1165 jtag_device_t
*device
= priv
;
1169 if (event
== JTAG_TRST_ASSERTED
)
1171 buf_set_ones(device
->cur_instr
, device
->ir_length
);
1178 void jtag_sleep(u32 us
)
1183 /* Try to examine chain layout according to IEEE 1149.1 §12
1185 int jtag_examine_chain()
1187 jtag_device_t
*device
= jtag_devices
;
1189 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1192 int device_count
= 0;
1193 u8 zero_check
= 0x0;
1194 u8 one_check
= 0xff;
1197 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1198 field
.out_value
= idcode_buffer
;
1199 field
.out_mask
= NULL
;
1200 field
.in_value
= idcode_buffer
;
1201 field
.in_check_value
= NULL
;
1202 field
.in_check_mask
= NULL
;
1203 field
.in_handler
= NULL
;
1204 field
.in_handler_priv
= NULL
;
1206 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1208 buf_set_u32(idcode_buffer
, i
* 32, 32, 0x000000FF);
1211 jtag_add_plain_dr_scan(1, &field
, TAP_TLR
, NULL
);
1212 jtag_execute_queue();
1214 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1216 zero_check
|= idcode_buffer
[i
];
1217 one_check
&= idcode_buffer
[i
];
1220 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1221 if ((zero_check
== 0x00) || (one_check
== 0xff))
1223 ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1224 return ERROR_JTAG_INIT_FAILED
;
1227 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1229 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1230 if ((idcode
& 1) == 0)
1232 /* LSB must not be 0, this indicates a device in bypass */
1243 if (idcode
== 0x000000FF)
1245 /* End of chain (invalid manufacturer ID) */
1251 device
->idcode
= idcode
;
1252 device
= device
->next
;
1256 manufacturer
= (idcode
& 0xffe) >> 1;
1257 part
= (idcode
& 0xffff000) >> 12;
1258 version
= (idcode
& 0xf0000000) >> 28;
1260 INFO("JTAG device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x)",
1261 idcode
, manufacturer
, part
, version
);
1267 /* see if number of discovered devices matches configuration */
1268 if (device_count
!= jtag_num_devices
)
1270 ERROR("number of discovered devices in JTAG chain (%i) doesn't match configuration (%i)",
1271 device_count
, jtag_num_devices
);
1272 ERROR("check the config file and ensure proper JTAG communication (connections, speed, ...)");
1273 return ERROR_JTAG_INIT_FAILED
;
1279 int jtag_validate_chain()
1281 jtag_device_t
*device
= jtag_devices
;
1282 int total_ir_length
= 0;
1289 total_ir_length
+= device
->ir_length
;
1290 device
= device
->next
;
1293 total_ir_length
+= 2;
1294 ir_test
= malloc(CEIL(total_ir_length
, 8));
1295 buf_set_ones(ir_test
, total_ir_length
);
1298 field
.num_bits
= total_ir_length
;
1299 field
.out_value
= ir_test
;
1300 field
.out_mask
= NULL
;
1301 field
.in_value
= ir_test
;
1302 field
.in_check_value
= NULL
;
1303 field
.in_check_mask
= NULL
;
1304 field
.in_handler
= NULL
;
1305 field
.in_handler_priv
= NULL
;
1307 jtag_add_plain_ir_scan(1, &field
, TAP_TLR
, NULL
);
1308 jtag_execute_queue();
1310 device
= jtag_devices
;
1313 if (buf_get_u32(ir_test
, chain_pos
, 2) != 0x1)
1315 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1316 ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf
);
1319 return ERROR_JTAG_INIT_FAILED
;
1321 chain_pos
+= device
->ir_length
;
1322 device
= device
->next
;
1325 if (buf_get_u32(ir_test
, chain_pos
, 2) != 0x3)
1327 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1328 ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf
);
1331 return ERROR_JTAG_INIT_FAILED
;
1339 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
1341 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
1342 COMMAND_CONFIG
, NULL
);
1343 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
1344 COMMAND_ANY
, "set jtag speed (if supported) <speed>");
1345 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
1346 COMMAND_CONFIG
, NULL
);
1347 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
1348 COMMAND_CONFIG
, NULL
);
1349 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
1350 COMMAND_CONFIG
, NULL
);
1351 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
1352 COMMAND_CONFIG
, NULL
);
1354 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
1355 COMMAND_EXEC
, "print current scan chain configuration");
1357 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
1358 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
1359 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
1360 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
1361 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
1362 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
1363 register_command(cmd_ctx
, NULL
, "statemove", handle_statemove_command
,
1364 COMMAND_EXEC
, "move to current endstate or [tap_state]");
1365 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
1366 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
1367 register_command(cmd_ctx
, NULL
, "drscan", handle_drscan_command
,
1368 COMMAND_EXEC
, "execute DR scan <device> <var> [dev2] [var2] ...");
1370 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
1371 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
1375 int jtag_init(struct command_context_s
*cmd_ctx
)
1377 int i
, validate_tries
= 0;
1381 if (jtag_speed
== -1)
1384 if (jtag_interface
&& (jtag_interface
[0] != 0))
1385 /* configuration var 'jtag_interface' is set, and not empty */
1386 for (i
= 0; jtag_interfaces
[i
]; i
++)
1388 if (strcmp(jtag_interface
, jtag_interfaces
[i
]->name
) == 0)
1390 jtag_device_t
*device
;
1391 device
= jtag_devices
;
1393 if (jtag_interfaces
[i
]->init() != ERROR_OK
)
1394 return ERROR_JTAG_INIT_FAILED
;
1395 jtag
= jtag_interfaces
[i
];
1397 jtag_ir_scan_size
= 0;
1398 jtag_num_devices
= 0;
1399 while (device
!= NULL
)
1401 jtag_ir_scan_size
+= device
->ir_length
;
1403 device
= device
->next
;
1406 jtag_add_statemove(TAP_TLR
);
1407 jtag_execute_queue();
1409 /* examine chain first, as this could discover the real chain layout */
1410 if (jtag_examine_chain() != ERROR_OK
)
1412 ERROR("trying to validate configured JTAG chain anyway...");
1415 while (jtag_validate_chain() != ERROR_OK
)
1418 if (validate_tries
> 5)
1420 ERROR("Could not validate JTAG chain, exit");
1422 return ERROR_JTAG_INVALID_INTERFACE
;
1431 /* no valid interface was found (i.e. the configuration option,
1432 * didn't match one of the compiled-in interfaces
1434 ERROR("No valid jtag interface found (%s)", jtag_interface
);
1435 ERROR("compiled-in jtag interfaces:");
1436 for (i
= 0; jtag_interfaces
[i
]; i
++)
1438 ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
1442 return ERROR_JTAG_INVALID_INTERFACE
;
1445 int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1449 /* only if the configuration var isn't overwritten from cmdline */
1450 if (!jtag_interface
)
1452 if (args
[0] && (args
[0][0] != 0))
1454 for (i
=0; jtag_interfaces
[i
]; i
++)
1456 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
1458 if (jtag_interfaces
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1461 jtag_interface
= jtag_interfaces
[i
]->name
;
1468 /* remember the requested interface name, so we can complain about it later */
1469 jtag_interface
= strdup(args
[0]);
1470 DEBUG("'interface' command didn't specify a valid interface");
1476 int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1478 jtag_device_t
**last_device_p
= &jtag_devices
;
1482 while ((*last_device_p
)->next
)
1483 last_device_p
= &((*last_device_p
)->next
);
1484 last_device_p
= &((*last_device_p
)->next
);
1490 *last_device_p
= malloc(sizeof(jtag_device_t
));
1491 (*last_device_p
)->ir_length
= strtoul(args
[0], NULL
, 0);
1493 (*last_device_p
)->expected
= malloc((*last_device_p
)->ir_length
);
1494 buf_set_u32((*last_device_p
)->expected
, 0, (*last_device_p
)->ir_length
, strtoul(args
[1], NULL
, 0));
1495 (*last_device_p
)->expected_mask
= malloc((*last_device_p
)->ir_length
);
1496 buf_set_u32((*last_device_p
)->expected_mask
, 0, (*last_device_p
)->ir_length
, strtoul(args
[2], NULL
, 0));
1498 (*last_device_p
)->cur_instr
= malloc((*last_device_p
)->ir_length
);
1499 (*last_device_p
)->bypass
= 1;
1500 buf_set_ones((*last_device_p
)->cur_instr
, (*last_device_p
)->ir_length
);
1502 (*last_device_p
)->next
= NULL
;
1504 jtag_register_event_callback(jtag_reset_callback
, (*last_device_p
));
1511 int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1513 jtag_device_t
*device
= jtag_devices
;
1514 int device_count
= 0;
1518 u32 expected
, expected_mask
, cur_instr
;
1519 expected
= buf_get_u32(device
->expected
, 0, device
->ir_length
);
1520 expected_mask
= buf_get_u32(device
->expected_mask
, 0, device
->ir_length
);
1521 cur_instr
= buf_get_u32(device
->cur_instr
, 0, device
->ir_length
);
1522 command_print(cmd_ctx
, "%i: idcode: 0x%8.8x ir length %i, ir capture 0x%x, ir mask 0x%x, current instruction 0x%x", device_count
, device
->idcode
, device
->ir_length
, expected
, expected_mask
, cur_instr
);
1523 device
= device
->next
;
1530 int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1534 if (strcmp(args
[0], "none") == 0)
1535 jtag_reset_config
= RESET_NONE
;
1536 else if (strcmp(args
[0], "trst_only") == 0)
1537 jtag_reset_config
= RESET_HAS_TRST
;
1538 else if (strcmp(args
[0], "srst_only") == 0)
1539 jtag_reset_config
= RESET_HAS_SRST
;
1540 else if (strcmp(args
[0], "trst_and_srst") == 0)
1541 jtag_reset_config
= RESET_TRST_AND_SRST
;
1544 ERROR("invalid reset_config argument, defaulting to none");
1545 jtag_reset_config
= RESET_NONE
;
1546 return ERROR_INVALID_ARGUMENTS
;
1552 if (strcmp(args
[1], "srst_pulls_trst") == 0)
1553 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
1554 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
1555 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
1556 else if (strcmp(args
[1], "combined") == 0)
1557 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1558 else if (strcmp(args
[1], "separate") == 0)
1559 jtag_reset_config
&= ~(RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
);
1562 ERROR("invalid reset_config argument, defaulting to none");
1563 jtag_reset_config
= RESET_NONE
;
1564 return ERROR_INVALID_ARGUMENTS
;
1570 if (strcmp(args
[2], "trst_open_drain") == 0)
1571 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
1572 else if (strcmp(args
[2], "trst_push_pull") == 0)
1573 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
1576 ERROR("invalid reset_config argument, defaulting to none");
1577 jtag_reset_config
= RESET_NONE
;
1578 return ERROR_INVALID_ARGUMENTS
;
1584 if (strcmp(args
[3], "srst_push_pull") == 0)
1585 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
1586 else if (strcmp(args
[3], "srst_open_drain") == 0)
1587 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
1590 ERROR("invalid reset_config argument, defaulting to none");
1591 jtag_reset_config
= RESET_NONE
;
1592 return ERROR_INVALID_ARGUMENTS
;
1599 int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1603 ERROR("jtag_nsrst_delay <ms> command takes one required argument");
1608 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
1614 int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1618 ERROR("jtag_ntrst_delay <ms> command takes one required argument");
1623 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
1629 int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1632 command_print(cmd_ctx
, "jtag_speed: %i", jtag_speed
);
1636 /* this command can be called during CONFIG,
1637 * in which case jtag isn't initialized */
1639 jtag
->speed(strtoul(args
[0], NULL
, 0));
1641 jtag_speed
= strtoul(args
[0], NULL
, 0);
1647 int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1649 enum tap_state state
;
1653 command_print(cmd_ctx
, "usage: endstate <tap_state>");
1657 for (state
= 0; state
< 16; state
++)
1659 if (strcmp(args
[0], tap_state_strings
[state
]) == 0)
1661 jtag_add_end_state(state
);
1662 jtag_execute_queue();
1666 command_print(cmd_ctx
, "current endstate: %s", tap_state_strings
[end_state
]);
1671 int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1675 char *usage
= "usage: jtag_reset <trst> <srst>";
1680 command_print(cmd_ctx
, usage
);
1684 if (args
[0][0] == '1')
1686 else if (args
[0][0] == '0')
1690 command_print(cmd_ctx
, usage
);
1694 if (args
[1][0] == '1')
1696 else if (args
[1][0] == '0')
1700 command_print(cmd_ctx
, usage
);
1704 if ((retval
= jtag_add_reset(trst
, srst
)) != ERROR_OK
)
1708 case ERROR_JTAG_RESET_WOULD_ASSERT_TRST
:
1709 command_print(cmd_ctx
, "requested reset would assert trst\nif this is acceptable, use jtag_reset 1 %c", args
[1][0]);
1711 case ERROR_JTAG_RESET_CANT_SRST
:
1712 command_print(cmd_ctx
, "can't assert srst because the current reset_config doesn't support it");
1715 command_print(cmd_ctx
, "unknown error");
1718 jtag_execute_queue();
1723 int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1727 command_print(cmd_ctx
, "usage: runtest <num_cycles>");
1731 jtag_add_runtest(strtol(args
[0], NULL
, 0), -1);
1732 jtag_execute_queue();
1738 int handle_statemove_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1740 enum tap_state state
;
1745 for (state
= 0; state
< 16; state
++)
1747 if (strcmp(args
[0], tap_state_strings
[state
]) == 0)
1754 jtag_add_statemove(state
);
1755 jtag_execute_queue();
1761 int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1764 scan_field_t
*fields
;
1766 if ((argc
< 2) || (argc
% 2))
1768 command_print(cmd_ctx
, "usage: irscan <device> <instr> [dev2] [instr2] ...");
1772 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
1774 for (i
= 0; i
< argc
/ 2; i
++)
1776 int device
= strtoul(args
[i
*2], NULL
, 0);
1777 int field_size
= jtag_get_device(device
)->ir_length
;
1778 fields
[i
].device
= device
;
1779 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1780 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
1781 fields
[i
].out_mask
= NULL
;
1782 fields
[i
].in_value
= NULL
;
1783 fields
[i
].in_check_mask
= NULL
;
1784 fields
[i
].in_handler
= NULL
;
1785 fields
[i
].in_handler_priv
= NULL
;
1788 jtag_add_ir_scan(argc
/ 2, fields
, -1, NULL
);
1789 jtag_execute_queue();
1791 for (i
= 0; i
< argc
/ 2; i
++)
1792 free(fields
[i
].out_value
);
1799 int handle_drscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1801 scan_field_t
*fields
;
1803 int field_count
= 0;
1807 if ((argc
< 2) || (argc
% 2))
1809 command_print(cmd_ctx
, "usage: drscan <device> <var> [dev2] [var2]");
1813 for (i
= 0; i
< argc
; i
+=2)
1815 var
= get_var_by_namenum(args
[i
+1]);
1818 num_fields
+= var
->num_fields
;
1822 command_print(cmd_ctx
, "variable %s doesn't exist", args
[i
+1]);
1827 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1829 for (i
= 0; i
< argc
; i
+=2)
1831 var
= get_var_by_namenum(args
[i
+1]);
1833 for (j
= 0; j
< var
->num_fields
; j
++)
1835 fields
[field_count
].device
= strtol(args
[i
], NULL
, 0);
1836 fields
[field_count
].num_bits
= var
->fields
[j
].num_bits
;
1837 fields
[field_count
].out_value
= malloc(CEIL(var
->fields
[j
].num_bits
, 8));
1838 buf_set_u32(fields
[field_count
].out_value
, 0, var
->fields
[j
].num_bits
, var
->fields
[j
].value
);
1839 fields
[field_count
].out_mask
= NULL
;
1840 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1841 fields
[field_count
].in_check_mask
= NULL
;
1842 fields
[field_count
].in_check_value
= NULL
;
1843 fields
[field_count
].in_handler
= field_le_to_host
;
1844 fields
[field_count
++].in_handler_priv
= &(var
->fields
[j
]);
1848 jtag_add_dr_scan(num_fields
, fields
, -1, NULL
);
1849 jtag_execute_queue();
1851 for (i
= 0; i
< argc
/ 2; i
++)
1852 free(fields
[i
].out_value
);
1859 int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1863 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
1867 if (strcmp(args
[0], "enable") == 0)
1869 jtag_verify_capture_ir
= 1;
1871 else if (strcmp(args
[0], "disable") == 0)
1873 jtag_verify_capture_ir
= 0;
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)