contrib/itmdump: add a hack to allow direct dumping of specific SWIT, fix timestamp 37/2537/7
authorPaul Fertser <fercerpav@gmail.com>
Mon, 9 Feb 2015 13:51:33 +0000 (16:51 +0300)
committerPaul Fertser <fercerpav@gmail.com>
Thu, 16 Apr 2015 19:25:30 +0000 (20:25 +0100)
Currently itmdump is not a production-quality code hence this hack
seems to be appropriate.

More robust handling is possible with libswo-based swodec tool that's
available from http://git.zapb.de/ .

This adds a new command line option -d N where N is a stimulus number
you want to dump (counting from 1).

The idea here is that if you're interested to live-monitor just a
single stimulus port, you can use this utility directly. If one wants
to demultiplex the TPIU stream, the following is proposed:

1. Use https://gitorious.org/multiplex/multiplex utility that can
accept binary data from a file/pipe/stdin and arbitrary number of TCP
connections. It simply mirrors all the incoming data to all the
accepted connections;

2. Use socat to connect itmdump to the proxy mentioned in 1. and then
either dump the results to separate files or share via their dedicated
TCP ports.

Example script (inspired by http://openocd.zylin.com/#/c/1662/ ,
enables and disables specific itm ports on demand):

for i in `seq 0 31`; do
  while true; do
    socat -U TCP-LISTEN:$((8000+$i)),reuseaddr \
             SYSTEM:"echo itm port $i on | nc -q0 localhost 4444 > /dev/null; nc localhost 7777 | stdbuf -oL itmdump -d$((i+1))"
    echo itm port $i off | nc -q0 localhost 4444 > /dev/null
  done < /dev/null >&0 2>&0 &
done

Change-Id: Iaeb102436eaa5b106002083f2ffe758fb7bd83e5
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2537
Tested-by: jenkins
contrib/itmdump.c

index 71f6e06709529d4c92fd1f9d7189e1390cb7bc8f..896389416033ab212ffcc6793d3fdce0c1015f66 100644 (file)
@@ -44,6 +44,7 @@
 #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 +60,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 +91,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++) {
@@ -144,6 +151,9 @@ static void show_hard(FILE *f, int c)
        unsigned value;
        char *label;
 
+       if (dump_swit)
+               return;
+
        printf("DWT - ");
 
        if (!read_varlen(f, c, &value))
@@ -243,10 +253,21 @@ static void show_swit(FILE *f, int c)
        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++) {
@@ -267,6 +288,9 @@ static void show_timestamp(FILE *f, int c)
        char *label = "";
        bool delayed = false;
 
+       if (dump_swit)
+               return;
+
        printf("TIMESTAMP - ");
 
        /* Format 2: header only */
@@ -285,7 +309,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;
@@ -348,7 +372,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 */
@@ -358,6 +382,9 @@ int main(int argc, char **argv)
                                return 1;
                        }
                        break;
+               case 'd':
+                       dump_swit = atoi(optarg);
+                       break;
                default:
                        fprintf(stderr, "usage: %s [-f input]",
                                basename(argv[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)