153cc15f9d262f9a0865d95dd8921bfb20cdd4fc
[openocd.git] / src / xsvf / xsvf.c
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4 * Copyright (C) 2005 by Dominic Rath *
5 * Dominic.Rath@gmx.de *
6 * *
7 * Copyright (C) 2007,2008 Øyvind Harboe *
8 * oyvind.harboe@zylin.com *
9 * *
10 * Copyright (C) 2008 Peter Hettkamp *
11 * peter.hettkamp@htp-tel.de *
12 * *
13 * Copyright (C) 2009 SoftPLC Corporation. http://softplc.com *
14 * Dick Hollenbeck <dick@softplc.com> *
15 ***************************************************************************/
16
17 /* The specification for SVF is available here:
18 * http://www.asset-intertech.com/support/svf.pdf
19 * Below, this document is referred to as the "SVF spec".
20 *
21 * The specification for XSVF is available here:
22 * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf
23 * Below, this document is referred to as the "XSVF spec".
24 */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include "xsvf.h"
31 #include "helper/system.h"
32 #include <jtag/jtag.h>
33 #include <svf/svf.h>
34
35 /* XSVF commands, from appendix B of xapp503.pdf */
36 #define XCOMPLETE 0x00
37 #define XTDOMASK 0x01
38 #define XSIR 0x02
39 #define XSDR 0x03
40 #define XRUNTEST 0x04
41 #define XREPEAT 0x07
42 #define XSDRSIZE 0x08
43 #define XSDRTDO 0x09
44 #define XSETSDRMASKS 0x0A
45 #define XSDRINC 0x0B
46 #define XSDRB 0x0C
47 #define XSDRC 0x0D
48 #define XSDRE 0x0E
49 #define XSDRTDOB 0x0F
50 #define XSDRTDOC 0x10
51 #define XSDRTDOE 0x11
52 #define XSTATE 0x12
53 #define XENDIR 0x13
54 #define XENDDR 0x14
55 #define XSIR2 0x15
56 #define XCOMMENT 0x16
57 #define XWAIT 0x17
58
59 /* XWAITSTATE is not in the xilinx XSVF spec, but the svf2xsvf.py translator
60 * generates this. Arguably it is needed because the XSVF XRUNTEST command
61 * was ill conceived and does not directly flow out of the SVF RUNTEST command.
62 * This XWAITSTATE does map directly from the SVF RUNTEST command.
63 */
64 #define XWAITSTATE 0x18
65
66 /* Lattice has extended the SVF file format, and Dick Hollenbeck's python based
67 * SVF2XSVF converter supports these 3 additional XSVF opcodes, LCOUNT, LDELAY, LSDR.
68 * Here is an example of usage of the 3 lattice opcode extensions:
69
70 ! Set the maximum loop count to 25.
71 LCOUNT 25;
72 ! Step to DRPAUSE give 5 clocks and wait for 1.00e + 000 SEC.
73 LDELAY DRPAUSE 5 TCK 1.00E-003 SEC;
74 ! Test for the completed status. Match means pass.
75 ! Loop back to LDELAY line if not match and loop count less than 25.
76
77 LSDR 1 TDI (0)
78 TDO (1);
79 */
80
81 #define LCOUNT 0x19
82 #define LDELAY 0x1A
83 #define LSDR 0x1B
84 #define XTRST 0x1C
85
86 /* XSVF valid state values for the XSTATE command, from appendix B of xapp503.pdf */
87 #define XSV_RESET 0x00
88 #define XSV_IDLE 0x01
89 #define XSV_DRSELECT 0x02
90 #define XSV_DRCAPTURE 0x03
91 #define XSV_DRSHIFT 0x04
92 #define XSV_DREXIT1 0x05
93 #define XSV_DRPAUSE 0x06
94 #define XSV_DREXIT2 0x07
95 #define XSV_DRUPDATE 0x08
96 #define XSV_IRSELECT 0x09
97 #define XSV_IRCAPTURE 0x0A
98 #define XSV_IRSHIFT 0x0B
99 #define XSV_IREXIT1 0x0C
100 #define XSV_IRPAUSE 0x0D
101 #define XSV_IREXIT2 0x0E
102 #define XSV_IRUPDATE 0x0F
103
104 /* arguments to XTRST */
105 #define XTRST_ON 0
106 #define XTRST_OFF 1
107 #define XTRST_Z 2
108 #define XTRST_ABSENT 3
109
110 #define XSTATE_MAX_PATH 12
111
112 static int xsvf_fd;
113
114 /* map xsvf tap state to an openocd "tap_state_t" */
115 static tap_state_t xsvf_to_tap(int xsvf_state)
116 {
117 tap_state_t ret;
118
119 switch (xsvf_state) {
120 case XSV_RESET:
121 ret = TAP_RESET;
122 break;
123 case XSV_IDLE:
124 ret = TAP_IDLE;
125 break;
126 case XSV_DRSELECT:
127 ret = TAP_DRSELECT;
128 break;
129 case XSV_DRCAPTURE:
130 ret = TAP_DRCAPTURE;
131 break;
132 case XSV_DRSHIFT:
133 ret = TAP_DRSHIFT;
134 break;
135 case XSV_DREXIT1:
136 ret = TAP_DREXIT1;
137 break;
138 case XSV_DRPAUSE:
139 ret = TAP_DRPAUSE;
140 break;
141 case XSV_DREXIT2:
142 ret = TAP_DREXIT2;
143 break;
144 case XSV_DRUPDATE:
145 ret = TAP_DRUPDATE;
146 break;
147 case XSV_IRSELECT:
148 ret = TAP_IRSELECT;
149 break;
150 case XSV_IRCAPTURE:
151 ret = TAP_IRCAPTURE;
152 break;
153 case XSV_IRSHIFT:
154 ret = TAP_IRSHIFT;
155 break;
156 case XSV_IREXIT1:
157 ret = TAP_IREXIT1;
158 break;
159 case XSV_IRPAUSE:
160 ret = TAP_IRPAUSE;
161 break;
162 case XSV_IREXIT2:
163 ret = TAP_IREXIT2;
164 break;
165 case XSV_IRUPDATE:
166 ret = TAP_IRUPDATE;
167 break;
168 default:
169 LOG_ERROR("UNKNOWN XSVF STATE 0x%02X", xsvf_state);
170 exit(1);
171 }
172
173 return ret;
174 }
175
176 static int xsvf_read_buffer(int num_bits, int fd, uint8_t *buf)
177 {
178 int num_bytes;
179
180 for (num_bytes = (num_bits + 7) / 8; num_bytes > 0; num_bytes--) {
181 /* reverse the order of bytes as they are read sequentially from file */
182 if (read(fd, buf + num_bytes - 1, 1) < 0)
183 return ERROR_XSVF_EOF;
184 }
185
186 return ERROR_OK;
187 }
188
189 COMMAND_HANDLER(handle_xsvf_command)
190 {
191 uint8_t *dr_out_buf = NULL; /* from host to device (TDI) */
192 uint8_t *dr_in_buf = NULL; /* from device to host (TDO) */
193 uint8_t *dr_in_mask = NULL;
194
195 int xsdrsize = 0;
196 int xruntest = 0; /* number of TCK cycles OR *microseconds */
197 int xrepeat = 0; /* number of retries */
198
199 tap_state_t xendir = TAP_IDLE; /* see page 8 of the SVF spec, initial
200 *xendir to be TAP_IDLE */
201 tap_state_t xenddr = TAP_IDLE;
202
203 uint8_t opcode;
204 uint8_t uc = 0;
205 long file_offset = 0;
206
207 int loop_count = 0;
208 tap_state_t loop_state = TAP_IDLE;
209 int loop_clocks = 0;
210 int loop_usecs = 0;
211
212 int do_abort = 0;
213 int unsupported = 0;
214 int tdo_mismatch = 0;
215 int result;
216 int verbose = 1;
217
218 bool collecting_path = false;
219 tap_state_t path[XSTATE_MAX_PATH];
220 unsigned pathlen = 0;
221
222 /* a flag telling whether to clock TCK during waits,
223 * or simply sleep, controlled by virt2
224 */
225 int runtest_requires_tck = 0;
226
227 /* use NULL to indicate a "plain" xsvf file which accounts for
228 * additional devices in the scan chain, otherwise the device
229 * that should be affected
230 */
231 struct jtag_tap *tap = NULL;
232
233 if (CMD_ARGC < 2)
234 return ERROR_COMMAND_SYNTAX_ERROR;
235
236 /* we mess with CMD_ARGV starting point below, snapshot filename here */
237 const char *filename = CMD_ARGV[1];
238
239 if (strcmp(CMD_ARGV[0], "plain") != 0) {
240 tap = jtag_tap_by_string(CMD_ARGV[0]);
241 if (!tap) {
242 command_print(CMD, "Tap: %s unknown", CMD_ARGV[0]);
243 return ERROR_FAIL;
244 }
245 }
246
247 xsvf_fd = open(filename, O_RDONLY);
248 if (xsvf_fd < 0) {
249 command_print(CMD, "file \"%s\" not found", filename);
250 return ERROR_FAIL;
251 }
252
253 /* if this argument is present, then interpret xruntest counts as TCK cycles rather than as
254 *usecs */
255 if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "virt2") == 0)) {
256 runtest_requires_tck = 1;
257 --CMD_ARGC;
258 ++CMD_ARGV;
259 }
260
261 if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "quiet") == 0))
262 verbose = 0;
263
264 LOG_WARNING("XSVF support in OpenOCD is limited. Consider using SVF instead");
265 LOG_USER("xsvf processing file: \"%s\"", filename);
266
267 while (read(xsvf_fd, &opcode, 1) > 0) {
268 /* record the position of this opcode within the file */
269 file_offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
270
271 /* maybe collect another state for a pathmove();
272 * or terminate a path.
273 */
274 if (collecting_path) {
275 tap_state_t mystate;
276
277 switch (opcode) {
278 case XCOMMENT:
279 /* ignore/show comments between XSTATE ops */
280 break;
281 case XSTATE:
282 /* try to collect another transition */
283 if (pathlen == XSTATE_MAX_PATH) {
284 LOG_ERROR("XSVF: path too long");
285 do_abort = 1;
286 break;
287 }
288
289 if (read(xsvf_fd, &uc, 1) < 0) {
290 do_abort = 1;
291 break;
292 }
293
294 mystate = xsvf_to_tap(uc);
295 path[pathlen++] = mystate;
296
297 LOG_DEBUG("XSTATE 0x%02X %s", uc,
298 tap_state_name(mystate));
299
300 /* If path is incomplete, collect more */
301 if (!svf_tap_state_is_stable(mystate))
302 continue;
303
304 /* Else execute the path transitions we've
305 * collected so far.
306 *
307 * NOTE: Punting on the saved path is not
308 * strictly correct, but we must to do this
309 * unless jtag_add_pathmove() stops rejecting
310 * paths containing RESET. This is probably
311 * harmless, since there aren't many options
312 * for going from a stable state to reset;
313 * at the worst, we may issue extra clocks
314 * once we get to RESET.
315 */
316 if (mystate == TAP_RESET) {
317 LOG_WARNING("XSVF: dodgey RESET");
318 path[0] = mystate;
319 }
320
321 /* FALL THROUGH */
322 default:
323 /* Execute the path we collected
324 *
325 * NOTE: OpenOCD requires something that XSVF
326 * doesn't: the last TAP state in the path
327 * must be stable. In practice, tools that
328 * create XSVF seem to follow that rule too.
329 */
330 collecting_path = false;
331
332 if (path[0] == TAP_RESET)
333 jtag_add_tlr();
334 else
335 jtag_add_pathmove(pathlen, path);
336
337 result = jtag_execute_queue();
338 if (result != ERROR_OK) {
339 LOG_ERROR("XSVF: pathmove error %d", result);
340 do_abort = 1;
341 break;
342 }
343 continue;
344 }
345 }
346
347 switch (opcode) {
348 case XCOMPLETE:
349 LOG_DEBUG("XCOMPLETE");
350
351 result = jtag_execute_queue();
352 if (result != ERROR_OK) {
353 tdo_mismatch = 1;
354 break;
355 }
356 break;
357
358 case XTDOMASK:
359 LOG_DEBUG("XTDOMASK");
360 if (dr_in_mask &&
361 (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_mask) != ERROR_OK))
362 do_abort = 1;
363 break;
364
365 case XRUNTEST:
366 {
367 uint8_t xruntest_buf[4];
368
369 if (read(xsvf_fd, xruntest_buf, 4) < 0) {
370 do_abort = 1;
371 break;
372 }
373
374 xruntest = be_to_h_u32(xruntest_buf);
375 LOG_DEBUG("XRUNTEST %d 0x%08X", xruntest, xruntest);
376 }
377 break;
378
379 case XREPEAT:
380 {
381 uint8_t myrepeat;
382
383 if (read(xsvf_fd, &myrepeat, 1) < 0)
384 do_abort = 1;
385 else {
386 xrepeat = myrepeat;
387 LOG_DEBUG("XREPEAT %d", xrepeat);
388 }
389 }
390 break;
391
392 case XSDRSIZE:
393 {
394 uint8_t xsdrsize_buf[4];
395
396 if (read(xsvf_fd, xsdrsize_buf, 4) < 0) {
397 do_abort = 1;
398 break;
399 }
400
401 xsdrsize = be_to_h_u32(xsdrsize_buf);
402 LOG_DEBUG("XSDRSIZE %d", xsdrsize);
403
404 free(dr_out_buf);
405 free(dr_in_buf);
406 free(dr_in_mask);
407
408 dr_out_buf = malloc((xsdrsize + 7) / 8);
409 dr_in_buf = malloc((xsdrsize + 7) / 8);
410 dr_in_mask = malloc((xsdrsize + 7) / 8);
411 }
412 break;
413
414 case XSDR: /* these two are identical except for the dr_in_buf */
415 case XSDRTDO:
416 {
417 int limit = xrepeat;
418 int matched = 0;
419 int attempt;
420
421 const char *op_name = (opcode == XSDR ? "XSDR" : "XSDRTDO");
422
423 if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK) {
424 do_abort = 1;
425 break;
426 }
427
428 if (opcode == XSDRTDO) {
429 if (xsvf_read_buffer(xsdrsize, xsvf_fd,
430 dr_in_buf) != ERROR_OK) {
431 do_abort = 1;
432 break;
433 }
434 }
435
436 if (limit < 1)
437 limit = 1;
438
439 LOG_DEBUG("%s %d", op_name, xsdrsize);
440
441 for (attempt = 0; attempt < limit; ++attempt) {
442 struct scan_field field;
443
444 if (attempt > 0) {
445 /* perform the XC9500 exception handling sequence shown in xapp067.pdf and
446 * illustrated in pseudo code at end of this file. We start from state
447 * DRPAUSE:
448 * go to Exit2-DR
449 * go to Shift-DR
450 * go to Exit1-DR
451 * go to Update-DR
452 * go to Run-Test/Idle
453 *
454 * This sequence should be harmless for other devices, and it
455 * will be skipped entirely if xrepeat is set to zero.
456 */
457
458 static tap_state_t exception_path[] = {
459 TAP_DREXIT2,
460 TAP_DRSHIFT,
461 TAP_DREXIT1,
462 TAP_DRUPDATE,
463 TAP_IDLE,
464 };
465
466 jtag_add_pathmove(ARRAY_SIZE(exception_path), exception_path);
467
468 if (verbose)
469 LOG_USER("%s mismatch, xsdrsize=%d retry=%d",
470 op_name,
471 xsdrsize,
472 attempt);
473 }
474
475 field.num_bits = xsdrsize;
476 field.out_value = dr_out_buf;
477 field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
478
479 if (!tap)
480 jtag_add_plain_dr_scan(field.num_bits,
481 field.out_value,
482 field.in_value,
483 TAP_DRPAUSE);
484 else
485 jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
486
487 jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
488
489 free(field.in_value);
490
491 /* LOG_DEBUG("FLUSHING QUEUE"); */
492 result = jtag_execute_queue();
493 if (result == ERROR_OK) {
494 matched = 1;
495 break;
496 }
497 }
498
499 if (!matched) {
500 LOG_USER("%s mismatch", op_name);
501 tdo_mismatch = 1;
502 break;
503 }
504
505 /* See page 19 of XSVF spec regarding opcode "XSDR" */
506 if (xruntest) {
507 result = svf_add_statemove(TAP_IDLE);
508 if (result != ERROR_OK)
509 return result;
510
511 if (runtest_requires_tck)
512 jtag_add_clocks(xruntest);
513 else
514 jtag_add_sleep(xruntest);
515 } else if (xendir != TAP_DRPAUSE) {
516 /* we are already in TAP_DRPAUSE */
517 result = svf_add_statemove(xenddr);
518 if (result != ERROR_OK)
519 return result;
520 }
521 }
522 break;
523
524 case XSETSDRMASKS:
525 LOG_ERROR("unsupported XSETSDRMASKS");
526 unsupported = 1;
527 break;
528
529 case XSDRINC:
530 LOG_ERROR("unsupported XSDRINC");
531 unsupported = 1;
532 break;
533
534 case XSDRB:
535 LOG_ERROR("unsupported XSDRB");
536 unsupported = 1;
537 break;
538
539 case XSDRC:
540 LOG_ERROR("unsupported XSDRC");
541 unsupported = 1;
542 break;
543
544 case XSDRE:
545 LOG_ERROR("unsupported XSDRE");
546 unsupported = 1;
547 break;
548
549 case XSDRTDOB:
550 LOG_ERROR("unsupported XSDRTDOB");
551 unsupported = 1;
552 break;
553
554 case XSDRTDOC:
555 LOG_ERROR("unsupported XSDRTDOC");
556 unsupported = 1;
557 break;
558
559 case XSDRTDOE:
560 LOG_ERROR("unsupported XSDRTDOE");
561 unsupported = 1;
562 break;
563
564 case XSTATE:
565 {
566 tap_state_t mystate;
567
568 if (read(xsvf_fd, &uc, 1) < 0) {
569 do_abort = 1;
570 break;
571 }
572
573 mystate = xsvf_to_tap(uc);
574
575 LOG_DEBUG("XSTATE 0x%02X %s", uc, tap_state_name(mystate));
576
577 if (mystate == TAP_INVALID) {
578 LOG_ERROR("XSVF: bad XSTATE %02x", uc);
579 do_abort = 1;
580 break;
581 }
582
583 /* NOTE: the current state is SVF-stable! */
584
585 /* no change == NOP */
586 if (mystate == cmd_queue_cur_state
587 && mystate != TAP_RESET)
588 break;
589
590 /* Hand off to SVF? */
591 if (svf_tap_state_is_stable(mystate)) {
592 result = svf_add_statemove(mystate);
593 if (result != ERROR_OK)
594 unsupported = 1;
595 break;
596 }
597
598 /*
599 * A sequence of XSTATE transitions, each TAP
600 * state adjacent to the previous one. Start
601 * collecting them.
602 */
603 collecting_path = true;
604 pathlen = 1;
605 path[0] = mystate;
606 }
607 break;
608
609 case XENDIR:
610
611 if (read(xsvf_fd, &uc, 1) < 0) {
612 do_abort = 1;
613 break;
614 }
615
616 /* see page 22 of XSVF spec */
617 if (uc == 0)
618 xendir = TAP_IDLE;
619 else if (uc == 1)
620 xendir = TAP_IRPAUSE;
621 else {
622 LOG_ERROR("illegial XENDIR argument: 0x%02X", uc);
623 unsupported = 1;
624 break;
625 }
626
627 LOG_DEBUG("XENDIR 0x%02X %s", uc, tap_state_name(xendir));
628 break;
629
630 case XENDDR:
631
632 if (read(xsvf_fd, &uc, 1) < 0) {
633 do_abort = 1;
634 break;
635 }
636
637 /* see page 22 of XSVF spec */
638 if (uc == 0)
639 xenddr = TAP_IDLE;
640 else if (uc == 1)
641 xenddr = TAP_DRPAUSE;
642 else {
643 LOG_ERROR("illegial XENDDR argument: 0x%02X", uc);
644 unsupported = 1;
645 break;
646 }
647
648 LOG_DEBUG("XENDDR %02X %s", uc, tap_state_name(xenddr));
649 break;
650
651 case XSIR:
652 case XSIR2:
653 {
654 uint8_t short_buf[2];
655 uint8_t *ir_buf;
656 int bitcount;
657 tap_state_t my_end_state = xruntest ? TAP_IDLE : xendir;
658
659 if (opcode == XSIR) {
660 /* one byte bitcount */
661 if (read(xsvf_fd, short_buf, 1) < 0) {
662 do_abort = 1;
663 break;
664 }
665 bitcount = short_buf[0];
666 LOG_DEBUG("XSIR %d", bitcount);
667 } else {
668 if (read(xsvf_fd, short_buf, 2) < 0) {
669 do_abort = 1;
670 break;
671 }
672 bitcount = be_to_h_u16(short_buf);
673 LOG_DEBUG("XSIR2 %d", bitcount);
674 }
675
676 ir_buf = malloc((bitcount + 7) / 8);
677
678 if (xsvf_read_buffer(bitcount, xsvf_fd, ir_buf) != ERROR_OK)
679 do_abort = 1;
680 else {
681 struct scan_field field;
682
683 field.num_bits = bitcount;
684 field.out_value = ir_buf;
685
686 field.in_value = NULL;
687
688 if (!tap)
689 jtag_add_plain_ir_scan(field.num_bits,
690 field.out_value, field.in_value, my_end_state);
691 else
692 jtag_add_ir_scan(tap, &field, my_end_state);
693
694 if (xruntest) {
695 if (runtest_requires_tck)
696 jtag_add_clocks(xruntest);
697 else
698 jtag_add_sleep(xruntest);
699 }
700
701 /* Note that an -irmask of non-zero in your config file
702 * can cause this to fail. Setting -irmask to zero cand work
703 * around the problem.
704 */
705
706 /* LOG_DEBUG("FLUSHING QUEUE"); */
707 result = jtag_execute_queue();
708 if (result != ERROR_OK)
709 tdo_mismatch = 1;
710 }
711 free(ir_buf);
712 }
713 break;
714
715 case XCOMMENT:
716 {
717 unsigned int ndx = 0;
718 char comment[128];
719
720 do {
721 if (read(xsvf_fd, &uc, 1) < 0) {
722 do_abort = 1;
723 break;
724 }
725
726 if (ndx < sizeof(comment)-1)
727 comment[ndx++] = uc;
728
729 } while (uc != 0);
730
731 comment[sizeof(comment)-1] = 0; /* regardless, terminate */
732 if (verbose)
733 LOG_USER("# %s", comment);
734 }
735 break;
736
737 case XWAIT:
738 {
739 /* expected in stream:
740 XWAIT <uint8_t wait_state> <uint8_t end_state> <uint32_t usecs>
741 */
742
743 uint8_t wait_local;
744 uint8_t end;
745 uint8_t delay_buf[4];
746
747 tap_state_t wait_state;
748 tap_state_t end_state;
749 int delay;
750
751 if (read(xsvf_fd, &wait_local, 1) < 0
752 || read(xsvf_fd, &end, 1) < 0
753 || read(xsvf_fd, delay_buf, 4) < 0) {
754 do_abort = 1;
755 break;
756 }
757
758 wait_state = xsvf_to_tap(wait_local);
759 end_state = xsvf_to_tap(end);
760 delay = be_to_h_u32(delay_buf);
761
762 LOG_DEBUG("XWAIT %s %s usecs:%d", tap_state_name(
763 wait_state), tap_state_name(end_state), delay);
764
765 if (runtest_requires_tck && wait_state == TAP_IDLE)
766 jtag_add_runtest(delay, end_state);
767 else {
768 /* FIXME handle statemove errors ... */
769 result = svf_add_statemove(wait_state);
770 if (result != ERROR_OK)
771 return result;
772 jtag_add_sleep(delay);
773 result = svf_add_statemove(end_state);
774 if (result != ERROR_OK)
775 return result;
776 }
777 }
778 break;
779
780 case XWAITSTATE:
781 {
782 /* expected in stream:
783 * XWAITSTATE <uint8_t wait_state> <uint8_t end_state> <uint32_t clock_count>
784 * <uint32_t usecs>
785 */
786
787 uint8_t clock_buf[4];
788 uint8_t usecs_buf[4];
789 uint8_t wait_local;
790 uint8_t end;
791 tap_state_t wait_state;
792 tap_state_t end_state;
793 int clock_count;
794 int usecs;
795
796 if (read(xsvf_fd, &wait_local, 1) < 0
797 || read(xsvf_fd, &end, 1) < 0
798 || read(xsvf_fd, clock_buf, 4) < 0
799 || read(xsvf_fd, usecs_buf, 4) < 0) {
800 do_abort = 1;
801 break;
802 }
803
804 wait_state = xsvf_to_tap(wait_local);
805 end_state = xsvf_to_tap(end);
806
807 clock_count = be_to_h_u32(clock_buf);
808 usecs = be_to_h_u32(usecs_buf);
809
810 LOG_DEBUG("XWAITSTATE %s %s clocks:%i usecs:%i",
811 tap_state_name(wait_state),
812 tap_state_name(end_state),
813 clock_count, usecs);
814
815 /* the following states are 'stable', meaning that they have a transition
816 * in the state diagram back to themselves. This is necessary because we will
817 * be issuing a number of clocks in this state. This set of allowed states is also
818 * determined by the SVF RUNTEST command's allowed states.
819 */
820 if (!svf_tap_state_is_stable(wait_state)) {
821 LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"",
822 tap_state_name(wait_state));
823 unsupported = 1;
824 /* REVISIT "break" so we won't run? */
825 }
826
827 /* FIXME handle statemove errors ... */
828 result = svf_add_statemove(wait_state);
829 if (result != ERROR_OK)
830 return result;
831
832 jtag_add_clocks(clock_count);
833 jtag_add_sleep(usecs);
834
835 result = svf_add_statemove(end_state);
836 if (result != ERROR_OK)
837 return result;
838 }
839 break;
840
841 case LCOUNT:
842 {
843 /* expected in stream:
844 * LCOUNT <uint32_t loop_count>
845 */
846 uint8_t count_buf[4];
847
848 if (read(xsvf_fd, count_buf, 4) < 0) {
849 do_abort = 1;
850 break;
851 }
852
853 loop_count = be_to_h_u32(count_buf);
854 LOG_DEBUG("LCOUNT %d", loop_count);
855 }
856 break;
857
858 case LDELAY:
859 {
860 /* expected in stream:
861 * LDELAY <uint8_t wait_state> <uint32_t clock_count> <uint32_t usecs_to_sleep>
862 */
863 uint8_t state;
864 uint8_t clock_buf[4];
865 uint8_t usecs_buf[4];
866
867 if (read(xsvf_fd, &state, 1) < 0
868 || read(xsvf_fd, clock_buf, 4) < 0
869 || read(xsvf_fd, usecs_buf, 4) < 0) {
870 do_abort = 1;
871 break;
872 }
873
874 /* NOTE: loop_state must be stable! */
875 loop_state = xsvf_to_tap(state);
876 loop_clocks = be_to_h_u32(clock_buf);
877 loop_usecs = be_to_h_u32(usecs_buf);
878
879 LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", tap_state_name(
880 loop_state), loop_clocks, loop_usecs);
881 }
882 break;
883
884 /* LSDR is more like XSDRTDO than it is like XSDR. It uses LDELAY which
885 * comes with clocks !AND! sleep requirements.
886 */
887 case LSDR:
888 {
889 int limit = loop_count;
890 int matched = 0;
891 int attempt;
892
893 LOG_DEBUG("LSDR");
894
895 if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK
896 || xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK) {
897 do_abort = 1;
898 break;
899 }
900
901 if (limit < 1)
902 limit = 1;
903
904 for (attempt = 0; attempt < limit; ++attempt) {
905 struct scan_field field;
906
907 result = svf_add_statemove(loop_state);
908 if (result != ERROR_OK) {
909 free(dr_in_mask);
910 return result;
911 }
912 jtag_add_clocks(loop_clocks);
913 jtag_add_sleep(loop_usecs);
914
915 field.num_bits = xsdrsize;
916 field.out_value = dr_out_buf;
917 field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
918
919 if (attempt > 0 && verbose)
920 LOG_USER("LSDR retry %d", attempt);
921
922 if (!tap)
923 jtag_add_plain_dr_scan(field.num_bits,
924 field.out_value,
925 field.in_value,
926 TAP_DRPAUSE);
927 else
928 jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
929
930 jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
931
932 free(field.in_value);
933
934
935 /* LOG_DEBUG("FLUSHING QUEUE"); */
936 result = jtag_execute_queue();
937 if (result == ERROR_OK) {
938 matched = 1;
939 break;
940 }
941 }
942
943 if (!matched) {
944 LOG_USER("LSDR mismatch");
945 tdo_mismatch = 1;
946 break;
947 }
948 }
949 break;
950
951 case XTRST:
952 {
953 uint8_t trst_mode;
954
955 if (read(xsvf_fd, &trst_mode, 1) < 0) {
956 do_abort = 1;
957 break;
958 }
959
960 switch (trst_mode) {
961 case XTRST_ON:
962 jtag_add_reset(1, 0);
963 break;
964 case XTRST_OFF:
965 case XTRST_Z:
966 jtag_add_reset(0, 0);
967 break;
968 case XTRST_ABSENT:
969 break;
970 default:
971 LOG_ERROR("XTRST mode argument (0x%02X) out of range", trst_mode);
972 do_abort = 1;
973 }
974 }
975 break;
976
977 default:
978 LOG_ERROR("unknown xsvf command (0x%02X)", uc);
979 unsupported = 1;
980 }
981
982 if (do_abort || unsupported || tdo_mismatch) {
983 LOG_DEBUG("xsvf failed, setting taps to reasonable state");
984
985 /* upon error, return the TAPs to a reasonable state */
986 result = svf_add_statemove(TAP_IDLE);
987 if (result != ERROR_OK)
988 return result;
989 result = jtag_execute_queue();
990 if (result != ERROR_OK)
991 return result;
992 break;
993 }
994 }
995
996 if (tdo_mismatch) {
997 command_print(CMD,
998 "TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
999 file_offset);
1000
1001 return ERROR_FAIL;
1002 }
1003
1004 if (unsupported) {
1005 off_t offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
1006 command_print(CMD,
1007 "unsupported xsvf command (0x%02X) at offset %jd, aborting",
1008 uc, (intmax_t)offset);
1009 return ERROR_FAIL;
1010 }
1011
1012 if (do_abort) {
1013 command_print(CMD, "premature end of xsvf file detected, aborting");
1014 return ERROR_FAIL;
1015 }
1016
1017 free(dr_out_buf);
1018 free(dr_in_buf);
1019 free(dr_in_mask);
1020
1021 close(xsvf_fd);
1022
1023 command_print(CMD, "XSVF file programmed successfully");
1024
1025 return ERROR_OK;
1026 }
1027
1028 static const struct command_registration xsvf_command_handlers[] = {
1029 {
1030 .name = "xsvf",
1031 .handler = handle_xsvf_command,
1032 .mode = COMMAND_EXEC,
1033 .help = "Runs a XSVF file. If 'virt2' is given, xruntest "
1034 "counts are interpreted as TCK cycles rather than "
1035 "as microseconds. Without the 'quiet' option, all "
1036 "comments, retries, and mismatches will be reported.",
1037 .usage = "(tapname|'plain') filename ['virt2'] ['quiet']",
1038 },
1039 COMMAND_REGISTRATION_DONE
1040 };
1041
1042 int xsvf_register_commands(struct command_context *cmd_ctx)
1043 {
1044 return register_commands(cmd_ctx, NULL, xsvf_command_handlers);
1045 }
1046
1047 /*
1048
1049 PSEUDO-Code from Xilinx Appnote XAPP067.pdf :
1050
1051 the following pseudo code clarifies the intent of the xrepeat support.The
1052 flow given is for the entire processing of an SVF file, not an XSVF file.
1053 No idea if this is just for the XC9500/XL/XV devices or all Xilinx parts.
1054
1055 "Pseudo-Code Algorithm for SVF-Based ISP"
1056
1057 1. Go to Test-Logic-Reset state
1058 2. Go to Run-Test Idle state
1059 3. Read SVF record
1060
1061 4. if SIR record then
1062 go to Shift-IR state
1063 Scan in <TDI value>
1064
1065 5. else if SDR record then
1066 set <repeat count> to 0
1067 store <TDI value> as <current TDI value>
1068 store <TDO value> as <current TDO value>
1069 6. go to Shift-DR state
1070 scan in <current TDI value>
1071 if < current TDO value > is specified then
1072 if < current TDO value > does not equal <actual TDO value> then
1073 if < repeat count > > 32 then
1074 LOG ERROR
1075 go to Run-Test Idle state
1076 go to Step 3
1077 end if
1078 go to Pause-DR
1079 go to Exit2-DR
1080 go to Shift-DR
1081 go to Exit1-DR
1082 go to Update-DR
1083 go to Run-Test/Idle
1084 increment <repeat count> by 1
1085 pause <current pause time> microseconds
1086 go to Step 6)
1087 end if
1088 else
1089 go to Run-Test Idle state
1090 go to Step 3
1091 endif
1092 else if RUNTEST record then
1093 pause tester for < TCK value > microseconds
1094 store <TCK value> as <current pause time>
1095 end if
1096
1097 */

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)