cosmetic fixes to debug output + phasing out printf() in favour of logging system...
[openocd.git] / src / xsvf / xsvf.c
index 16012887a88e7e760dfb669af46083bb4215f87d..f4c4dc4a60aa5157bface3caca6f2755de9b6354 100644 (file)
-/***************************************************************************
- *   Copyright (C) 2005 by Dominic Rath                                    *
- *   Dominic.Rath@gmx.de                                                   *
- *                                                                         *
- *   This program is free software; you can redistribute it and/or modify  *
- *   it under the terms of the GNU General Public License as published by  *
- *   the Free Software Foundation; either version 2 of the License, or     *
- *   (at your option) any later version.                                   *
- *                                                                         *
- *   This program is distributed in the hope that it will be useful,       *
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
- *   GNU General Public License for more details.                          *
- *                                                                         *
- *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
- ***************************************************************************/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "xsvf.h"
-
-#include "jtag.h"
-#include "command.h"
-#include "log.h"
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <string.h>
-
-#include <sys/time.h>
-#include <time.h>
-
-#define XSTATE_MAX_PATH (12)
-
-int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
-
-int xsvf_fd = 0;
-
-u8 *dr_out_buf;        /* from host to device (TDI) */
-u8 *dr_in_buf; /* from device to host (TDO) */
-u8 *dr_in_mask;
-
-int xsdrsize = 0;
-int xruntest = 0;      /* number of TCK cycles / microseconds */
-int xrepeat = 0x20; /* number of XC9500 retries */
-
-int xendir = 0;
-int xenddr = 0;
-
-enum tap_state xsvf_to_tap[] =
-{
-       TAP_TLR, TAP_RTI,
-       TAP_SDS, TAP_CD, TAP_SD, TAP_E1D, TAP_PD, TAP_E2D, TAP_UD,
-       TAP_SIS, TAP_CI, TAP_SI, TAP_E1I, TAP_PI, TAP_E2I, TAP_UI,
-};
-
-int tap_to_xsvf[] =
-{
-       0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x1, 0x9, 0xa, 0xb, 0xc, 0xe, 0xf
-};
-
-int xsvf_register_commands(struct command_context_s *cmd_ctx)
-{
-       register_command(cmd_ctx, NULL, "xsvf", handle_xsvf_command,
-               COMMAND_EXEC, "run xsvf <file>");
-
-       return ERROR_OK;
-}
-
-int xsvf_read_buffer(int num_bits, int fd, u8* buf)
-{
-       int num_bytes;
-
-       for (num_bytes = (num_bits + 7) / 8; num_bytes > 0; num_bytes--)
-       {
-               if (read(fd, buf + num_bytes - 1, 1) < 0)
-                       return ERROR_XSVF_EOF;
-       }
-
-       return ERROR_OK;
-}
-
-int xsvf_read_xstates(int fd, enum tap_state *path, int max_path, int *path_len)
-{
-       char c;
-       unsigned char uc;
-       
-       while ((read(fd, &c, 1) > 0) && (c == 0x12))
-       {
-               if (*path_len > max_path)
-               {
-                       WARNING("XSTATE path longer than max_path");
-                       break;
-               }
-               if (read(fd, &uc, 1) < 0)
-               {
-                       return ERROR_XSVF_EOF;
-               }
-               path[(*path_len)++] = xsvf_to_tap[uc];
-       }
-       
-       lseek(fd, -1, SEEK_CUR);
-       
-       return ERROR_OK;
-}
-
-int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       char c;
-       u8 buf4[4], buf2[2];
-       unsigned char uc, uc2;
-       unsigned int ui;
-       unsigned short us;
-
-       int do_abort = 0;
-       int unsupported = 0;
-       int tdo_mismatch = 0;
-       
-       int runtest_requires_tck = 0;
-       
-       int device = -1;        /* use -1 to indicate a "plain" xsvf file which accounts for additional devices in the scan chain, otherwise the device that should be affected */
-
-       if (argc < 2)
-       {
-               command_print(cmd_ctx, "usage: xsvf <device#|plain> <file> <variant>");
-               return ERROR_OK;
-       }
-
-       if (strcmp(args[0], "plain") != 0)
-       {
-               device = strtoul(args[0], NULL, 0);
-       }
-
-       if ((xsvf_fd = open(args[1], O_RDONLY)) < 0)
-       {
-               command_print(cmd_ctx, "file %s not found", args[0]);
-               return ERROR_OK;
-       }
-       
-       if ((argc > 2) && (strcmp(args[2], "virt2") == 0))
-       {
-               runtest_requires_tck = 1;
-       }
-
-       while (read(xsvf_fd, &c, 1) > 0)
-       {
-               switch (c)
-               {
-                       case 0x00:      /* XCOMPLETE */
-                               DEBUG("XCOMPLETE");
-                               if (jtag_execute_queue() != ERROR_OK)
-                               {
-                                       tdo_mismatch = 1;
-                                       break;  
-                               }
-                               break;
-                       case 0x01:      /* XTDOMASK */
-                               DEBUG("XTDOMASK");
-                               if (dr_in_mask && (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_mask) != ERROR_OK))
-                                       do_abort = 1;
-                               break;
-                       case 0x02:      /* XSIR */
-                               DEBUG("XSIR");
-                               if (read(xsvf_fd, &c, 1) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       u8 *ir_buf = malloc((c + 7) / 8);
-                                       if (xsvf_read_buffer(c, xsvf_fd, ir_buf) != ERROR_OK)
-                                               do_abort = 1;
-                                       else
-                                       {
-                                               scan_field_t field;
-                                               field.device = device;
-                                               field.num_bits = c;
-                                               field.out_value = ir_buf;
-                                               field.out_mask = NULL;
-                                               field.in_value = NULL;
-                                               field.in_check_value = NULL;
-                                               field.in_check_mask = NULL;
-                                               field.in_handler = NULL;
-                                               field.in_handler_priv = NULL;
-                                               if (device == -1)
-                                                       jtag_add_plain_ir_scan(1, &field, TAP_PI, NULL);
-                                               else
-                                                       jtag_add_ir_scan(1, &field, TAP_PI, NULL);
-                                               if (jtag_execute_queue() != ERROR_OK)
-                                               {
-                                                       tdo_mismatch = 1;
-                                                       free(ir_buf);
-                                                       break;
-                                               }
-                                               if (xruntest)
-                                               {
-                                                       if (runtest_requires_tck)
-                                                               jtag_add_runtest(xruntest, xsvf_to_tap[xendir]);
-                                                       else
-                                                       {
-                                                               jtag_add_statemove(TAP_RTI);
-                                                               jtag_add_sleep(xruntest);
-                                                               jtag_add_statemove(xsvf_to_tap[xendir]);
-                                                       }
-                                               }
-                                               else if (xendir != 0xd) /* Pause-IR */
-                                                       jtag_add_statemove(xsvf_to_tap[xendir]);
-                                       }
-                                       free(ir_buf);
-                               }
-                               break;
-                       case 0x03:      /* XSDR */
-                               DEBUG("XSDR");
-                               if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK)
-                                       do_abort = 1;
-                               else
-                               {
-                                       scan_field_t field;
-                                       field.device = device;
-                                       field.num_bits = xsdrsize;
-                                       field.out_value = dr_out_buf;
-                                       field.out_mask = NULL;
-                                       field.in_value = NULL;
-                                       jtag_set_check_value(&field, dr_in_buf, dr_in_mask, NULL);
-                                       if (device == -1)
-                                               jtag_add_plain_dr_scan(1, &field, TAP_PD, NULL);
-                                       else
-                                               jtag_add_dr_scan(1, &field, TAP_PD, NULL);
-                                       if (jtag_execute_queue() != ERROR_OK)
-                                       {
-                                               tdo_mismatch = 1;
-                                               break;  
-                                       }
-                                       if (xruntest)
-                                       {
-                                               if (runtest_requires_tck)
-                                                       jtag_add_runtest(xruntest, xsvf_to_tap[xenddr]);
-                                               else
-                                               {
-                                                       jtag_add_statemove(TAP_RTI);
-                                                       jtag_add_sleep(xruntest);
-                                                       jtag_add_statemove(xsvf_to_tap[xenddr]);
-                                               }
-                                       }
-                                       else if (xendir != 0x6) /* Pause-DR */
-                                               jtag_add_statemove(xsvf_to_tap[xenddr]);
-                               }
-                               break;
-                       case 0x04:      /* XRUNTEST */
-                               DEBUG("XRUNTEST");
-                               if (read(xsvf_fd, buf4, 4) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       xruntest = be_to_h_u32(buf4);
-                               }
-                               break;
-                       case 0x07:      /* XREPEAT */
-                               DEBUG("XREPEAT");
-                               if (read(xsvf_fd, &c, 1) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       xrepeat = c;
-                               }
-                               break;
-                       case 0x08:      /* XSDRSIZE */
-                               DEBUG("XSDRSIZE");
-                               if (read(xsvf_fd, buf4, 4) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       xsdrsize = be_to_h_u32(buf4);
-                                       free(dr_out_buf);
-                                       free(dr_in_buf);
-                                       free(dr_in_mask);
-                                       dr_out_buf = malloc((xsdrsize + 7) / 8);
-                                       dr_in_buf = malloc((xsdrsize + 7) / 8);
-                                       dr_in_mask = malloc((xsdrsize + 7) / 8);
-                               }
-                               break;
-                       case 0x09:      /* XSDRTDO */
-                               DEBUG("XSDRTDO");
-                               if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK)
-                                       do_abort = 1;
-                               else
-                               {
-                                       if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK)
-                                               do_abort = 1;
-                                       else
-                                       {
-                                               scan_field_t field;
-                                               field.device = device;
-                                               field.num_bits = xsdrsize;
-                                               field.out_value = dr_out_buf;
-                                               field.out_mask = NULL;
-                                               field.in_value = NULL;
-                                               jtag_set_check_value(&field, dr_in_buf, dr_in_mask, NULL);
-                                               if (device == -1)
-                                                       jtag_add_plain_dr_scan(1, &field, TAP_PD, NULL);
-                                               else
-                                                       jtag_add_dr_scan(1, &field, TAP_PD, NULL);
-                                               if (jtag_execute_queue() != ERROR_OK)
-                                               {
-                                                       tdo_mismatch = 1;
-                                                       break;  
-                                               }
-                                               if (xruntest)
-                                               {
-                                                       if (runtest_requires_tck)
-                                                               jtag_add_runtest(xruntest, xsvf_to_tap[xenddr]);
-                                                       else
-                                                       {
-                                                               jtag_add_statemove(TAP_RTI);
-                                                               jtag_add_sleep(xruntest);
-                                                               jtag_add_statemove(xsvf_to_tap[xenddr]);
-                                                       }
-                                               }
-                                               else if (xendir != 0x6) /* Pause-DR */
-                                                       jtag_add_statemove(xsvf_to_tap[xenddr]);
-                                       }
-                               }
-                               break;
-                       case 0x0a:      /* XSETDRMASKS */
-                               printf("unsupported XSETSDRMASKS\n");
-                               unsupported = 1;
-                               break;
-                       case 0x0b:      /* XSDRINC */
-                               printf("unsupported XSDRINC\n");
-                               unsupported = 1;
-                               break;
-                       case 0x0c:      /* XSDRB */
-                               unsupported = 1;
-                               break;
-                       case 0x0d:      /* XSDRC */
-                               unsupported = 1;
-                               break;
-                       case 0x0e:      /* XSDRE */
-                               unsupported = 1;
-                               break;
-                       case 0x0f:      /* XSDRTDOB */
-                               unsupported = 1;
-                               break;
-                       case 0x10:      /* XSDRTDOB */
-                               unsupported = 1;
-                               break;
-                       case 0x11:      /* XSDRTDOB */
-                               unsupported = 1;
-                               break;
-                       case 0x12:      /* XSTATE */
-                               DEBUG("XSTATE");
-                               if (read(xsvf_fd, &uc, 1) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       enum tap_state *path = calloc(XSTATE_MAX_PATH, 4);
-                                       int path_len = 1;
-                                       path[0] = xsvf_to_tap[uc];
-                                       if (xsvf_read_xstates(xsvf_fd, path, XSTATE_MAX_PATH, &path_len) != ERROR_OK)
-                                               do_abort = 1;
-                                       else
-                                       {
-                                               jtag_add_pathmove(path_len, path);
-                                       }
-                                       free(path);
-                               }
-                               break;
-                       case 0x13:      /* XENDIR */
-                               DEBUG("XENDIR");
-                               if (read(xsvf_fd, &c, 1) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       if (c == 0)
-                                               xendir = 1;
-                                       else if (c == 1)
-                                               xendir = 0xd;
-                                       else
-                                       {
-                                               ERROR("unknown XENDIR endstate");
-                                               unsupported = 1;
-                                       }
-                               }
-                               break;
-                       case 0x14:      /* XENDDR */
-                               DEBUG("XENDDR");
-                               if (read(xsvf_fd, &c, 1) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       if (c == 0)
-                                               xenddr = 1;
-                                       else if (c == 1)
-                                               xenddr = 0x6;
-                                       else
-                                       {
-                                               ERROR("unknown XENDDR endstate");
-                                               unsupported = 1;
-                                       }
-                               }
-                               break;
-                       case 0x15:      /* XSIR2 */
-                               DEBUG("XSIR2");
-                               if (read(xsvf_fd, buf2, 2) < 0)
-                                       do_abort = 1;
-                               else
-                               {
-                                       u8 *ir_buf;
-                                       us = be_to_h_u16(buf2);
-                                       ir_buf = malloc((us + 7) / 8);
-                                       if (xsvf_read_buffer(us, xsvf_fd, ir_buf) != ERROR_OK)
-                                               do_abort = 1;
-                                       else
-                                       {
-                                               scan_field_t field;
-                                               field.device = device;
-                                               field.num_bits = us;
-                                               field.out_value = ir_buf;
-                                               field.out_mask = NULL;
-                                               field.in_value = NULL;
-                                               field.in_check_value = NULL;
-                                               field.in_check_mask = NULL;
-                                               field.in_handler = NULL;
-                                               field.in_handler_priv = NULL;
-                                               if (device == -1)
-                                                       jtag_add_plain_ir_scan(1, &field, xsvf_to_tap[xendir], NULL);
-                                               else
-                                                       jtag_add_ir_scan(1, &field, xsvf_to_tap[xendir], NULL);
-                                       }
-                                       free(ir_buf);
-                               }
-                               break;
-                       case 0x16:      /* XCOMMENT */
-                               do
-                               {
-                                       if (read(xsvf_fd, &c, 1) < 0)
-                                       {
-                                               do_abort = 1;
-                                               break;
-                                       }
-                               } while (c != 0);
-                               break;
-                       case 0x17:      /* XWAIT */
-                               DEBUG("XWAIT");
-                               if ((read(xsvf_fd, &uc, 1) < 0) || (read(xsvf_fd, &uc2, 1) < 0) || (read(xsvf_fd, buf4, 4) < 0))
-                                       do_abort = 1;
-                               else
-                               {
-                                       jtag_add_statemove(xsvf_to_tap[uc]);
-                                       ui = be_to_h_u32(buf4);
-                                       jtag_add_sleep(ui);
-                                       jtag_add_statemove(xsvf_to_tap[uc2]);
-                               }
-                               break;
-                       default:
-                               printf("unknown xsvf command (0x%2.2x)\n", c);
-                               unsupported = 1;
-               }
-
-               if (do_abort || unsupported || tdo_mismatch)
-                       break;
-       }
-       
-       if (tdo_mismatch)
-       {
-               command_print(cmd_ctx, "TDO mismatch, aborting");
-               jtag_cancel_queue();
-               return ERROR_OK;
-       }
-
-       if (unsupported)
-       {
-               command_print(cmd_ctx, "unsupported xsvf command encountered, aborting");
-               jtag_cancel_queue();
-               return ERROR_OK;
-       }
-
-       if (do_abort)
-       {
-               command_print(cmd_ctx, "premature end detected, aborting");
-               jtag_cancel_queue();
-               return ERROR_OK;
-       }
-       
-       if (dr_out_buf)
-               free(dr_out_buf);
-       
-       if (dr_in_buf)
-               free(dr_in_buf);
-       
-       if (dr_in_mask)
-               free(dr_in_mask);
-
-       close(xsvf_fd);
-       
-       command_print(cmd_ctx, "XSVF file programmed successfully");
-
-       return ERROR_OK;
-}
+/***************************************************************************\r
+ *   Copyright (C) 2005 by Dominic Rath                                    *\r
+ *   Dominic.Rath@gmx.de                                                   *\r
+ *                                                                         *\r
+ *   This program is free software; you can redistribute it and/or modify  *\r
+ *   it under the terms of the GNU General Public License as published by  *\r
+ *   the Free Software Foundation; either version 2 of the License, or     *\r
+ *   (at your option) any later version.                                   *\r
+ *                                                                         *\r
+ *   This program is distributed in the hope that it will be useful,       *\r
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *\r
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *\r
+ *   GNU General Public License for more details.                          *\r
+ *                                                                         *\r
+ *   You should have received a copy of the GNU General Public License     *\r
+ *   along with this program; if not, write to the                         *\r
+ *   Free Software Foundation, Inc.,                                       *\r
+ *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *\r
+ ***************************************************************************/\r
+#ifdef HAVE_CONFIG_H\r
+#include "config.h"\r
+#endif\r
+\r
+#include "xsvf.h"\r
+\r
+#include "jtag.h"\r
+#include "command.h"\r
+#include "log.h"\r
+\r
+#include <stdlib.h>\r
+#include <unistd.h>\r
+#include <sys/types.h>\r
+#include <sys/stat.h>\r
+#include <fcntl.h>\r
+#include <string.h>\r
+\r
+#include <sys/time.h>\r
+#include <time.h>\r
+\r
+#define XSTATE_MAX_PATH (12)\r
+\r
+int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);\r
+\r
+int xsvf_fd = 0;\r
+\r
+u8 *dr_out_buf;        /* from host to device (TDI) */\r
+u8 *dr_in_buf; /* from device to host (TDO) */\r
+u8 *dr_in_mask;\r
+\r
+int xsdrsize = 0;\r
+int xruntest = 0;      /* number of TCK cycles / microseconds */\r
+int xrepeat = 0x20; /* number of XC9500 retries */\r
+\r
+int xendir = 0;\r
+int xenddr = 0;\r
+\r
+enum tap_state xsvf_to_tap[] =\r
+{\r
+       TAP_TLR, TAP_RTI,\r
+       TAP_SDS, TAP_CD, TAP_SD, TAP_E1D, TAP_PD, TAP_E2D, TAP_UD,\r
+       TAP_SIS, TAP_CI, TAP_SI, TAP_E1I, TAP_PI, TAP_E2I, TAP_UI,\r
+};\r
+\r
+int tap_to_xsvf[] =\r
+{\r
+       0x0, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x1, 0x9, 0xa, 0xb, 0xc, 0xe, 0xf\r
+};\r
+\r
+int xsvf_register_commands(struct command_context_s *cmd_ctx)\r
+{\r
+       register_command(cmd_ctx, NULL, "xsvf", handle_xsvf_command,\r
+               COMMAND_EXEC, "run xsvf <file>");\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+int xsvf_read_buffer(int num_bits, int fd, u8* buf)\r
+{\r
+       int num_bytes;\r
+\r
+       for (num_bytes = (num_bits + 7) / 8; num_bytes > 0; num_bytes--)\r
+       {\r
+               if (read(fd, buf + num_bytes - 1, 1) < 0)\r
+                       return ERROR_XSVF_EOF;\r
+       }\r
+\r
+       return ERROR_OK;\r
+}\r
+\r
+int xsvf_read_xstates(int fd, enum tap_state *path, int max_path, int *path_len)\r
+{\r
+       char c;\r
+       unsigned char uc;\r
+       \r
+       while ((read(fd, &c, 1) > 0) && (c == 0x12))\r
+       {\r
+               if (*path_len > max_path)\r
+               {\r
+                       WARNING("XSTATE path longer than max_path");\r
+                       break;\r
+               }\r
+               if (read(fd, &uc, 1) < 0)\r
+               {\r
+                       return ERROR_XSVF_EOF;\r
+               }\r
+               path[(*path_len)++] = xsvf_to_tap[uc];\r
+       }\r
+       \r
+       lseek(fd, -1, SEEK_CUR);\r
+       \r
+       return ERROR_OK;\r
+}\r
+\r
+int handle_xsvf_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)\r
+{\r
+       char c;\r
+       u8 buf4[4], buf2[2];\r
+       unsigned char uc, uc2;\r
+       unsigned int ui;\r
+       unsigned short us;\r
+\r
+       int do_abort = 0;\r
+       int unsupported = 0;\r
+       int tdo_mismatch = 0;\r
+       \r
+       int runtest_requires_tck = 0;\r
+       \r
+       int device = -1;        /* use -1 to indicate a "plain" xsvf file which accounts for additional devices in the scan chain, otherwise the device that should be affected */\r
+\r
+       if (argc < 2)\r
+       {\r
+               command_print(cmd_ctx, "usage: xsvf <device#|plain> <file> <variant>");\r
+               return ERROR_OK;\r
+       }\r
+\r
+       if (strcmp(args[0], "plain") != 0)\r
+       {\r
+               device = strtoul(args[0], NULL, 0);\r
+       }\r
+\r
+       if ((xsvf_fd = open(args[1], O_RDONLY)) < 0)\r
+       {\r
+               command_print(cmd_ctx, "file %s not found", args[0]);\r
+               return ERROR_OK;\r
+       }\r
+       \r
+       if ((argc > 2) && (strcmp(args[2], "virt2") == 0))\r
+       {\r
+               runtest_requires_tck = 1;\r
+       }\r
+\r
+       while (read(xsvf_fd, &c, 1) > 0)\r
+       {\r
+               switch (c)\r
+               {\r
+                       case 0x00:      /* XCOMPLETE */\r
+                               DEBUG("XCOMPLETE");\r
+                               if (jtag_execute_queue() != ERROR_OK)\r
+                               {\r
+                                       tdo_mismatch = 1;\r
+                                       break;  \r
+                               }\r
+                               break;\r
+                       case 0x01:      /* XTDOMASK */\r
+                               DEBUG("XTDOMASK");\r
+                               if (dr_in_mask && (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_mask) != ERROR_OK))\r
+                                       do_abort = 1;\r
+                               break;\r
+                       case 0x02:      /* XSIR */\r
+                               DEBUG("XSIR");\r
+                               if (read(xsvf_fd, &c, 1) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       u8 *ir_buf = malloc((c + 7) / 8);\r
+                                       if (xsvf_read_buffer(c, xsvf_fd, ir_buf) != ERROR_OK)\r
+                                               do_abort = 1;\r
+                                       else\r
+                                       {\r
+                                               scan_field_t field;\r
+                                               field.device = device;\r
+                                               field.num_bits = c;\r
+                                               field.out_value = ir_buf;\r
+                                               field.out_mask = NULL;\r
+                                               field.in_value = NULL;\r
+                                               field.in_check_value = NULL;\r
+                                               field.in_check_mask = NULL;\r
+                                               field.in_handler = NULL;\r
+                                               field.in_handler_priv = NULL;\r
+                                               if (device == -1)\r
+                                                       jtag_add_plain_ir_scan(1, &field, TAP_PI, NULL);\r
+                                               else\r
+                                                       jtag_add_ir_scan(1, &field, TAP_PI, NULL);\r
+                                               if (jtag_execute_queue() != ERROR_OK)\r
+                                               {\r
+                                                       tdo_mismatch = 1;\r
+                                                       free(ir_buf);\r
+                                                       break;\r
+                                               }\r
+                                               if (xruntest)\r
+                                               {\r
+                                                       if (runtest_requires_tck)\r
+                                                               jtag_add_runtest(xruntest, xsvf_to_tap[xendir]);\r
+                                                       else\r
+                                                       {\r
+                                                               jtag_add_statemove(TAP_RTI);\r
+                                                               jtag_add_sleep(xruntest);\r
+                                                               jtag_add_statemove(xsvf_to_tap[xendir]);\r
+                                                       }\r
+                                               }\r
+                                               else if (xendir != 0xd) /* Pause-IR */\r
+                                                       jtag_add_statemove(xsvf_to_tap[xendir]);\r
+                                       }\r
+                                       free(ir_buf);\r
+                               }\r
+                               break;\r
+                       case 0x03:      /* XSDR */\r
+                               DEBUG("XSDR");\r
+                               if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       scan_field_t field;\r
+                                       field.device = device;\r
+                                       field.num_bits = xsdrsize;\r
+                                       field.out_value = dr_out_buf;\r
+                                       field.out_mask = NULL;\r
+                                       field.in_value = NULL;\r
+                                       jtag_set_check_value(&field, dr_in_buf, dr_in_mask, NULL);\r
+                                       if (device == -1)\r
+                                               jtag_add_plain_dr_scan(1, &field, TAP_PD, NULL);\r
+                                       else\r
+                                               jtag_add_dr_scan(1, &field, TAP_PD, NULL);\r
+                                       if (jtag_execute_queue() != ERROR_OK)\r
+                                       {\r
+                                               tdo_mismatch = 1;\r
+                                               break;  \r
+                                       }\r
+                                       if (xruntest)\r
+                                       {\r
+                                               if (runtest_requires_tck)\r
+                                                       jtag_add_runtest(xruntest, xsvf_to_tap[xenddr]);\r
+                                               else\r
+                                               {\r
+                                                       jtag_add_statemove(TAP_RTI);\r
+                                                       jtag_add_sleep(xruntest);\r
+                                                       jtag_add_statemove(xsvf_to_tap[xenddr]);\r
+                                               }\r
+                                       }\r
+                                       else if (xendir != 0x6) /* Pause-DR */\r
+                                               jtag_add_statemove(xsvf_to_tap[xenddr]);\r
+                               }\r
+                               break;\r
+                       case 0x04:      /* XRUNTEST */\r
+                               DEBUG("XRUNTEST");\r
+                               if (read(xsvf_fd, buf4, 4) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       xruntest = be_to_h_u32(buf4);\r
+                               }\r
+                               break;\r
+                       case 0x07:      /* XREPEAT */\r
+                               DEBUG("XREPEAT");\r
+                               if (read(xsvf_fd, &c, 1) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       xrepeat = c;\r
+                               }\r
+                               break;\r
+                       case 0x08:      /* XSDRSIZE */\r
+                               DEBUG("XSDRSIZE");\r
+                               if (read(xsvf_fd, buf4, 4) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       xsdrsize = be_to_h_u32(buf4);\r
+                                       free(dr_out_buf);\r
+                                       free(dr_in_buf);\r
+                                       free(dr_in_mask);\r
+                                       dr_out_buf = malloc((xsdrsize + 7) / 8);\r
+                                       dr_in_buf = malloc((xsdrsize + 7) / 8);\r
+                                       dr_in_mask = malloc((xsdrsize + 7) / 8);\r
+                               }\r
+                               break;\r
+                       case 0x09:      /* XSDRTDO */\r
+                               DEBUG("XSDRTDO");\r
+                               if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_out_buf) != ERROR_OK)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       if (xsvf_read_buffer(xsdrsize, xsvf_fd, dr_in_buf) != ERROR_OK)\r
+                                               do_abort = 1;\r
+                                       else\r
+                                       {\r
+                                               scan_field_t field;\r
+                                               field.device = device;\r
+                                               field.num_bits = xsdrsize;\r
+                                               field.out_value = dr_out_buf;\r
+                                               field.out_mask = NULL;\r
+                                               field.in_value = NULL;\r
+                                               jtag_set_check_value(&field, dr_in_buf, dr_in_mask, NULL);\r
+                                               if (device == -1)\r
+                                                       jtag_add_plain_dr_scan(1, &field, TAP_PD, NULL);\r
+                                               else\r
+                                                       jtag_add_dr_scan(1, &field, TAP_PD, NULL);\r
+                                               if (jtag_execute_queue() != ERROR_OK)\r
+                                               {\r
+                                                       tdo_mismatch = 1;\r
+                                                       break;  \r
+                                               }\r
+                                               if (xruntest)\r
+                                               {\r
+                                                       if (runtest_requires_tck)\r
+                                                               jtag_add_runtest(xruntest, xsvf_to_tap[xenddr]);\r
+                                                       else\r
+                                                       {\r
+                                                               jtag_add_statemove(TAP_RTI);\r
+                                                               jtag_add_sleep(xruntest);\r
+                                                               jtag_add_statemove(xsvf_to_tap[xenddr]);\r
+                                                       }\r
+                                               }\r
+                                               else if (xendir != 0x6) /* Pause-DR */\r
+                                                       jtag_add_statemove(xsvf_to_tap[xenddr]);\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case 0x0a:      /* XSETDRMASKS */\r
+                               ERROR("unsupported XSETSDRMASKS\n");\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x0b:      /* XSDRINC */\r
+                               ERROR("unsupported XSDRINC\n");\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x0c:      /* XSDRB */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x0d:      /* XSDRC */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x0e:      /* XSDRE */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x0f:      /* XSDRTDOB */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x10:      /* XSDRTDOB */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x11:      /* XSDRTDOB */\r
+                               unsupported = 1;\r
+                               break;\r
+                       case 0x12:      /* XSTATE */\r
+                               DEBUG("XSTATE");\r
+                               if (read(xsvf_fd, &uc, 1) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       enum tap_state *path = calloc(XSTATE_MAX_PATH, 4);\r
+                                       int path_len = 1;\r
+                                       path[0] = xsvf_to_tap[uc];\r
+                                       if (xsvf_read_xstates(xsvf_fd, path, XSTATE_MAX_PATH, &path_len) != ERROR_OK)\r
+                                               do_abort = 1;\r
+                                       else\r
+                                       {\r
+                                               jtag_add_pathmove(path_len, path);\r
+                                       }\r
+                                       free(path);\r
+                               }\r
+                               break;\r
+                       case 0x13:      /* XENDIR */\r
+                               DEBUG("XENDIR");\r
+                               if (read(xsvf_fd, &c, 1) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       if (c == 0)\r
+                                               xendir = 1;\r
+                                       else if (c == 1)\r
+                                               xendir = 0xd;\r
+                                       else\r
+                                       {\r
+                                               ERROR("unknown XENDIR endstate");\r
+                                               unsupported = 1;\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case 0x14:      /* XENDDR */\r
+                               DEBUG("XENDDR");\r
+                               if (read(xsvf_fd, &c, 1) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       if (c == 0)\r
+                                               xenddr = 1;\r
+                                       else if (c == 1)\r
+                                               xenddr = 0x6;\r
+                                       else\r
+                                       {\r
+                                               ERROR("unknown XENDDR endstate");\r
+                                               unsupported = 1;\r
+                                       }\r
+                               }\r
+                               break;\r
+                       case 0x15:      /* XSIR2 */\r
+                               DEBUG("XSIR2");\r
+                               if (read(xsvf_fd, buf2, 2) < 0)\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       u8 *ir_buf;\r
+                                       us = be_to_h_u16(buf2);\r
+                                       ir_buf = malloc((us + 7) / 8);\r
+                                       if (xsvf_read_buffer(us, xsvf_fd, ir_buf) != ERROR_OK)\r
+                                               do_abort = 1;\r
+                                       else\r
+                                       {\r
+                                               scan_field_t field;\r
+                                               field.device = device;\r
+                                               field.num_bits = us;\r
+                                               field.out_value = ir_buf;\r
+                                               field.out_mask = NULL;\r
+                                               field.in_value = NULL;\r
+                                               field.in_check_value = NULL;\r
+                                               field.in_check_mask = NULL;\r
+                                               field.in_handler = NULL;\r
+                                               field.in_handler_priv = NULL;\r
+                                               if (device == -1)\r
+                                                       jtag_add_plain_ir_scan(1, &field, xsvf_to_tap[xendir], NULL);\r
+                                               else\r
+                                                       jtag_add_ir_scan(1, &field, xsvf_to_tap[xendir], NULL);\r
+                                       }\r
+                                       free(ir_buf);\r
+                               }\r
+                               break;\r
+                       case 0x16:      /* XCOMMENT */\r
+                               do\r
+                               {\r
+                                       if (read(xsvf_fd, &c, 1) < 0)\r
+                                       {\r
+                                               do_abort = 1;\r
+                                               break;\r
+                                       }\r
+                               } while (c != 0);\r
+                               break;\r
+                       case 0x17:      /* XWAIT */\r
+                               DEBUG("XWAIT");\r
+                               if ((read(xsvf_fd, &uc, 1) < 0) || (read(xsvf_fd, &uc2, 1) < 0) || (read(xsvf_fd, buf4, 4) < 0))\r
+                                       do_abort = 1;\r
+                               else\r
+                               {\r
+                                       jtag_add_statemove(xsvf_to_tap[uc]);\r
+                                       ui = be_to_h_u32(buf4);\r
+                                       jtag_add_sleep(ui);\r
+                                       jtag_add_statemove(xsvf_to_tap[uc2]);\r
+                               }\r
+                               break;\r
+                       default:\r
+                               ERROR("unknown xsvf command (0x%2.2x)\n", c);\r
+                               unsupported = 1;\r
+               }\r
+\r
+               if (do_abort || unsupported || tdo_mismatch)\r
+                       break;\r
+       }\r
+       \r
+       if (tdo_mismatch)\r
+       {\r
+               command_print(cmd_ctx, "TDO mismatch, aborting");\r
+               jtag_cancel_queue();\r
+               return ERROR_OK;\r
+       }\r
+\r
+       if (unsupported)\r
+       {\r
+               command_print(cmd_ctx, "unsupported xsvf command encountered, aborting");\r
+               jtag_cancel_queue();\r
+               return ERROR_OK;\r
+       }\r
+\r
+       if (do_abort)\r
+       {\r
+               command_print(cmd_ctx, "premature end detected, aborting");\r
+               jtag_cancel_queue();\r
+               return ERROR_OK;\r
+       }\r
+       \r
+       if (dr_out_buf)\r
+               free(dr_out_buf);\r
+       \r
+       if (dr_in_buf)\r
+               free(dr_in_buf);\r
+       \r
+       if (dr_in_mask)\r
+               free(dr_in_mask);\r
+\r
+       close(xsvf_fd);\r
+       \r
+       command_print(cmd_ctx, "XSVF file programmed successfully");\r
+\r
+       return ERROR_OK;\r
+}\r

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)