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);
}