summaryrefslogtreecommitdiff
path: root/nuttx/drivers/ramlog.c
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/drivers/ramlog.c')
-rw-r--r--nuttx/drivers/ramlog.c79
1 files changed, 73 insertions, 6 deletions
diff --git a/nuttx/drivers/ramlog.c b/nuttx/drivers/ramlog.c
index fd94f5bf4..53e57b1a0 100644
--- a/nuttx/drivers/ramlog.c
+++ b/nuttx/drivers/ramlog.c
@@ -72,11 +72,15 @@
struct ramlog_dev_s
{
+#ifndef CONFIG_RAMLOG_NONBLOCKING
volatile uint8_t rl_nwaiters; /* Number of threads waiting for data */
+#endif
volatile uint16_t rl_head; /* The head index (where data is added) */
volatile uint16_t rl_tail; /* The tail index (where data is removed) */
sem_t rl_exclsem; /* Enforces mutually exclusive access */
+#ifndef CONFIG_RAMLOG_NONBLOCKING
sem_t rl_waitsem; /* Used to wait for data */
+#endif
size_t rl_bufsize; /* Size of the RAM buffer */
FAR char *rl_buffer; /* Circular RAM buffer */
@@ -252,7 +256,14 @@ static ssize_t ramlog_read(FAR struct file *filep, FAR char *buffer, size_t len)
if (priv->rl_head == priv->rl_tail)
{
- /* The circular buffer is empty. Did we read anything? */
+ /* The circular buffer is empty. */
+
+#ifdef CONFIG_RAMLOG_NONBLOCKING
+ /* Return what we have (with zero mean the end-of-file) */
+
+ break;
+#else
+ /* Did we read anything? */
if (nread > 0)
{
@@ -333,6 +344,7 @@ static ssize_t ramlog_read(FAR struct file *filep, FAR char *buffer, size_t len)
goto errout_without_sem;
}
+#endif /* CONFIG_RAMLOG_NONBLOCKING */
}
else
{
@@ -362,7 +374,10 @@ static ssize_t ramlog_read(FAR struct file *filep, FAR char *buffer, size_t len)
/* Notify all poll/select waiters that they can write to the FIFO */
+#ifndef CONFIG_RAMLOG_NONBLOCKING
errout_without_sem:
+#endif
+
#ifndef CONFIG_DISABLE_POLL
if (nread > 0)
{
@@ -380,9 +395,9 @@ static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer, size
{
struct inode *inode = filep->f_inode;
struct ramlog_dev_s *priv;
- irqstate_t flags;
ssize_t nwritten;
- int i;
+ char ch;
+ int ret;
/* Some sanity checking */
@@ -400,7 +415,29 @@ static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer, size
for (nwritten = 0; nwritten < len; nwritten++)
{
- int ret = ramlog_addchar(priv, buffer[nwritten]);
+ /* Get the next character to output */
+
+ ch = buffer[nwritten];
+
+ /* Pre-pend a carriage before a linefeed */
+
+ if (ch == '\n')
+ {
+ ret = ramlog_addchar(priv, '\r');
+ if (ret < 0)
+ {
+ /* The buffer is full and nothing was saved. Break out of the
+ * loop to return the number of bytes written up to this point.
+ * The data to be written is dropped on the floor.
+ */
+
+ break;
+ }
+ }
+
+ /* Then output the character */
+
+ ret = ramlog_addchar(priv,ch);
if (ret < 0)
{
/* The buffer is full and nothing was saved. Break out of the
@@ -414,24 +451,30 @@ static ssize_t ramlog_write(FAR struct file *filep, FAR const char *buffer, size
/* Was anything written? */
+#if !defined(CONFIG_RAMLOG_NONBLOCKING) || !defined(CONFIG_DISABLE_POLL)
if (nwritten > 0)
{
+ int i;
+
/* Are there threads waiting for read data? */
- flags = irqsave();
+ irqstate_t flags = irqsave();
+#ifndef CONFIG_RAMLOG_NONBLOCKING
for (i = 0; i < priv->rl_nwaiters; i++)
{
/* Yes.. Notify all of the waiting readers that more data is available */
sem_post(&priv->rl_waitsem);
}
+#endif
/* Notify all poll/select waiters that they can write to the FIFO */
ramlog_pollnotify(priv, POLLIN);
irqrestore(flags);
}
-
+#endif
+
/* Return the number of bytes written */
return nwritten;
@@ -581,7 +624,9 @@ int ramlog_register(FAR const char *devpath, FAR char *buffer, size_t buflen)
/* Initialize the non-zero values in the RAM logging device structure */
sem_init(&priv->rl_exclsem, 0, 1);
+#ifndef CONFIG_RAMLOG_NONBLOCKING
sem_init(&priv->rl_waitsem, 0, 0);
+#endif
priv->rl_bufsize = buflen;
priv->rl_buffer = buffer;
@@ -616,7 +661,9 @@ int ramlog_consoleinit(void)
/* Initialize the RAM loggin device structure */
sem_init(&priv->rl_exclsem, 0, 1);
+#ifndef CONFIG_RAMLOG_NONBLOCKING
sem_init(&priv->rl_waitsem, 0, 0);
+#endif
priv->rl_bufsize = CONFIG_RAMLOG_CONSOLE_BUFSIZE;
priv->rl_buffer = g_sysbuffer;
@@ -656,7 +703,9 @@ int ramlog_sysloginit(void)
/* Initialize the RAM loggin device structure */
sem_init(&priv->rl_exclsem, 0, 1);
+#ifndef CONFIG_RAMLOG_NONBLOCKING
sem_init(&priv->rl_waitsem, 0, 0);
+#endif
priv->rl_bufsize = CONFIG_RAMLOG_CONSOLE_BUFSIZE;
priv->rl_buffer = g_sysbuffer;
@@ -681,6 +730,24 @@ int ramlog_sysloginit(void)
int ramlog_putc(int ch)
{
FAR struct ramlog_dev_s *priv = &g_sysdev;
+ int ret;
+
+ /* Pre-pend a newline with a carriage return */
+
+ if (ch == '\n')
+ {
+ ret = ramlog_addchar(priv, '\r');
+ if (ret < 0)
+ {
+ /* The buffer is full and nothing was saved. Break out of the
+ * loop to return the number of bytes written up to this point.
+ * The data to be written is dropped on the floor.
+ */
+
+ return ch;
+ }
+ }
+
(void)ramlog_addchar(priv, ch);
return ch;
}