Finish transforming 'u32' to 'uint32_t'.
[openocd.git] / src / svf / svf.c
blobd414ce31646818a4255ce669cda2c0bbcfa13109
1 /***************************************************************************
2 * Copyright (C) 2009 by Simon Qian *
3 * SimonQian@SimonQian.com *
4 * *
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. *
9 * *
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. *
14 * *
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 ***************************************************************************/
22 /* The specification for SVF is available here:
23 * http://www.asset-intertech.com/support/svf.pdf
24 * Below, this document is refered to as the "SVF spec".
26 * The specification for XSVF is available here:
27 * http://www.xilinx.com/support/documentation/application_notes/xapp503.pdf
28 * Below, this document is refered to as the "XSVF spec".
31 #ifdef HAVE_CONFIG_H
32 #include "config.h"
33 #endif
35 #include "svf.h"
36 #include "jtag.h"
37 #include "time_support.h"
40 // SVF command
41 typedef enum
43 ENDDR,
44 ENDIR,
45 FREQUENCY,
46 HDR,
47 HIR,
48 PIO,
49 PIOMAP,
50 RUNTEST,
51 SDR,
52 SIR,
53 STATE,
54 TDR,
55 TIR,
56 TRST,
57 }svf_command_t;
59 const char *svf_command_name[14] =
61 "ENDDR",
62 "ENDIR",
63 "FREQUENCY",
64 "HDR",
65 "HIR",
66 "PIO",
67 "PIOMAP",
68 "RUNTEST",
69 "SDR",
70 "SIR",
71 "STATE",
72 "TDR",
73 "TIR",
74 "TRST"
77 typedef enum
79 TRST_ON,
80 TRST_OFF,
81 TRST_Z,
82 TRST_ABSENT
83 }trst_mode_t;
85 const char *svf_trst_mode_name[4] =
87 "ON",
88 "OFF",
89 "Z",
90 "ABSENT"
93 typedef struct
95 tap_state_t from;
96 tap_state_t to;
97 uint32_t num_of_moves;
98 tap_state_t paths[8];
99 }svf_statemove_t;
101 svf_statemove_t svf_statemoves[] =
103 // from to num_of_moves, paths[8]
104 // {TAP_RESET, TAP_RESET, 1, {TAP_RESET}},
105 {TAP_RESET, TAP_IDLE, 2, {TAP_RESET, TAP_IDLE}},
106 {TAP_RESET, TAP_DRPAUSE, 6, {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
107 {TAP_RESET, TAP_IRPAUSE, 7, {TAP_RESET, TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
109 // {TAP_IDLE, TAP_RESET, 4, {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
110 {TAP_IDLE, TAP_IDLE, 1, {TAP_IDLE}},
111 {TAP_IDLE, TAP_DRPAUSE, 5, {TAP_IDLE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
112 {TAP_IDLE, TAP_IRPAUSE, 6, {TAP_IDLE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
114 // {TAP_DRPAUSE, TAP_RESET, 6, {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
115 {TAP_DRPAUSE, TAP_IDLE, 4, {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_IDLE}},
116 {TAP_DRPAUSE, TAP_DRPAUSE, 7, {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
117 {TAP_DRPAUSE, TAP_IRPAUSE, 8, {TAP_DRPAUSE, TAP_DREXIT2, TAP_DRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}},
119 // {TAP_IRPAUSE, TAP_RESET, 6, {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_RESET}},
120 {TAP_IRPAUSE, TAP_IDLE, 4, {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_IDLE}},
121 {TAP_IRPAUSE, TAP_DRPAUSE, 7, {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_DRCAPTURE, TAP_DREXIT1, TAP_DRPAUSE}},
122 {TAP_IRPAUSE, TAP_IRPAUSE, 8, {TAP_IRPAUSE, TAP_IREXIT2, TAP_IRUPDATE, TAP_DRSELECT, TAP_IRSELECT, TAP_IRCAPTURE, TAP_IREXIT1, TAP_IRPAUSE}}
125 char *svf_tap_state_name[TAP_NUM_STATES];
127 #define XXR_TDI (1 << 0)
128 #define XXR_TDO (1 << 1)
129 #define XXR_MASK (1 << 2)
130 #define XXR_SMASK (1 << 3)
131 typedef struct
133 int len;
134 int data_mask;
135 uint8_t *tdi;
136 uint8_t *tdo;
137 uint8_t *mask;
138 uint8_t *smask;
139 }svf_xxr_para_t;
141 typedef struct
143 float frequency;
144 tap_state_t ir_end_state;
145 tap_state_t dr_end_state;
146 tap_state_t runtest_run_state;
147 tap_state_t runtest_end_state;
148 trst_mode_t trst_mode;
150 svf_xxr_para_t hir_para;
151 svf_xxr_para_t hdr_para;
152 svf_xxr_para_t tir_para;
153 svf_xxr_para_t tdr_para;
154 svf_xxr_para_t sir_para;
155 svf_xxr_para_t sdr_para;
156 }svf_para_t;
158 svf_para_t svf_para;
159 const svf_para_t svf_para_init =
161 // frequency, ir_end_state, dr_end_state, runtest_run_state, runtest_end_state, trst_mode
162 0, TAP_IDLE, TAP_IDLE, TAP_IDLE, TAP_IDLE, TRST_Z,
163 // hir_para
164 // {len, data_mask, tdi, tdo, mask, smask},
165 {0, 0, NULL, NULL, NULL, NULL},
166 // hdr_para
167 // {len, data_mask, tdi, tdo, mask, smask},
168 {0, 0, NULL, NULL, NULL, NULL},
169 // tir_para
170 // {len, data_mask, tdi, tdo, mask, smask},
171 {0, 0, NULL, NULL, NULL, NULL},
172 // tdr_para
173 // {len, data_mask, tdi, tdo, mask, smask},
174 {0, 0, NULL, NULL, NULL, NULL},
175 // sir_para
176 // {len, data_mask, tdi, tdo, mask, smask},
177 {0, 0, NULL, NULL, NULL, NULL},
178 // sdr_para
179 // {len, data_mask, tdi, tdo, mask, smask},
180 {0, 0, NULL, NULL, NULL, NULL},
183 typedef struct
185 int line_num; // used to record line number of the check operation
186 // so more information could be printed
187 int enabled; // check is enabled or not
188 int buffer_offset; // buffer_offset to buffers
189 int bit_len; // bit length to check
190 }svf_check_tdo_para_t;
192 #define SVF_CHECK_TDO_PARA_SIZE 1024
193 static svf_check_tdo_para_t *svf_check_tdo_para = NULL;
194 static int svf_check_tdo_para_index = 0;
196 #define dimof(a) (sizeof(a) / sizeof((a)[0]))
198 static int svf_read_command_from_file(int fd);
199 static int svf_check_tdo(void);
200 static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len);
201 static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str);
202 static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
204 static int svf_fd = 0;
205 static char *svf_command_buffer = NULL;
206 static int svf_command_buffer_size = 0;
207 static int svf_line_number = 1;
209 static jtag_tap_t *tap = NULL;
211 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT (4 * 1024)
212 static uint8_t *svf_tdi_buffer = NULL, *svf_tdo_buffer = NULL, *svf_mask_buffer = NULL;
213 static int svf_buffer_index = 0, svf_buffer_size = 0;
214 static int svf_quiet = 0;
217 int svf_register_commands(struct command_context_s *cmd_ctx)
219 register_command(cmd_ctx, NULL, "svf", handle_svf_command,
220 COMMAND_EXEC, "run svf <file>");
222 return ERROR_OK;
225 void svf_free_xxd_para(svf_xxr_para_t *para)
227 if (NULL != para)
229 if (para->tdi != NULL)
231 free(para->tdi);
232 para->tdi = NULL;
234 if (para->tdo != NULL)
236 free(para->tdo);
237 para->tdo = NULL;
239 if (para->mask != NULL)
241 free(para->mask);
242 para->mask = NULL;
244 if (para->smask != NULL)
246 free(para->smask);
247 para->smask = NULL;
252 unsigned svf_get_mask_u32(int bitlen)
254 uint32_t bitmask;
256 if (bitlen < 0)
258 bitmask = 0;
260 else if (bitlen >= 32)
262 bitmask = 0xFFFFFFFF;
264 else
266 bitmask = (1 << bitlen) - 1;
269 return bitmask;
272 static const char* tap_state_svf_name(tap_state_t state)
274 const char* ret;
276 switch( state )
278 case TAP_RESET: ret = "RESET"; break;
279 case TAP_IDLE: ret = "IDLE"; break;
280 case TAP_DRSELECT: ret = "DRSELECT"; break;
281 case TAP_DRCAPTURE: ret = "DRCAPTURE"; break;
282 case TAP_DRSHIFT: ret = "DRSHIFT"; break;
283 case TAP_DREXIT1: ret = "DREXIT1"; break;
284 case TAP_DRPAUSE: ret = "DRPAUSE"; break;
285 case TAP_DREXIT2: ret = "DREXIT2"; break;
286 case TAP_DRUPDATE: ret = "DRUPDATE"; break;
287 case TAP_IRSELECT: ret = "IRSELECT"; break;
288 case TAP_IRCAPTURE: ret = "IRCAPTURE"; break;
289 case TAP_IRSHIFT: ret = "IRSHIFT"; break;
290 case TAP_IREXIT1: ret = "IREXIT1"; break;
291 case TAP_IRPAUSE: ret = "IRPAUSE"; break;
292 case TAP_IREXIT2: ret = "IREXIT2"; break;
293 case TAP_IRUPDATE: ret = "IRUPDATE"; break;
294 default: ret = "???"; break;
297 return ret;
300 static int svf_add_statemove(tap_state_t state_to)
302 tap_state_t state_from = cmd_queue_cur_state;
303 uint8_t index;
305 for (index = 0; index < dimof(svf_statemoves); index++)
307 if ((svf_statemoves[index].from == state_from)
308 && (svf_statemoves[index].to == state_to))
310 if (TAP_RESET == state_from)
312 jtag_add_tlr();
313 if (svf_statemoves[index].num_of_moves > 1)
315 jtag_add_pathmove(svf_statemoves[index].num_of_moves - 1, svf_statemoves[index].paths + 1);
318 else
320 if (svf_statemoves[index].num_of_moves > 0)
322 jtag_add_pathmove(svf_statemoves[index].num_of_moves, svf_statemoves[index].paths);
325 return ERROR_OK;
328 LOG_ERROR("can not move to %s", tap_state_svf_name(state_to));
329 return ERROR_FAIL;
332 static int handle_svf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
334 #define SVF_NUM_OF_OPTIONS 1
335 int command_num = 0, i;
336 int ret = ERROR_OK;
337 long long time_ago;
339 if ((argc < 1) || (argc > (1 + SVF_NUM_OF_OPTIONS)))
341 command_print(cmd_ctx, "usage: svf <file> [quiet]");
342 return ERROR_FAIL;
345 // parse variant
346 svf_quiet = 0;
347 for (i = 1; i < argc; i++)
349 if (!strcmp(args[i], "quiet"))
351 svf_quiet = 1;
353 else
355 LOG_ERROR("unknown variant for svf: %s", args[i]);
357 // no need to free anything now
358 return ERROR_FAIL;
362 if ((svf_fd = open(args[0], O_RDONLY)) < 0)
364 command_print(cmd_ctx, "file \"%s\" not found", args[0]);
366 // no need to free anything now
367 return ERROR_FAIL;
370 LOG_USER("svf processing file: \"%s\"", args[0]);
372 // get time
373 time_ago = timeval_ms();
375 // init
376 svf_line_number = 1;
377 svf_command_buffer_size = 0;
379 svf_check_tdo_para_index = 0;
380 svf_check_tdo_para = malloc(sizeof(svf_check_tdo_para_t) * SVF_CHECK_TDO_PARA_SIZE);
381 if (NULL == svf_check_tdo_para)
383 LOG_ERROR("not enough memory");
384 ret = ERROR_FAIL;
385 goto free_all;
388 svf_buffer_index = 0;
389 // double the buffer size
390 // in case current command cannot be commited, and next command is a bit scan command
391 // here is 32K bits for this big scan command, it should be enough
392 // buffer will be reallocated if buffer size is not enough
393 svf_tdi_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
394 if (NULL == svf_tdi_buffer)
396 LOG_ERROR("not enough memory");
397 ret = ERROR_FAIL;
398 goto free_all;
400 svf_tdo_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
401 if (NULL == svf_tdo_buffer)
403 LOG_ERROR("not enough memory");
404 ret = ERROR_FAIL;
405 goto free_all;
407 svf_mask_buffer = (uint8_t *)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT);
408 if (NULL == svf_mask_buffer)
410 LOG_ERROR("not enough memory");
411 ret = ERROR_FAIL;
412 goto free_all;
414 svf_buffer_size = 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT;
416 memcpy(&svf_para, &svf_para_init, sizeof(svf_para));
417 for (i = 0; i < (int)dimof(svf_tap_state_name); i++)
419 svf_tap_state_name[i] = (char *)tap_state_svf_name(i);
422 // TAP_RESET
423 jtag_add_tlr();
425 while ( ERROR_OK == svf_read_command_from_file(svf_fd) )
427 if (ERROR_OK != svf_run_command(cmd_ctx, svf_command_buffer))
429 LOG_ERROR("fail to run command at line %d", svf_line_number);
430 ret = ERROR_FAIL;
431 break;
433 command_num++;
435 if (ERROR_OK != jtag_execute_queue())
437 ret = ERROR_FAIL;
439 else if (ERROR_OK != svf_check_tdo())
441 ret = ERROR_FAIL;
444 // print time
445 command_print(cmd_ctx, "%lld ms used", timeval_ms() - time_ago);
447 free_all:
449 close(svf_fd);
450 svf_fd = 0;
452 // free buffers
453 if (svf_command_buffer)
455 free(svf_command_buffer);
456 svf_command_buffer = NULL;
457 svf_command_buffer_size = 0;
459 if (svf_check_tdo_para)
461 free(svf_check_tdo_para);
462 svf_check_tdo_para = NULL;
463 svf_check_tdo_para_index = 0;
465 if (svf_tdi_buffer)
467 free(svf_tdi_buffer);
468 svf_tdi_buffer = NULL;
470 if (svf_tdo_buffer)
472 free(svf_tdo_buffer);
473 svf_tdo_buffer = NULL;
475 if (svf_mask_buffer)
477 free(svf_mask_buffer);
478 svf_mask_buffer = NULL;
480 svf_buffer_index = 0;
481 svf_buffer_size = 0;
483 svf_free_xxd_para(&svf_para.hdr_para);
484 svf_free_xxd_para(&svf_para.hir_para);
485 svf_free_xxd_para(&svf_para.tdr_para);
486 svf_free_xxd_para(&svf_para.tir_para);
487 svf_free_xxd_para(&svf_para.sdr_para);
488 svf_free_xxd_para(&svf_para.sir_para);
490 if (ERROR_OK == ret)
492 command_print(cmd_ctx, "svf file programmed successfully for %d commands", command_num);
494 else
496 command_print(cmd_ctx, "svf file programmed failed");
499 return ret;
502 #define SVFP_CMD_INC_CNT 1024
503 static int svf_read_command_from_file(int fd)
505 char ch, *tmp_buffer = NULL;
506 int cmd_pos = 0, cmd_ok = 0, slash = 0, comment = 0;
508 while (!cmd_ok && (read(fd, &ch, 1) > 0) )
510 switch(ch)
512 case '!':
513 slash = 0;
514 comment = 1;
515 break;
516 case '/':
517 if (++slash == 2)
519 comment = 1;
521 break;
522 case ';':
523 slash = 0;
524 if (!comment)
526 cmd_ok = 1;
528 break;
529 case '\n':
530 svf_line_number++;
531 case '\r':
532 slash = 0;
533 comment = 0;
534 break;
535 default:
536 if (!comment)
538 if (cmd_pos >= svf_command_buffer_size - 1)
540 tmp_buffer = (char*)malloc(svf_command_buffer_size + SVFP_CMD_INC_CNT); // 1 more byte for '\0'
541 if (NULL == tmp_buffer)
543 LOG_ERROR("not enough memory");
544 return ERROR_FAIL;
546 if (svf_command_buffer_size > 0)
548 memcpy(tmp_buffer, svf_command_buffer, svf_command_buffer_size);
550 if (svf_command_buffer != NULL)
552 free(svf_command_buffer);
554 svf_command_buffer = tmp_buffer;
555 svf_command_buffer_size += SVFP_CMD_INC_CNT;
556 tmp_buffer = NULL;
558 svf_command_buffer[cmd_pos++] = (char)toupper(ch);
560 break;
564 if (cmd_ok)
566 svf_command_buffer[cmd_pos] = '\0';
567 return ERROR_OK;
569 else
571 return ERROR_FAIL;
575 static int svf_parse_cmd_string(char *str, int len, char **argus, int *num_of_argu)
577 int pos = 0, num = 0, space_found = 1;
579 while (pos < len)
581 switch(str[pos])
583 case '\n':
584 case '\r':
585 case '!':
586 case '/':
587 LOG_ERROR("fail to parse svf command");
588 return ERROR_FAIL;
589 break;
590 case ' ':
591 space_found = 1;
592 str[pos] = '\0';
593 break;
594 default:
595 if (space_found)
597 argus[num++] = &str[pos];
598 space_found = 0;
600 break;
602 pos++;
605 *num_of_argu = num;
607 return ERROR_OK;
610 static int svf_tap_state_is_stable(tap_state_t state)
612 return ((TAP_RESET == state) || (TAP_IDLE == state) || (TAP_DRPAUSE == state) || (TAP_IRPAUSE == state));
615 static int svf_tap_state_is_valid(tap_state_t state)
617 return state >= 0 && state < TAP_NUM_STATES;
620 static int svf_find_string_in_array(char *str, char **strs, int num_of_element)
622 int i;
624 for (i = 0; i < num_of_element; i++)
626 if (!strcmp(str, strs[i]))
628 return i;
631 return 0xFF;
634 static int svf_adjust_array_length(uint8_t **arr, int orig_bit_len, int new_bit_len)
636 int new_byte_len = (new_bit_len + 7) >> 3;
638 if ((NULL == *arr) || (((orig_bit_len + 7) >> 3) < ((new_bit_len + 7) >> 3)))
640 if (*arr != NULL)
642 free(*arr);
643 *arr = NULL;
645 *arr = (uint8_t*)malloc(new_byte_len);
646 if (NULL == *arr)
648 LOG_ERROR("not enough memory");
649 return ERROR_FAIL;
651 memset(*arr, 0, new_byte_len);
653 return ERROR_OK;
656 static int svf_copy_hexstring_to_binary(char *str, uint8_t **bin, int orig_bit_len, int bit_len)
658 int i, str_len = strlen(str), str_byte_len = (bit_len + 3) >> 2, loop_cnt;
659 uint8_t ch, need_write = 1;
661 if (ERROR_OK != svf_adjust_array_length(bin, orig_bit_len, bit_len))
663 LOG_ERROR("fail to adjust length of array");
664 return ERROR_FAIL;
667 if (str_byte_len > str_len)
669 loop_cnt = str_byte_len;
671 else
673 loop_cnt = str_len;
676 for (i = 0; i < loop_cnt; i++)
678 if (i < str_len)
680 ch = str[str_len - i - 1];
681 if ((ch >= '0') && (ch <= '9'))
683 ch = ch - '0';
685 else if ((ch >= 'A') && (ch <= 'F'))
687 ch = ch - 'A' + 10;
689 else
691 LOG_ERROR("invalid hex string");
692 return ERROR_FAIL;
695 else
697 ch = 0;
700 // check valid
701 if (i >= str_byte_len)
703 // all data written, other data should be all '0's and needn't to be written
704 need_write = 0;
705 if (ch != 0)
707 LOG_ERROR("value execede length");
708 return ERROR_FAIL;
711 else if (i == (str_byte_len - 1))
713 // last data byte, written if valid
714 if ((ch & ~((1 << (bit_len - 4 * i)) - 1)) != 0)
716 LOG_ERROR("value execede length");
717 return ERROR_FAIL;
721 if (need_write)
723 // write bin
724 if (i % 2)
726 // MSB
727 (*bin)[i / 2] |= ch << 4;
729 else
731 // LSB
732 (*bin)[i / 2] = 0;
733 (*bin)[i / 2] |= ch;
738 return ERROR_OK;
741 static int svf_check_tdo(void)
743 int i, len, index;
745 for (i = 0; i < svf_check_tdo_para_index; i++)
747 index = svf_check_tdo_para[i].buffer_offset;
748 len = svf_check_tdo_para[i].bit_len;
749 if ((svf_check_tdo_para[i].enabled)
750 && buf_cmp_mask(&svf_tdi_buffer[index], &svf_tdo_buffer[index], &svf_mask_buffer[index], len))
752 unsigned bitmask;
753 unsigned received, expected, tapmask;
754 bitmask = svf_get_mask_u32(svf_check_tdo_para[i].bit_len);
756 memcpy(&received, svf_tdi_buffer + index, sizeof(unsigned));
757 memcpy(&expected, svf_tdo_buffer + index, sizeof(unsigned));
758 memcpy(&tapmask, svf_mask_buffer + index, sizeof(unsigned));
759 LOG_ERROR("tdo check error at line %d",
760 svf_check_tdo_para[i].line_num);
761 LOG_ERROR("read = 0x%X, want = 0x%X, mask = 0x%X",
762 received & bitmask,
763 expected & bitmask,
764 tapmask & bitmask);
765 return ERROR_FAIL;
768 svf_check_tdo_para_index = 0;
770 return ERROR_OK;
773 static int svf_add_check_para(uint8_t enabled, int buffer_offset, int bit_len)
775 if (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE)
777 LOG_ERROR("toooooo many operation undone");
778 return ERROR_FAIL;
781 svf_check_tdo_para[svf_check_tdo_para_index].line_num = svf_line_number;
782 svf_check_tdo_para[svf_check_tdo_para_index].bit_len = bit_len;
783 svf_check_tdo_para[svf_check_tdo_para_index].enabled = enabled;
784 svf_check_tdo_para[svf_check_tdo_para_index].buffer_offset = buffer_offset;
785 svf_check_tdo_para_index++;
787 return ERROR_OK;
790 static int svf_execute_tap(void)
792 if (ERROR_OK != jtag_execute_queue())
794 return ERROR_FAIL;
796 else if (ERROR_OK != svf_check_tdo())
798 return ERROR_FAIL;
801 svf_buffer_index = 0;
803 return ERROR_OK;
806 static int svf_run_command(struct command_context_s *cmd_ctx, char *cmd_str)
808 char *argus[256], command;
809 int num_of_argu = 0, i;
811 // tmp variable
812 int i_tmp;
814 // for RUNTEST
815 int run_count;
816 float min_time, max_time;
817 // for XXR
818 svf_xxr_para_t *xxr_para_tmp;
819 uint8_t **pbuffer_tmp;
820 scan_field_t field;
821 // for STATE
822 tap_state_t *path = NULL, state;
824 if (!svf_quiet)
826 LOG_USER("%s", svf_command_buffer);
829 if (ERROR_OK != svf_parse_cmd_string(cmd_str, strlen(cmd_str), argus, &num_of_argu))
831 return ERROR_FAIL;
834 command = svf_find_string_in_array(argus[0], (char **)svf_command_name, dimof(svf_command_name));
835 switch(command)
837 case ENDDR:
838 case ENDIR:
839 if (num_of_argu != 2)
841 LOG_ERROR("invalid parameter of %s", argus[0]);
842 return ERROR_FAIL;
844 i_tmp = svf_find_string_in_array(argus[1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
845 if (svf_tap_state_is_stable(i_tmp))
847 if (command == ENDIR)
849 svf_para.ir_end_state = i_tmp;
850 LOG_DEBUG("\tir_end_state = %s", svf_tap_state_name[svf_para.ir_end_state]);
852 else
854 svf_para.dr_end_state = i_tmp;
855 LOG_DEBUG("\tdr_end_state = %s", svf_tap_state_name[svf_para.dr_end_state]);
858 else
860 LOG_ERROR("%s is not valid state", argus[1]);
861 return ERROR_FAIL;
863 break;
864 case FREQUENCY:
865 if ((num_of_argu != 1) && (num_of_argu != 3))
867 LOG_ERROR("invalid parameter of %s", argus[0]);
868 return ERROR_FAIL;
870 if (1 == num_of_argu)
872 // TODO: set jtag speed to full speed
873 svf_para.frequency = 0;
875 else
877 if (strcmp(argus[2], "HZ"))
879 LOG_ERROR("HZ not found in FREQUENCY command");
880 return ERROR_FAIL;
882 if (ERROR_OK != svf_execute_tap())
884 return ERROR_FAIL;
886 svf_para.frequency = atof(argus[1]);
887 // TODO: set jtag speed to
888 if (svf_para.frequency > 0)
890 command_run_linef(cmd_ctx, "jtag_khz %d", (int)svf_para.frequency / 1000);
891 LOG_DEBUG("\tfrequency = %f", svf_para.frequency);
894 break;
895 case HDR:
896 xxr_para_tmp = &svf_para.hdr_para;
897 goto XXR_common;
898 case HIR:
899 xxr_para_tmp = &svf_para.hir_para;
900 goto XXR_common;
901 case TDR:
902 xxr_para_tmp = &svf_para.tdr_para;
903 goto XXR_common;
904 case TIR:
905 xxr_para_tmp = &svf_para.tir_para;
906 goto XXR_common;
907 case SDR:
908 xxr_para_tmp = &svf_para.sdr_para;
909 goto XXR_common;
910 case SIR:
911 xxr_para_tmp = &svf_para.sir_para;
912 goto XXR_common;
913 XXR_common:
914 // XXR length [TDI (tdi)] [TDO (tdo)][MASK (mask)] [SMASK (smask)]
915 if ((num_of_argu > 10) || (num_of_argu % 2))
917 LOG_ERROR("invalid parameter of %s", argus[0]);
918 return ERROR_FAIL;
920 i_tmp = xxr_para_tmp->len;
921 xxr_para_tmp->len = atoi(argus[1]);
922 LOG_DEBUG("\tlength = %d", xxr_para_tmp->len);
923 xxr_para_tmp->data_mask = 0;
924 for (i = 2; i < num_of_argu; i += 2)
926 if ((strlen(argus[i + 1]) < 3) || (argus[i + 1][0] != '(') || (argus[i + 1][strlen(argus[i + 1]) - 1] != ')'))
928 LOG_ERROR("data section error");
929 return ERROR_FAIL;
931 argus[i + 1][strlen(argus[i + 1]) - 1] = '\0';
932 // TDI, TDO, MASK, SMASK
933 if (!strcmp(argus[i], "TDI"))
935 // TDI
936 pbuffer_tmp = &xxr_para_tmp->tdi;
937 xxr_para_tmp->data_mask |= XXR_TDI;
939 else if (!strcmp(argus[i], "TDO"))
941 // TDO
942 pbuffer_tmp = &xxr_para_tmp->tdo;
943 xxr_para_tmp->data_mask |= XXR_TDO;
945 else if (!strcmp(argus[i], "MASK"))
947 // MASK
948 pbuffer_tmp = &xxr_para_tmp->mask;
949 xxr_para_tmp->data_mask |= XXR_MASK;
951 else if (!strcmp(argus[i], "SMASK"))
953 // SMASK
954 pbuffer_tmp = &xxr_para_tmp->smask;
955 xxr_para_tmp->data_mask |= XXR_SMASK;
957 else
959 LOG_ERROR("unknow parameter: %s", argus[i]);
960 return ERROR_FAIL;
962 if (ERROR_OK != svf_copy_hexstring_to_binary(&argus[i + 1][1], pbuffer_tmp, i_tmp, xxr_para_tmp->len))
964 LOG_ERROR("fail to parse hex value");
965 return ERROR_FAIL;
967 LOG_DEBUG("\t%s = 0x%X", argus[i], (**(int**)pbuffer_tmp) & svf_get_mask_u32(xxr_para_tmp->len));
969 // If a command changes the length of the last scan of the same type and the MASK parameter is absent,
970 // the mask pattern used is all cares
971 if (!(xxr_para_tmp->data_mask & XXR_MASK) && (i_tmp != xxr_para_tmp->len))
973 // MASK not defined and length changed
974 if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, i_tmp, xxr_para_tmp->len))
976 LOG_ERROR("fail to adjust length of array");
977 return ERROR_FAIL;
979 buf_set_ones(xxr_para_tmp->mask, xxr_para_tmp->len);
981 // If TDO is absent, no comparison is needed, set the mask to 0
982 if (!(xxr_para_tmp->data_mask & XXR_TDO))
984 if (NULL == xxr_para_tmp->tdo)
986 if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->tdo, i_tmp, xxr_para_tmp->len))
988 LOG_ERROR("fail to adjust length of array");
989 return ERROR_FAIL;
992 if (NULL == xxr_para_tmp->mask)
994 if (ERROR_OK != svf_adjust_array_length(&xxr_para_tmp->mask, i_tmp, xxr_para_tmp->len))
996 LOG_ERROR("fail to adjust length of array");
997 return ERROR_FAIL;
1000 memset(xxr_para_tmp->mask, 0, (xxr_para_tmp->len + 7) >> 3);
1002 // do scan if necessary
1003 if (SDR == command)
1005 // check buffer size first, reallocate if necessary
1006 i = svf_para.hdr_para.len + svf_para.sdr_para.len + svf_para.tdr_para.len;
1007 if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
1009 #if 1
1010 // simply print error message
1011 LOG_ERROR("buffer is not enough, report to author");
1012 return ERROR_FAIL;
1013 #else
1014 uint8_t *buffer_tmp;
1016 // reallocate buffer
1017 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1018 if (NULL == buffer_tmp)
1020 LOG_ERROR("not enough memory");
1021 return ERROR_FAIL;
1023 memcpy(buffer_tmp, svf_tdi_buffer, svf_buffer_index);
1024 // svf_tdi_buffer isn't NULL here
1025 free(svf_tdi_buffer);
1026 svf_tdi_buffer = buffer_tmp;
1028 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1029 if (NULL == buffer_tmp)
1031 LOG_ERROR("not enough memory");
1032 return ERROR_FAIL;
1034 memcpy(buffer_tmp, svf_tdo_buffer, svf_buffer_index);
1035 // svf_tdo_buffer isn't NULL here
1036 free(svf_tdo_buffer);
1037 svf_tdo_buffer = buffer_tmp;
1039 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1040 if (NULL == buffer_tmp)
1042 LOG_ERROR("not enough memory");
1043 return ERROR_FAIL;
1045 memcpy(buffer_tmp, svf_mask_buffer, svf_buffer_index);
1046 // svf_mask_buffer isn't NULL here
1047 free(svf_mask_buffer);
1048 svf_mask_buffer = buffer_tmp;
1050 buffer_tmp = NULL;
1051 svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
1052 #endif
1055 // assemble dr data
1056 i = 0;
1057 buf_set_buf(svf_para.hdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1058 i += svf_para.hdr_para.len;
1059 buf_set_buf(svf_para.sdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1060 i += svf_para.sdr_para.len;
1061 buf_set_buf(svf_para.tdr_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1062 i += svf_para.tdr_para.len;
1064 // add check data
1065 if (svf_para.sdr_para.data_mask & XXR_TDO)
1067 // assemble dr mask data
1068 i = 0;
1069 buf_set_buf(svf_para.hdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1070 i += svf_para.hdr_para.len;
1071 buf_set_buf(svf_para.sdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1072 i += svf_para.sdr_para.len;
1073 buf_set_buf(svf_para.tdr_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1074 i += svf_para.tdr_para.len;
1075 // assemble dr check data
1076 i = 0;
1077 buf_set_buf(svf_para.hdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hdr_para.len);
1078 i += svf_para.hdr_para.len;
1079 buf_set_buf(svf_para.sdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sdr_para.len);
1080 i += svf_para.sdr_para.len;
1081 buf_set_buf(svf_para.tdr_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tdr_para.len);
1082 i += svf_para.tdr_para.len;
1084 svf_add_check_para(1, svf_buffer_index, i);
1086 else
1088 svf_add_check_para(0, svf_buffer_index, i);
1090 field.tap = tap;
1091 field.num_bits = i;
1092 field.out_value = &svf_tdi_buffer[svf_buffer_index];
1093 field.in_value = &svf_tdi_buffer[svf_buffer_index];
1094 jtag_add_plain_dr_scan(1, &field, svf_para.dr_end_state);
1096 svf_buffer_index += (i + 7) >> 3;
1098 else if (SIR == command)
1100 // check buffer size first, reallocate if necessary
1101 i = svf_para.hir_para.len + svf_para.sir_para.len + svf_para.tir_para.len;
1102 if ((svf_buffer_size - svf_buffer_index) < ((i + 7) >> 3))
1104 #if 1
1105 // simply print error message
1106 LOG_ERROR("buffer is not enough, report to author");
1107 return ERROR_FAIL;
1108 #else
1109 uint8_t *buffer_tmp;
1111 // reallocate buffer
1112 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1113 if (NULL == buffer_tmp)
1115 LOG_ERROR("not enough memory");
1116 return ERROR_FAIL;
1118 memcpy(buffer_tmp, svf_tdi_buffer, svf_buffer_index);
1119 // svf_tdi_buffer isn't NULL here
1120 free(svf_tdi_buffer);
1121 svf_tdi_buffer = buffer_tmp;
1123 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1124 if (NULL == buffer_tmp)
1126 LOG_ERROR("not enough memory");
1127 return ERROR_FAIL;
1129 memcpy(buffer_tmp, svf_tdo_buffer, svf_buffer_index);
1130 // svf_tdo_buffer isn't NULL here
1131 free(svf_tdo_buffer);
1132 svf_tdo_buffer = buffer_tmp;
1134 buffer_tmp = (uint8_t *)malloc(svf_buffer_index + ((i + 7) >> 3));
1135 if (NULL == buffer_tmp)
1137 LOG_ERROR("not enough memory");
1138 return ERROR_FAIL;
1140 memcpy(buffer_tmp, svf_mask_buffer, svf_buffer_index);
1141 // svf_mask_buffer isn't NULL here
1142 free(svf_mask_buffer);
1143 svf_mask_buffer = buffer_tmp;
1145 buffer_tmp = NULL;
1146 svf_buffer_size = svf_buffer_index + ((i + 7) >> 3);
1147 #endif
1150 // assemble ir data
1151 i = 0;
1152 buf_set_buf(svf_para.hir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1153 i += svf_para.hir_para.len;
1154 buf_set_buf(svf_para.sir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1155 i += svf_para.sir_para.len;
1156 buf_set_buf(svf_para.tir_para.tdi, 0, &svf_tdi_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1157 i += svf_para.tir_para.len;
1159 // add check data
1160 if (svf_para.sir_para.data_mask & XXR_TDO)
1162 // assemble dr mask data
1163 i = 0;
1164 buf_set_buf(svf_para.hir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1165 i += svf_para.hir_para.len;
1166 buf_set_buf(svf_para.sir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1167 i += svf_para.sir_para.len;
1168 buf_set_buf(svf_para.tir_para.mask, 0, &svf_mask_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1169 i += svf_para.tir_para.len;
1170 // assemble dr check data
1171 i = 0;
1172 buf_set_buf(svf_para.hir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.hir_para.len);
1173 i += svf_para.hir_para.len;
1174 buf_set_buf(svf_para.sir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.sir_para.len);
1175 i += svf_para.sir_para.len;
1176 buf_set_buf(svf_para.tir_para.tdo, 0, &svf_tdo_buffer[svf_buffer_index], i, svf_para.tir_para.len);
1177 i += svf_para.tir_para.len;
1179 svf_add_check_para(1, svf_buffer_index, i);
1181 else
1183 svf_add_check_para(0, svf_buffer_index, i);
1185 field.tap = tap;
1186 field.num_bits = i;
1187 field.out_value = &svf_tdi_buffer[svf_buffer_index];
1188 field.in_value = &svf_tdi_buffer[svf_buffer_index];
1189 jtag_add_plain_ir_scan(1, &field, svf_para.ir_end_state);
1191 svf_buffer_index += (i + 7) >> 3;
1193 break;
1194 case PIO:
1195 case PIOMAP:
1196 LOG_ERROR("PIO and PIOMAP are not supported");
1197 return ERROR_FAIL;
1198 break;
1199 case RUNTEST:
1200 // RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
1201 // RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state]
1202 if ((num_of_argu < 3) && (num_of_argu > 11))
1204 LOG_ERROR("invalid parameter of %s", argus[0]);
1205 return ERROR_FAIL;
1207 // init
1208 run_count = 0;
1209 min_time = 0;
1210 max_time = 0;
1211 i = 1;
1212 // run_state
1213 i_tmp = svf_find_string_in_array(argus[i], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
1214 if (svf_tap_state_is_valid(i_tmp))
1216 if (svf_tap_state_is_stable(i_tmp))
1218 svf_para.runtest_run_state = i_tmp;
1220 // When a run_state is specified, the new run_state becomes the default end_state
1221 svf_para.runtest_end_state = i_tmp;
1222 LOG_DEBUG("\trun_state = %s", svf_tap_state_name[svf_para.runtest_run_state]);
1223 i++;
1225 else
1227 LOG_ERROR("%s is not valid state", svf_tap_state_name[i_tmp]);
1228 return ERROR_FAIL;
1231 // run_count run_clk
1232 if (((i + 2) <= num_of_argu) && strcmp(argus[i + 1], "SEC"))
1234 if (!strcmp(argus[i + 1], "TCK"))
1236 // clock source is TCK
1237 run_count = atoi(argus[i]);
1238 LOG_DEBUG("\trun_count@TCK = %d", run_count);
1240 else
1242 LOG_ERROR("%s not supported for clock", argus[i + 1]);
1243 return ERROR_FAIL;
1245 i += 2;
1247 // min_time SEC
1248 if (((i + 2) <= num_of_argu) && !strcmp(argus[i + 1], "SEC"))
1250 min_time = atof(argus[i]);
1251 LOG_DEBUG("\tmin_time = %fs", min_time);
1252 i += 2;
1254 // MAXIMUM max_time SEC
1255 if (((i + 3) <= num_of_argu) && !strcmp(argus[i], "MAXIMUM") && !strcmp(argus[i + 2], "SEC"))
1257 max_time = atof(argus[i + 1]);
1258 LOG_DEBUG("\tmax_time = %fs", max_time);
1259 i += 3;
1261 // ENDSTATE end_state
1262 if (((i + 2) <= num_of_argu) && !strcmp(argus[i], "ENDSTATE"))
1264 i_tmp = svf_find_string_in_array(argus[i + 1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
1265 if (svf_tap_state_is_stable(i_tmp))
1267 svf_para.runtest_end_state = i_tmp;
1268 LOG_DEBUG("\tend_state = %s", svf_tap_state_name[svf_para.runtest_end_state]);
1270 else
1272 LOG_ERROR("%s is not valid state", svf_tap_state_name[i_tmp]);
1273 return ERROR_FAIL;
1275 i += 2;
1277 // calculate run_count
1278 if ((0 == run_count) && (min_time > 0))
1280 run_count = min_time * svf_para.frequency;
1282 // all parameter should be parsed
1283 if (i == num_of_argu)
1285 if (run_count > 0)
1287 // run_state and end_state is checked to be stable state
1288 // TODO: do runtest
1289 #if 1
1290 // enter into run_state if necessary
1291 if (cmd_queue_cur_state != svf_para.runtest_run_state)
1293 svf_add_statemove(svf_para.runtest_run_state);
1296 // call jtag_add_clocks
1297 jtag_add_clocks(run_count);
1299 // move to end_state if necessary
1300 if (svf_para.runtest_end_state != svf_para.runtest_run_state)
1302 svf_add_statemove(svf_para.runtest_end_state);
1304 #else
1305 if (svf_para.runtest_run_state != TAP_IDLE)
1307 // RUNTEST can only executed in TAP_IDLE
1308 LOG_ERROR("cannot runtest in %s state", svf_tap_state_name[svf_para.runtest_run_state]);
1309 return ERROR_FAIL;
1312 jtag_add_runtest(run_count, svf_para.runtest_end_state);
1313 #endif
1316 else
1318 LOG_ERROR("fail to parse parameter of RUNTEST, %d out of %d is parsed", i, num_of_argu);
1319 return ERROR_FAIL;
1321 break;
1322 case STATE:
1323 // STATE [pathstate1 [pathstate2 ...[pathstaten]]] stable_state
1324 if (num_of_argu < 2)
1326 LOG_ERROR("invalid parameter of %s", argus[0]);
1327 return ERROR_FAIL;
1329 if (num_of_argu > 2)
1331 // STATE pathstate1 ... stable_state
1332 path = (tap_state_t *)malloc((num_of_argu - 1) * sizeof(tap_state_t));
1333 if (NULL == path)
1335 LOG_ERROR("not enough memory");
1336 return ERROR_FAIL;
1338 num_of_argu--; // num of path
1339 i_tmp = 1; // path is from patameter 1
1340 for (i = 0; i < num_of_argu; i++)
1342 path[i] = svf_find_string_in_array(argus[i_tmp++], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
1343 if (!svf_tap_state_is_valid(path[i]))
1345 LOG_ERROR("%s is not valid state", svf_tap_state_name[path[i]]);
1346 return ERROR_FAIL;
1348 if (TAP_RESET == path[i])
1350 if (i > 0)
1352 jtag_add_pathmove(i, path);
1354 jtag_add_tlr();
1355 num_of_argu -= i + 1;
1356 i = -1;
1359 if (num_of_argu > 0)
1361 // execute last path if necessary
1362 if (svf_tap_state_is_stable(path[num_of_argu - 1]))
1364 // last state MUST be stable state
1365 // TODO: call path_move
1366 jtag_add_pathmove(num_of_argu, path);
1367 LOG_DEBUG("\tmove to %s by path_move", svf_tap_state_name[path[num_of_argu - 1]]);
1369 else
1371 LOG_ERROR("%s is not valid state", svf_tap_state_name[path[num_of_argu - 1]]);
1372 return ERROR_FAIL;
1375 // no need to keep this memory, in jtag_add_pathmove, path will be duplicated
1376 if (NULL != path)
1378 free(path);
1379 path = NULL;
1382 else
1384 // STATE stable_state
1385 state = svf_find_string_in_array(argus[1], (char **)svf_tap_state_name, dimof(svf_tap_state_name));
1386 if (svf_tap_state_is_stable(state))
1388 // TODO: move to state
1389 svf_add_statemove(state);
1391 LOG_DEBUG("\tmove to %s by svf_add_statemove", svf_tap_state_name[state]);
1393 else
1395 LOG_ERROR("%s is not valid state", svf_tap_state_name[state]);
1396 return ERROR_FAIL;
1399 break;
1400 case TRST:
1401 // TRST trst_mode
1402 if (num_of_argu != 2)
1404 LOG_ERROR("invalid parameter of %s", argus[0]);
1405 return ERROR_FAIL;
1407 if (svf_para.trst_mode != TRST_ABSENT)
1409 if (ERROR_OK != svf_execute_tap())
1411 return ERROR_FAIL;
1413 i_tmp = svf_find_string_in_array(argus[1], (char **)svf_trst_mode_name, dimof(svf_trst_mode_name));
1414 switch (i_tmp)
1416 case TRST_ON:
1417 jtag_add_reset(1, 0);
1418 break;
1419 case TRST_Z:
1420 case TRST_OFF:
1421 jtag_add_reset(0, 0);
1422 break;
1423 case TRST_ABSENT:
1424 break;
1425 default:
1426 LOG_ERROR("unknown TRST mode: %s", argus[1]);
1427 return ERROR_FAIL;
1429 svf_para.trst_mode = i_tmp;
1430 LOG_DEBUG("\ttrst_mode = %s", svf_trst_mode_name[svf_para.trst_mode]);
1432 else
1434 LOG_ERROR("can not accpet TRST command if trst_mode is ABSENT");
1435 return ERROR_FAIL;
1437 break;
1438 default:
1439 LOG_ERROR("invalid svf command: %s", argus[0]);
1440 return ERROR_FAIL;
1441 break;
1444 if (debug_level >= LOG_LVL_DEBUG)
1446 // for convenient debugging, execute tap if possible
1447 if ((svf_buffer_index > 0) && \
1448 (((command != STATE) && (command != RUNTEST)) || \
1449 ((command == STATE) && (num_of_argu == 2))))
1451 if (ERROR_OK != svf_execute_tap())
1453 return ERROR_FAIL;
1456 // output debug info
1457 if ((SIR == command) || (SDR == command))
1459 int read_value;
1460 memcpy(&read_value, svf_tdi_buffer, sizeof(int));
1461 // in debug mode, data is from index 0
1462 int read_mask = svf_get_mask_u32(svf_check_tdo_para[0].bit_len);
1463 LOG_DEBUG("\tTDO read = 0x%X", read_value & read_mask);
1467 else
1469 // for fast executing, execute tap if necessary
1470 // half of the buffer is for the next command
1471 if (((svf_buffer_index >= SVF_MAX_BUFFER_SIZE_TO_COMMIT) || (svf_check_tdo_para_index >= SVF_CHECK_TDO_PARA_SIZE / 2)) && \
1472 (((command != STATE) && (command != RUNTEST)) || \
1473 ((command == STATE) && (num_of_argu == 2))))
1475 return svf_execute_tap();
1479 return ERROR_OK;