From 63c9f1a86ea2899f7002f1fffd361ff00ee91d1b Mon Sep 17 00:00:00 2001 From: Simon Piriou Date: Sat, 22 Jul 2017 08:54:43 -0600 Subject: [PATCH] sim arch: Add non blocking read to devconsole driver --- arch/sim/src/up_devconsole.c | 8 +++++--- arch/sim/src/up_internal.h | 2 +- arch/sim/src/up_simuart.c | 9 ++++++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/arch/sim/src/up_devconsole.c b/arch/sim/src/up_devconsole.c index cc863a227c..33a15c65d4 100644 --- a/arch/sim/src/up_devconsole.c +++ b/arch/sim/src/up_devconsole.c @@ -43,6 +43,7 @@ #include #include #include +#include #include @@ -97,12 +98,13 @@ static ssize_t devconsole_read(struct file *filep, char *buffer, size_t len) * on the first read. */ - ch = simuart_getc(); + ch = simuart_getc(!(filep->f_oflags & O_NONBLOCK)); if (ch < 0) { - set_errno(EIO); + /* errno is set in upper layer according to returned value */ + sched_unlock(); - return ERROR; + return ch; } *buffer++ = ch; diff --git a/arch/sim/src/up_internal.h b/arch/sim/src/up_internal.h index 9b26f11041..ef5263f2d6 100644 --- a/arch/sim/src/up_internal.h +++ b/arch/sim/src/up_internal.h @@ -262,7 +262,7 @@ void up_registerblockdevice(void); void simuart_start(void); int simuart_putc(int ch); -int simuart_getc(void); +int simuart_getc(bool block); bool simuart_checkc(void); void simuart_terminate(void); diff --git a/arch/sim/src/up_simuart.c b/arch/sim/src/up_simuart.c index 777dc32e15..a532839f85 100644 --- a/arch/sim/src/up_simuart.c +++ b/arch/sim/src/up_simuart.c @@ -42,6 +42,7 @@ #include #include #include +#include /**************************************************************************** * Pre-processor Definitions @@ -268,7 +269,7 @@ int simuart_putc(int ch) * Name: simuart_getc ****************************************************************************/ -int simuart_getc(void) +int simuart_getc(bool block) { int index; int ch; @@ -282,6 +283,12 @@ int simuart_getc(void) { /* Wait for a byte to become available */ + if (!block && (g_uarthead == g_uarttail)) + { + sched_unlock(); + return -EAGAIN; + } + while (g_uarthead == g_uarttail) { simuart_wait();