diff options
author | Thiemo van Engelen <tvanengelen@victronenergy.com> | 2023-06-23 09:29:25 +0200 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2023-11-24 21:06:24 +0000 |
commit | 53e67c37abee6506bb06eaf0d50d4d9ce045c0c8 (patch) | |
tree | ce01bcb7ea8311f18dcf2adec7116783103be07a | |
parent | acde409ba07dfd692c2356fabdabab89f6e6a281 (diff) | |
download | riscv-openocd-53e67c37abee6506bb06eaf0d50d4d9ce045c0c8.zip riscv-openocd-53e67c37abee6506bb06eaf0d50d4d9ce045c0c8.tar.gz riscv-openocd-53e67c37abee6506bb06eaf0d50d4d9ce045c0c8.tar.bz2 |
rtt_server: Add option for a message when client connects
This is useful when using the SEGGER RTT tooling, as the SEGGER RTT
tool J-Link RTT Viewer version 7.84f requires that it receives a
messages immediately after connecting. Otherwise it will give a timeout
and it will not connect.
Change-Id: I9240a1b6a93cd5c0fbd18292afb33b89013d78bf
Signed-off-by: Thiemo van Engelen <tvanengelen@victronenergy.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/7752
Tested-by: jenkins
Reviewed-by: zapb <dev@zapb.de>
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
-rw-r--r-- | doc/openocd.texi | 5 | ||||
-rw-r--r-- | src/server/rtt_server.c | 24 |
2 files changed, 24 insertions, 5 deletions
diff --git a/doc/openocd.texi b/doc/openocd.texi index 5d73fd1..e8b207c 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -9448,8 +9448,9 @@ Return a list of all channels and their properties as Tcl list. The list can be manipulated easily from within scripts. @end deffn -@deffn {Command} {rtt server start} port channel -Start a TCP server on @var{port} for the channel @var{channel}. +@deffn {Command} {rtt server start} port channel [message] +Start a TCP server on @var{port} for the channel @var{channel}. When +@var{message} is not empty, it will be sent to a client when it connects. @end deffn @deffn {Command} {rtt server stop} port diff --git a/src/server/rtt_server.c b/src/server/rtt_server.c index df2247b..9769153 100644 --- a/src/server/rtt_server.c +++ b/src/server/rtt_server.c @@ -25,6 +25,7 @@ struct rtt_service { unsigned int channel; + char *hello_message; }; static int read_callback(unsigned int channel, const uint8_t *buffer, @@ -65,6 +66,9 @@ static int rtt_new_connection(struct connection *connection) if (ret != ERROR_OK) return ret; + if (service->hello_message) + connection_write(connection, service->hello_message, strlen(service->hello_message)); + return ERROR_OK; } @@ -117,16 +121,30 @@ COMMAND_HANDLER(handle_rtt_start_command) int ret; struct rtt_service *service; - if (CMD_ARGC != 2) + if (CMD_ARGC < 2 || CMD_ARGC > 3) return ERROR_COMMAND_SYNTAX_ERROR; - service = malloc(sizeof(struct rtt_service)); + service = calloc(1, sizeof(struct rtt_service)); if (!service) return ERROR_FAIL; COMMAND_PARSE_NUMBER(uint, CMD_ARGV[1], service->channel); + if (CMD_ARGC >= 3) { + const char *hello_message = CMD_ARGV[2]; + size_t hello_length = strlen(hello_message); + + service->hello_message = malloc(hello_length + 2); + if (!service->hello_message) { + LOG_ERROR("Out of memory"); + free(service); + return ERROR_FAIL; + } + strcpy(service->hello_message, hello_message); + service->hello_message[hello_length] = '\n'; + service->hello_message[hello_length + 1] = '\0'; + } ret = add_service(&rtt_service_driver, CMD_ARGV[0], CONNECTION_LIMIT_UNLIMITED, service); if (ret != ERROR_OK) { @@ -153,7 +171,7 @@ static const struct command_registration rtt_server_subcommand_handlers[] = { .handler = handle_rtt_start_command, .mode = COMMAND_ANY, .help = "Start a RTT server", - .usage = "<port> <channel>" + .usage = "<port> <channel> [message]" }, { .name = "stop", |