2 * Copyright (C) 2005 by Dominic Rath
5 * Copyright (C) 2007,2008 Øyvind Harboe
6 * oyvind.harboe@zylin.com
8 * Copyright (C) 2008 Peter Hettkamp
9 * peter.hettkamp@htp-tel.de
11 * Copyright (C) 2009 SoftPLC Corporation. http://softplc.com
12 * Dick Hollenbeck <dick@softplc.com>
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 2 of the License, or
17 * (at your option) any later version.
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License
25 * along with this program; if not, write to the Free Software
26 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 /* The specification for SVF is available here:
31 * http://www.asset-intertech.com/support/svf.pdf
32 * Below, this document is refered to as the "SVF spec".
34 * The specification for XSVF is available here:
35 * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf
36 * Below, this document is refered to as the "XSVF spec".
48 /* XSVF commands, from appendix B of xapp503.pdf */
49 #define XCOMPLETE 0x00
57 #define XSETSDRMASKS 0x0A
72 /* XWAITSTATE is not in the xilinx XSVF spec, but the svf2xsvf.py translator
73 * generates this. Arguably it is needed because the XSVF XRUNTEST command
74 * was ill conceived and does not directly flow out of the SVF RUNTEST command.
75 * This XWAITSTATE does map directly from the SVF RUNTEST command.
77 #define XWAITSTATE 0x18
79 /* Lattice has extended the SVF file format, and Dick Hollenbeck's python based
80 * SVF2XSVF converter supports these 3 additional XSVF opcodes, LCOUNT, LDELAY, LSDR.
81 * Here is an example of usage of the 3 lattice opcode extensions:
83 ! Set the maximum loop count to 25.
85 ! Step to DRPAUSE give 5 clocks and wait for 1.00e + 000 SEC.
86 LDELAY DRPAUSE 5 TCK 1.00E-003 SEC;
87 ! Test for the completed status. Match means pass.
88 ! Loop back to LDELAY line if not match and loop count less than 25.
100 /* XSVF valid state values for the XSTATE command, from appendix B of xapp503.pdf */
101 #define XSV_RESET 0x00
102 #define XSV_IDLE 0x01
103 #define XSV_DRSELECT 0x02
104 #define XSV_DRCAPTURE 0x03
105 #define XSV_DRSHIFT 0x04
106 #define XSV_DREXIT1 0x05
107 #define XSV_DRPAUSE 0x06
108 #define XSV_DREXIT2 0x07
109 #define XSV_DRUPDATE 0x08
110 #define XSV_IRSELECT 0x09
111 #define XSV_IRCAPTURE 0x0A
112 #define XSV_IRSHIFT 0x0B
113 #define XSV_IREXIT1 0x0C
114 #define XSV_IRPAUSE 0x0D
115 #define XSV_IREXIT2 0x0E
116 #define XSV_IRUPDATE 0x0F
118 /* arguments to XTRST */
122 #define XTRST_ABSENT 3
124 #define XSTATE_MAX_PATH 12
126 static int handle_xsvf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
128 static int xsvf_fd
= 0;
131 /* map xsvf tap state to an openocd "tap_state_t" */
132 static tap_state_t
xsvf_to_tap(int xsvf_state
)
138 case XSV_RESET
: ret
= TAP_RESET
; break;
139 case XSV_IDLE
: ret
= TAP_IDLE
; break;
140 case XSV_DRSELECT
: ret
= TAP_DRSELECT
; break;
141 case XSV_DRCAPTURE
: ret
= TAP_DRCAPTURE
; break;
142 case XSV_DRSHIFT
: ret
= TAP_DRSHIFT
; break;
143 case XSV_DREXIT1
: ret
= TAP_DREXIT1
; break;
144 case XSV_DRPAUSE
: ret
= TAP_DRPAUSE
; break;
145 case XSV_DREXIT2
: ret
= TAP_DREXIT2
; break;
146 case XSV_DRUPDATE
: ret
= TAP_DRUPDATE
; break;
147 case XSV_IRSELECT
: ret
= TAP_IRSELECT
; break;
148 case XSV_IRCAPTURE
: ret
= TAP_IRCAPTURE
; break;
149 case XSV_IRSHIFT
: ret
= TAP_IRSHIFT
; break;
150 case XSV_IREXIT1
: ret
= TAP_IREXIT1
; break;
151 case XSV_IRPAUSE
: ret
= TAP_IRPAUSE
; break;
152 case XSV_IREXIT2
: ret
= TAP_IREXIT2
; break;
153 case XSV_IRUPDATE
: ret
= TAP_IRUPDATE
; break;
155 LOG_ERROR("UNKNOWN XSVF STATE 0x%02X", xsvf_state
);
164 int xsvf_register_commands(struct command_context_s
*cmd_ctx
)
166 register_command(cmd_ctx
, NULL
, "xsvf", handle_xsvf_command
,
167 COMMAND_EXEC
, "run xsvf <file> [virt2] [quiet]");
172 static int xsvf_read_buffer(int num_bits
, int fd
, uint8_t* buf
)
176 for (num_bytes
= (num_bits
+ 7) / 8; num_bytes
> 0; num_bytes
--)
178 /* reverse the order of bytes as they are read sequentially from file */
179 if (read(fd
, buf
+ num_bytes
- 1, 1) < 0)
180 return ERROR_XSVF_EOF
;
187 static int handle_xsvf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
189 uint8_t *dr_out_buf
= NULL
; /* from host to device (TDI) */
190 uint8_t *dr_in_buf
= NULL
; /* from device to host (TDO) */
191 uint8_t *dr_in_mask
= NULL
;
194 int xruntest
= 0; /* number of TCK cycles OR microseconds */
195 int xrepeat
= 0; /* number of retries */
197 tap_state_t xendir
= TAP_IDLE
; /* see page 8 of the SVF spec, initial xendir to be TAP_IDLE */
198 tap_state_t xenddr
= TAP_IDLE
;
202 long file_offset
= 0;
205 tap_state_t loop_state
= TAP_IDLE
;
211 int tdo_mismatch
= 0;
216 int runtest_requires_tck
= 0; /* a flag telling whether to clock TCK during waits, or simply sleep, controled by virt2 */
219 /* use NULL to indicate a "plain" xsvf file which accounts for
220 additional devices in the scan chain, otherwise the device
221 that should be affected
223 jtag_tap_t
*tap
= NULL
;
227 command_print(cmd_ctx
, "usage: xsvf <device#|plain> <file> [<variant>] [quiet]");
231 filename
= args
[1]; /* we mess with args starting point below, snapshot filename here */
233 if (strcmp(args
[0], "plain") != 0)
235 tap
= jtag_tap_by_string(args
[0]);
238 command_print(cmd_ctx
, "Tap: %s unknown", args
[0]);
243 if ((xsvf_fd
= open(filename
, O_RDONLY
)) < 0)
245 command_print(cmd_ctx
, "file \"%s\" not found", filename
);
249 /* if this argument is present, then interpret xruntest counts as TCK cycles rather than as usecs */
250 if ((argc
> 2) && (strcmp(args
[2], "virt2") == 0))
252 runtest_requires_tck
= 1;
257 if ((argc
> 2) && (strcmp(args
[2], "quiet") == 0))
262 LOG_USER("xsvf processing file: \"%s\"", filename
);
264 while (read(xsvf_fd
, &opcode
, 1) > 0)
266 /* record the position of the just read opcode within the file */
267 file_offset
= lseek(xsvf_fd
, 0, SEEK_CUR
) - 1;
272 LOG_DEBUG("XCOMPLETE");
274 result
= jtag_execute_queue();
275 if (result
!= ERROR_OK
)
283 LOG_DEBUG("XTDOMASK");
284 if (dr_in_mask
&& (xsvf_read_buffer(xsdrsize
, xsvf_fd
, dr_in_mask
) != ERROR_OK
))
290 uint8_t xruntest_buf
[4];
292 if (read(xsvf_fd
, xruntest_buf
, 4) < 0)
298 xruntest
= be_to_h_u32(xruntest_buf
);
299 LOG_DEBUG("XRUNTEST %d 0x%08X", xruntest
, xruntest
);
307 if (read(xsvf_fd
, &myrepeat
, 1) < 0)
312 LOG_DEBUG("XREPEAT %d", xrepeat
);
319 uint8_t xsdrsize_buf
[4];
321 if (read(xsvf_fd
, xsdrsize_buf
, 4) < 0)
327 xsdrsize
= be_to_h_u32(xsdrsize_buf
);
328 LOG_DEBUG("XSDRSIZE %d", xsdrsize
);
330 if (dr_out_buf
) free(dr_out_buf
);
331 if (dr_in_buf
) free(dr_in_buf
);
332 if (dr_in_mask
) free(dr_in_mask
);
334 dr_out_buf
= malloc((xsdrsize
+ 7) / 8);
335 dr_in_buf
= malloc((xsdrsize
+ 7) / 8);
336 dr_in_mask
= malloc((xsdrsize
+ 7) / 8);
340 case XSDR
: /* these two are identical except for the dr_in_buf */
347 const char* op_name
= (opcode
== XSDR
? "XSDR" : "XSDRTDO");
349 if (xsvf_read_buffer(xsdrsize
, xsvf_fd
, dr_out_buf
) != ERROR_OK
)
355 if (opcode
== XSDRTDO
)
357 if (xsvf_read_buffer(xsdrsize
, xsvf_fd
, dr_in_buf
) != ERROR_OK
)
367 LOG_DEBUG("%s %d", op_name
, xsdrsize
);
369 for (attempt
= 0; attempt
< limit
; ++attempt
)
375 /* perform the XC9500 exception handling sequence shown in xapp067.pdf and
376 illustrated in psuedo code at end of this file. We start from state
384 This sequence should be harmless for other devices, and it
385 will be skipped entirely if xrepeat is set to zero.
388 static tap_state_t exception_path
[] = {
396 jtag_add_pathmove(DIM(exception_path
), exception_path
);
399 LOG_USER("%s mismatch, xsdrsize=%d retry=%d", op_name
, xsdrsize
, attempt
);
403 field
.num_bits
= xsdrsize
;
404 field
.out_value
= dr_out_buf
;
405 field
.in_value
= calloc(CEIL(field
.num_bits
, 8), 1);
408 jtag_add_plain_dr_scan(1, &field
, jtag_set_end_state(TAP_DRPAUSE
));
410 jtag_add_dr_scan(1, &field
, jtag_set_end_state(TAP_DRPAUSE
));
412 jtag_check_value_mask(&field
, dr_in_buf
, dr_in_mask
);
414 free(field
.in_value
);
417 /* LOG_DEBUG("FLUSHING QUEUE"); */
418 result
= jtag_execute_queue();
419 if (result
== ERROR_OK
)
428 LOG_USER("%s mismatch", op_name
);
433 /* See page 19 of XSVF spec regarding opcode "XSDR" */
436 result
= svf_add_statemove(TAP_IDLE
);
438 if (runtest_requires_tck
)
439 jtag_add_clocks(xruntest
);
441 jtag_add_sleep(xruntest
);
443 else if (xendir
!= TAP_DRPAUSE
) /* we are already in TAP_DRPAUSE */
444 result
= svf_add_statemove(xenddr
);
449 LOG_ERROR("unsupported XSETSDRMASKS\n");
454 LOG_ERROR("unsupported XSDRINC\n");
459 LOG_ERROR("unsupported XSDRB\n");
464 LOG_ERROR("unsupported XSDRC\n");
469 LOG_ERROR("unsupported XSDRE\n");
474 LOG_ERROR("unsupported XSDRTDOB\n");
479 LOG_ERROR("unsupported XSDRTDOC\n");
484 LOG_ERROR("unsupported XSDRTDOE\n");
493 if (read(xsvf_fd
, &uc
, 1) < 0)
499 mystate
= xsvf_to_tap(uc
);
501 LOG_DEBUG("XSTATE 0x%02X %s", uc
, tap_state_name(mystate
));
503 /* NOTE: the current state is SVF-stable! */
505 /* no change == NOP */
506 if (mystate
== cmd_queue_cur_state
507 && mystate
!= TAP_RESET
)
510 /* Hand off to SVF? */
511 if (svf_tap_state_is_stable(mystate
))
513 result
= svf_add_statemove(mystate
);
514 if (result
!= ERROR_OK
)
520 * A sequence of XSTATE transitions, each TAP
521 * state adjacent to the previous one.
523 * NOTE: OpenOCD requires something that XSVF
524 * doesn't: the last TAP state in the path
527 * FIXME Implement path collection; submit via
528 * jtag_add_pathmove() after teaching it to
531 LOG_ERROR("XSVF: 'XSTATE %s' ... NYET",
532 tap_state_name(mystate
));
539 if (read(xsvf_fd
, &uc
, 1) < 0)
545 /* see page 22 of XSVF spec */
549 xendir
= TAP_IRPAUSE
;
552 LOG_ERROR("illegial XENDIR argument: 0x%02X", uc
);
557 LOG_DEBUG("XENDIR 0x%02X %s", uc
, tap_state_name(xendir
));
562 if (read(xsvf_fd
, &uc
, 1) < 0)
568 /* see page 22 of XSVF spec */
572 xenddr
= TAP_DRPAUSE
;
575 LOG_ERROR("illegial XENDDR argument: 0x%02X", uc
);
580 LOG_DEBUG("XENDDR %02X %s", uc
, tap_state_name(xenddr
));
586 uint8_t short_buf
[2];
589 tap_state_t my_end_state
= xruntest
? TAP_IDLE
: xendir
;
593 /* one byte bitcount */
594 if (read(xsvf_fd
, short_buf
, 1) < 0)
599 bitcount
= short_buf
[0];
600 LOG_DEBUG("XSIR %d", bitcount
);
604 if (read(xsvf_fd
, short_buf
, 2) < 0)
609 bitcount
= be_to_h_u16(short_buf
);
610 LOG_DEBUG("XSIR2 %d", bitcount
);
613 ir_buf
= malloc((bitcount
+ 7) / 8);
615 if (xsvf_read_buffer(bitcount
, xsvf_fd
, ir_buf
) != ERROR_OK
)
622 field
.num_bits
= bitcount
;
623 field
.out_value
= ir_buf
;
625 field
.in_value
= NULL
;
631 jtag_add_plain_ir_scan(1, &field
, my_end_state
);
633 jtag_add_ir_scan(1, &field
, my_end_state
);
637 if (runtest_requires_tck
)
638 jtag_add_clocks(xruntest
);
640 jtag_add_sleep(xruntest
);
643 /* Note that an -irmask of non-zero in your config file
644 * can cause this to fail. Setting -irmask to zero cand work
645 * around the problem.
648 /* LOG_DEBUG("FLUSHING QUEUE"); */
649 result
= jtag_execute_queue();
650 if (result
!= ERROR_OK
)
661 unsigned int ndx
= 0;
666 if (read(xsvf_fd
, &uc
, 1) < 0)
672 if (ndx
< sizeof(comment
)-1)
677 comment
[sizeof(comment
)-1] = 0; /* regardless, terminate */
679 LOG_USER("# %s", comment
);
685 /* expected in stream:
686 XWAIT <uint8_t wait_state> <uint8_t end_state> <uint32_t usecs>
691 uint8_t delay_buf
[4];
693 tap_state_t wait_state
;
694 tap_state_t end_state
;
697 if (read(xsvf_fd
, &wait
, 1) < 0
698 || read(xsvf_fd
, &end
, 1) < 0
699 || read(xsvf_fd
, delay_buf
, 4) < 0)
705 wait_state
= xsvf_to_tap(wait
);
706 end_state
= xsvf_to_tap(end
);
707 delay
= be_to_h_u32(delay_buf
);
709 LOG_DEBUG("XWAIT %s %s usecs:%d", tap_state_name(wait_state
), tap_state_name(end_state
), delay
);
711 if (runtest_requires_tck
&& wait_state
== TAP_IDLE
)
713 jtag_add_runtest(delay
, end_state
);
717 /* FIXME handle statemove errors ... */
718 result
= svf_add_statemove(wait_state
);
719 jtag_add_sleep(delay
);
720 result
= svf_add_statemove(end_state
);
727 /* expected in stream:
728 XWAITSTATE <uint8_t wait_state> <uint8_t end_state> <uint32_t clock_count> <uint32_t usecs>
731 uint8_t clock_buf
[4];
732 uint8_t usecs_buf
[4];
735 tap_state_t wait_state
;
736 tap_state_t end_state
;
740 if (read(xsvf_fd
, &wait
, 1) < 0
741 || read(xsvf_fd
, &end
, 1) < 0
742 || read(xsvf_fd
, clock_buf
, 4) < 0
743 || read(xsvf_fd
, usecs_buf
, 4) < 0)
749 wait_state
= xsvf_to_tap(wait
);
750 end_state
= xsvf_to_tap(end
);
752 clock_count
= be_to_h_u32(clock_buf
);
753 usecs
= be_to_h_u32(usecs_buf
);
755 LOG_DEBUG("XWAITSTATE %s %s clocks:%i usecs:%i",
756 tap_state_name(wait_state
),
757 tap_state_name(end_state
),
760 /* the following states are 'stable', meaning that they have a transition
761 * in the state diagram back to themselves. This is necessary because we will
762 * be issuing a number of clocks in this state. This set of allowed states is also
763 * determined by the SVF RUNTEST command's allowed states.
765 if (!svf_tap_state_is_stable(wait_state
))
767 LOG_ERROR("illegal XWAITSTATE wait_state: \"%s\"",
768 tap_state_name(wait_state
));
770 /* REVISIT "break" so we won't run? */
773 /* FIXME handle statemove errors ... */
774 result
= svf_add_statemove(wait_state
);
776 jtag_add_clocks(clock_count
);
778 jtag_add_sleep(usecs
);
780 result
= svf_add_statemove(end_state
);
786 /* expected in stream:
787 LCOUNT <uint32_t loop_count>
789 uint8_t count_buf
[4];
791 if (read(xsvf_fd
, count_buf
, 4) < 0)
797 loop_count
= be_to_h_u32(count_buf
);
798 LOG_DEBUG("LCOUNT %d", loop_count
);
804 /* expected in stream:
805 LDELAY <uint8_t wait_state> <uint32_t clock_count> <uint32_t usecs_to_sleep>
808 uint8_t clock_buf
[4];
809 uint8_t usecs_buf
[4];
811 if (read(xsvf_fd
, &state
, 1) < 0
812 || read(xsvf_fd
, clock_buf
, 4) < 0
813 || read(xsvf_fd
, usecs_buf
, 4) < 0)
819 /* NOTE: loop_state must be stable! */
820 loop_state
= xsvf_to_tap(state
);
821 loop_clocks
= be_to_h_u32(clock_buf
);
822 loop_usecs
= be_to_h_u32(usecs_buf
);
824 LOG_DEBUG("LDELAY %s clocks:%d usecs:%d", tap_state_name(loop_state
), loop_clocks
, loop_usecs
);
828 /* LSDR is more like XSDRTDO than it is like XSDR. It uses LDELAY which
829 * comes with clocks !AND! sleep requirements.
833 int limit
= loop_count
;
839 if (xsvf_read_buffer(xsdrsize
, xsvf_fd
, dr_out_buf
) != ERROR_OK
840 || xsvf_read_buffer(xsdrsize
, xsvf_fd
, dr_in_buf
) != ERROR_OK
)
849 for (attempt
= 0; attempt
< limit
; ++attempt
)
853 result
= svf_add_statemove(loop_state
);
854 jtag_add_clocks(loop_clocks
);
855 jtag_add_sleep(loop_usecs
);
858 field
.num_bits
= xsdrsize
;
859 field
.out_value
= dr_out_buf
;
860 field
.in_value
= calloc(CEIL(field
.num_bits
, 8), 1);
862 if (attempt
> 0 && verbose
)
863 LOG_USER("LSDR retry %d", attempt
);
866 jtag_add_plain_dr_scan(1, &field
, jtag_set_end_state(TAP_DRPAUSE
));
868 jtag_add_dr_scan(1, &field
, jtag_set_end_state(TAP_DRPAUSE
));
870 jtag_check_value_mask(&field
, dr_in_buf
, dr_in_mask
);
872 free(field
.in_value
);
875 /* LOG_DEBUG("FLUSHING QUEUE"); */
876 result
= jtag_execute_queue();
877 if (result
== ERROR_OK
)
886 LOG_USER("LSDR mismatch");
897 if (read(xsvf_fd
, &trst_mode
, 1) < 0)
906 jtag_add_reset(1, 0);
910 jtag_add_reset(0, 0);
915 LOG_ERROR("XTRST mode argument (0x%02X) out of range", trst_mode
);
922 LOG_ERROR("unknown xsvf command (0x%02X)\n", uc
);
926 if (do_abort
|| unsupported
|| tdo_mismatch
)
928 LOG_DEBUG("xsvf failed, setting taps to reasonable state");
930 /* upon error, return the TAPs to a reasonable state */
931 result
= svf_add_statemove(TAP_IDLE
);
932 result
= jtag_execute_queue();
939 command_print(cmd_ctx
, "TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
948 off_t offset
= lseek(xsvf_fd
, 0, SEEK_CUR
) - 1;
949 command_print(cmd_ctx
,
950 "unsupported xsvf command (0x%02X) at offset %jd, aborting",
951 uc
, (intmax_t)offset
);
957 command_print(cmd_ctx
, "premature end of xsvf file detected, aborting");
972 command_print(cmd_ctx
, "XSVF file programmed successfully");
978 #if 0 /* this comment style used to try and keep uncrustify from adding * at begin of line */
980 PSUEDO
-Code from Xilinx Appnote XAPP067
.pdf
:
982 the following pseudo code clarifies the intent of the xrepeat support
. The
983 flow given is
for the entire processing of an SVF file
, not an XSVF file
.
984 No idea
if this is just
for the XC9500
/XL
/XV devices
or all Xilinx parts
.
986 "Pseudo-Code Algorithm for SVF-Based ISP"
988 1. Go to Test
-Logic
-Reset state
989 2. Go to Run
-Test Idle state
992 4. if SIR record then
996 5. else if SDR record then
997 set
<repeat count
> to
0
998 store
<TDI value
> as
<current TDI value
>
999 store
<TDO value
> as
<current TDO value
>
1000 6. go to Shift
-DR state
1001 scan in
<current TDI value
>
1002 if <current TDO value
> is specified then
1003 if <current TDO value
> does
not equal
<actual TDO value
> then
1004 if <repeat count
> > 32 then
1006 go to Run
-Test Idle state
1015 increment
<repeat count
> by
1
1016 pause
<current pause time
> microseconds
1020 go to Run
-Test Idle state
1023 else if RUNTEST record then
1024 pause tester
for <TCK value
> microseconds
1025 store
<TCK value
> as
<current pause time
>