From e7e13965782a114cca369a71382cd2dd2a7b8da0 Mon Sep 17 00:00:00 2001 From: Paul Fertser Date: Mon, 9 Feb 2015 16:51:33 +0300 Subject: contrib/itmdump: add a hack to allow direct dumping of specific SWIT, fix timestamp 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 Reviewed-on: http://openocd.zylin.com/2537 Tested-by: jenkins --- contrib/itmdump.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) (limited to 'contrib') diff --git a/contrib/itmdump.c b/contrib/itmdump.c index 71f6e06..8963894 100644 --- a/contrib/itmdump.c +++ b/contrib/itmdump.c @@ -44,6 +44,7 @@ #include #include +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])); -- cgit v1.1