nit: do not add \n at end of LOG_ERROR
[fw/openocd] / src / xsvf / xsvf.c
index 2e78447acc148b7c5072c1c0d1bd1f8ec7e536d2..31c39499380c494dbd71d6df9bbd9137abe43193 100644 (file)
@@ -41,8 +41,8 @@
 #endif
 
 #include "xsvf.h"
-#include "jtag.h"
-#include "svf.h"
+#include <jtag/jtag.h>
+#include <svf/svf.h>
 
 
 /* XSVF commands, from appendix B of xapp503.pdf  */
@@ -219,40 +219,40 @@ COMMAND_HANDLER(handle_xsvf_command)
        */
        struct jtag_tap *tap = NULL;
 
-       if (argc < 2)
+       if (CMD_ARGC < 2)
        {
-               command_print(cmd_ctx, "usage: xsvf <device#|plain> <file> [<variant>] [quiet]");
+               command_print(CMD_CTX, "usage: xsvf <device#|plain> <file> [<variant>] [quiet]");
                return ERROR_FAIL;
        }
 
-       /* we mess with args starting point below, snapshot filename here */
-       const char *filename = args[1];
+       /* we mess with CMD_ARGV starting point below, snapshot filename here */
+       const char *filename = CMD_ARGV[1];
 
-       if (strcmp(args[0], "plain") != 0)
+       if (strcmp(CMD_ARGV[0], "plain") != 0)
        {
-               tap = jtag_tap_by_string(args[0]);
+               tap = jtag_tap_by_string(CMD_ARGV[0]);
                if (!tap)
                {
-                       command_print(cmd_ctx, "Tap: %s unknown", args[0]);
+                       command_print(CMD_CTX, "Tap: %s unknown", CMD_ARGV[0]);
                        return ERROR_FAIL;
                }
        }
 
        if ((xsvf_fd = open(filename, O_RDONLY)) < 0)
        {
-               command_print(cmd_ctx, "file \"%s\" not found", filename);
+               command_print(CMD_CTX, "file \"%s\" not found", filename);
                return ERROR_FAIL;
        }
 
        /* if this argument is present, then interpret xruntest counts as TCK cycles rather than as usecs */
-       if ((argc > 2) && (strcmp(args[2], "virt2") == 0))
+       if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "virt2") == 0))
        {
                runtest_requires_tck = 1;
-               --argc;
-               ++args;
+               --CMD_ARGC;
+               ++CMD_ARGV;
        }
 
-       if ((argc > 2) && (strcmp(args[2], "quiet") == 0))
+       if ((CMD_ARGC > 2) && (strcmp(CMD_ARGV[2], "quiet") == 0))
        {
                verbose = 0;
        }
@@ -269,7 +269,6 @@ COMMAND_HANDLER(handle_xsvf_command)
                 */
                if (collecting_path) {
                        tap_state_t     mystate;
-                       uint8_t         uc;
 
                        switch (opcode) {
                        case XCOMMENT:
@@ -332,7 +331,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                else
                                        jtag_add_pathmove(pathlen, path);
 
-                               result = jtag_get_error();
+                               result = jtag_execute_queue();
                                if (result != ERROR_OK) {
                                        LOG_ERROR("XSVF: pathmove error %d",
                                                        result);
@@ -470,21 +469,21 @@ COMMAND_HANDLER(handle_xsvf_command)
                                                        TAP_IDLE,
                                                };
 
-                                               jtag_add_pathmove(DIM(exception_path), exception_path);
+                                               jtag_add_pathmove(ARRAY_SIZE(exception_path), exception_path);
 
                                                if (verbose)
                                                        LOG_USER("%s mismatch, xsdrsize=%d retry=%d", op_name, xsdrsize, attempt);
                                        }
 
-                                       field.tap = tap;
                                        field.num_bits = xsdrsize;
                                        field.out_value = dr_out_buf;
                                        field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
+                                                               TAP_DRPAUSE);
                                        else
-                                               jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -523,49 +522,48 @@ COMMAND_HANDLER(handle_xsvf_command)
                        break;
 
                case XSETSDRMASKS:
-                       LOG_ERROR("unsupported XSETSDRMASKS\n");
+                       LOG_ERROR("unsupported XSETSDRMASKS");
                        unsupported = 1;
                        break;
 
                case XSDRINC:
-                       LOG_ERROR("unsupported XSDRINC\n");
+                       LOG_ERROR("unsupported XSDRINC");
                        unsupported = 1;
                        break;
 
                case XSDRB:
-                       LOG_ERROR("unsupported XSDRB\n");
+                       LOG_ERROR("unsupported XSDRB");
                        unsupported = 1;
                        break;
 
                case XSDRC:
-                       LOG_ERROR("unsupported XSDRC\n");
+                       LOG_ERROR("unsupported XSDRC");
                        unsupported = 1;
                        break;
 
                case XSDRE:
-                       LOG_ERROR("unsupported XSDRE\n");
+                       LOG_ERROR("unsupported XSDRE");
                        unsupported = 1;
                        break;
 
                case XSDRTDOB:
-                       LOG_ERROR("unsupported XSDRTDOB\n");
+                       LOG_ERROR("unsupported XSDRTDOB");
                        unsupported = 1;
                        break;
 
                case XSDRTDOC:
-                       LOG_ERROR("unsupported XSDRTDOC\n");
+                       LOG_ERROR("unsupported XSDRTDOC");
                        unsupported = 1;
                        break;
 
                case XSDRTDOE:
-                       LOG_ERROR("unsupported XSDRTDOE\n");
+                       LOG_ERROR("unsupported XSDRTDOE");
                        unsupported = 1;
                        break;
 
                case XSTATE:
                        {
                                tap_state_t     mystate;
-                               uint8_t                 uc;
 
                                if (read(xsvf_fd, &uc, 1) < 0)
                                {
@@ -694,7 +692,6 @@ COMMAND_HANDLER(handle_xsvf_command)
                                {
                                        struct scan_field field;
 
-                                       field.tap = tap;
                                        field.num_bits = bitcount;
                                        field.out_value = ir_buf;
 
@@ -704,9 +701,10 @@ COMMAND_HANDLER(handle_xsvf_command)
 
 
                                        if (tap == NULL)
-                                               jtag_add_plain_ir_scan(1, &field, my_end_state);
+                                               jtag_add_plain_ir_scan(field.num_bits,
+                                                               field.out_value, field.in_value, my_end_state);
                                        else
-                                               jtag_add_ir_scan(1, &field, my_end_state);
+                                               jtag_add_ir_scan(tap, &field, my_end_state);
 
                                        if (xruntest)
                                        {
@@ -762,7 +760,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                   XWAIT <uint8_t wait_state> <uint8_t end_state> <uint32_t usecs>
                                */
 
-                               uint8_t wait;
+                               uint8_t wait_local;
                                uint8_t end;
                                uint8_t delay_buf[4];
 
@@ -770,7 +768,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                tap_state_t end_state;
                                int     delay;
 
-                               if (read(xsvf_fd, &wait, 1) < 0
+                               if (read(xsvf_fd, &wait_local, 1) < 0
                                  || read(xsvf_fd, &end, 1) < 0
                                  || read(xsvf_fd, delay_buf, 4) < 0)
                                {
@@ -778,7 +776,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        break;
                                }
 
-                               wait_state = xsvf_to_tap(wait);
+                               wait_state = xsvf_to_tap(wait_local);
                                end_state  = xsvf_to_tap(end);
                                delay      = be_to_h_u32(delay_buf);
 
@@ -806,14 +804,14 @@ COMMAND_HANDLER(handle_xsvf_command)
 
                                uint8_t  clock_buf[4];
                                uint8_t usecs_buf[4];
-                               uint8_t wait;
+                               uint8_t wait_local;
                                uint8_t end;
                                tap_state_t wait_state;
                                tap_state_t end_state;
                                int clock_count;
                                int usecs;
 
-                               if (read(xsvf_fd, &wait, 1) < 0
+                               if (read(xsvf_fd, &wait_local, 1) < 0
                                 ||  read(xsvf_fd, &end, 1) < 0
                                 ||  read(xsvf_fd, clock_buf, 4) < 0
                                 ||  read(xsvf_fd, usecs_buf, 4) < 0)
@@ -822,7 +820,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        break;
                                }
 
-                               wait_state = xsvf_to_tap(wait);
+                               wait_state = xsvf_to_tap(wait_local);
                                end_state  = xsvf_to_tap(end);
 
                                clock_count = be_to_h_u32(clock_buf);
@@ -930,7 +928,6 @@ COMMAND_HANDLER(handle_xsvf_command)
                                        jtag_add_clocks(loop_clocks);
                                        jtag_add_sleep(loop_usecs);
 
-                                       field.tap = tap;
                                        field.num_bits = xsdrsize;
                                        field.out_value = dr_out_buf;
                                        field.in_value = calloc(DIV_ROUND_UP(field.num_bits, 8), 1);
@@ -939,9 +936,10 @@ COMMAND_HANDLER(handle_xsvf_command)
                                                LOG_USER("LSDR retry %d", attempt);
 
                                        if (tap == NULL)
-                                               jtag_add_plain_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value,
+                                                               TAP_DRPAUSE);
                                        else
-                                               jtag_add_dr_scan(1, &field, jtag_set_end_state(TAP_DRPAUSE));
+                                               jtag_add_dr_scan(tap, 1, &field, TAP_DRPAUSE);
 
                                        jtag_check_value_mask(&field, dr_in_buf, dr_in_mask);
 
@@ -995,7 +993,7 @@ COMMAND_HANDLER(handle_xsvf_command)
                        break;
 
                default:
-                       LOG_ERROR("unknown xsvf command (0x%02X)\n", uc);
+                       LOG_ERROR("unknown xsvf command (0x%02X)", uc);
                        unsupported = 1;
                }
 
@@ -1012,7 +1010,7 @@ COMMAND_HANDLER(handle_xsvf_command)
 
        if (tdo_mismatch)
        {
-               command_print(cmd_ctx, "TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
+               command_print(CMD_CTX, "TDO mismatch, somewhere near offset %lu in xsvf file, aborting",
                                          file_offset);
 
 
@@ -1022,7 +1020,7 @@ COMMAND_HANDLER(handle_xsvf_command)
        if (unsupported)
        {
                off_t offset = lseek(xsvf_fd, 0, SEEK_CUR) - 1;
-               command_print(cmd_ctx,
+               command_print(CMD_CTX,
                                "unsupported xsvf command (0x%02X) at offset %jd, aborting",
                                uc, (intmax_t)offset);
                return ERROR_FAIL;
@@ -1030,7 +1028,7 @@ COMMAND_HANDLER(handle_xsvf_command)
 
        if (do_abort)
        {
-               command_print(cmd_ctx, "premature end of xsvf file detected, aborting");
+               command_print(CMD_CTX, "premature end of xsvf file detected, aborting");
                return ERROR_FAIL;
        }
 
@@ -1045,18 +1043,28 @@ COMMAND_HANDLER(handle_xsvf_command)
 
        close(xsvf_fd);
 
-       command_print(cmd_ctx, "XSVF file programmed successfully");
+       command_print(CMD_CTX, "XSVF file programmed successfully");
 
        return ERROR_OK;
 }
 
+static const struct command_registration xsvf_command_handlers[] = {
+       {
+               .name = "xsvf",
+               .handler = handle_xsvf_command,
+               .mode = COMMAND_EXEC,
+               .help = "Runs a XSVF file.  If 'virt2' is given, xruntest "
+                       "counts are interpreted as TCK cycles rather than "
+                       "as microseconds.  Without the 'quiet' option, all "
+                       "comments, retries, and mismatches will be reported.",
+               .usage = "(tapname|'plain') filename ['virt2'] ['quiet']",
+       },
+       COMMAND_REGISTRATION_DONE
+};
+
 int xsvf_register_commands(struct command_context *cmd_ctx)
 {
-       register_command(cmd_ctx, NULL, "xsvf",
-                       &handle_xsvf_command, COMMAND_EXEC,
-                       "run xsvf <file> [virt2] [quiet]");
-
-       return ERROR_OK;
+       return register_commands(cmd_ctx, NULL, xsvf_command_handlers);
 }
 
 #if 0   /* this comment style used to try and keep uncrustify from adding * at begin of line */