You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/07/12 01:54:56 UTC

[nuttx] 01/02: drivers/rtt: check whether Jlink is connected

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit e1553e840771204e2fe2e6933df3b125f8e84f15
Author: yinshengkai <yi...@xiaomi.com>
AuthorDate: Thu Jul 6 22:09:05 2023 +0800

    drivers/rtt: check whether Jlink is connected
    
    Signed-off-by: yinshengkai <yi...@xiaomi.com>
---
 drivers/segger/config/SEGGER_RTT_Conf.h | 23 +++++++++++++++++++++++
 drivers/segger/stream_rtt.c             |  7 ++++++-
 drivers/segger/syslog_rtt.c             |  2 ++
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/drivers/segger/config/SEGGER_RTT_Conf.h b/drivers/segger/config/SEGGER_RTT_Conf.h
index a84bab9e4e..9f6d7d3399 100644
--- a/drivers/segger/config/SEGGER_RTT_Conf.h
+++ b/drivers/segger/config/SEGGER_RTT_Conf.h
@@ -89,4 +89,27 @@
 
 #define RTT_USE_ASM                     0
 
+#define SEGGER_RTT_FLAG_UP(ch)          (((FAR SEGGER_RTT_BUFFER_UP *)((FAR char *) \
+                                         &_SEGGER_RTT.aUp[ch] + SEGGER_RTT_UNCACHED_OFF))->Flags)
+#define SEGGER_RTT_RDOFF_UP(ch)         (((FAR SEGGER_RTT_BUFFER_UP *)((FAR char *) \
+                                         &_SEGGER_RTT.aUp[ch] + SEGGER_RTT_UNCACHED_OFF))->RdOff)
+
+#define SEGGER_RTT_IS_CONNECTED(ch)     (SEGGER_RTT_RDOFF_UP(ch) != 0)
+#define SEGGER_RTT_IS_FIFO_MODE(ch)     (SEGGER_RTT_FLAG_UP(ch) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL)
+
+/* Determine whether JLink is connected, and use FIFO mode
+  * after connection to ensure that data is not lost.
+  */
+
+#define SEGGER_RTT_BLOCK_IF_FIFO_FULL(ch) \
+  do \
+    { \
+      if (!SEGGER_RTT_IS_FIFO_MODE(ch) && SEGGER_RTT_IS_CONNECTED(ch)) \
+        { \
+          SEGGER_RTT_SetFlagsUpBuffer(ch, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL); \
+          SEGGER_RTT_SetFlagsDownBuffer(ch, SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL); \
+        } \
+    } \
+  while (0)
+
 #endif /* __DRIVERS_SEGGER_CONFIG_SEGGER_RTT_CONF_H */
diff --git a/drivers/segger/stream_rtt.c b/drivers/segger/stream_rtt.c
index 5caef0ff87..1bcb9428b7 100644
--- a/drivers/segger/stream_rtt.c
+++ b/drivers/segger/stream_rtt.c
@@ -43,6 +43,8 @@ static void rttstream_putc(FAR struct lib_outstream_s *this, int ch)
 {
   FAR struct lib_rttoutstream_s *stream =
                                  (FAR struct lib_rttoutstream_s *)this;
+
+  SEGGER_RTT_BLOCK_IF_FIFO_FULL(0);
   stream->public.nput += SEGGER_RTT_PutChar(stream->channel, ch);
 }
 
@@ -55,7 +57,10 @@ static int rttstream_puts(FAR struct lib_outstream_s *this,
 {
   FAR struct lib_rttoutstream_s *stream =
                                 (FAR struct lib_rttoutstream_s *)this;
-  int ret = SEGGER_RTT_Write(stream->channel, buf, len);
+  int ret;
+
+  SEGGER_RTT_BLOCK_IF_FIFO_FULL(0);
+  ret = SEGGER_RTT_Write(stream->channel, buf, len);
   stream->public.nput += ret;
   return ret;
 }
diff --git a/drivers/segger/syslog_rtt.c b/drivers/segger/syslog_rtt.c
index e7932e5e85..aa9810014f 100644
--- a/drivers/segger/syslog_rtt.c
+++ b/drivers/segger/syslog_rtt.c
@@ -32,6 +32,7 @@
 
 int syslog_rtt_putc(FAR struct syslog_channel_s *channel, int ch)
 {
+  SEGGER_RTT_BLOCK_IF_FIFO_FULL(0);
   SEGGER_RTT_PutChar(0, ch);
   return ch;
 }
@@ -39,5 +40,6 @@ int syslog_rtt_putc(FAR struct syslog_channel_s *channel, int ch)
 ssize_t syslog_rtt_write(FAR struct syslog_channel_s *channel,
                          FAR const char *buffer, size_t buflen)
 {
+  SEGGER_RTT_BLOCK_IF_FIFO_FULL(0);
   return SEGGER_RTT_Write(0, buffer, buflen);
 }