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
64 /* TLR RTI SD PD SI PI */
65 {0x7f, 0x00, 0x17, 0x0a, 0x1b, 0x16}, /* TLR */
66 {0x7f, 0x00, 0x25, 0x05, 0x2b, 0x0b}, /* RTI */
67 {0x7f, 0x31, 0x00, 0x01, 0x0f, 0x2f}, /* SD */
68 {0x7f, 0x30, 0x20, 0x17, 0x1e, 0x2f}, /* PD */
69 {0x7f, 0x31, 0x07, 0x17, 0x00, 0x01}, /* SI */
70 {0x7f, 0x30, 0x1c, 0x17, 0x20, 0x2f} /* PI */
73 int tap_move_map
[16] = {
74 0, -1, -1, 2, -1, 3, -1, -1,
75 1, -1, -1, 4, -1, 5, -1, -1
78 tap_transition_t tap_transitions
[16] =
80 {TAP_TLR
, TAP_RTI
}, /* TLR */
81 {TAP_SIS
, TAP_CD
}, /* SDS */
82 {TAP_E1D
, TAP_SD
}, /* CD */
83 {TAP_E1D
, TAP_SD
}, /* SD */
84 {TAP_UD
, TAP_PD
}, /* E1D */
85 {TAP_E2D
, TAP_PD
}, /* PD */
86 {TAP_UD
, TAP_SD
}, /* E2D */
87 {TAP_SDS
, TAP_RTI
}, /* UD */
88 {TAP_SDS
, TAP_RTI
}, /* RTI */
89 {TAP_TLR
, TAP_CI
}, /* SIS */
90 {TAP_E1I
, TAP_SI
}, /* CI */
91 {TAP_E1I
, TAP_SI
}, /* SI */
92 {TAP_UI
, TAP_PI
}, /* E1I */
93 {TAP_E2I
, TAP_PI
}, /* PI */
94 {TAP_UI
, TAP_SI
}, /* E2I */
95 {TAP_SDS
, TAP_RTI
} /* UI */
98 char* jtag_event_strings
[] =
106 enum tap_state end_state
= TAP_TLR
;
107 enum tap_state cur_state
= TAP_TLR
;
111 jtag_command_t
*jtag_command_queue
= NULL
;
112 jtag_command_t
**last_comand_pointer
= &jtag_command_queue
;
113 jtag_device_t
*jtag_devices
= NULL
;
114 int jtag_num_devices
= 0;
115 int jtag_ir_scan_size
= 0;
116 enum reset_types jtag_reset_config
= RESET_NONE
;
117 enum tap_state cmd_queue_end_state
= TAP_TLR
;
118 enum tap_state cmd_queue_cur_state
= TAP_TLR
;
120 int jtag_verify_capture_ir
= 1;
122 /* how long the OpenOCD should wait before attempting JTAG communication after reset lines deasserted (in ms) */
123 int jtag_nsrst_delay
= 0; /* default to no nSRST delay */
124 int jtag_ntrst_delay
= 0; /* default to no nTRST delay */
126 /* maximum number of JTAG devices expected in the chain
128 #define JTAG_MAX_CHAIN_SIZE 20
130 /* callbacks to inform high-level handlers about JTAG state changes */
131 jtag_event_callback_t
*jtag_event_callbacks
;
133 /* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
135 #if BUILD_PARPORT == 1
136 extern jtag_interface_t parport_interface
;
139 #if BUILD_FT2232_FTD2XX == 1
140 extern jtag_interface_t ft2232_interface
;
143 #if BUILD_FT2232_LIBFTDI == 1
144 extern jtag_interface_t ft2232_interface
;
147 #if BUILD_AMTJTAGACCEL == 1
148 extern jtag_interface_t amt_jtagaccel_interface
;
151 #if BUILD_EP93XX == 1
152 extern jtag_interface_t ep93xx_interface
;
155 #if BUILD_AT91RM9200 == 1
156 extern jtag_interface_t at91rm9200_interface
;
159 #if BUILD_GW16012 == 1
160 extern jtag_interface_t gw16012_interface
;
163 jtag_interface_t
*jtag_interfaces
[] = {
164 #if BUILD_PARPORT == 1
167 #if BUILD_FT2232_FTD2XX == 1
170 #if BUILD_FT2232_LIBFTDI == 1
173 #if BUILD_AMTJTAGACCEL == 1
174 &amt_jtagaccel_interface
,
176 #if BUILD_EP93XX == 1
179 #if BUILD_AT91RM9200 == 1
180 &at91rm9200_interface
,
182 #if BUILD_GW16012 == 1
188 jtag_interface_t
*jtag
= NULL
;
191 char* jtag_interface
= NULL
;
194 /* forward declarations */
195 int jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state endstate
);
196 int jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state endstate
);
197 int jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state endstate
);
198 int jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state endstate
);
199 int jtag_add_statemove(enum tap_state endstate
);
200 int jtag_add_pathmove(int num_states
, enum tap_state
*path
);
201 int jtag_add_runtest(int num_cycles
, enum tap_state endstate
);
202 int jtag_add_reset(int trst
, int srst
);
203 int jtag_add_end_state(enum tap_state endstate
);
204 int jtag_add_sleep(u32 us
);
205 int jtag_execute_queue(void);
206 int jtag_cancel_queue(void);
209 int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
210 int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
211 int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
212 int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
213 int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
214 int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
216 int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
218 int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
219 int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
220 int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
221 int handle_statemove_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
222 int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
223 int handle_drscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
225 int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
227 int jtag_register_event_callback(int (*callback
)(enum jtag_event event
, void *priv
), void *priv
)
229 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
231 if (callback
== NULL
)
233 return ERROR_INVALID_ARGUMENTS
;
238 while ((*callbacks_p
)->next
)
239 callbacks_p
= &((*callbacks_p
)->next
);
240 callbacks_p
= &((*callbacks_p
)->next
);
243 (*callbacks_p
) = malloc(sizeof(jtag_event_callback_t
));
244 (*callbacks_p
)->callback
= callback
;
245 (*callbacks_p
)->priv
= priv
;
246 (*callbacks_p
)->next
= NULL
;
251 int jtag_unregister_event_callback(int (*callback
)(enum jtag_event event
, void *priv
))
253 jtag_event_callback_t
**callbacks_p
= &jtag_event_callbacks
;
255 if (callback
== NULL
)
257 return ERROR_INVALID_ARGUMENTS
;
262 jtag_event_callback_t
**next
= &((*callbacks_p
)->next
);
263 if ((*callbacks_p
)->callback
== callback
)
266 *callbacks_p
= *next
;
274 int jtag_call_event_callbacks(enum jtag_event event
)
276 jtag_event_callback_t
*callback
= jtag_event_callbacks
;
278 DEBUG("jtag event: %s", jtag_event_strings
[event
]);
282 callback
->callback(event
, callback
->priv
);
283 callback
= callback
->next
;
289 /* returns a pointer to the pointer of the last command in queue
290 * this may be a pointer to the root pointer (jtag_command_queue)
291 * or to the next member of the last but one command
293 jtag_command_t
** jtag_get_last_command_p(void)
295 /* jtag_command_t *cmd = jtag_command_queue;
301 return &jtag_command_queue;
305 return last_comand_pointer
;
308 /* returns a pointer to the n-th device in the scan chain */
309 jtag_device_t
* jtag_get_device(int num
)
311 jtag_device_t
*device
= jtag_devices
;
318 device
= device
->next
;
325 void* cmd_queue_alloc(size_t size
)
327 cmd_queue_page_t
**p_page
= &cmd_queue_pages
;
332 while ((*p_page
)->next
)
333 p_page
= &((*p_page
)->next
);
334 if (CMD_QUEUE_PAGE_SIZE
- (*p_page
)->used
< size
)
335 p_page
= &((*p_page
)->next
);
340 *p_page
= malloc(sizeof(cmd_queue_page_t
));
342 (*p_page
)->address
= malloc(CMD_QUEUE_PAGE_SIZE
);
343 (*p_page
)->next
= NULL
;
346 offset
= (*p_page
)->used
;
347 (*p_page
)->used
+= size
;
349 return ((*p_page
)->address
) + offset
;
352 void cmd_queue_free()
354 cmd_queue_page_t
*page
= cmd_queue_pages
;
358 cmd_queue_page_t
*last
= page
;
364 cmd_queue_pages
= NULL
;
367 int jtag_add_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
)
369 jtag_command_t
**last_cmd
;
370 jtag_device_t
*device
;
373 /* int changed = 0; */
377 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
378 return ERROR_JTAG_TRST_ASSERTED
;
382 for (i=0; i<num_fields; i++)
384 device = jtag_get_device(fields[i].device);
387 if (buf_cmp(device->cur_instr, fields[i].out_value, device->ir_length))
392 ERROR("inexistant device specified for ir scan");
393 return ERROR_INVALID_ARGUMENTS;
401 last_cmd
= jtag_get_last_command_p();
403 /* allocate memory for a new list member */
404 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
405 (*last_cmd
)->next
= NULL
;
406 last_comand_pointer
= &((*last_cmd
)->next
);
407 (*last_cmd
)->type
= JTAG_SCAN
;
409 /* allocate memory for ir scan command */
410 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
411 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
412 (*last_cmd
)->cmd
.scan
->num_fields
= jtag_num_devices
; /* one field per device */
413 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(jtag_num_devices
* sizeof(scan_field_t
));
414 (*last_cmd
)->cmd
.scan
->end_state
= state
;
417 cmd_queue_end_state
= state
;
419 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
420 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
422 if (cmd_queue_end_state
== TAP_TLR
)
423 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
425 cmd_queue_cur_state
= cmd_queue_end_state
;
427 for (i
=0; i
< jtag_num_devices
; i
++)
430 device
= jtag_get_device(i
);
431 scan_size
= device
->ir_length
;
432 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= i
;
433 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= scan_size
;
434 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= NULL
;
435 if (jtag_verify_capture_ir
)
437 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= buf_cpy(device
->expected
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
438 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= buf_cpy(device
->expected_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
442 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= NULL
;
443 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= NULL
;
445 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
;
446 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= NULL
;
448 /* search the list */
449 for (j
=0; j
< num_fields
; j
++)
451 if (i
== fields
[j
].device
)
454 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
455 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
464 /* if a device isn't listed, set it to BYPASS */
465 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_set_ones(cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
466 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= NULL
;
471 /* update device information */
472 buf_cpy((*last_cmd
)->cmd
.scan
->fields
[i
].out_value
, jtag_get_device(i
)->cur_instr
, scan_size
);
478 int jtag_add_plain_ir_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
)
480 jtag_command_t
**last_cmd
;
485 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
486 return ERROR_JTAG_TRST_ASSERTED
;
489 last_cmd
= jtag_get_last_command_p();
491 /* allocate memory for a new list member */
492 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
493 (*last_cmd
)->next
= NULL
;
494 last_comand_pointer
= &((*last_cmd
)->next
);
495 (*last_cmd
)->type
= JTAG_SCAN
;
497 /* allocate memory for ir scan command */
498 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
499 (*last_cmd
)->cmd
.scan
->ir_scan
= 1;
500 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
501 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
502 (*last_cmd
)->cmd
.scan
->end_state
= state
;
505 cmd_queue_end_state
= state
;
507 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
508 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
510 if (cmd_queue_end_state
== TAP_TLR
)
511 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
513 cmd_queue_cur_state
= cmd_queue_end_state
;
515 for (i
= 0; i
< num_fields
; i
++)
517 int num_bits
= fields
[i
].num_bits
;
518 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
519 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= fields
[i
].device
;
520 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
521 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
522 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
523 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
524 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= buf_cpy(fields
[i
].in_check_value
, cmd_queue_alloc(num_bytes
), num_bits
);
525 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= buf_cpy(fields
[i
].in_check_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
526 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= NULL
;
527 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= NULL
;
532 int jtag_add_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
)
535 int bypass_devices
= 0;
537 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
538 jtag_device_t
*device
= jtag_devices
;
543 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
544 return ERROR_JTAG_TRST_ASSERTED
;
547 /* count devices in bypass */
552 device
= device
->next
;
555 /* allocate memory for a new list member */
556 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
557 last_comand_pointer
= &((*last_cmd
)->next
);
558 (*last_cmd
)->next
= NULL
;
559 (*last_cmd
)->type
= JTAG_SCAN
;
561 /* allocate memory for dr scan command */
562 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
563 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
564 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
+ bypass_devices
;
565 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc((num_fields
+ bypass_devices
) * sizeof(scan_field_t
));
566 (*last_cmd
)->cmd
.scan
->end_state
= state
;
569 cmd_queue_end_state
= state
;
571 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
572 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
574 if (cmd_queue_end_state
== TAP_TLR
)
575 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
577 cmd_queue_cur_state
= cmd_queue_end_state
;
579 for (i
=0; i
< jtag_num_devices
; i
++)
582 (*last_cmd
)->cmd
.scan
->fields
[field_count
].device
= i
;
584 for (j
=0; j
< num_fields
; j
++)
586 if (i
== fields
[j
].device
)
589 scan_size
= fields
[j
].num_bits
;
590 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= scan_size
;
591 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= buf_cpy(fields
[j
].out_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
592 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= buf_cpy(fields
[j
].out_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
593 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= fields
[j
].in_value
;
594 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= buf_cpy(fields
[j
].in_check_value
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
595 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= buf_cpy(fields
[j
].in_check_mask
, cmd_queue_alloc(CEIL(scan_size
, 8)), scan_size
);
596 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= fields
[j
].in_handler
;
597 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= fields
[j
].in_handler_priv
;
602 /* if a device isn't listed, the BYPASS register should be selected */
603 if (!jtag_get_device(i
)->bypass
)
605 ERROR("BUG: no scan data for a device not in BYPASS");
609 /* program the scan field to 1 bit length, and ignore it's value */
610 (*last_cmd
)->cmd
.scan
->fields
[field_count
].num_bits
= 1;
611 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_value
= NULL
;
612 (*last_cmd
)->cmd
.scan
->fields
[field_count
].out_mask
= NULL
;
613 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_value
= NULL
;
614 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_value
= NULL
;
615 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_check_mask
= NULL
;
616 (*last_cmd
)->cmd
.scan
->fields
[field_count
].in_handler
= NULL
;
617 (*last_cmd
)->cmd
.scan
->fields
[field_count
++].in_handler_priv
= NULL
;
621 /* if a device is listed, the BYPASS register must not be selected */
622 if (jtag_get_device(i
)->bypass
)
624 WARNING("scan data for a device in BYPASS");
631 int jtag_add_plain_dr_scan(int num_fields
, scan_field_t
*fields
, enum tap_state state
)
634 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
638 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
639 return ERROR_JTAG_TRST_ASSERTED
;
642 /* allocate memory for a new list member */
643 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
644 last_comand_pointer
= &((*last_cmd
)->next
);
645 (*last_cmd
)->next
= NULL
;
646 (*last_cmd
)->type
= JTAG_SCAN
;
648 /* allocate memory for scan command */
649 (*last_cmd
)->cmd
.scan
= cmd_queue_alloc(sizeof(scan_command_t
));
650 (*last_cmd
)->cmd
.scan
->ir_scan
= 0;
651 (*last_cmd
)->cmd
.scan
->num_fields
= num_fields
;
652 (*last_cmd
)->cmd
.scan
->fields
= cmd_queue_alloc(num_fields
* sizeof(scan_field_t
));
653 (*last_cmd
)->cmd
.scan
->end_state
= state
;
656 cmd_queue_end_state
= state
;
658 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
659 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
661 if (cmd_queue_end_state
== TAP_TLR
)
662 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
664 cmd_queue_cur_state
= cmd_queue_end_state
;
666 for (i
= 0; i
< num_fields
; i
++)
668 int num_bits
= fields
[i
].num_bits
;
669 int num_bytes
= CEIL(fields
[i
].num_bits
, 8);
670 (*last_cmd
)->cmd
.scan
->fields
[i
].device
= fields
[i
].device
;
671 (*last_cmd
)->cmd
.scan
->fields
[i
].num_bits
= num_bits
;
672 (*last_cmd
)->cmd
.scan
->fields
[i
].out_value
= buf_cpy(fields
[i
].out_value
, cmd_queue_alloc(num_bytes
), num_bits
);
673 (*last_cmd
)->cmd
.scan
->fields
[i
].out_mask
= buf_cpy(fields
[i
].out_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
674 (*last_cmd
)->cmd
.scan
->fields
[i
].in_value
= fields
[i
].in_value
;
675 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_value
= buf_cpy(fields
[i
].in_check_value
, cmd_queue_alloc(num_bytes
), num_bits
);
676 (*last_cmd
)->cmd
.scan
->fields
[i
].in_check_mask
= buf_cpy(fields
[i
].in_check_mask
, cmd_queue_alloc(num_bytes
), num_bits
);
677 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler
= fields
[i
].in_handler
;
678 (*last_cmd
)->cmd
.scan
->fields
[i
].in_handler_priv
= fields
[i
].in_handler_priv
;
683 int jtag_add_statemove(enum tap_state state
)
685 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
689 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
690 return ERROR_JTAG_TRST_ASSERTED
;
693 /* allocate memory for a new list member */
694 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
695 last_comand_pointer
= &((*last_cmd
)->next
);
696 (*last_cmd
)->next
= NULL
;
697 (*last_cmd
)->type
= JTAG_STATEMOVE
;
699 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
700 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
703 cmd_queue_end_state
= state
;
705 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
706 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
708 if (cmd_queue_end_state
== TAP_TLR
)
709 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
711 cmd_queue_cur_state
= cmd_queue_end_state
;
716 int jtag_add_pathmove(int num_states
, enum tap_state
*path
)
718 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
723 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
724 return ERROR_JTAG_TRST_ASSERTED
;
727 /* the last state has to be a stable state */
728 if (tap_move_map
[path
[num_states
- 1]] == -1)
730 ERROR("TAP path doesn't finish in a stable state");
731 return ERROR_JTAG_NOT_IMPLEMENTED
;
734 if (jtag
->support_pathmove
)
736 /* allocate memory for a new list member */
737 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
738 last_comand_pointer
= &((*last_cmd
)->next
);
739 (*last_cmd
)->next
= NULL
;
740 (*last_cmd
)->type
= JTAG_PATHMOVE
;
742 (*last_cmd
)->cmd
.pathmove
= cmd_queue_alloc(sizeof(pathmove_command_t
));
743 (*last_cmd
)->cmd
.pathmove
->num_states
= num_states
;
744 (*last_cmd
)->cmd
.pathmove
->path
= cmd_queue_alloc(sizeof(enum tap_state
) * num_states
);
746 for (i
= 0; i
< num_states
; i
++)
747 (*last_cmd
)->cmd
.pathmove
->path
[i
] = path
[i
];
751 /* validate the desired path, and see if it fits a default path */
756 for (i
= 0; i
< num_states
; i
++)
758 for (j
= i
; j
< num_states
; j
++)
760 if (tap_move_map
[path
[j
]] != -1)
767 if (begin
- end
<= 7) /* a default path spans no more than 7 states */
769 jtag_add_statemove(path
[end
]);
773 ERROR("encountered a TAP path that can't be fulfilled by default paths");
774 return ERROR_JTAG_NOT_IMPLEMENTED
;
781 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
782 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
784 if (cmd_queue_end_state
== TAP_TLR
)
785 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
787 cmd_queue_cur_state
= path
[num_states
- 1];
792 int jtag_add_runtest(int num_cycles
, enum tap_state state
)
794 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
798 WARNING("JTAG command queued, while TRST is low (TAP in reset)");
799 return ERROR_JTAG_TRST_ASSERTED
;
802 /* allocate memory for a new list member */
803 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
804 (*last_cmd
)->next
= NULL
;
805 last_comand_pointer
= &((*last_cmd
)->next
);
806 (*last_cmd
)->type
= JTAG_RUNTEST
;
808 (*last_cmd
)->cmd
.runtest
= cmd_queue_alloc(sizeof(runtest_command_t
));
809 (*last_cmd
)->cmd
.runtest
->num_cycles
= num_cycles
;
810 (*last_cmd
)->cmd
.runtest
->end_state
= state
;
813 cmd_queue_end_state
= state
;
815 if (cmd_queue_cur_state
== TAP_TLR
&& cmd_queue_end_state
!= TAP_TLR
)
816 jtag_call_event_callbacks(JTAG_TRST_RELEASED
);
818 if (cmd_queue_end_state
== TAP_TLR
)
819 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
821 cmd_queue_cur_state
= cmd_queue_end_state
;
826 int jtag_add_reset(int req_trst
, int req_srst
)
828 int trst_with_tms
= 0;
830 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
833 req_trst
= jtag_trst
;
836 req_srst
= jtag_srst
;
838 /* Make sure that jtag_reset_config allows the requested reset */
839 /* if SRST pulls TRST, we can't fulfill srst == 1 with trst == 0 */
840 if (((jtag_reset_config
& RESET_SRST_PULLS_TRST
) && (req_srst
== 1)) && (req_trst
== 0))
841 return ERROR_JTAG_RESET_WOULD_ASSERT_TRST
;
843 /* if TRST pulls SRST, we reset with TAP T-L-R */
844 if (((jtag_reset_config
& RESET_TRST_PULLS_SRST
) && (req_trst
== 1)) && (req_srst
== 0))
850 if (req_srst
&& !(jtag_reset_config
& RESET_HAS_SRST
))
852 ERROR("requested nSRST assertion, but the current configuration doesn't support this");
853 return ERROR_JTAG_RESET_CANT_SRST
;
856 if (req_trst
&& !(jtag_reset_config
& RESET_HAS_TRST
))
862 /* allocate memory for a new list member */
863 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
864 (*last_cmd
)->next
= NULL
;
865 last_comand_pointer
= &((*last_cmd
)->next
);
866 (*last_cmd
)->type
= JTAG_RESET
;
868 (*last_cmd
)->cmd
.reset
= cmd_queue_alloc(sizeof(reset_command_t
));
869 (*last_cmd
)->cmd
.reset
->trst
= req_trst
;
870 (*last_cmd
)->cmd
.reset
->srst
= req_srst
;
872 jtag_trst
= req_trst
;
873 jtag_srst
= req_srst
;
877 jtag_call_event_callbacks(JTAG_SRST_ASSERTED
);
881 jtag_call_event_callbacks(JTAG_SRST_RELEASED
);
882 if (jtag_nsrst_delay
)
883 jtag_add_sleep(jtag_nsrst_delay
* 1000);
888 last_cmd
= &((*last_cmd
)->next
);
890 /* allocate memory for a new list member */
891 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
892 (*last_cmd
)->next
= NULL
;
893 last_comand_pointer
= &((*last_cmd
)->next
);
894 (*last_cmd
)->type
= JTAG_STATEMOVE
;
896 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
897 (*last_cmd
)->cmd
.statemove
->end_state
= TAP_TLR
;
899 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
900 cmd_queue_cur_state
= TAP_TLR
;
901 cmd_queue_end_state
= TAP_TLR
;
909 /* we just asserted nTRST, so we're now in Test-Logic-Reset,
910 * and inform possible listeners about this
912 cmd_queue_cur_state
= TAP_TLR
;
913 jtag_call_event_callbacks(JTAG_TRST_ASSERTED
);
917 /* the nTRST line got deasserted, so we're still in Test-Logic-Reset,
918 * but we might want to add a delay to give the TAP time to settle
920 if (jtag_ntrst_delay
)
921 jtag_add_sleep(jtag_ntrst_delay
* 1000);
928 int jtag_add_end_state(enum tap_state state
)
930 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
932 /* allocate memory for a new list member */
933 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
934 (*last_cmd
)->next
= NULL
;
935 last_comand_pointer
= &((*last_cmd
)->next
);
936 (*last_cmd
)->type
= JTAG_END_STATE
;
938 (*last_cmd
)->cmd
.end_state
= cmd_queue_alloc(sizeof(end_state_command_t
));
939 (*last_cmd
)->cmd
.end_state
->end_state
= state
;
942 cmd_queue_end_state
= state
;
947 int jtag_add_sleep(u32 us
)
949 jtag_command_t
**last_cmd
= jtag_get_last_command_p();
951 /* allocate memory for a new list member */
952 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
953 (*last_cmd
)->next
= NULL
;
954 last_comand_pointer
= &((*last_cmd
)->next
);
955 (*last_cmd
)->type
= JTAG_SLEEP
;
957 (*last_cmd
)->cmd
.sleep
= cmd_queue_alloc(sizeof(sleep_command_t
));
958 (*last_cmd
)->cmd
.sleep
->us
= us
;
963 int jtag_scan_size(scan_command_t
*cmd
)
968 /* count bits in scan command */
969 for (i
=0; i
<cmd
->num_fields
; i
++)
971 bit_count
+= cmd
->fields
[i
].num_bits
;
977 int jtag_build_buffer(scan_command_t
*cmd
, u8
**buffer
)
982 bit_count
= jtag_scan_size(cmd
);
983 *buffer
= malloc(CEIL(bit_count
, 8));
987 for (i
= 0; i
< cmd
->num_fields
; i
++)
989 if (cmd
->fields
[i
].out_value
)
991 #ifdef _DEBUG_JTAG_IO_
992 char* char_buf
= buf_to_str(cmd
->fields
[i
].out_value
, (cmd
->fields
[i
].num_bits
> 64) ? 64 : cmd
->fields
[i
].num_bits
, 16);
994 buf_set_buf(cmd
->fields
[i
].out_value
, 0, *buffer
, bit_count
, cmd
->fields
[i
].num_bits
);
995 #ifdef _DEBUG_JTAG_IO_
996 DEBUG("fields[%i].out_value: 0x%s", i
, char_buf
);
1001 bit_count
+= cmd
->fields
[i
].num_bits
;
1008 int jtag_read_buffer(u8
*buffer
, scan_command_t
*cmd
)
1012 int retval
= ERROR_OK
;
1014 for (i
=0; i
< cmd
->num_fields
; i
++)
1016 /* if neither in_value, in_check_value nor in_handler
1017 * are specified we don't have to examine this field
1019 if (cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_check_value
|| cmd
->fields
[i
].in_handler
)
1021 int num_bits
= cmd
->fields
[i
].num_bits
;
1022 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
);
1032 if (cmd
->fields
[i
].in_value
)
1034 buf_cpy(captured
, cmd
->fields
[i
].in_value
, num_bits
);
1036 if (cmd
->fields
[i
].in_handler
)
1038 if (cmd
->fields
[i
].in_handler(cmd
->fields
[i
].in_value
, cmd
->fields
[i
].in_handler_priv
) != ERROR_OK
)
1040 /* TODO: error reporting */
1041 WARNING("in_handler reported a failed check");
1042 retval
= ERROR_JTAG_QUEUE_FAILED
;
1047 /* no in_value specified, but a handler takes care of the scanned data */
1048 if (cmd
->fields
[i
].in_handler
&& (!cmd
->fields
[i
].in_value
))
1050 if (cmd
->fields
[i
].in_handler(captured
, cmd
->fields
[i
].in_handler_priv
) != ERROR_OK
)
1052 /* TODO: error reporting */
1053 WARNING("in_handler reported a failed check");
1054 retval
= ERROR_JTAG_QUEUE_FAILED
;
1059 if (cmd
->fields
[i
].in_check_value
)
1061 if ((cmd
->fields
[i
].in_check_mask
&& buf_cmp_mask(captured
, cmd
->fields
[i
].in_check_value
, cmd
->fields
[i
].in_check_mask
, num_bits
))
1062 || (!cmd
->fields
[i
].in_check_mask
&& buf_cmp(captured
, cmd
->fields
[i
].in_check_mask
, num_bits
)))
1064 char *captured_char
= buf_to_str(captured
, (num_bits
> 64) ? 64 : num_bits
, 16);
1065 char *in_check_value_char
= buf_to_str(cmd
->fields
[i
].in_check_value
, (num_bits
> 64) ? 64 : num_bits
, 16);
1066 char *in_check_mask_char
= buf_to_str(cmd
->fields
[i
].in_check_mask
, (num_bits
> 64) ? 64 : num_bits
, 16);
1067 /* TODO: error reporting */
1068 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
);
1069 retval
= ERROR_JTAG_QUEUE_FAILED
;
1070 free(captured_char
);
1071 free(in_check_value_char
);
1072 free(in_check_mask_char
);
1077 bit_count
+= cmd
->fields
[i
].num_bits
;
1083 enum scan_type
jtag_scan_type(scan_command_t
*cmd
)
1088 for (i
=0; i
< cmd
->num_fields
; i
++)
1090 if (cmd
->fields
[i
].in_check_value
|| cmd
->fields
[i
].in_value
|| cmd
->fields
[i
].in_handler
)
1092 if (cmd
->fields
[i
].out_value
)
1099 int jtag_execute_queue(void)
1103 retval
= jtag
->execute_queue();
1107 jtag_command_queue
= NULL
;
1108 last_comand_pointer
= &jtag_command_queue
;
1113 int jtag_cancel_queue(void)
1116 jtag_command_queue
= NULL
;
1117 last_comand_pointer
= &jtag_command_queue
;
1122 int jtag_reset_callback(enum jtag_event event
, void *priv
)
1124 jtag_device_t
*device
= priv
;
1128 if (event
== JTAG_TRST_ASSERTED
)
1130 buf_set_ones(device
->cur_instr
, device
->ir_length
);
1137 void jtag_sleep(u32 us
)
1142 /* Try to examine chain layout according to IEEE 1149.1 §12
1144 int jtag_examine_chain()
1146 jtag_device_t
*device
= jtag_devices
;
1148 u8 idcode_buffer
[JTAG_MAX_CHAIN_SIZE
* 4];
1151 int device_count
= 0;
1152 u8 zero_check
= 0x0;
1153 u8 one_check
= 0xff;
1156 field
.num_bits
= sizeof(idcode_buffer
) * 8;
1157 field
.out_value
= idcode_buffer
;
1158 field
.out_mask
= NULL
;
1159 field
.in_value
= idcode_buffer
;
1160 field
.in_check_value
= NULL
;
1161 field
.in_check_mask
= NULL
;
1162 field
.in_handler
= NULL
;
1163 field
.in_handler_priv
= NULL
;
1165 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
; i
++)
1167 buf_set_u32(idcode_buffer
, 0, 32, 0x000000FF);
1170 jtag_add_plain_dr_scan(1, &field
, TAP_TLR
);
1171 jtag_execute_queue();
1173 for (i
= 0; i
< JTAG_MAX_CHAIN_SIZE
* 4; i
++)
1175 zero_check
|= idcode_buffer
[i
];
1176 one_check
&= idcode_buffer
[i
];
1179 /* if there wasn't a single non-zero bit or if all bits were one, the scan isn't valid */
1180 if ((zero_check
== 0x00) || (one_check
== 0xff))
1182 ERROR("JTAG communication failure, check connection, JTAG interface, target power etc.");
1186 for (bit_count
= 0; bit_count
< (JTAG_MAX_CHAIN_SIZE
* 32) - 31;)
1188 u32 idcode
= buf_get_u32(idcode_buffer
, bit_count
, 32);
1189 if ((idcode
& 1) == 0)
1191 /* LSB must not be 0, this indicates a device in bypass */
1202 if (idcode
== 0x000000FF)
1204 /* End of chain (invalid manufacturer ID) */
1210 device
->idcode
= idcode
;
1211 device
= device
->next
;
1215 manufacturer
= (idcode
& 0xffe) >> 1;
1216 part
= (idcode
& 0xffff000) >> 12;
1217 version
= (idcode
& 0xf0000000) >> 28;
1219 DEBUG("JTAG device found: 0x%8.8x (Manufacturer: 0x%3.3x, Part: 0x%4.4x, Version: 0x%1.1x",
1220 idcode
, manufacturer
, part
, version
);
1226 /* see if number of discovered devices matches configuration */
1227 if (device_count
!= jtag_num_devices
)
1229 ERROR("number of discovered devices in JTAG chain (%i) doesn't match configuration (%i)",
1230 device_count
, jtag_num_devices
);
1237 int jtag_validate_chain()
1239 jtag_device_t
*device
= jtag_devices
;
1240 int total_ir_length
= 0;
1247 total_ir_length
+= device
->ir_length
;
1248 device
= device
->next
;
1251 total_ir_length
+= 2;
1252 ir_test
= malloc(CEIL(total_ir_length
, 8));
1253 buf_set_ones(ir_test
, total_ir_length
);
1256 field
.num_bits
= total_ir_length
;
1257 field
.out_value
= ir_test
;
1258 field
.out_mask
= NULL
;
1259 field
.in_value
= ir_test
;
1260 field
.in_check_value
= NULL
;
1261 field
.in_check_mask
= NULL
;
1262 field
.in_handler
= NULL
;
1263 field
.in_handler_priv
= NULL
;
1265 jtag_add_plain_ir_scan(1, &field
, TAP_TLR
);
1266 jtag_execute_queue();
1268 device
= jtag_devices
;
1271 if (buf_get_u32(ir_test
, chain_pos
, 2) != 0x1)
1273 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1274 ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf
);
1278 chain_pos
+= device
->ir_length
;
1279 device
= device
->next
;
1282 if (buf_get_u32(ir_test
, chain_pos
, 2) != 0x3)
1284 char *cbuf
= buf_to_str(ir_test
, total_ir_length
, 16);
1285 ERROR("Error validating JTAG scan chain, IR mismatch, scan returned 0x%s", cbuf
);
1295 int jtag_register_commands(struct command_context_s
*cmd_ctx
)
1297 register_command(cmd_ctx
, NULL
, "interface", handle_interface_command
,
1298 COMMAND_CONFIG
, NULL
);
1299 register_command(cmd_ctx
, NULL
, "jtag_speed", handle_jtag_speed_command
,
1300 COMMAND_ANY
, "set jtag speed (if supported) <speed>");
1301 register_command(cmd_ctx
, NULL
, "jtag_device", handle_jtag_device_command
,
1302 COMMAND_CONFIG
, NULL
);
1303 register_command(cmd_ctx
, NULL
, "reset_config", handle_reset_config_command
,
1304 COMMAND_CONFIG
, NULL
);
1305 register_command(cmd_ctx
, NULL
, "jtag_nsrst_delay", handle_jtag_nsrst_delay_command
,
1306 COMMAND_CONFIG
, NULL
);
1307 register_command(cmd_ctx
, NULL
, "jtag_ntrst_delay", handle_jtag_ntrst_delay_command
,
1308 COMMAND_CONFIG
, NULL
);
1310 register_command(cmd_ctx
, NULL
, "scan_chain", handle_scan_chain_command
,
1311 COMMAND_EXEC
, "print current scan chain configuration");
1313 register_command(cmd_ctx
, NULL
, "endstate", handle_endstate_command
,
1314 COMMAND_EXEC
, "finish JTAG operations in <tap_state>");
1315 register_command(cmd_ctx
, NULL
, "jtag_reset", handle_jtag_reset_command
,
1316 COMMAND_EXEC
, "toggle reset lines <trst> <srst>");
1317 register_command(cmd_ctx
, NULL
, "runtest", handle_runtest_command
,
1318 COMMAND_EXEC
, "move to Run-Test/Idle, and execute <num_cycles>");
1319 register_command(cmd_ctx
, NULL
, "statemove", handle_statemove_command
,
1320 COMMAND_EXEC
, "move to current endstate or [tap_state]");
1321 register_command(cmd_ctx
, NULL
, "irscan", handle_irscan_command
,
1322 COMMAND_EXEC
, "execute IR scan <device> <instr> [dev2] [instr2] ...");
1323 register_command(cmd_ctx
, NULL
, "drscan", handle_drscan_command
,
1324 COMMAND_EXEC
, "execute DR scan <device> <var> [dev2] [var2] ...");
1326 register_command(cmd_ctx
, NULL
, "verify_ircapture", handle_verify_ircapture_command
,
1327 COMMAND_ANY
, "verify value captured during Capture-IR <enable|disable>");
1331 int jtag_init(struct command_context_s
*cmd_ctx
)
1337 if (jtag_speed
== -1)
1340 if (jtag_interface
&& (jtag_interface
[0] != 0))
1341 /* configuration var 'jtag_interface' is set, and not empty */
1342 for (i
= 0; jtag_interfaces
[i
]; i
++)
1344 if (strcmp(jtag_interface
, jtag_interfaces
[i
]->name
) == 0)
1346 jtag_device_t
*device
;
1347 device
= jtag_devices
;
1349 if (jtag_interfaces
[i
]->init() != ERROR_OK
)
1350 return ERROR_JTAG_INIT_FAILED
;
1351 jtag
= jtag_interfaces
[i
];
1353 jtag_ir_scan_size
= 0;
1354 jtag_num_devices
= 0;
1355 while (device
!= NULL
)
1357 jtag_ir_scan_size
+= device
->ir_length
;
1359 device
= device
->next
;
1362 jtag_add_statemove(TAP_TLR
);
1363 jtag_execute_queue();
1365 jtag_examine_chain();
1367 jtag_validate_chain();
1373 /* no valid interface was found (i.e. the configuration option,
1374 * didn't match one of the compiled-in interfaces
1376 ERROR("No valid jtag interface found (%s)", jtag_interface
);
1377 ERROR("compiled-in jtag interfaces:");
1378 for (i
= 0; jtag_interfaces
[i
]; i
++)
1380 ERROR("%i: %s", i
, jtag_interfaces
[i
]->name
);
1384 return ERROR_JTAG_INVALID_INTERFACE
;
1387 int handle_interface_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1391 /* only if the configuration var isn't overwritten from cmdline */
1392 if (!jtag_interface
)
1394 if (args
[0] && (args
[0][0] != 0))
1396 for (i
=0; jtag_interfaces
[i
]; i
++)
1398 if (strcmp(args
[0], jtag_interfaces
[i
]->name
) == 0)
1400 if (jtag_interfaces
[i
]->register_commands(cmd_ctx
) != ERROR_OK
)
1403 jtag_interface
= jtag_interfaces
[i
]->name
;
1410 /* remember the requested interface name, so we can complain about it later */
1411 jtag_interface
= strdup(args
[0]);
1412 DEBUG("'interface' command didn't specify a valid interface");
1418 int handle_jtag_device_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1420 jtag_device_t
**last_device_p
= &jtag_devices
;
1424 while ((*last_device_p
)->next
)
1425 last_device_p
= &((*last_device_p
)->next
);
1426 last_device_p
= &((*last_device_p
)->next
);
1432 *last_device_p
= malloc(sizeof(jtag_device_t
));
1433 (*last_device_p
)->ir_length
= strtoul(args
[0], NULL
, 0);
1435 (*last_device_p
)->expected
= malloc((*last_device_p
)->ir_length
);
1436 buf_set_u32((*last_device_p
)->expected
, 0, (*last_device_p
)->ir_length
, strtoul(args
[1], NULL
, 0));
1437 (*last_device_p
)->expected_mask
= malloc((*last_device_p
)->ir_length
);
1438 buf_set_u32((*last_device_p
)->expected_mask
, 0, (*last_device_p
)->ir_length
, strtoul(args
[2], NULL
, 0));
1440 (*last_device_p
)->cur_instr
= malloc((*last_device_p
)->ir_length
);
1441 (*last_device_p
)->bypass
= 1;
1442 buf_set_ones((*last_device_p
)->cur_instr
, (*last_device_p
)->ir_length
);
1444 (*last_device_p
)->next
= NULL
;
1446 jtag_register_event_callback(jtag_reset_callback
, (*last_device_p
));
1453 int handle_scan_chain_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1455 jtag_device_t
*device
= jtag_devices
;
1456 int device_count
= 0;
1460 u32 expected
, expected_mask
, cur_instr
;
1461 expected
= buf_get_u32(device
->expected
, 0, device
->ir_length
);
1462 expected_mask
= buf_get_u32(device
->expected_mask
, 0, device
->ir_length
);
1463 cur_instr
= buf_get_u32(device
->cur_instr
, 0, device
->ir_length
);
1464 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
);
1465 device
= device
->next
;
1472 int handle_reset_config_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1476 if (strcmp(args
[0], "none") == 0)
1477 jtag_reset_config
= RESET_NONE
;
1478 else if (strcmp(args
[0], "trst_only") == 0)
1479 jtag_reset_config
= RESET_HAS_TRST
;
1480 else if (strcmp(args
[0], "srst_only") == 0)
1481 jtag_reset_config
= RESET_HAS_SRST
;
1482 else if (strcmp(args
[0], "trst_and_srst") == 0)
1483 jtag_reset_config
= RESET_TRST_AND_SRST
;
1486 ERROR("invalid reset_config argument");
1493 if (strcmp(args
[1], "srst_pulls_trst") == 0)
1494 jtag_reset_config
|= RESET_SRST_PULLS_TRST
;
1495 else if (strcmp(args
[1], "trst_pulls_srst") == 0)
1496 jtag_reset_config
|= RESET_TRST_PULLS_SRST
;
1497 else if (strcmp(args
[1], "combined") == 0)
1498 jtag_reset_config
|= RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
;
1499 else if (strcmp(args
[1], "separate") == 0)
1500 jtag_reset_config
&= ~(RESET_SRST_PULLS_TRST
| RESET_TRST_PULLS_SRST
);
1503 ERROR("invalid reset_config argument");
1510 if (strcmp(args
[2], "trst_open_drain") == 0)
1511 jtag_reset_config
|= RESET_TRST_OPEN_DRAIN
;
1512 else if (strcmp(args
[2], "trst_push_pull") == 0)
1513 jtag_reset_config
&= ~RESET_TRST_OPEN_DRAIN
;
1516 ERROR("invalid reset_config argument");
1523 if (strcmp(args
[3], "srst_push_pull") == 0)
1524 jtag_reset_config
|= RESET_SRST_PUSH_PULL
;
1525 else if (strcmp(args
[3], "srst_open_drain") == 0)
1526 jtag_reset_config
&= ~RESET_SRST_PUSH_PULL
;
1529 ERROR("invalid reset_config argument");
1537 int handle_jtag_nsrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1541 ERROR("jtag_nsrst_delay <ms> command takes one required argument");
1546 jtag_nsrst_delay
= strtoul(args
[0], NULL
, 0);
1552 int handle_jtag_ntrst_delay_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1556 ERROR("jtag_ntrst_delay <ms> command takes one required argument");
1561 jtag_ntrst_delay
= strtoul(args
[0], NULL
, 0);
1567 int handle_jtag_speed_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1570 command_print(cmd_ctx
, "jtag_speed: %i", jtag_speed
);
1574 /* this command can be called during CONFIG,
1575 * in which case jtag isn't initialized */
1577 jtag
->speed(strtoul(args
[0], NULL
, 0));
1579 jtag_speed
= strtoul(args
[0], NULL
, 0);
1585 int handle_endstate_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1587 enum tap_state state
;
1591 command_print(cmd_ctx
, "usage: endstate <tap_state>");
1595 for (state
= 0; state
< 16; state
++)
1597 if (strcmp(args
[0], tap_state_strings
[state
]) == 0)
1599 jtag_add_end_state(state
);
1600 jtag_execute_queue();
1607 int handle_jtag_reset_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1611 char *usage
= "usage: jtag_reset <trst> <srst>";
1616 command_print(cmd_ctx
, usage
);
1620 if (args
[0][0] == '1')
1622 else if (args
[0][0] == '0')
1626 command_print(cmd_ctx
, usage
);
1630 if (args
[1][0] == '1')
1632 else if (args
[1][0] == '0')
1636 command_print(cmd_ctx
, usage
);
1640 if ((retval
= jtag_add_reset(trst
, srst
)) != ERROR_OK
)
1644 case ERROR_JTAG_RESET_WOULD_ASSERT_TRST
:
1645 command_print(cmd_ctx
, "requested reset would assert trst\nif this is acceptable, use jtag_reset 1 %c", args
[1][0]);
1647 case ERROR_JTAG_RESET_CANT_SRST
:
1648 command_print(cmd_ctx
, "can't assert srst because the current reset_config doesn't support it");
1651 command_print(cmd_ctx
, "unknown error");
1654 jtag_execute_queue();
1659 int handle_runtest_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1663 command_print(cmd_ctx
, "usage: runtest <num_cycles>");
1667 jtag_add_runtest(strtol(args
[0], NULL
, 0), -1);
1668 jtag_execute_queue();
1674 int handle_statemove_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1676 enum tap_state state
;
1681 for (state
= 0; state
< 16; state
++)
1683 if (strcmp(args
[0], tap_state_strings
[state
]) == 0)
1690 jtag_add_statemove(state
);
1691 jtag_execute_queue();
1697 int handle_irscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1700 scan_field_t
*fields
;
1702 if ((argc
< 2) || (argc
% 2))
1704 command_print(cmd_ctx
, "usage: irscan <device> <instr> [dev2] [instr2] ...");
1708 fields
= malloc(sizeof(scan_field_t
) * argc
/ 2);
1710 for (i
= 0; i
< argc
/ 2; i
++)
1712 int device
= strtoul(args
[i
*2], NULL
, 0);
1713 int field_size
= jtag_get_device(device
)->ir_length
;
1714 fields
[i
].device
= device
;
1715 fields
[i
].out_value
= malloc(CEIL(field_size
, 8));
1716 buf_set_u32(fields
[i
].out_value
, 0, field_size
, strtoul(args
[i
*2+1], NULL
, 0));
1717 fields
[i
].out_mask
= NULL
;
1718 fields
[i
].in_value
= NULL
;
1719 fields
[i
].in_check_mask
= NULL
;
1720 fields
[i
].in_handler
= NULL
;
1721 fields
[i
].in_handler_priv
= NULL
;
1724 jtag_add_ir_scan(argc
/ 2, fields
, -1);
1725 jtag_execute_queue();
1727 for (i
= 0; i
< argc
/ 2; i
++)
1728 free(fields
[i
].out_value
);
1735 int handle_drscan_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1737 scan_field_t
*fields
;
1739 int field_count
= 0;
1743 if ((argc
< 2) || (argc
% 2))
1745 command_print(cmd_ctx
, "usage: drscan <device> <var> [dev2] [var2]");
1749 for (i
= 0; i
< argc
; i
+=2)
1751 var
= get_var_by_namenum(args
[i
+1]);
1754 num_fields
+= var
->num_fields
;
1758 command_print(cmd_ctx
, "variable %s doesn't exist", args
[i
+1]);
1763 fields
= malloc(sizeof(scan_field_t
) * num_fields
);
1765 for (i
= 0; i
< argc
; i
+=2)
1767 var
= get_var_by_namenum(args
[i
+1]);
1769 for (j
= 0; j
< var
->num_fields
; j
++)
1771 fields
[field_count
].device
= strtol(args
[i
], NULL
, 0);
1772 fields
[field_count
].num_bits
= var
->fields
[j
].num_bits
;
1773 fields
[field_count
].out_value
= malloc(CEIL(var
->fields
[j
].num_bits
, 8));
1774 buf_set_u32(fields
[field_count
].out_value
, 0, var
->fields
[j
].num_bits
, var
->fields
[j
].value
);
1775 fields
[field_count
].out_mask
= NULL
;
1776 fields
[field_count
].in_value
= fields
[field_count
].out_value
;
1777 fields
[field_count
].in_check_mask
= NULL
;
1778 fields
[field_count
].in_check_value
= NULL
;
1779 fields
[field_count
].in_handler
= field_le_to_host
;
1780 fields
[field_count
++].in_handler_priv
= &(var
->fields
[j
]);
1784 jtag_add_dr_scan(num_fields
, fields
, -1);
1785 jtag_execute_queue();
1787 for (i
= 0; i
< argc
/ 2; i
++)
1788 free(fields
[i
].out_value
);
1795 int handle_verify_ircapture_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
1799 command_print(cmd_ctx
, "verify Capture-IR is %s", (jtag_verify_capture_ir
) ? "enabled": "disabled");
1803 if (strcmp(args
[0], "enable") == 0)
1805 jtag_verify_capture_ir
= 1;
1807 else if (strcmp(args
[0], "disable") == 0)
1809 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)