2 * Copyright (C) 2009 by Simon Qian
3 * SimonQian@SimonQian.com
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 along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 /* The specification for SVF is available here:
22 * http://www.asset-intertech.com/support/svf.pdf
23 * Below, this document is refered to as the "SVF spec".
25 * The specification for XSVF is available here:
26 * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf
27 * Below, this document is refered to as the "XSVF spec".
36 #include "time_support.h"
58 static const char *svf_command_name
[14] =
84 static const char *svf_trst_mode_name
[4] =
96 uint32_t num_of_moves
;
101 * These paths are from the SVF specification for the STATE command, to be
102 * used when the STATE command only includes the final state. The first
103 * element of the path is the "from" (current) state, and the last one is
104 * the "to" (target) state.
106 * All specified paths are the shortest ones in the JTAG spec, and are thus
107 * not (!!) exact matches for the paths used elsewhere in OpenOCD. Note
108 * that PAUSE-to-PAUSE transitions all go through UPDATE and then CAPTURE,
109 * which has specific effects on the various registers; they are not NOPs.
111 * Paths to RESET are disabled here. As elsewhere in OpenOCD, and in XSVF
112 * and many SVF implementations, we don't want to risk missing that state.
113 * To get to RESET, always we ignore the current state.
115 static const svf_statemove_t svf_statemoves
[] =
117 // from to num_of_moves, paths[8]
118 // {TAP_RESET, TAP_RESET, 1, {TAP_RESET}},
119 {TAP_RESET
, TAP_IDLE
, 2, {TAP_RESET
, TAP_IDLE
}},
120 {TAP_RESET
, TAP_DRPAUSE
, 6, {TAP_RESET
, TAP_IDLE
, TAP_DRSELECT
, TAP_DRCAPTURE
, TAP_DREXIT1
, TAP_DRPAUSE
}},
121 {TAP_RESET
, TAP_IRPAUSE
, 7, {TAP_RESET
, TAP_IDLE
, TAP_DRSELECT
, TAP_IRSELECT
, TAP_IRCAPTURE
, TAP_IREXIT1
, TAP_IRPAUSE
}},
123 // {TAP_IDLE, TAP_RESET, 4, {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
124 {TAP_IDLE
, TAP_IDLE
, 1, {TAP_IDLE
}},
125 {TAP_IDLE
, TAP_DRPAUSE
, 5, {TAP_IDLE
, TAP_DRSELECT
, TAP_DRCAPTURE
, TAP_DREXIT1
, TAP_DRPAUSE
}},
126 {TAP_IDLE
, TAP_IRPAUSE
, 6, {TAP_IDLE
, TAP_DRSELECT
, TAP_IRSELECT
, TAP_IRCAPTURE
, TAP_IREXIT1
, TAP_IRPAUSE
}},
128 // {TAP_DRPAUSE, TAP_RESET, 6, {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
129 {TAP_DRPAUSE
, TAP_IDLE
, 4, {TAP_DRPAUSE
, TAP_DREXIT2
, TAP_DRUPDATE
, TAP_IDLE
}},
130 {TAP_DRPAUSE
, TAP_DRPAUSE
, 7, {TAP_DRPAUSE
, TAP_DREXIT2
, TAP_DRUPDATE
, TAP_DRSELECT
, TAP_DRCAPTURE
, TAP_DREXIT1
, TAP_DRPAUSE
}},
131 {TAP_DRPAUSE
, TAP_IRPAUSE
, 8, {TAP_DRPAUSE
, TAP_DREXIT2
, TAP_DRUPDATE
, TAP_DRSELECT
, TAP_IRSELECT
, TAP_IRCAPTURE
, TAP_IREXIT1
, TAP_IRPAUSE
}},
133 // {TAP_IRPAUSE, TAP_RESET, 6, {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
134 {TAP_IRPAUSE
, TAP_IDLE
, 4, {TAP_IRPAUSE
, TAP_IREXIT2
, TAP_IRUPDATE
, TAP_IDLE
}},
135 {TAP_IRPAUSE
, TAP_DRPAUSE
, 7, {TAP_IRPAUSE
, TAP_IREXIT2
, TAP_IRUPDATE
, TAP_DRSELECT
, TAP_DRCAPTURE
, TAP_DREXIT1
, TAP_DRPAUSE
}},
136 {TAP_IRPAUSE
, TAP_IRPAUSE
, 8, {TAP_IRPAUSE
, TAP_IREXIT2
, TAP_IRUPDATE
, TAP_DRSELECT
, TAP_IRSELECT
, TAP_IRCAPTURE
, TAP_IREXIT1
, TAP_IRPAUSE
}}
140 #define XXR_TDI (1 << 0)
141 #define XXR_TDO (1 << 1)
142 #define XXR_MASK (1 << 2)
143 #define XXR_SMASK (1 << 3)
157 tap_state_t ir_end_state
;
158 tap_state_t dr_end_state
;
159 tap_state_t runtest_run_state
;
160 tap_state_t runtest_end_state
;
161 trst_mode_t trst_mode
;
163 svf_xxr_para_t hir_para
;
164 svf_xxr_para_t hdr_para
;
165 svf_xxr_para_t tir_para
;
166 svf_xxr_para_t tdr_para
;
167 svf_xxr_para_t sir_para
;
168 svf_xxr_para_t sdr_para
;
171 static svf_para_t svf_para
;
172 static const svf_para_t svf_para_init
=
174 // frequency, ir_end_state, dr_end_state, runtest_run_state, runtest_end_state, trst_mode
175 0, TAP_IDLE
, TAP_IDLE
, TAP_IDLE
, TAP_IDLE
, TRST_Z
,
177 // {len, data_mask, tdi, tdo, mask, smask},
178 {0, 0, NULL
, NULL
, NULL
, NULL
},
180 // {len, data_mask, tdi, tdo, mask, smask},
181 {0, 0, NULL
, NULL
, NULL
, NULL
},
183 // {len, data_mask, tdi, tdo, mask, smask},
184 {0, 0, NULL
, NULL
, NULL
, NULL
},
186 // {len, data_mask, tdi, tdo, mask, smask},
187 {0, 0, NULL
, NULL
, NULL
, NULL
},
189 // {len, data_mask, tdi, tdo, mask, smask},
190 {0, 0, NULL
, NULL
, NULL
, NULL
},
192 // {len, data_mask, tdi, tdo, mask, smask},
193 {0, 0, NULL
, NULL
, NULL
, NULL
},
198 int line_num
; // used to record line number of the check operation
199 // so more information could be printed
200 int enabled
; // check is enabled or not
201 int buffer_offset
; // buffer_offset to buffers
202 int bit_len
; // bit length to check
203 }svf_check_tdo_para_t
;
205 #define SVF_CHECK_TDO_PARA_SIZE 1024
206 static svf_check_tdo_para_t
*svf_check_tdo_para
= NULL
;
207 static int svf_check_tdo_para_index
= 0;
209 static int svf_read_command_from_file(int fd
);
210 static int svf_check_tdo(void);
211 static int svf_add_check_para(uint8_t enabled
, int buffer_offset
, int bit_len
);
212 static int svf_run_command(struct command_context_s
*cmd_ctx
, char *cmd_str
);
213 static int handle_svf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
215 static int svf_fd
= 0;
216 static char *svf_command_buffer
= NULL
;
217 static int svf_command_buffer_size
= 0;
218 static int svf_line_number
= 1;
220 static jtag_tap_t
*tap
= NULL
;
222 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT (4 * 1024)
223 static uint8_t *svf_tdi_buffer
= NULL
, *svf_tdo_buffer
= NULL
, *svf_mask_buffer
= NULL
;
224 static int svf_buffer_index
= 0, svf_buffer_size
= 0;
225 static int svf_quiet
= 0;
228 int svf_register_commands(struct command_context_s
*cmd_ctx
)
230 register_command(cmd_ctx
, NULL
, "svf", handle_svf_command
,
231 COMMAND_EXEC
, "run svf <file>");
236 static void svf_free_xxd_para(svf_xxr_para_t
*para
)
240 if (para
->tdi
!= NULL
)
245 if (para
->tdo
!= NULL
)
250 if (para
->mask
!= NULL
)
255 if (para
->smask
!= NULL
)
263 static unsigned svf_get_mask_u32(int bitlen
)
271 else if (bitlen
>= 32)
273 bitmask
= 0xFFFFFFFF;
277 bitmask
= (1 << bitlen
) - 1;
283 int svf_add_statemove(tap_state_t state_to
)
285 tap_state_t state_from
= cmd_queue_cur_state
;
288 /* when resetting, be paranoid and ignore current state */
289 if (state_to
== TAP_RESET
) {
294 for (index
= 0; index
< DIM(svf_statemoves
); index
++)
296 if ((svf_statemoves
[index
].from
== state_from
)
297 && (svf_statemoves
[index
].to
== state_to
))
299 /* recorded path includes current state ... avoid extra TCKs! */
300 if (svf_statemoves
[index
].num_of_moves
> 1)
301 jtag_add_pathmove(svf_statemoves
[index
].num_of_moves
- 1,
302 svf_statemoves
[index
].paths
+ 1);
304 jtag_add_pathmove(svf_statemoves
[index
].num_of_moves
,
305 svf_statemoves
[index
].paths
);
309 LOG_ERROR("SVF: can not move to %s", tap_state_name(state_to
));
313 static int handle_svf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
315 #define SVF_NUM_OF_OPTIONS 1
316 int command_num
= 0, i
;
320 if ((argc
< 1) || (argc
> (1 + SVF_NUM_OF_OPTIONS
)))
322 command_print(cmd_ctx
, "usage: svf <file> [quiet]");
328 for (i
= 1; i
< argc
; i
++)
330 if (!strcmp(args
[i
], "quiet"))
336 LOG_ERROR("unknown variant for svf: %s", args
[i
]);
338 // no need to free anything now
343 if ((svf_fd
= open(args
[0], O_RDONLY
)) < 0)
345 command_print(cmd_ctx
, "file \"%s\" not found", args
[0]);
347 // no need to free anything now
351 LOG_USER("svf processing file: \"%s\"", args
[0]);
354 time_ago
= timeval_ms();
358 svf_command_buffer_size
= 0;
360 svf_check_tdo_para_index
= 0;
361 svf_check_tdo_para
= malloc(sizeof(svf_check_tdo_para_t
) * SVF_CHECK_TDO_PARA_SIZE
);
362 if (NULL
== svf_check_tdo_para
)
364 LOG_ERROR("not enough memory");
369 svf_buffer_index
= 0;
370 // double the buffer size
371 // in case current command cannot be commited, and next command is a bit scan command
372 // here is 32K bits for this big scan command, it should be enough
373 // buffer will be reallocated if buffer size is not enough
374 svf_tdi_buffer
= (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
375 if (NULL
== svf_tdi_buffer
)
377 LOG_ERROR("not enough memory");
381 svf_tdo_buffer
= (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
382 if (NULL
== svf_tdo_buffer
)
384 LOG_ERROR("not enough memory");
388 svf_mask_buffer
= (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
389 if (NULL
== svf_mask_buffer
)
391 LOG_ERROR("not enough memory");
395 svf_buffer_size
= 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
;
397 memcpy(&svf_para
, &svf_para_init
, sizeof(svf_para
));
402 while (ERROR_OK
== svf_read_command_from_file(svf_fd
))
404 if (ERROR_OK
!= svf_run_command(cmd_ctx
, svf_command_buffer
))
406 LOG_ERROR("fail to run command at line %d", svf_line_number
);
412 if (ERROR_OK
!= jtag_execute_queue())
416 else if (ERROR_OK
!= svf_check_tdo())
422 command_print(cmd_ctx
, "%lld ms used", timeval_ms() - time_ago
);
430 if (svf_command_buffer
)
432 free(svf_command_buffer
);
433 svf_command_buffer
= NULL
;
434 svf_command_buffer_size
= 0;
436 if (svf_check_tdo_para
)
438 free(svf_check_tdo_para
);
439 svf_check_tdo_para
= NULL
;
440 svf_check_tdo_para_index
= 0;
444 free(svf_tdi_buffer
);
445 svf_tdi_buffer
= NULL
;
449 free(svf_tdo_buffer
);
450 svf_tdo_buffer
= NULL
;
454 free(svf_mask_buffer
);
455 svf_mask_buffer
= NULL
;
457 svf_buffer_index
= 0;
460 svf_free_xxd_para(&svf_para
.hdr_para
);
461 svf_free_xxd_para(&svf_para
.hir_para
);
462 svf_free_xxd_para(&svf_para
.tdr_para
);
463 svf_free_xxd_para(&svf_para
.tir_para
);
464 svf_free_xxd_para(&svf_para
.sdr_para
);
465 svf_free_xxd_para(&svf_para
.sir_para
);
469 command_print(cmd_ctx
, "svf file programmed successfully for %d commands", command_num
);
473 command_print(cmd_ctx
, "svf file programmed failed");
479 #define SVFP_CMD_INC_CNT 1024
480 static int svf_read_command_from_file(int fd
)
482 char ch
, *tmp_buffer
= NULL
;
483 int cmd_pos
= 0, cmd_ok
= 0, slash
= 0, comment
= 0;
485 while (!cmd_ok
&& (read(fd
, &ch
, 1) > 0))
515 if (cmd_pos
>= svf_command_buffer_size
- 1)
517 tmp_buffer
= (char*)malloc(svf_command_buffer_size
+ SVFP_CMD_INC_CNT
); // 1 more byte for '\0'
518 if (NULL
== tmp_buffer
)
520 LOG_ERROR("not enough memory");
523 if (svf_command_buffer_size
> 0)
525 memcpy(tmp_buffer
, svf_command_buffer
, svf_command_buffer_size
);
527 if (svf_command_buffer
!= NULL
)
529 free(svf_command_buffer
);
531 svf_command_buffer
= tmp_buffer
;
532 svf_command_buffer_size
+= SVFP_CMD_INC_CNT
;
535 svf_command_buffer
[cmd_pos
++] = (char)toupper(ch
);
543 svf_command_buffer
[cmd_pos
] = '\0';
552 static int svf_parse_cmd_string(char *str
, int len
, char **argus
, int *num_of_argu
)
554 int pos
= 0, num
= 0, space_found
= 1;
564 LOG_ERROR("fail to parse svf command");
574 argus
[num
++] = &str
[pos
];
587 bool svf_tap_state_is_stable(tap_state_t state
)
589 return (TAP_RESET
== state
) || (TAP_IDLE
== state
)
590 || (TAP_DRPAUSE
== state
) || (TAP_IRPAUSE
== state
);
593 static int svf_find_string_in_array(char *str
, char **strs
, int num_of_element
)
597 for (i
= 0; i
< num_of_element
; i
++)
599 if (!strcmp(str
, strs
[i
]))
607 static int svf_adjust_array_length(uint8_t **arr
, int orig_bit_len
, int new_bit_len
)
609 int new_byte_len
= (new_bit_len
+ 7) >> 3;
611 if ((NULL
== *arr
) || (((orig_bit_len
+ 7) >> 3) < ((new_bit_len
+ 7) >> 3)))
618 *arr
= (uint8_t*)malloc(new_byte_len
);
621 LOG_ERROR("not enough memory");
624 memset(*arr
, 0, new_byte_len
);
629 static int svf_copy_hexstring_to_binary(char *str
, uint8_t **bin
, int orig_bit_len
, int bit_len
)
631 int i
, str_len
= strlen(str
), str_hbyte_len
= (bit_len
+ 3) >> 2;
634 if (ERROR_OK
!= svf_adjust_array_length(bin
, orig_bit_len
, bit_len
))
636 LOG_ERROR("fail to adjust length of array");
640 for (i
= 0; i
< str_hbyte_len
; i
++)
649 if ((ch
>= '0') && (ch
<= '9'))
654 else if ((ch
>= 'A') && (ch
<= 'F'))
661 LOG_ERROR("invalid hex string");
673 (*bin
)[i
/ 2] |= ch
<< 4;
683 // consume optional leading '0' characters
684 while (str_len
> 0 && str
[str_len
- 1] == '0')
688 if (str_len
> 0 || (ch
& ~((2 << ((bit_len
- 1) % 4)) - 1)) != 0)
690 LOG_ERROR("value execeeds length");
697 static int svf_check_tdo(void)
701 for (i
= 0; i
< svf_check_tdo_para_index
; i
++)
703 index
= svf_check_tdo_para
[i
].buffer_offset
;
704 len
= svf_check_tdo_para
[i
].bit_len
;
705 if ((svf_check_tdo_para
[i
].enabled
)
706 && buf_cmp_mask(&svf_tdi_buffer
[index
], &svf_tdo_buffer
[index
], &svf_mask_buffer
[index
], len
))
709 unsigned received
, expected
, tapmask
;
710 bitmask
= svf_get_mask_u32(svf_check_tdo_para
[i
].bit_len
);
712 memcpy(&received
, svf_tdi_buffer
+ index
, sizeof(unsigned));
713 memcpy(&expected
, svf_tdo_buffer
+ index
, sizeof(unsigned));
714 memcpy(&tapmask
, svf_mask_buffer
+ index
, sizeof(unsigned));
715 LOG_ERROR("tdo check error at line %d",
716 svf_check_tdo_para
[i
].line_num
);
717 LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X",
724 svf_check_tdo_para_index
= 0;
729 static int svf_add_check_para(uint8_t enabled
, int buffer_offset
, int bit_len
)
731 if (svf_check_tdo_para_index
>= SVF_CHECK_TDO_PARA_SIZE
)
733 LOG_ERROR("toooooo many operation undone");
737 svf_check_tdo_para
[svf_check_tdo_para_index
].line_num
= svf_line_number
;
738 svf_check_tdo_para
[svf_check_tdo_para_index
].bit_len
= bit_len
;
739 svf_check_tdo_para
[svf_check_tdo_para_index
].enabled
= enabled
;
740 svf_check_tdo_para
[svf_check_tdo_para_index
].buffer_offset
= buffer_offset
;
741 svf_check_tdo_para_index
++;
746 static int svf_execute_tap(void)
748 if (ERROR_OK
!= jtag_execute_queue())
752 else if (ERROR_OK
!= svf_check_tdo())
757 svf_buffer_index
= 0;
762 static int svf_run_command(struct command_context_s
*cmd_ctx
, char *cmd_str
)
764 char *argus
[256], command
;
765 int num_of_argu
= 0, i
;
772 float min_time
, max_time
;
774 svf_xxr_para_t
*xxr_para_tmp
;
775 uint8_t **pbuffer_tmp
;
778 tap_state_t
*path
= NULL
, state
;
782 LOG_USER("%s", svf_command_buffer
);
785 if (ERROR_OK
!= svf_parse_cmd_string(cmd_str
, strlen(cmd_str
), argus
, &num_of_argu
))
790 /* NOTE: we're a bit loose here, because we ignore case in
791 * TAP state names (instead of insisting on uppercase).
794 command
= svf_find_string_in_array(argus
[0],
795 (char **)svf_command_name
, DIM(svf_command_name
));
800 if (num_of_argu
!= 2)
802 LOG_ERROR("invalid parameter of %s", argus
[0]);
806 i_tmp
= tap_state_by_name(argus
[1]);
808 if (svf_tap_state_is_stable(i_tmp
))
810 if (command
== ENDIR
)
812 svf_para
.ir_end_state
= i_tmp
;
813 LOG_DEBUG("\tIR end_state = %s",
814 tap_state_name(i_tmp
));
818 svf_para
.dr_end_state
= i_tmp
;
819 LOG_DEBUG("\tDR end_state = %s",
820 tap_state_name(i_tmp
));
825 LOG_ERROR("%s: %s is not a stable state",
831 if ((num_of_argu
!= 1) && (num_of_argu
!= 3))
833 LOG_ERROR("invalid parameter of %s", argus
[0]);
836 if (1 == num_of_argu
)
838 // TODO: set jtag speed to full speed
839 svf_para
.frequency
= 0;
843 if (strcmp(argus
[2], "HZ"))
845 LOG_ERROR("HZ not found in FREQUENCY command");
848 if (ERROR_OK
!= svf_execute_tap())
852 svf_para
.frequency
= atof(argus
[1]);
853 // TODO: set jtag speed to
854 if (svf_para
.frequency
> 0)
856 command_run_linef(cmd_ctx
, "jtag_khz %d", (int)svf_para
.frequency
/ 1000);
857 LOG_DEBUG("\tfrequency = %f", svf_para
.frequency
);
862 xxr_para_tmp
= &svf_para
.hdr_para
;
865 xxr_para_tmp
= &svf_para
.hir_para
;
868 xxr_para_tmp
= &svf_para
.tdr_para
;
871 xxr_para_tmp
= &svf_para
.tir_para
;
874 xxr_para_tmp
= &svf_para
.sdr_para
;
877 xxr_para_tmp
= &svf_para
.sir_para
;
880 // XXR length [TDI (tdi)] [TDO (tdo)][MASK (mask)] [SMASK (smask)]
881 if ((num_of_argu
> 10) || (num_of_argu
% 2))
883 LOG_ERROR("invalid parameter of %s", argus
[0]);
886 i_tmp
= xxr_para_tmp
->len
;
887 xxr_para_tmp
->len
= atoi(argus
[1]);
888 LOG_DEBUG("\tlength = %d", xxr_para_tmp
->len
);
889 xxr_para_tmp
->data_mask
= 0;
890 for (i
= 2; i
< num_of_argu
; i
+= 2)
892 if ((strlen(argus
[i
+ 1]) < 3) || (argus
[i
+ 1][0] != '(') || (argus
[i
+ 1][strlen(argus
[i
+ 1]) - 1] != ')'))
894 LOG_ERROR("data section error");
897 argus
[i
+ 1][strlen(argus
[i
+ 1]) - 1] = '\0';
898 // TDI, TDO, MASK, SMASK
899 if (!strcmp(argus
[i
], "TDI"))
902 pbuffer_tmp
= &xxr_para_tmp
->tdi
;
903 xxr_para_tmp
->data_mask
|= XXR_TDI
;
905 else if (!strcmp(argus
[i
], "TDO"))
908 pbuffer_tmp
= &xxr_para_tmp
->tdo
;
909 xxr_para_tmp
->data_mask
|= XXR_TDO
;
911 else if (!strcmp(argus
[i
], "MASK"))
914 pbuffer_tmp
= &xxr_para_tmp
->mask
;
915 xxr_para_tmp
->data_mask
|= XXR_MASK
;
917 else if (!strcmp(argus
[i
], "SMASK"))
920 pbuffer_tmp
= &xxr_para_tmp
->smask
;
921 xxr_para_tmp
->data_mask
|= XXR_SMASK
;
925 LOG_ERROR("unknow parameter: %s", argus
[i
]);
928 if (ERROR_OK
!= svf_copy_hexstring_to_binary(&argus
[i
+ 1][1], pbuffer_tmp
, i_tmp
, xxr_para_tmp
->len
))
930 LOG_ERROR("fail to parse hex value");
933 LOG_DEBUG("\t%s = 0x%X", argus
[i
], (**(int**)pbuffer_tmp
) & svf_get_mask_u32(xxr_para_tmp
->len
));
935 // If a command changes the length of the last scan of the same type and the MASK parameter is absent,
936 // the mask pattern used is all cares
937 if (!(xxr_para_tmp
->data_mask
& XXR_MASK
) && (i_tmp
!= xxr_para_tmp
->len
))
939 // MASK not defined and length changed
940 if (ERROR_OK
!= svf_adjust_array_length(&xxr_para_tmp
->mask
, i_tmp
, xxr_para_tmp
->len
))
942 LOG_ERROR("fail to adjust length of array");
945 buf_set_ones(xxr_para_tmp
->mask
, xxr_para_tmp
->len
);
947 // If TDO is absent, no comparison is needed, set the mask to 0
948 if (!(xxr_para_tmp
->data_mask
& XXR_TDO
))
950 if (NULL
== xxr_para_tmp
->tdo
)
952 if (ERROR_OK
!= svf_adjust_array_length(&xxr_para_tmp
->tdo
, i_tmp
, xxr_para_tmp
->len
))
954 LOG_ERROR("fail to adjust length of array");
958 if (NULL
== xxr_para_tmp
->mask
)
960 if (ERROR_OK
!= svf_adjust_array_length(&xxr_para_tmp
->mask
, i_tmp
, xxr_para_tmp
->len
))
962 LOG_ERROR("fail to adjust length of array");
966 memset(xxr_para_tmp
->mask
, 0, (xxr_para_tmp
->len
+ 7) >> 3);
968 // do scan if necessary
971 // check buffer size first, reallocate if necessary
972 i
= svf_para
.hdr_para
.len
+ svf_para
.sdr_para
.len
+ svf_para
.tdr_para
.len
;
973 if ((svf_buffer_size
- svf_buffer_index
) < ((i
+ 7) >> 3))
976 // simply print error message
977 LOG_ERROR("buffer is not enough, report to author");
983 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
984 if (NULL
== buffer_tmp
)
986 LOG_ERROR("not enough memory");
989 memcpy(buffer_tmp
, svf_tdi_buffer
, svf_buffer_index
);
990 // svf_tdi_buffer isn't NULL here
991 free(svf_tdi_buffer
);
992 svf_tdi_buffer
= buffer_tmp
;
994 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
995 if (NULL
== buffer_tmp
)
997 LOG_ERROR("not enough memory");
1000 memcpy(buffer_tmp
, svf_tdo_buffer
, svf_buffer_index
);
1001 // svf_tdo_buffer isn't NULL here
1002 free(svf_tdo_buffer
);
1003 svf_tdo_buffer
= buffer_tmp
;
1005 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
1006 if (NULL
== buffer_tmp
)
1008 LOG_ERROR("not enough memory");
1011 memcpy(buffer_tmp
, svf_mask_buffer
, svf_buffer_index
);
1012 // svf_mask_buffer isn't NULL here
1013 free(svf_mask_buffer
);
1014 svf_mask_buffer
= buffer_tmp
;
1017 svf_buffer_size
= svf_buffer_index
+ ((i
+ 7) >> 3);
1023 buf_set_buf(svf_para
.hdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
1024 i
+= svf_para
.hdr_para
.len
;
1025 buf_set_buf(svf_para
.sdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
1026 i
+= svf_para
.sdr_para
.len
;
1027 buf_set_buf(svf_para
.tdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
1028 i
+= svf_para
.tdr_para
.len
;
1031 if (svf_para
.sdr_para
.data_mask
& XXR_TDO
)
1033 // assemble dr mask data
1035 buf_set_buf(svf_para
.hdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
1036 i
+= svf_para
.hdr_para
.len
;
1037 buf_set_buf(svf_para
.sdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
1038 i
+= svf_para
.sdr_para
.len
;
1039 buf_set_buf(svf_para
.tdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
1040 i
+= svf_para
.tdr_para
.len
;
1041 // assemble dr check data
1043 buf_set_buf(svf_para
.hdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
1044 i
+= svf_para
.hdr_para
.len
;
1045 buf_set_buf(svf_para
.sdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
1046 i
+= svf_para
.sdr_para
.len
;
1047 buf_set_buf(svf_para
.tdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
1048 i
+= svf_para
.tdr_para
.len
;
1050 svf_add_check_para(1, svf_buffer_index
, i
);
1054 svf_add_check_para(0, svf_buffer_index
, i
);
1058 field
.out_value
= &svf_tdi_buffer
[svf_buffer_index
];
1059 field
.in_value
= &svf_tdi_buffer
[svf_buffer_index
];
1060 /* NOTE: doesn't use SVF-specified state paths */
1061 jtag_add_plain_dr_scan(1, &field
, svf_para
.dr_end_state
);
1063 svf_buffer_index
+= (i
+ 7) >> 3;
1065 else if (SIR
== command
)
1067 // check buffer size first, reallocate if necessary
1068 i
= svf_para
.hir_para
.len
+ svf_para
.sir_para
.len
+ svf_para
.tir_para
.len
;
1069 if ((svf_buffer_size
- svf_buffer_index
) < ((i
+ 7) >> 3))
1072 // simply print error message
1073 LOG_ERROR("buffer is not enough, report to author");
1076 uint8_t *buffer_tmp
;
1078 // reallocate buffer
1079 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
1080 if (NULL
== buffer_tmp
)
1082 LOG_ERROR("not enough memory");
1085 memcpy(buffer_tmp
, svf_tdi_buffer
, svf_buffer_index
);
1086 // svf_tdi_buffer isn't NULL here
1087 free(svf_tdi_buffer
);
1088 svf_tdi_buffer
= buffer_tmp
;
1090 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
1091 if (NULL
== buffer_tmp
)
1093 LOG_ERROR("not enough memory");
1096 memcpy(buffer_tmp
, svf_tdo_buffer
, svf_buffer_index
);
1097 // svf_tdo_buffer isn't NULL here
1098 free(svf_tdo_buffer
);
1099 svf_tdo_buffer
= buffer_tmp
;
1101 buffer_tmp
= (uint8_t *)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
1102 if (NULL
== buffer_tmp
)
1104 LOG_ERROR("not enough memory");
1107 memcpy(buffer_tmp
, svf_mask_buffer
, svf_buffer_index
);
1108 // svf_mask_buffer isn't NULL here
1109 free(svf_mask_buffer
);
1110 svf_mask_buffer
= buffer_tmp
;
1113 svf_buffer_size
= svf_buffer_index
+ ((i
+ 7) >> 3);
1119 buf_set_buf(svf_para
.hir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
1120 i
+= svf_para
.hir_para
.len
;
1121 buf_set_buf(svf_para
.sir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
1122 i
+= svf_para
.sir_para
.len
;
1123 buf_set_buf(svf_para
.tir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
1124 i
+= svf_para
.tir_para
.len
;
1127 if (svf_para
.sir_para
.data_mask
& XXR_TDO
)
1129 // assemble dr mask data
1131 buf_set_buf(svf_para
.hir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
1132 i
+= svf_para
.hir_para
.len
;
1133 buf_set_buf(svf_para
.sir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
1134 i
+= svf_para
.sir_para
.len
;
1135 buf_set_buf(svf_para
.tir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
1136 i
+= svf_para
.tir_para
.len
;
1137 // assemble dr check data
1139 buf_set_buf(svf_para
.hir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
1140 i
+= svf_para
.hir_para
.len
;
1141 buf_set_buf(svf_para
.sir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
1142 i
+= svf_para
.sir_para
.len
;
1143 buf_set_buf(svf_para
.tir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
1144 i
+= svf_para
.tir_para
.len
;
1146 svf_add_check_para(1, svf_buffer_index
, i
);
1150 svf_add_check_para(0, svf_buffer_index
, i
);
1154 field
.out_value
= &svf_tdi_buffer
[svf_buffer_index
];
1155 field
.in_value
= &svf_tdi_buffer
[svf_buffer_index
];
1156 /* NOTE: doesn't use SVF-specified state paths */
1157 jtag_add_plain_ir_scan(1, &field
, svf_para
.ir_end_state
);
1159 svf_buffer_index
+= (i
+ 7) >> 3;
1164 LOG_ERROR("PIO and PIOMAP are not supported");
1168 // RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
1169 // RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state]
1170 if ((num_of_argu
< 3) && (num_of_argu
> 11))
1172 LOG_ERROR("invalid parameter of %s", argus
[0]);
1182 i_tmp
= tap_state_by_name(argus
[i
]);
1183 if (i_tmp
!= TAP_INVALID
)
1185 if (svf_tap_state_is_stable(i_tmp
))
1187 svf_para
.runtest_run_state
= i_tmp
;
1189 /* When a run_state is specified, the new
1190 * run_state becomes the default end_state.
1192 svf_para
.runtest_end_state
= i_tmp
;
1193 LOG_DEBUG("\trun_state = %s",
1194 tap_state_name(i_tmp
));
1199 LOG_ERROR("%s: %s is not a stable state",
1200 argus
[0], tap_state_name(i_tmp
));
1205 // run_count run_clk
1206 if (((i
+ 2) <= num_of_argu
) && strcmp(argus
[i
+ 1], "SEC"))
1208 if (!strcmp(argus
[i
+ 1], "TCK"))
1210 // clock source is TCK
1211 run_count
= atoi(argus
[i
]);
1212 LOG_DEBUG("\trun_count@TCK = %d", run_count
);
1216 LOG_ERROR("%s not supported for clock", argus
[i
+ 1]);
1222 if (((i
+ 2) <= num_of_argu
) && !strcmp(argus
[i
+ 1], "SEC"))
1224 min_time
= atof(argus
[i
]);
1225 LOG_DEBUG("\tmin_time = %fs", min_time
);
1228 // MAXIMUM max_time SEC
1229 if (((i
+ 3) <= num_of_argu
) && !strcmp(argus
[i
], "MAXIMUM") && !strcmp(argus
[i
+ 2], "SEC"))
1231 max_time
= atof(argus
[i
+ 1]);
1232 LOG_DEBUG("\tmax_time = %fs", max_time
);
1235 // ENDSTATE end_state
1236 if (((i
+ 2) <= num_of_argu
) && !strcmp(argus
[i
], "ENDSTATE"))
1238 i_tmp
= tap_state_by_name(argus
[i
+ 1]);
1240 if (svf_tap_state_is_stable(i_tmp
))
1242 svf_para
.runtest_end_state
= i_tmp
;
1243 LOG_DEBUG("\tend_state = %s",
1244 tap_state_name(i_tmp
));
1248 LOG_ERROR("%s: %s is not a stable state",
1249 argus
[0], tap_state_name(i_tmp
));
1254 // calculate run_count
1255 if ((0 == run_count
) && (min_time
> 0))
1257 run_count
= min_time
* svf_para
.frequency
;
1259 // all parameter should be parsed
1260 if (i
== num_of_argu
)
1264 // run_state and end_state is checked to be stable state
1267 /* FIXME handle statemove failures */
1270 // enter into run_state if necessary
1271 if (cmd_queue_cur_state
!= svf_para
.runtest_run_state
)
1273 retval
= svf_add_statemove(svf_para
.runtest_run_state
);
1276 // call jtag_add_clocks
1277 jtag_add_clocks(run_count
);
1279 // move to end_state if necessary
1280 if (svf_para
.runtest_end_state
!= svf_para
.runtest_run_state
)
1282 retval
= svf_add_statemove(svf_para
.runtest_end_state
);
1285 if (svf_para
.runtest_run_state
!= TAP_IDLE
)
1287 LOG_ERROR("cannot runtest in %s state",
1288 tap_state_name(svf_para
.runtest_run_state
));
1292 jtag_add_runtest(run_count
, svf_para
.runtest_end_state
);
1298 LOG_ERROR("fail to parse parameter of RUNTEST, %d out of %d is parsed", i
, num_of_argu
);
1303 // STATE [pathstate1 [pathstate2 ...[pathstaten]]] stable_state
1304 if (num_of_argu
< 2)
1306 LOG_ERROR("invalid parameter of %s", argus
[0]);
1309 if (num_of_argu
> 2)
1311 // STATE pathstate1 ... stable_state
1312 path
= (tap_state_t
*)malloc((num_of_argu
- 1) * sizeof(tap_state_t
));
1315 LOG_ERROR("not enough memory");
1318 num_of_argu
--; // num of path
1319 i_tmp
= 1; /* path is from parameter 1 */
1320 for (i
= 0; i
< num_of_argu
; i
++, i_tmp
++)
1322 path
[i
] = tap_state_by_name(argus
[i_tmp
]);
1323 if (path
[i
] == TAP_INVALID
)
1325 LOG_ERROR("%s: %s is not a valid state",
1326 argus
[0], argus
[i_tmp
]);
1330 /* OpenOCD refuses paths containing TAP_RESET */
1331 if (TAP_RESET
== path
[i
])
1333 /* FIXME last state MUST be stable! */
1336 jtag_add_pathmove(i
, path
);
1339 num_of_argu
-= i
+ 1;
1343 if (num_of_argu
> 0)
1345 // execute last path if necessary
1346 if (svf_tap_state_is_stable(path
[num_of_argu
- 1]))
1348 // last state MUST be stable state
1349 jtag_add_pathmove(num_of_argu
, path
);
1350 LOG_DEBUG("\tmove to %s by path_move",
1351 tap_state_name(path
[num_of_argu
- 1]));
1355 LOG_ERROR("%s: %s is not a stable state",
1357 tap_state_name(path
[num_of_argu
- 1]));
1362 // no need to keep this memory, in jtag_add_pathmove, path will be duplicated
1371 // STATE stable_state
1372 state
= tap_state_by_name(argus
[1]);
1373 if (svf_tap_state_is_stable(state
))
1375 LOG_DEBUG("\tmove to %s by svf_add_statemove",
1376 tap_state_name(state
));
1377 /* FIXME handle statemove failures */
1378 svf_add_statemove(state
);
1382 LOG_ERROR("%s: %s is not a stable state",
1383 argus
[0], tap_state_name(state
));
1390 if (num_of_argu
!= 2)
1392 LOG_ERROR("invalid parameter of %s", argus
[0]);
1395 if (svf_para
.trst_mode
!= TRST_ABSENT
)
1397 if (ERROR_OK
!= svf_execute_tap())
1401 i_tmp
= svf_find_string_in_array(argus
[1],
1402 (char **)svf_trst_mode_name
,
1403 DIM(svf_trst_mode_name
));
1407 jtag_add_reset(1, 0);
1411 jtag_add_reset(0, 0);
1416 LOG_ERROR("unknown TRST mode: %s", argus
[1]);
1419 svf_para
.trst_mode
= i_tmp
;
1420 LOG_DEBUG("\ttrst_mode = %s", svf_trst_mode_name
[svf_para
.trst_mode
]);
1424 LOG_ERROR("can not accpet TRST command if trst_mode is ABSENT");
1429 LOG_ERROR("invalid svf command: %s", argus
[0]);
1434 if (debug_level
>= LOG_LVL_DEBUG
)
1436 // for convenient debugging, execute tap if possible
1437 if ((svf_buffer_index
> 0) && \
1438 (((command
!= STATE
) && (command
!= RUNTEST
)) || \
1439 ((command
== STATE
) && (num_of_argu
== 2))))
1441 if (ERROR_OK
!= svf_execute_tap())
1446 // output debug info
1447 if ((SIR
== command
) || (SDR
== command
))
1450 memcpy(&read_value
, svf_tdi_buffer
, sizeof(int));
1451 // in debug mode, data is from index 0
1452 int read_mask
= svf_get_mask_u32(svf_check_tdo_para
[0].bit_len
);
1453 LOG_DEBUG("\tTDO read = 0x%X", read_value
& read_mask
);
1459 // for fast executing, execute tap if necessary
1460 // half of the buffer is for the next command
1461 if (((svf_buffer_index
>= SVF_MAX_BUFFER_SIZE_TO_COMMIT
) || (svf_check_tdo_para_index
>= SVF_CHECK_TDO_PARA_SIZE
/ 2)) && \
1462 (((command
!= STATE
) && (command
!= RUNTEST
)) || \
1463 ((command
== STATE
) && (num_of_argu
== 2))))
1465 return svf_execute_tap();
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)