From: Szymon Janc <szymon.janc@codecoup.pl>
To: linux-bluetooth@vger.kernel.org
Cc: Andrzej Kaczmarek <andrzej.kaczmarek@codecoup.pl>
Subject: [PATCH V3 3/3] monitor: Add support for reading over J-Link RTT
Date: Fri, 4 Oct 2019 07:43:34 +0200 [thread overview]
Message-ID: <20191004054334.5479-3-szymon.janc@codecoup.pl> (raw)
In-Reply-To: <20191004054334.5479-1-szymon.janc@codecoup.pl>
From: Andrzej Kaczmarek <andrzej.kaczmarek@codecoup.pl>
This patch adds support for reading data over J-Link RTT. It can be
used as replacement for TTY when reading from embedded devices since
it's much faster and does block a UART. Data format is the same as
for TTY. At the moment monitor over RTT is only supported by Apache
Mynewt project.
Reading data is done by polling RTT every 1 msec since there is no
blocking API to read something from RTT buffer.
To enable reading from RTT, J-Link configuration needs to be passed via
command line (all parameters except <device> can be skipped to use
default value):
-J <device>,<serialno=0>,<interface=swd>,<speed=1000>
-J nrf52,683649029
In some cases J-Link cannot locate RTT buffer in RAM. In such case
RAM area and buffer name should be provided via command line:
-R <address=0x0>,<area=0x1000>,<buffer=monitor>
-R 0x20000000,0x10000
---
Makefile.tools | 3 ++-
monitor/control.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++
monitor/control.h | 1 +
monitor/main.c | 21 ++++++++++++++++++--
4 files changed, 72 insertions(+), 3 deletions(-)
diff --git a/Makefile.tools b/Makefile.tools
index 81ed2e30d..7ce05b7ef 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -42,9 +42,10 @@ monitor_btmon_SOURCES = monitor/main.c monitor/bt.h \
monitor/analyze.h monitor/analyze.c \
monitor/intel.h monitor/intel.c \
monitor/broadcom.h monitor/broadcom.c \
+ monitor/jlink.h monitor/jlink.c \
monitor/tty.h
monitor_btmon_LDADD = lib/libbluetooth-internal.la \
- src/libshared-mainloop.la $(UDEV_LIBS)
+ src/libshared-mainloop.la $(UDEV_LIBS) -ldl
endif
if LOGGER
diff --git a/monitor/control.c b/monitor/control.c
index 4022e7644..1e9054db3 100644
--- a/monitor/control.c
+++ b/monitor/control.c
@@ -57,6 +57,7 @@
#include "ellisys.h"
#include "tty.h"
#include "control.h"
+#include "jlink.h"
static struct btsnoop *btsnoop_file = NULL;
static bool hcidump_fallback = false;
@@ -1416,6 +1417,55 @@ int control_tty(const char *path, unsigned int speed)
return 0;
}
+static void rtt_callback(int id, void *user_data)
+{
+ struct control_data *data = user_data;
+ ssize_t len;
+
+ do {
+ len = jlink_rtt_read(data->buf + data->offset,
+ sizeof(data->buf) - data->offset);
+ data->offset += len;
+ process_data(data);
+ } while (len > 0);
+
+ if (mainloop_modify_timeout(id, 1) < 0)
+ mainloop_exit_failure();
+}
+
+int control_rtt(char *jlink, char *rtt)
+{
+ struct control_data *data;
+
+ if (jlink_init() < 0) {
+ fprintf(stderr, "Failed to initialize J-Link library\n");
+ return -EIO;
+ }
+
+ if (jlink_connect(jlink) < 0) {
+ fprintf(stderr, "Failed to connect to target device\n");
+ return -ENODEV;
+ }
+
+ if (jlink_start_rtt(rtt) < 0) {
+ fprintf(stderr, "Failed to initialize RTT\n");
+ return -ENODEV;
+ }
+
+ printf("--- RTT opened ---\n");
+
+ data = new0(struct control_data, 1);
+ data->channel = HCI_CHANNEL_MONITOR;
+ data->fd = -1;
+
+ if (mainloop_add_timeout(1, rtt_callback, data, free_data) < 0) {
+ free(data);
+ return -EIO;
+ }
+
+ return 0;
+}
+
bool control_writer(const char *path)
{
btsnoop_file = btsnoop_create(path, 0, 0, BTSNOOP_FORMAT_MONITOR);
diff --git a/monitor/control.h b/monitor/control.h
index a9691e32f..ddf485f1f 100644
--- a/monitor/control.h
+++ b/monitor/control.h
@@ -28,6 +28,7 @@ bool control_writer(const char *path);
void control_reader(const char *path, bool pager);
void control_server(const char *path);
int control_tty(const char *path, unsigned int speed);
+int control_rtt(char *jlink, char *rtt);
int control_tracing(void);
void control_disable_decoding(void);
void control_filter_index(uint16_t index);
diff --git a/monitor/main.c b/monitor/main.c
index acd44a098..479df859c 100644
--- a/monitor/main.c
+++ b/monitor/main.c
@@ -75,6 +75,10 @@ static void usage(void)
"\t-A, --a2dp Dump A2DP stream traffic\n"
"\t-E, --ellisys [ip] Send Ellisys HCI Injection\n"
"\t-P, --no-pager Disable pager usage\n"
+ "\t-J --jlink <device>,[<serialno>],[<interface>],[<speed>]\n"
+ "\t Read data from RTT\n"
+ "\t-R --rtt [<address>],[<area>],[<name>]\n"
+ "\t RTT control block parameters\n"
"\t-h, --help Show help options\n");
}
@@ -94,6 +98,8 @@ static const struct option main_options[] = {
{ "a2dp", no_argument, NULL, 'A' },
{ "ellisys", required_argument, NULL, 'E' },
{ "no-pager", no_argument, NULL, 'P' },
+ { "jlink", required_argument, NULL, 'J' },
+ { "rtt", required_argument, NULL, 'R' },
{ "todo", no_argument, NULL, '#' },
{ "version", no_argument, NULL, 'v' },
{ "help", no_argument, NULL, 'h' },
@@ -112,6 +118,8 @@ int main(int argc, char *argv[])
unsigned int tty_speed = B115200;
unsigned short ellisys_port = 0;
const char *str;
+ char *jlink = NULL;
+ char *rtt = NULL;
int exit_status;
mainloop_init();
@@ -122,7 +130,7 @@ int main(int argc, char *argv[])
int opt;
struct sockaddr_un addr;
- opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:V:tTSAEPvh",
+ opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:V:tTSAE:PJ:R:vh",
main_options, NULL);
if (opt < 0)
break;
@@ -194,6 +202,12 @@ int main(int argc, char *argv[])
case 'P':
use_pager = false;
break;
+ case 'J':
+ jlink = optarg;
+ break;
+ case 'R':
+ rtt = optarg;
+ break;
case '#':
packet_todo();
lmp_todo();
@@ -246,12 +260,15 @@ int main(int argc, char *argv[])
if (ellisys_server)
ellisys_enable(ellisys_server, ellisys_port);
- if (!tty && control_tracing() < 0)
+ if (!tty && !jlink && control_tracing() < 0)
return EXIT_FAILURE;
if (tty && control_tty(tty, tty_speed) < 0)
return EXIT_FAILURE;
+ if (jlink && control_rtt(jlink, rtt) < 0)
+ return EXIT_FAILURE;
+
exit_status = mainloop_run_with_signal(signal_callback, NULL);
keys_cleanup();
--
2.21.0
next prev parent reply other threads:[~2019-10-04 5:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-04 5:43 [PATCH V3 1/3] monitor: Extract TTY data processing to separate function Szymon Janc
2019-10-04 5:43 ` [PATCH V3 2/3] monitor: Add interface for J-Link library Szymon Janc
2019-10-04 5:43 ` Szymon Janc [this message]
2019-10-14 10:15 ` [PATCH V3 1/3] monitor: Extract TTY data processing to separate function Szymon Janc
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191004054334.5479-3-szymon.janc@codecoup.pl \
--to=szymon.janc@codecoup.pl \
--cc=andrzej.kaczmarek@codecoup.pl \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).