diff --git a/UsingRTT.md b/UsingRTT.md index 0e59323b813..f2841cc75e2 100644 --- a/UsingRTT.md +++ b/UsingRTT.md @@ -121,7 +121,11 @@ grep 2000 HelloWorld.ino.map | grep RTT sets RTT ident to *string*. If *string* contains a space, replace the space with an underscore _. Setting ident string is optional, RTT works fine without. -- `monitor rtt ident` +- ``monitor rtt send string`` + + push *string* to the RTT down buffer. It is equivalent to pushing the string to ttyBmpTarg. + +- ``monitor rtt ident`` clears ident string. (default) diff --git a/src/command.c b/src/command.c index 0ca47b4ef5a..86cf1ac4d97 100644 --- a/src/command.c +++ b/src/command.c @@ -104,8 +104,8 @@ const command_s cmd_list[] = { #endif #ifdef ENABLE_RTT {"rtt", cmd_rtt, - "[enable|disable|status|channel [0..15 ...]|ident [STR]|cblock|ram [RAM_START RAM_END]|poll [MAXMS MINMS " - "MAXERR]]"}, + "[enable|disable|status|channel [0..15 ...]|ident [STR]|send [STR]|cblock|ram [RAM_START RAM_END]|" + "poll [MAXMS MINMS MAXERR]]"}, #endif #ifdef PLATFORM_HAS_TRACESWO #if defined TRACESWO_PROTOCOL && TRACESWO_PROTOCOL == 2 @@ -572,6 +572,9 @@ static bool cmd_rtt(target_s *t, int argc, const char **argv) if (rtt_ident[i] == '_') rtt_ident[i] = ' '; } + } else if (argc == 3 && strncmp(argv[1], "send", command_len) == 0) { + size_t len = strlen(argv[2]); + rtt_load_recv_buf(argv[2], len); } else if (argc == 2 && strncmp(argv[1], "ram", command_len) == 0) rtt_flag_ram = false; else if (argc == 4 && strncmp(argv[1], "ram", command_len) == 0) { diff --git a/src/include/rtt.h b/src/include/rtt.h index 029b8018135..7f31be144e1 100644 --- a/src/include/rtt.h +++ b/src/include/rtt.h @@ -60,5 +60,6 @@ typedef struct rtt_channel { extern rtt_channel_s rtt_channel[MAX_RTT_CHAN]; void poll_rtt(target_s *cur_target); +void rtt_load_recv_buf(const char *data_buf, size_t len); #endif /* INCLUDE_RTT_H */ diff --git a/src/platforms/common/stm32/rtt_if.c b/src/platforms/common/stm32/rtt_if.c index f781918e837..e727b3d89fc 100644 --- a/src/platforms/common/stm32/rtt_if.c +++ b/src/platforms/common/stm32/rtt_if.c @@ -58,9 +58,20 @@ inline static bool recv_set_nak() return recv_bytes_free() < 2U * CDCACM_PACKET_SIZE; } +void rtt_load_recv_buf(const char *data_buf, size_t len) +{ + /* copy data to recv_buf */ + for (size_t i = 0; i < len; i++) { + uint32_t next_recv_head = (recv_head + 1U) % sizeof(recv_buf); + if (next_recv_head == recv_tail) + break; /* overflow */ + recv_buf[recv_head] = data_buf[i]; + recv_head = next_recv_head; + } +} + /* debug_serial_receive_callback is called when usb uart has received new data for target. this routine has to be fast */ - void rtt_serial_receive_callback(usbd_device *dev, uint8_t ep) { (void)dev; @@ -78,14 +89,7 @@ void rtt_serial_receive_callback(usbd_device *dev, uint8_t ep) return; } - /* copy data to recv_buf */ - for (int i = 0; i < len; i++) { - uint32_t next_recv_head = (recv_head + 1U) % sizeof(recv_buf); - if (next_recv_head == recv_tail) - break; /* overflow */ - recv_buf[recv_head] = usb_buf[i]; - recv_head = next_recv_head; - } + rtt_load_recv_buf(usb_buf, len); /* block flag: flow control closed if not enough free buffer space */ if (!(rtt_flag_block && recv_set_nak())) diff --git a/src/platforms/launchpad-icdi/rtt_if.c b/src/platforms/launchpad-icdi/rtt_if.c index 57544cf5652..d02a7434037 100644 --- a/src/platforms/launchpad-icdi/rtt_if.c +++ b/src/platforms/launchpad-icdi/rtt_if.c @@ -58,6 +58,18 @@ inline static bool recv_set_nak() return recv_bytes_free() < 2U * CDCACM_PACKET_SIZE; } +void rtt_load_recv_buf(const char *data_buf, size_t len) +{ + /* copy data to recv_buf */ + for (size_t i = 0; i < len; i++) { + uint32_t next_recv_head = (recv_head + 1U) % sizeof(recv_buf); + if (next_recv_head == recv_tail) + break; /* overflow */ + recv_buf[recv_head] = data_buf[i]; + recv_head = next_recv_head; + } +} + /* debug_serial_receive_callback is called when usb uart has received new data for target. this routine has to be fast */ @@ -78,14 +90,7 @@ void rtt_serial_receive_callback(usbd_device *dev, uint8_t ep) return; } - /* copy data to recv_buf */ - for (int i = 0; i < len; i++) { - uint32_t next_recv_head = (recv_head + 1U) % sizeof(recv_buf); - if (next_recv_head == recv_tail) - break; /* overflow */ - recv_buf[recv_head] = usb_buf[i]; - recv_head = next_recv_head; - } + rtt_load_recv_buf(usb_buf, len); /* block flag: flow control closed if not enough free buffer space */ if (!(rtt_flag_block && recv_set_nak()))