1 /***************************************************************************
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 *
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".
44 #include <sys/types.h>
71 const char *svf_command_name
[14] =
97 const char *svf_trst_mode_name
[4] =
105 char *svf_tap_state_name
[16];
107 #define XXR_TDI (1 << 0)
108 #define XXR_TDO (1 << 1)
109 #define XXR_MASK (1 << 2)
110 #define XXR_SMASK (1 << 3)
124 tap_state_t ir_end_state
;
125 tap_state_t dr_end_state
;
126 tap_state_t runtest_run_state
;
127 tap_state_t runtest_end_state
;
128 trst_mode_t trst_mode
;
130 svf_xxr_para_t hir_para
;
131 svf_xxr_para_t hdr_para
;
132 svf_xxr_para_t tir_para
;
133 svf_xxr_para_t tdr_para
;
134 svf_xxr_para_t sir_para
;
135 svf_xxr_para_t sdr_para
;
139 const svf_para_t svf_para_init
=
141 // frequency, ir_end_state, dr_end_state, runtest_run_state, runtest_end_state, trst_mode
142 0, TAP_IDLE
, TAP_IDLE
, TAP_IDLE
, TAP_IDLE
, TRST_Z
,
144 // {len, data_mask, tdi, tdo, mask, smask},
145 {0, 0, NULL
, NULL
, NULL
, NULL
},
147 // {len, data_mask, tdi, tdo, mask, smask},
148 {0, 0, NULL
, NULL
, NULL
, NULL
},
150 // {len, data_mask, tdi, tdo, mask, smask},
151 {0, 0, NULL
, NULL
, NULL
, NULL
},
153 // {len, data_mask, tdi, tdo, mask, smask},
154 {0, 0, NULL
, NULL
, NULL
, NULL
},
156 // {len, data_mask, tdi, tdo, mask, smask},
157 {0, 0, NULL
, NULL
, NULL
, NULL
},
159 // {len, data_mask, tdi, tdo, mask, smask},
160 {0, 0, NULL
, NULL
, NULL
, NULL
},
165 int line_num
; // used to record line number of the check operation
166 // so more information could be printed
167 int enabled
; // check is enabled or not
168 int buffer_offset
; // buffer_offset to buffers
169 int bit_len
; // bit length to check
170 }svf_check_tdo_para_t
;
172 #define SVF_CHECK_TDO_PARA_SIZE 1024
173 static svf_check_tdo_para_t
*svf_check_tdo_para
= NULL
;
174 static int svf_check_tdo_para_index
= 0;
176 #define dimof(a) (sizeof(a) / sizeof((a)[0]))
178 static int svf_read_command_from_file(int fd
);
179 static int svf_check_tdo(void);
180 static int svf_add_check_para(u8 enabled
, int buffer_offset
, int bit_len
);
181 static int svf_run_command(struct command_context_s
*cmd_ctx
, char *cmd_str
);
182 static int handle_svf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
);
184 static int svf_fd
= 0;
185 static char *svf_command_buffer
= NULL
;
186 static int svf_command_buffer_size
= 0;
187 static int svf_line_number
= 1;
189 static jtag_tap_t
*tap
= NULL
;
191 #define SVF_MAX_BUFFER_SIZE_TO_COMMIT (4 * 1024)
192 static u8
*svf_tdi_buffer
= NULL
, *svf_tdo_buffer
= NULL
, *svf_mask_buffer
= NULL
;
193 static int svf_buffer_index
= 0, svf_buffer_size
= 0;
196 int svf_register_commands(struct command_context_s
*cmd_ctx
)
198 register_command(cmd_ctx
, NULL
, "svf", handle_svf_command
,
199 COMMAND_EXEC
, "run svf <file>");
204 void svf_free_xxd_para(svf_xxr_para_t
*para
)
208 if (para
->tdi
!= NULL
)
213 if (para
->tdo
!= NULL
)
218 if (para
->mask
!= NULL
)
223 if (para
->smask
!= NULL
)
231 static int handle_svf_command(struct command_context_s
*cmd_ctx
, char *cmd
, char **args
, int argc
)
233 int command_num
= 0, i
;
238 command_print(cmd_ctx
, "usage: svf <file>");
242 if ((svf_fd
= open(args
[0], O_RDONLY
)) < 0)
244 command_print(cmd_ctx
, "file \"%s\" not found", args
[0]);
248 LOG_USER("svf processing file: \"%s\"", args
[0]);
252 svf_command_buffer_size
= 0;
254 svf_check_tdo_para_index
= 0;
255 svf_check_tdo_para
= malloc(sizeof(svf_check_tdo_para_t
) * SVF_CHECK_TDO_PARA_SIZE
);
256 if (NULL
== svf_check_tdo_para
)
258 LOG_ERROR("not enough memory");
263 svf_buffer_index
= 0;
264 // double the buffer size
265 // in case current command cannot be commited, and next command is a bit scan command
266 // here is 32K bits for this big scan command, it should be enough
267 // buffer will be reallocated if buffer size is not enough
268 svf_tdi_buffer
= (u8
*)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
269 if (NULL
== svf_tdi_buffer
)
271 LOG_ERROR("not enough memory");
275 svf_tdo_buffer
= (u8
*)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
276 if (NULL
== svf_tdo_buffer
)
278 LOG_ERROR("not enough memory");
282 svf_mask_buffer
= (u8
*)malloc(2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
);
283 if (NULL
== svf_mask_buffer
)
285 LOG_ERROR("not enough memory");
289 svf_buffer_size
= 2 * SVF_MAX_BUFFER_SIZE_TO_COMMIT
;
291 memcpy(&svf_para
, &svf_para_init
, sizeof(svf_para
));
292 for (i
= 0; i
< dimof(svf_tap_state_name
); i
++)
294 svf_tap_state_name
[i
] = (char *)jtag_state_name(i
);
299 while ( ERROR_OK
== svf_read_command_from_file(svf_fd
) )
301 if (ERROR_OK
!= svf_run_command(cmd_ctx
, svf_command_buffer
))
303 LOG_ERROR("fail to run command at line %d", svf_line_number
);
309 if (ERROR_OK
!= jtag_execute_queue())
313 else if (ERROR_OK
!= svf_check_tdo())
324 if (svf_command_buffer
)
326 free(svf_command_buffer
);
327 svf_command_buffer
= NULL
;
328 svf_command_buffer_size
= 0;
330 if (svf_check_tdo_para
)
332 free(svf_check_tdo_para
);
333 svf_check_tdo_para
= NULL
;
334 svf_check_tdo_para_index
= 0;
338 free(svf_tdi_buffer
);
339 svf_tdi_buffer
= NULL
;
343 free(svf_tdo_buffer
);
344 svf_tdo_buffer
= NULL
;
348 free(svf_mask_buffer
);
349 svf_mask_buffer
= NULL
;
351 svf_buffer_index
= 0;
354 svf_free_xxd_para(&svf_para
.hdr_para
);
355 svf_free_xxd_para(&svf_para
.hir_para
);
356 svf_free_xxd_para(&svf_para
.tdr_para
);
357 svf_free_xxd_para(&svf_para
.tir_para
);
358 svf_free_xxd_para(&svf_para
.sdr_para
);
359 svf_free_xxd_para(&svf_para
.sir_para
);
363 command_print(cmd_ctx
, "svf file programmed successfully for %d commands", command_num
);
367 command_print(cmd_ctx
, "svf file programmed failed");
373 #define SVFP_CMD_INC_CNT 1024
374 static int svf_read_command_from_file(int fd
)
376 char ch
, *tmp_buffer
= NULL
;
377 int cmd_pos
= 0, cmd_ok
= 0, slash
= 0, comment
= 0;
379 while (!cmd_ok
&& (read(fd
, &ch
, 1) > 0) )
409 if (cmd_pos
>= svf_command_buffer_size
- 1)
411 tmp_buffer
= (char*)malloc(svf_command_buffer_size
+ SVFP_CMD_INC_CNT
); // 1 more byte for '\0'
412 if (NULL
== tmp_buffer
)
414 LOG_ERROR("not enough memory");
417 if (svf_command_buffer_size
> 0)
419 memcpy(tmp_buffer
, svf_command_buffer
, svf_command_buffer_size
);
421 if (svf_command_buffer
!= NULL
)
423 free(svf_command_buffer
);
425 svf_command_buffer
= tmp_buffer
;
426 svf_command_buffer_size
+= SVFP_CMD_INC_CNT
;
429 svf_command_buffer
[cmd_pos
++] = (char)toupper(ch
);
437 svf_command_buffer
[cmd_pos
] = '\0';
446 static int svf_parse_cmd_string(char *str
, int len
, char **argus
, int *num_of_argu
)
448 int pos
= 0, num
= 0, space_found
= 1;
458 LOG_ERROR("fail to parse svf command");
468 argus
[num
++] = &str
[pos
];
481 static int svf_tap_state_is_stable(tap_state_t state
)
483 return ((TAP_RESET
== state
) || (TAP_IDLE
== state
) || (TAP_DRPAUSE
== state
) || (TAP_IRPAUSE
== state
));
486 static int svf_tap_state_is_valid(tap_state_t state
)
488 return ((state
>= 0) && (state
< sizeof(svf_tap_state_name
)));
491 static int svf_find_string_in_array(char *str
, char **strs
, int num_of_element
)
495 for (i
= 0; i
< num_of_element
; i
++)
497 if (!strcmp(str
, strs
[i
]))
505 static int svf_adjust_array_length(u8
**arr
, int orig_bit_len
, int new_bit_len
)
507 int new_byte_len
= (new_bit_len
+ 7) >> 3;
509 if ((NULL
== *arr
) || (((orig_bit_len
+ 7) >> 3) < ((new_bit_len
+ 7) >> 3)))
516 *arr
= (u8
*)malloc(new_byte_len
);
519 LOG_ERROR("not enough memory");
522 memset(*arr
, 0, new_byte_len
);
527 static int svf_copy_hexstring_to_binary(char *str
, u8
**bin
, int orig_bit_len
, int bit_len
)
529 int i
, str_len
= strlen(str
), str_byte_len
= (bit_len
+ 3) >> 2, loop_cnt
;
530 u8 ch
, need_write
= 1;
532 if (ERROR_OK
!= svf_adjust_array_length(bin
, orig_bit_len
, bit_len
))
534 LOG_ERROR("fail to adjust length of array");
538 if (str_byte_len
> str_len
)
540 loop_cnt
= str_byte_len
;
547 for (i
= 0; i
< loop_cnt
; i
++)
551 ch
= str
[str_len
- i
- 1];
552 if ((ch
>= '0') && (ch
<= '9'))
556 else if ((ch
>= 'A') && (ch
<= 'F'))
562 LOG_ERROR("invalid hex string");
572 if (i
>= str_byte_len
)
574 // all data written, other data should be all '0's and needn't to be written
578 LOG_ERROR("value execede length");
582 else if (i
== (str_byte_len
- 1))
584 // last data byte, written if valid
585 if ((ch
& ~((1 << (bit_len
- 4 * i
)) - 1)) != 0)
587 LOG_ERROR("value execede length");
598 (*bin
)[i
/ 2] |= ch
<< 4;
612 static int svf_check_tdo(void)
614 int i
, j
, byte_len
, index
;
616 for (i
= 0; i
< svf_check_tdo_para_index
; i
++)
618 if (svf_check_tdo_para
[i
].enabled
)
620 byte_len
= (svf_check_tdo_para
[i
].bit_len
+ 7) >> 3;
621 index
= svf_check_tdo_para
[i
].buffer_offset
;
622 for (j
= 0; j
< byte_len
; j
++)
624 if ((svf_tdi_buffer
[index
+ j
] & svf_mask_buffer
[index
+ j
]) != svf_tdo_buffer
[index
+ j
])
626 LOG_ERROR("tdo check error at line %d, read = 0x%X, want = 0x%X, mask = 0x%X",
627 svf_check_tdo_para
[i
].line_num
,
628 (*(int*)(svf_tdi_buffer
+ index
)) & ((1 << svf_check_tdo_para
[i
].bit_len
) - 1),
629 (*(int*)(svf_tdo_buffer
+ index
)) & ((1 << svf_check_tdo_para
[i
].bit_len
) - 1),
630 (*(int*)(svf_mask_buffer
+ index
)) & ((1 << svf_check_tdo_para
[i
].bit_len
) - 1));
636 svf_check_tdo_para_index
= 0;
641 static int svf_add_check_para(u8 enabled
, int buffer_offset
, int bit_len
)
643 if (svf_check_tdo_para_index
>= SVF_CHECK_TDO_PARA_SIZE
)
645 LOG_ERROR("toooooo many operation undone");
649 svf_check_tdo_para
[svf_check_tdo_para_index
].line_num
= svf_line_number
;
650 svf_check_tdo_para
[svf_check_tdo_para_index
].bit_len
= bit_len
;
651 svf_check_tdo_para
[svf_check_tdo_para_index
].enabled
= enabled
;
652 svf_check_tdo_para
[svf_check_tdo_para_index
].buffer_offset
= buffer_offset
;
653 svf_check_tdo_para_index
++;
658 // not good to use this
659 extern jtag_command_t
** jtag_get_last_command_p(void);
660 extern void* cmd_queue_alloc(size_t size
);
661 extern jtag_command_t
**last_comand_pointer
;
663 static int svf_run_command(struct command_context_s
*cmd_ctx
, char *cmd_str
)
665 char *argus
[256], command
;
666 int num_of_argu
= 0, i
;
671 // not good to use this
672 jtag_command_t
**last_cmd
;
676 float min_time
, max_time
;
678 svf_xxr_para_t
*xxr_para_tmp
;
682 tap_state_t
*path
= NULL
, state
;
684 LOG_DEBUG("%s", cmd_str
);
686 if (ERROR_OK
!= svf_parse_cmd_string(cmd_str
, strlen(cmd_str
), argus
, &num_of_argu
))
691 command
= svf_find_string_in_array(argus
[0], (char **)svf_command_name
, dimof(svf_command_name
));
696 if (num_of_argu
!= 2)
698 LOG_ERROR("invalid parameter of %s", argus
[0]);
701 i_tmp
= svf_find_string_in_array(argus
[1], (char **)svf_tap_state_name
, dimof(svf_tap_state_name
));
702 if (svf_tap_state_is_stable(i_tmp
))
704 if (command
== ENDIR
)
706 svf_para
.ir_end_state
= i_tmp
;
707 LOG_DEBUG("\tir_end_state = %s", svf_tap_state_name
[svf_para
.ir_end_state
]);
711 svf_para
.dr_end_state
= i_tmp
;
712 LOG_DEBUG("\tdr_end_state = %s", svf_tap_state_name
[svf_para
.dr_end_state
]);
717 LOG_ERROR("%s is not valid state", argus
[1]);
722 if ((num_of_argu
!= 1) && (num_of_argu
!= 3))
724 LOG_ERROR("invalid parameter of %s", argus
[0]);
727 if (1 == num_of_argu
)
729 // TODO: set jtag speed to full speed
730 svf_para
.frequency
= 0;
734 if (strcmp(argus
[2], "HZ"))
736 LOG_ERROR("HZ not found in FREQUENCY command");
739 svf_para
.frequency
= atof(argus
[1]);
740 // TODO: set jtag speed to
741 if (svf_para
.frequency
> 0)
743 command_run_linef(cmd_ctx
, "jtag_khz %d", (int)svf_para
.frequency
/ 1000);
744 LOG_DEBUG("\tfrequency = %f", svf_para
.frequency
);
749 xxr_para_tmp
= &svf_para
.hdr_para
;
752 xxr_para_tmp
= &svf_para
.hir_para
;
755 xxr_para_tmp
= &svf_para
.tdr_para
;
758 xxr_para_tmp
= &svf_para
.tir_para
;
761 xxr_para_tmp
= &svf_para
.sdr_para
;
764 xxr_para_tmp
= &svf_para
.sir_para
;
767 // XXR length [TDI (tdi)] [TDO (tdo)][MASK (mask)] [SMASK (smask)]
768 if ((num_of_argu
> 10) || (num_of_argu
% 2))
770 LOG_ERROR("invalid parameter of %s", argus
[0]);
773 i_tmp
= xxr_para_tmp
->len
;
774 xxr_para_tmp
->len
= atoi(argus
[1]);
775 LOG_DEBUG("\tlength = %d", xxr_para_tmp
->len
);
776 xxr_para_tmp
->data_mask
= 0;
777 for (i
= 2; i
< num_of_argu
; i
+= 2)
779 if ((argus
[i
+ 1][0] != '(') || (argus
[i
+ 1][strlen(argus
[i
+ 1]) - 1] != ')'))
781 LOG_ERROR("data section error");
784 argus
[i
+ 1][strlen(argus
[i
+ 1]) - 1] = '\0';
785 // TDI, TDO, MASK, SMASK
786 if (!strcmp(argus
[i
], "TDI"))
789 pbuffer_tmp
= &xxr_para_tmp
->tdi
;
790 xxr_para_tmp
->data_mask
|= XXR_TDI
;
792 else if (!strcmp(argus
[i
], "TDO"))
795 pbuffer_tmp
= &xxr_para_tmp
->tdo
;
796 xxr_para_tmp
->data_mask
|= XXR_TDO
;
798 else if (!strcmp(argus
[i
], "MASK"))
801 pbuffer_tmp
= &xxr_para_tmp
->mask
;
802 xxr_para_tmp
->data_mask
|= XXR_MASK
;
804 else if (!strcmp(argus
[i
], "SMASK"))
807 pbuffer_tmp
= &xxr_para_tmp
->smask
;
808 xxr_para_tmp
->data_mask
|= XXR_SMASK
;
812 LOG_ERROR("unknow parameter: %s", argus
[i
]);
815 if (ERROR_OK
!= svf_copy_hexstring_to_binary(&argus
[i
+ 1][1], pbuffer_tmp
, i_tmp
, xxr_para_tmp
->len
))
817 LOG_ERROR("fail to parse hex value");
820 LOG_DEBUG("\t%s = 0x%X", argus
[i
], (**(int**)pbuffer_tmp
) & ((1 << (xxr_para_tmp
->len
)) - 1));
822 // If a command changes the length of the last scan of the same type and the MASK parameter is absent,
823 // the mask pattern used is all cares
824 if (!(xxr_para_tmp
->data_mask
& XXR_MASK
) && (i_tmp
!= xxr_para_tmp
->len
))
826 // MASK not defined and length changed
827 if (ERROR_OK
!= svf_adjust_array_length(&xxr_para_tmp
->mask
, i_tmp
, xxr_para_tmp
->len
))
829 LOG_ERROR("fail to adjust length of array");
832 buf_set_ones(xxr_para_tmp
->mask
, xxr_para_tmp
->len
);
834 // do scan if necessary
837 // check buffer size first, reallocate if necessary
838 i
= svf_para
.hdr_para
.len
+ svf_para
.sdr_para
.len
+ svf_para
.tdr_para
.len
;
839 if ((svf_buffer_size
- svf_buffer_index
) < ((i
+ 7) >> 3))
842 // simply print error message
843 LOG_ERROR("buffer is not enough, report to author");
849 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
850 if (NULL
== buffer_tmp
)
852 LOG_ERROR("not enough memory");
855 memcpy(buffer_tmp
, svf_tdi_buffer
, svf_buffer_index
);
856 // svf_tdi_buffer isn't NULL here
857 free(svf_tdi_buffer
);
858 svf_tdi_buffer
= buffer_tmp
;
860 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
861 if (NULL
== buffer_tmp
)
863 LOG_ERROR("not enough memory");
866 memcpy(buffer_tmp
, svf_tdo_buffer
, svf_buffer_index
);
867 // svf_tdo_buffer isn't NULL here
868 free(svf_tdo_buffer
);
869 svf_tdo_buffer
= buffer_tmp
;
871 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
872 if (NULL
== buffer_tmp
)
874 LOG_ERROR("not enough memory");
877 memcpy(buffer_tmp
, svf_mask_buffer
, svf_buffer_index
);
878 // svf_mask_buffer isn't NULL here
879 free(svf_mask_buffer
);
880 svf_mask_buffer
= buffer_tmp
;
883 svf_buffer_size
= svf_buffer_index
+ ((i
+ 7) >> 3);
889 buf_set_buf(svf_para
.hdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
890 i
+= svf_para
.hdr_para
.len
;
891 buf_set_buf(svf_para
.sdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
892 i
+= svf_para
.sdr_para
.len
;
893 buf_set_buf(svf_para
.tdr_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
894 i
+= svf_para
.tdr_para
.len
;
897 if (svf_para
.sdr_para
.data_mask
& XXR_TDO
)
899 // assemble dr mask data
901 buf_set_buf(svf_para
.hdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
902 i
+= svf_para
.hdr_para
.len
;
903 buf_set_buf(svf_para
.sdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
904 i
+= svf_para
.sdr_para
.len
;
905 buf_set_buf(svf_para
.tdr_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
906 i
+= svf_para
.tdr_para
.len
;
907 // assemble dr check data
909 buf_set_buf(svf_para
.hdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.hdr_para
.len
);
910 i
+= svf_para
.hdr_para
.len
;
911 buf_set_buf(svf_para
.sdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.sdr_para
.len
);
912 i
+= svf_para
.sdr_para
.len
;
913 buf_set_buf(svf_para
.tdr_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.tdr_para
.len
);
914 i
+= svf_para
.tdr_para
.len
;
916 svf_add_check_para(1, svf_buffer_index
, i
);
920 svf_add_check_para(0, svf_buffer_index
, i
);
924 field
.out_value
= &svf_tdi_buffer
[svf_buffer_index
];
925 field
.out_mask
= NULL
;
926 field
.in_value
= &svf_tdi_buffer
[svf_buffer_index
];
927 field
.in_check_value
= NULL
;
928 field
.in_check_mask
= NULL
;
929 field
.in_handler
= NULL
;
930 field
.in_handler_priv
= NULL
;
931 jtag_add_plain_dr_scan(1, &field
, svf_para
.dr_end_state
);
933 svf_buffer_index
+= (i
+ 7) >> 3;
935 else if (SIR
== command
)
937 // check buffer size first, reallocate if necessary
938 i
= svf_para
.hir_para
.len
+ svf_para
.sir_para
.len
+ svf_para
.tir_para
.len
;
939 if ((svf_buffer_size
- svf_buffer_index
) < ((i
+ 7) >> 3))
942 // simply print error message
943 LOG_ERROR("buffer is not enough, report to author");
949 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
950 if (NULL
== buffer_tmp
)
952 LOG_ERROR("not enough memory");
955 memcpy(buffer_tmp
, svf_tdi_buffer
, svf_buffer_index
);
956 // svf_tdi_buffer isn't NULL here
957 free(svf_tdi_buffer
);
958 svf_tdi_buffer
= buffer_tmp
;
960 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
961 if (NULL
== buffer_tmp
)
963 LOG_ERROR("not enough memory");
966 memcpy(buffer_tmp
, svf_tdo_buffer
, svf_buffer_index
);
967 // svf_tdo_buffer isn't NULL here
968 free(svf_tdo_buffer
);
969 svf_tdo_buffer
= buffer_tmp
;
971 buffer_tmp
= (u8
*)malloc(svf_buffer_index
+ ((i
+ 7) >> 3));
972 if (NULL
== buffer_tmp
)
974 LOG_ERROR("not enough memory");
977 memcpy(buffer_tmp
, svf_mask_buffer
, svf_buffer_index
);
978 // svf_mask_buffer isn't NULL here
979 free(svf_mask_buffer
);
980 svf_mask_buffer
= buffer_tmp
;
983 svf_buffer_size
= svf_buffer_index
+ ((i
+ 7) >> 3);
989 buf_set_buf(svf_para
.hir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
990 i
+= svf_para
.hir_para
.len
;
991 buf_set_buf(svf_para
.sir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
992 i
+= svf_para
.sir_para
.len
;
993 buf_set_buf(svf_para
.tir_para
.tdi
, 0, &svf_tdi_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
994 i
+= svf_para
.tir_para
.len
;
997 if (svf_para
.sir_para
.data_mask
& XXR_TDO
)
999 // assemble dr mask data
1001 buf_set_buf(svf_para
.hir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
1002 i
+= svf_para
.hir_para
.len
;
1003 buf_set_buf(svf_para
.sir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
1004 i
+= svf_para
.sir_para
.len
;
1005 buf_set_buf(svf_para
.tir_para
.mask
, 0, &svf_mask_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
1006 i
+= svf_para
.tir_para
.len
;
1007 // assemble dr check data
1009 buf_set_buf(svf_para
.hir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.hir_para
.len
);
1010 i
+= svf_para
.hir_para
.len
;
1011 buf_set_buf(svf_para
.sir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.sir_para
.len
);
1012 i
+= svf_para
.sir_para
.len
;
1013 buf_set_buf(svf_para
.tir_para
.tdo
, 0, &svf_tdo_buffer
[svf_buffer_index
], i
, svf_para
.tir_para
.len
);
1014 i
+= svf_para
.tir_para
.len
;
1016 svf_add_check_para(1, svf_buffer_index
, i
);
1020 svf_add_check_para(0, svf_buffer_index
, i
);
1024 field
.out_value
= &svf_tdi_buffer
[svf_buffer_index
];
1025 field
.out_mask
= NULL
;
1026 field
.in_value
= &svf_tdi_buffer
[svf_buffer_index
];
1027 field
.in_check_value
= NULL
;
1028 field
.in_check_mask
= NULL
;
1029 field
.in_handler
= NULL
;
1030 field
.in_handler_priv
= NULL
;
1031 jtag_add_plain_ir_scan(1, &field
, svf_para
.ir_end_state
);
1033 svf_buffer_index
+= (i
+ 7) >> 3;
1038 LOG_ERROR("PIO and PIOMAP are not supported");
1042 // RUNTEST [run_state] run_count run_clk [min_time SEC [MAXIMUM max_time SEC]] [ENDSTATE end_state]
1043 // RUNTEST [run_state] min_time SEC [MAXIMUM max_time SEC] [ENDSTATE end_state]
1044 if ((num_of_argu
< 3) && (num_of_argu
> 11))
1046 LOG_ERROR("invalid parameter of %s", argus
[0]);
1055 i_tmp
= svf_find_string_in_array(argus
[i
], (char **)svf_tap_state_name
, dimof(svf_tap_state_name
));
1056 if (svf_tap_state_is_valid(i_tmp
))
1058 if (svf_tap_state_is_stable(i_tmp
))
1060 svf_para
.runtest_run_state
= i_tmp
;
1062 // When a run_state is specified, the new run_state becomes the default end_state
1063 svf_para
.runtest_end_state
= i_tmp
;
1064 LOG_DEBUG("\trun_state = %s", svf_tap_state_name
[svf_para
.runtest_run_state
]);
1069 LOG_ERROR("%s is not valid state", svf_tap_state_name
[i_tmp
]);
1073 // run_count run_clk
1074 if (((i
+ 2) <= num_of_argu
) && strcmp(argus
[i
+ 1], "SEC"))
1076 if (!strcmp(argus
[i
+ 1], "TCK"))
1078 // clock source is TCK
1079 run_count
= atoi(argus
[i
]);
1080 LOG_DEBUG("\trun_count@TCK = %d", run_count
);
1084 LOG_ERROR("%s not supported for clock", argus
[i
+ 1]);
1090 if (((i
+ 2) <= num_of_argu
) && !strcmp(argus
[i
+ 1], "SEC"))
1092 min_time
= atof(argus
[i
]);
1093 LOG_DEBUG("\tmin_time = %fs", min_time
);
1096 // MAXIMUM max_time SEC
1097 if (((i
+ 3) <= num_of_argu
) && !strcmp(argus
[i
], "MAXIMUM") && !strcmp(argus
[i
+ 2], "SEC"))
1099 max_time
= atof(argus
[i
+ 1]);
1100 LOG_DEBUG("\tmax_time = %fs", max_time
);
1103 // ENDSTATE end_state
1104 if (((i
+ 2) <= num_of_argu
) && !strcmp(argus
[i
], "ENDSTATE"))
1106 i_tmp
= svf_find_string_in_array(argus
[i
+ 1], (char **)svf_tap_state_name
, dimof(svf_tap_state_name
));
1107 if (svf_tap_state_is_stable(i_tmp
))
1109 svf_para
.runtest_end_state
= i_tmp
;
1110 LOG_DEBUG("\tend_state = %s", svf_tap_state_name
[svf_para
.runtest_end_state
]);
1114 LOG_ERROR("%s is not valid state", svf_tap_state_name
[i_tmp
]);
1119 // calculate run_count
1120 if ((0 == run_count
) && (min_time
> 0))
1122 run_count
= min_time
* svf_para
.frequency
;
1124 // all parameter should be parsed
1125 if (i
== num_of_argu
)
1130 if (svf_para
.runtest_run_state
!= TAP_IDLE
)
1132 // RUNTEST can only executed in TAP_IDLE
1133 LOG_ERROR("cannot runtest in %s state", svf_tap_state_name
[svf_para
.runtest_run_state
]);
1136 jtag_add_runtest(run_count
, svf_para
.runtest_end_state
);
1141 LOG_ERROR("fail to parse parameter of RUNTEST, %d out of %d is parsed", i
, num_of_argu
);
1146 // STATE [pathstate1 [pathstate2 ...[pathstaten]]] stable_state
1147 if (num_of_argu
< 2)
1149 LOG_ERROR("invalid parameter of %s", argus
[0]);
1152 if (num_of_argu
> 2)
1154 // STATE pathstate1 ... stable_state
1155 path
= (tap_state_t
*)malloc((num_of_argu
- 1) * sizeof(tap_state_t
));
1158 LOG_ERROR("not enough memory");
1161 for (i
= 1; i
< num_of_argu
; i
++)
1163 path
[i
- 1] = svf_find_string_in_array(argus
[i
], (char **)svf_tap_state_name
, dimof(svf_tap_state_name
));
1164 if (!svf_tap_state_is_valid(path
[i
- 1]))
1166 LOG_ERROR("%s is not valid state", svf_tap_state_name
[path
[i
- 1]]);
1169 if (TAP_RESET
== path
[i
- 1])
1171 LOG_ERROR("TAP_RESET is not allowed in pathmove");
1175 if (svf_tap_state_is_stable(path
[num_of_argu
- 1]))
1177 // last state MUST be stable state
1178 // TODO: call path_move
1179 jtag_add_pathmove(num_of_argu
- 1, path
);
1180 LOG_DEBUG("\tmove to %s by path_move", svf_tap_state_name
[path
[num_of_argu
- 1]]);
1184 LOG_ERROR("%s is not valid state", svf_tap_state_name
[path
[num_of_argu
- 1]]);
1195 // STATE stable_state
1196 state
= svf_find_string_in_array(argus
[1], (char **)svf_tap_state_name
, dimof(svf_tap_state_name
));
1197 if (svf_tap_state_is_stable(state
))
1199 // TODO: move to state
1200 last_cmd
= jtag_get_last_command_p();
1201 *last_cmd
= cmd_queue_alloc(sizeof(jtag_command_t
));
1202 last_comand_pointer
= &((*last_cmd
)->next
);
1203 (*last_cmd
)->next
= NULL
;
1204 (*last_cmd
)->type
= JTAG_STATEMOVE
;
1205 (*last_cmd
)->cmd
.statemove
= cmd_queue_alloc(sizeof(statemove_command_t
));
1206 (*last_cmd
)->cmd
.statemove
->end_state
= state
;
1208 LOG_DEBUG("\tmove to %s by state_move", svf_tap_state_name
[state
]);
1212 LOG_ERROR("%s is not valid state", svf_tap_state_name
[state
]);
1219 if (num_of_argu
!= 2)
1221 LOG_ERROR("invalid parameter of %s", argus
[0]);
1224 if (svf_para
.trst_mode
!= TRST_ABSENT
)
1226 i_tmp
= svf_find_string_in_array(argus
[1], (char **)svf_trst_mode_name
, dimof(svf_trst_mode_name
));
1230 jtag_add_reset(1, 0);
1233 jtag_add_reset(1, 1);
1240 LOG_ERROR("unknown TRST mode: %s", argus
[1]);
1243 svf_para
.trst_mode
= i_tmp
;
1244 LOG_DEBUG("\ttrst_mode = %s", svf_trst_mode_name
[svf_para
.trst_mode
]);
1248 LOG_ERROR("can not accpet TRST command if trst_mode is ABSENT");
1253 LOG_ERROR("invalid svf command: %s", argus
[0]);
1258 if (debug_level
>= LOG_LVL_DEBUG
)
1260 // for convenient debugging, execute tap if possible
1261 if ((svf_buffer_index
> 0) && \
1262 (((command
!= STATE
) && (command
!= RUNTEST
)) || \
1263 ((command
== STATE
) && (num_of_argu
== 2))))
1265 // there is data to be executed
1266 if (ERROR_OK
!= jtag_execute_queue())
1270 // output debug info
1271 if ((SIR
== command
) || (SDR
== command
))
1273 LOG_DEBUG("\tTDO read = 0x%X", (*(int*)svf_tdi_buffer
) & ((1 << (svf_check_tdo_para
[0].bit_len
)) - 1));
1275 if (ERROR_OK
!= svf_check_tdo())
1280 svf_buffer_index
= 0;
1285 // for fast executing, execute tap if necessary
1286 // half of the buffer is for the next command
1287 if (((svf_buffer_index
>= SVF_MAX_BUFFER_SIZE_TO_COMMIT
) || (svf_check_tdo_para_index
>= SVF_CHECK_TDO_PARA_SIZE
/ 2)) && \
1288 (((command
!= STATE
) && (command
!= RUNTEST
)) || \
1289 ((command
== STATE
) && (num_of_argu
== 2))))
1291 if (ERROR_OK
!= jtag_execute_queue())
1295 else if (ERROR_OK
!= svf_check_tdo())
1300 svf_buffer_index
= 0;
Linking to existing account procedure
If you already have an account and want to add another login method
you
MUST first sign in with your existing account and
then change URL to read
https://review.openocd.org/login/?link
to get to this page again but this time it'll work for linking. Thank you.
SSH host keys fingerprints
1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=.. |
|+o.. . |
|*.o . . |
|+B . . . |
|Bo. = o S |
|Oo.+ + = |
|oB=.* = . o |
| =+=.+ + E |
|. .=o . o |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)