.gitignore: remove cross-compile *-libtool
[fw/openocd] / contrib / itmdump.c
index 9d313ffbfe297d1d3901da11d989bb680d957f82..f31e1ff756aba9a6de653e1297af695eaff81823 100644 (file)
@@ -1,19 +1,6 @@
-/*
- * Copyright (C) 2010 by David Brownell
- *
- * 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 3 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, see <http://www.gnu.org/licenses/>.
- */
+/* SPDX-License-Identifier: GPL-3.0-or-later */
+
+/* Copyright (C) 2010 by David Brownell */
 
 /*
  * Simple utility to parse and dump ARM Cortex-M3 SWO trace output.  Once the
 
 #include <errno.h>
 #include <libgen.h>
-#include <stdio.h>
 #include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+unsigned int dump_swit;
 
 /* Example ITM trace word (0xWWXXYYZZ) parsing for task events, sent
  * on port 31 (Reserved for "the" RTOS in CMSIS v1.30)
@@ -59,6 +48,9 @@ static void show_task(int port, unsigned data)
        unsigned code = data >> 16;
        char buf[16];
 
+       if (dump_swit)
+               return;
+
        switch (code) {
        case 0:
                strcpy(buf, "run");
@@ -87,6 +79,9 @@ static void show_reserved(FILE *f, char *label, int c)
 {
        unsigned i;
 
+       if (dump_swit)
+               return;
+
        printf("%s - %#02x", label, c);
 
        for (i = 0; (c & 0x80) && i < 4; i++) {
@@ -105,7 +100,6 @@ static bool read_varlen(FILE *f, int c, unsigned *value)
 {
        unsigned size;
        unsigned char buf[4];
-       unsigned i;
 
        *value = 0;
 
@@ -136,17 +130,19 @@ static bool read_varlen(FILE *f, int c, unsigned *value)
 
 err:
        printf("(ERROR %d - %s)\n", errno, strerror(errno));
-       return;
+       return false;
 }
 
 static void show_hard(FILE *f, int c)
 {
        unsigned type = c >> 3;
        unsigned value;
-       unsigned size;
        char *label;
 
-       printf("DWT - ", type);
+       if (dump_swit)
+               return;
+
+       printf("DWT - ");
 
        if (!read_varlen(f, c, &value))
                return;
@@ -216,7 +212,7 @@ static void show_hard(FILE *f, int c)
                }
                break;
        default:
-               printf("UNDEFINED");
+               printf("UNDEFINED, rawtype: %x", type);
                break;
        }
 
@@ -241,19 +237,28 @@ struct {
 
 static void show_swit(FILE *f, int c)
 {
-       unsigned size;
        unsigned port = c >> 3;
-       unsigned char buf[4];
        unsigned value = 0;
        unsigned i;
 
-       printf("SWIT %u - ", port);
+       if (port + 1 == dump_swit) {
+               if (!read_varlen(f, c, &value))
+                       return;
+               printf("%c", value);
+               return;
+       }
 
        if (!read_varlen(f, c, &value))
                return;
+
+       if (dump_swit)
+               return;
+
+       printf("SWIT %u - ", port);
+
        printf("%#08x", value);
 
-       for (i = 0; i <= sizeof(format) / sizeof(format[0]); i++) {
+       for (i = 0; i < sizeof(format) / sizeof(format[0]); i++) {
                if (format[i].port == port) {
                        printf(", ");
                        format[i].show(port, value);
@@ -263,10 +268,6 @@ static void show_swit(FILE *f, int c)
 
        printf("\n");
        return;
-
-err:
-       printf("(ERROR %d - %s)\n", errno, strerror(errno));
-       return;
 }
 
 static void show_timestamp(FILE *f, int c)
@@ -275,6 +276,9 @@ static void show_timestamp(FILE *f, int c)
        char *label = "";
        bool delayed = false;
 
+       if (dump_swit)
+               return;
+
        printf("TIMESTAMP - ");
 
        /* Format 2: header only */
@@ -293,7 +297,7 @@ static void show_timestamp(FILE *f, int c)
        }
 
        /* Format 1:  one to four bytes of data too */
-       switch (c) {
+       switch (c >> 4) {
        default:
                label = ", reserved control\n";
                break;
@@ -309,7 +313,7 @@ static void show_timestamp(FILE *f, int c)
                delayed = true;
                break;
        case 0xf:
-               label = ", packet and timetamp delayed";
+               label = ", packet and timestamp delayed";
                delayed = true;
                break;
        }
@@ -356,7 +360,7 @@ int main(int argc, char **argv)
        int c;
 
        /* parse arguments */
-       while ((c = getopt(argc, argv, "f:")) != EOF) {
+       while ((c = getopt(argc, argv, "f:d:")) != EOF) {
                switch (c) {
                case 'f':
                        /* e.g. from UART connected to /dev/ttyUSB0 */
@@ -366,8 +370,10 @@ int main(int argc, char **argv)
                                return 1;
                        }
                        break;
+               case 'd':
+                       dump_swit = atoi(optarg);
+                       break;
                default:
-usage:
                        fprintf(stderr, "usage: %s [-f input]",
                                basename(argv[0]));
                        return 1;