#include "ellisys.h"
#include "tty.h"
#include "control.h"
+#include "jlink.h"
static struct btsnoop *btsnoop_file = NULL;
static bool hcidump_fallback = false;
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;
+}
+
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
bool control_writer(const char *path, int16_t rotate_count, ssize_t file_size)
#else
"\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"
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
"\t-C, --count <num> Save traces by <num> rotation\n"
"\t-W, --size <num> Save traces at most <num> size\n"
{ "size", required_argument, NULL, 'W' },
#endif
{ "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' },
ssize_t file_size = -1;
#endif
const char *str;
+ char *jlink = NULL;
+ char *rtt = NULL;
int exit_status;
mainloop_init();
opt = getopt_long(argc, argv, "d:r:w:a:s:p:i:tTSE:C:W:vh",
main_options, NULL);
#else
- opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:V:tTSAEPvh",
- main_options, NULL);
+ opt = getopt_long(argc, argv, "r:w:a:s:p:i:d:B:V:tTSAE:PJ:R:vh",
+ main_options, NULL);
#endif
if (opt < 0)
break;
file_size = atoll(optarg);
break;
#endif
+ case 'J':
+ jlink = optarg;
+ break;
+ case 'R':
+ rtt = optarg;
+ break;
case '#':
packet_todo();
lmp_todo();
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();