diff --git a/src/include/rtt_if.h b/src/include/rtt_if.h index ceba91a7451..6f45e133f03 100644 --- a/src/include/rtt_if.h +++ b/src/include/rtt_if.h @@ -65,11 +65,11 @@ int rtt_if_init(void); /* hosted teardown */ int rtt_if_exit(void); -/* target to host: write len bytes from the buffer starting at buf. return number bytes written */ -uint32_t rtt_write(const char *buf, uint32_t len); -/* host to target: read one character, non-blocking. return character, -1 if no character */ -int32_t rtt_getchar(void); -/* host to target: true if no characters available for reading */ -bool rtt_nodata(void); +/* target to host: write len bytes from the buffer on the channel starting at buf. return number bytes written */ +uint32_t rtt_write(const uint32_t channel, const char *buf, uint32_t len); +/* host to target: read one character from the channel, non-blocking. return character, -1 if no character */ +int32_t rtt_getchar(const uint32_t channel); +/* host to target: true if no characters available for reading in the selected channel */ +bool rtt_nodata(const uint32_t channel); #endif /* INCLUDE_RTT_IF_H */ diff --git a/src/platforms/common/stm32/rtt_if.c b/src/platforms/common/stm32/rtt_if.c index f781918e837..f5a7fea523b 100644 --- a/src/platforms/common/stm32/rtt_if.c +++ b/src/platforms/common/stm32/rtt_if.c @@ -93,9 +93,10 @@ void rtt_serial_receive_callback(usbd_device *dev, uint8_t ep) } /* rtt host to target: read one character */ -int32_t rtt_getchar() +int32_t rtt_getchar(const uint32_t channel) { int retval; + (void)channel; if (recv_head == recv_tail) return -1; @@ -110,14 +111,20 @@ int32_t rtt_getchar() } /* rtt host to target: true if no characters available for reading */ -bool rtt_nodata() +bool rtt_nodata(const uint32_t channel) { + /* only support reading from down channel 0 */ + if (channel != 0U) + return true; return recv_head == recv_tail; } /* rtt target to host: write string */ -uint32_t rtt_write(const char *buf, uint32_t len) +uint32_t rtt_write(const uint32_t channel, const char *buf, uint32_t len) { + /* only support writing to up channel 0 */ + if (channel != 0U) + return len; if (len != 0 && usbdev && usb_get_config() && gdb_serial_get_dtr()) { for (uint32_t p = 0; p < len; p += CDCACM_PACKET_SIZE) { uint32_t plen = MIN(CDCACM_PACKET_SIZE, len - p); diff --git a/src/platforms/hosted/rtt_if.c b/src/platforms/hosted/rtt_if.c index 3c5a11cf8d0..516ffe79ca0 100644 --- a/src/platforms/hosted/rtt_if.c +++ b/src/platforms/hosted/rtt_if.c @@ -71,8 +71,11 @@ int rtt_if_exit() /* write buffer to terminal */ -uint32_t rtt_write(const char *buf, uint32_t len) +uint32_t rtt_write(const uint32_t channel, const char *buf, uint32_t len) { + /* only support writing to up channel 0 */ + if (channel != 0U) + return len; int unused = write(1, buf, len); (void)unused; return len; @@ -80,10 +83,11 @@ uint32_t rtt_write(const char *buf, uint32_t len) /* read character from terminal */ -int32_t rtt_getchar() +int32_t rtt_getchar(const uint32_t channel) { char ch; int len; + (void)channel; len = read(0, &ch, 1); if (len == 1) return ch; @@ -92,8 +96,9 @@ int32_t rtt_getchar() /* true if no characters available */ -bool rtt_nodata() +bool rtt_nodata(const uint32_t channel) { + (void)channel; return false; } @@ -113,23 +118,28 @@ int rtt_if_exit() /* write buffer to terminal */ -uint32_t rtt_write(const char *buf, uint32_t len) +uint32_t rtt_write(const uint32_t channel, const char *buf, uint32_t len) { + /* only support writing to up channel 0 */ + if (channel != 0U) + return len; write(1, buf, len); return len; } /* read character from terminal */ -int32_t rtt_getchar() +int32_t rtt_getchar(const uint32_t channel) { + (void)channel; return -1; } /* true if no characters available */ -bool rtt_nodata() +bool rtt_nodata(const uint32_t channel) { + (void)channel; return false; } diff --git a/src/platforms/launchpad-icdi/rtt_if.c b/src/platforms/launchpad-icdi/rtt_if.c index 57544cf5652..a3983fd54e8 100644 --- a/src/platforms/launchpad-icdi/rtt_if.c +++ b/src/platforms/launchpad-icdi/rtt_if.c @@ -93,9 +93,10 @@ void rtt_serial_receive_callback(usbd_device *dev, uint8_t ep) } /* rtt host to target: read one character */ -int32_t rtt_getchar() +int32_t rtt_getchar(const uint32_t channel) { int retval; + (void)channel; if (recv_head == recv_tail) return -1; @@ -110,14 +111,20 @@ int32_t rtt_getchar() } /* rtt host to target: true if no characters available for reading */ -bool rtt_nodata() +bool rtt_nodata(const uint32_t channel) { + /* only support reading from down channel 0 */ + if (channel != 0U) + return true; return recv_head == recv_tail; } /* rtt target to host: write string */ -uint32_t rtt_write(const char *buf, uint32_t len) +uint32_t rtt_write(const uint32_t channel, const char *buf, uint32_t len) { + /* only support writing to up channel 0 */ + if (channel != 0U) + return len; if (len != 0 && usbdev && usb_get_config() && gdb_serial_get_dtr()) { for (uint32_t p = 0; p < len; p += CDCACM_PACKET_SIZE) { uint32_t plen = MIN(CDCACM_PACKET_SIZE, len - p); diff --git a/src/rtt.c b/src/rtt.c index 88f2039a635..3e4b2e40e2c 100644 --- a/src/rtt.c +++ b/src/rtt.c @@ -222,8 +222,13 @@ static void find_rtt(target_s *const cur_target) /* poll if host has new data for target */ static rtt_retval_e read_rtt(target_s *const cur_target, const uint32_t i) { + /* down buffers are located in the rtt_channel array after the + * up buffers. subtract the index from the total number of + * up buffers to get the down buffer number. */ + uint32_t channel = i - rtt_num_up_chan; + /* copy data from recv_buf to target rtt 'down' buffer */ - if (rtt_nodata()) + if (rtt_nodata(channel)) return RTT_IDLE; if (cur_target == NULL || rtt_channel[i].buf_addr == 0 || rtt_channel[i].buf_size == 0) @@ -237,7 +242,7 @@ static rtt_retval_e read_rtt(target_s *const cur_target, const uint32_t i) const uint32_t next_head = (rtt_channel[i].head + 1U) % rtt_channel[i].buf_size; if (rtt_channel[i].tail == next_head) break; - const int ch = rtt_getchar(); + const int ch = rtt_getchar(channel); if (ch == -1) break; if (target_mem32_write(cur_target, rtt_channel[i].buf_addr + rtt_channel[i].head, &ch, 1)) @@ -320,7 +325,7 @@ static rtt_retval_e print_rtt(target_s *const cur_target, const uint32_t i) return RTT_ERR; /* write buffer to usb */ - rtt_write(xmit_buf, bytes_read); + rtt_write(i, xmit_buf, bytes_read); return RTT_OK; }