You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by gn...@apache.org on 2020/02/08 13:53:20 UTC

[incubator-nuttx] branch master updated: arch/sim/src/: Reimplement sim uart on top of serial driver framework

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

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


The following commit(s) were added to refs/heads/master by this push:
     new fa3e66f  arch/sim/src/:  Reimplement sim uart on top of serial driver framework
fa3e66f is described below

commit fa3e66fe8203f3abe530ba244e617ebb14b1f089
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Sat Feb 8 07:52:26 2020 -0600

    arch/sim/src/:  Reimplement sim uart on top of serial driver framework
    
    The benefits include:
    
    1. Simplify the implementation
    2. Support Ctrl+C automatically
    3. Support poll automatically
    4. Call pm_activity automatically
    5. Save one polling thread
---
 arch/sim/src/Makefile            |  17 +--
 arch/sim/src/sim/up_devconsole.c | 279 +++++++++++++++++++++++++++++----------
 arch/sim/src/sim/up_idle.c       |  16 +--
 arch/sim/src/sim/up_internal.h   |  65 ++++-----
 arch/sim/src/sim/up_simuart.c    | 163 ++---------------------
 arch/sim/src/sim/up_uartwait.c   |  86 ------------
 6 files changed, 254 insertions(+), 372 deletions(-)

diff --git a/arch/sim/src/Makefile b/arch/sim/src/Makefile
index 02b7628..f513d47 100644
--- a/arch/sim/src/Makefile
+++ b/arch/sim/src/Makefile
@@ -84,6 +84,7 @@ ifeq ($(CONFIG_SMP),y)
   CSRCS += up_smpsignal.c up_smphook.c up_cpuidlestack.c
   HOSTCFLAGS += -DCONFIG_SMP=1 -DCONFIG_SMP_NCPUS=$(CONFIG_SMP_NCPUS)
   HOSTSRCS += up_simsmp.c
+  STDLIBS += -lpthread
 endif
 
 ifeq ($(CONFIG_SCHED_INSTRUMENTATION),y)
@@ -94,7 +95,7 @@ endif
 
 ifeq ($(CONFIG_DEV_CONSOLE),y)
 ifneq ($(CONFIG_SYSLOG_RPMSG),y)
-  CSRCS += up_devconsole.c up_uartwait.c
+  CSRCS += up_devconsole.c
   HOSTSRCS += up_simuart.c
 endif
 endif
@@ -135,6 +136,7 @@ endif
 
 ifeq ($(CONFIG_FS_FAT),y)
   CSRCS += up_blockdevice.c up_deviceimage.c
+  STDLIBS += -lz
 endif
 
 ifeq ($(CONFIG_ARCH_ROMGETC),y)
@@ -208,13 +210,6 @@ endif
 EXTRA_LIBS ?=
 EXTRA_LIBPATHS ?=
 
-ifeq ($(CONFIG_FS_FAT),y)
-STDLIBS += -lz
-endif
-
-STDLIBS += -lc
-STDLIBS += -lpthread
-
 # Determine which objects are required in the link.  The
 # up_head object normally draws in all that is needed, but
 # there are a fews that must be included because they
@@ -223,12 +218,6 @@ STDLIBS += -lpthread
 LINKOBJS = up_head$(OBJEXT)
 REQUIREDOBJS = $(LINKOBJS)
 
-ifeq ($(CONFIG_DEV_CONSOLE),y)
-ifneq ($(CONFIG_SYSLOG_RPMSG),y)
-  REQUIREDOBJS += up_uartwait$(OBJEXT)
-endif
-endif
-
 ifeq ($(CONFIG_SIM_X11FB),y)
 ifeq ($(CONFIG_SIM_TOUCHSCREEN),y)
   REQUIREDOBJS += up_touchscreen$(OBJEXT)
diff --git a/arch/sim/src/sim/up_devconsole.c b/arch/sim/src/sim/up_devconsole.c
index cc203a8..6b11413 100644
--- a/arch/sim/src/sim/up_devconsole.c
+++ b/arch/sim/src/sim/up_devconsole.c
@@ -38,37 +38,70 @@
  ****************************************************************************/
 
 #include <nuttx/config.h>
+#include <nuttx/serial/serial.h>
 
-#include <sys/types.h>
-#include <stdbool.h>
-#include <sched.h>
-#include <errno.h>
-#include <fcntl.h>
+#include "up_internal.h"
 
-#include <nuttx/fs/fs.h>
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
 
-#include "up_internal.h"
+#define DEVCONSOLE_BUFSIZE 256
 
 /****************************************************************************
  * Private Function Prototypes
  ****************************************************************************/
 
-static ssize_t devconsole_read(FAR struct file *filep, FAR char *buffer,
-                 size_t buflen);
-static ssize_t devconsole_write(FAR struct file *filep,
-                 FAR const char *buffer, size_t buflen);
-static int     devconsole_poll(FAR struct file *filep, FAR struct pollfd *fds,
-                 bool setup);
+static int  devconsole_setup(FAR struct uart_dev_s *dev);
+static void devconsole_shutdown(FAR struct uart_dev_s *dev);
+static int  devconsole_attach(FAR struct uart_dev_s *dev);
+static void devconsole_detach(FAR struct uart_dev_s *dev);
+static int  devconsole_ioctl(FAR struct file *filep, int cmd, unsigned long arg);
+static int  devconsole_receive(FAR struct uart_dev_s *dev, uint32_t *status);
+static void devconsole_rxint(FAR struct uart_dev_s *dev, bool enable);
+static bool devconsole_rxavailable(FAR struct uart_dev_s *dev);
+static void devconsole_send(FAR struct uart_dev_s *dev, int ch);
+static void devconsole_txint(FAR struct uart_dev_s *dev, bool enable);
+static bool devconsole_txready(FAR struct uart_dev_s *dev);
+static bool devconsole_txempty(FAR struct uart_dev_s *dev);
 
 /****************************************************************************
  * Private Data
  ****************************************************************************/
 
-static const struct file_operations devconsole_fops =
+static const struct uart_ops_s g_devconsole_ops =
+{
+  .setup          = devconsole_setup,
+  .shutdown       = devconsole_shutdown,
+  .attach         = devconsole_attach,
+  .detach         = devconsole_detach,
+  .ioctl          = devconsole_ioctl,
+  .receive        = devconsole_receive,
+  .rxint          = devconsole_rxint,
+  .rxavailable    = devconsole_rxavailable,
+  .send           = devconsole_send,
+  .txint          = devconsole_txint,
+  .txready        = devconsole_txready,
+  .txempty        = devconsole_txempty,
+};
+
+static char g_devconsole_rxbuf[DEVCONSOLE_BUFSIZE];
+static char g_devconsole_txbuf[DEVCONSOLE_BUFSIZE];
+
+static struct uart_dev_s g_devconsole_dev =
 {
-  .read   = devconsole_read,
-  .write  = devconsole_write,
-  .poll   = devconsole_poll,
+  .isconsole      = true,
+  .ops            = &g_devconsole_ops,
+  .xmit =
+  {
+    .size         = DEVCONSOLE_BUFSIZE,
+    .buffer       = g_devconsole_txbuf,
+  },
+  .recv =
+  {
+    .size         = DEVCONSOLE_BUFSIZE,
+    .buffer       = g_devconsole_rxbuf,
+  },
 };
 
 /****************************************************************************
@@ -76,81 +109,174 @@ static const struct file_operations devconsole_fops =
  ****************************************************************************/
 
 /****************************************************************************
- * Name: devconsole_read
+ * Name: devconsole_setup
+ *
+ * Description:
+ *   Configure the UART baud, bits, parity, fifos, etc. This
+ *   method is called the first time that the serial port is
+ *   opened.
+ *
  ****************************************************************************/
 
-static ssize_t devconsole_read(struct file *filep, char *buffer, size_t len)
+static int devconsole_setup(FAR struct uart_dev_s *dev)
 {
-  size_t remaining = len;
-  ssize_t nread;
-  int ch;
+  return OK;
+}
 
-  /* Loop until all requested bytes have been read.  No error checking */
+/****************************************************************************
+ * Name: devconsole_shutdown
+ *
+ * Description:
+ *   Disable the UART.  This method is called when the serial
+ *   port is closed
+ *
+ ****************************************************************************/
 
-  sched_lock();
-  for (remaining = len, nread = 0; remaining > 0; remaining--)
-    {
-      /* Read the next character from the console, we should only wait
-       * on the first read.
-       */
-
-      ch = simuart_getc(!(filep->f_oflags & O_NONBLOCK));
-      if (ch < 0)
-        {
-          /*  errno is set in upper layer according to returned value */
-
-          sched_unlock();
-          return ch;
-        }
-
-      *buffer++ = ch;
-       nread++;
-
-      /* We have at least one character.  Return now if no further
-       * characters are available without waiting.
-       */
-
-      if (!simuart_checkc())
-        {
-          break;
-        }
-    }
+static void devconsole_shutdown(struct uart_dev_s *dev)
+{
+}
+
+/****************************************************************************
+ * Name: devconsole_attach
+ *
+ * Description:
+ *   Configure the UART to operation in interrupt driven mode.  This method is
+ *   called when the serial port is opened.  Normally, this is just after the
+ *   the setup() method is called, however, the serial console may operate in
+ *   a non-interrupt driven mode during the boot phase.
+ *
+ *   RX and TX interrupts are not enabled when by the attach method (unless the
+ *   hardware supports multiple levels of interrupt enabling).  The RX and TX
+ *   interrupts are not enabled until the txint() and rxint() methods are called.
+ *
+ ****************************************************************************/
 
-  sched_unlock();
-  return nread;
+static int devconsole_attach(struct uart_dev_s *dev)
+{
+  return OK;
 }
 
 /****************************************************************************
- * Name: devconsole_write
+ * Name: devconsole_detach
+ *
+ * Description:
+ *   Detach UART interrupts.  This method is called when the serial port is
+ *   closed normally just before the shutdown method is called.  The exception is
+ *   the serial console which is never shutdown.
+ *
  ****************************************************************************/
 
-static ssize_t devconsole_write(struct file *filep, const char *buffer, size_t len)
+static void devconsole_detach(FAR struct uart_dev_s *dev)
 {
-  int remaining;
-  int ret = OK;
+}
 
-  for (remaining = len; remaining > 0 && ret >= 0; remaining--)
-    {
-      unsigned char ch = *buffer++;
-      ret = simuart_putc((int)ch);
-    }
+/****************************************************************************
+ * Name: devconsole_ioctl
+ *
+ * Description:
+ *   All ioctl calls will be routed through this method
+ *
+ ****************************************************************************/
+
+static int devconsole_ioctl(struct file *filep, int cmd, unsigned long arg)
+{
+  return -ENOTTY;
+}
+
+/****************************************************************************
+ * Name: devconsole_receive
+ *
+ * Description:
+ *   Called (usually) from the interrupt level to receive one
+ *   character from the UART.  Error bits associated with the
+ *   receipt are provided in the return 'status'.
+ *
+ ****************************************************************************/
+
+static int devconsole_receive(struct uart_dev_s *dev, uint32_t *status)
+{
+  *status = 0;
+  return simuart_getc();
+}
 
-  if (ret < 0)
+/****************************************************************************
+ * Name: devconsole_rxint
+ *
+ * Description:
+ *   Call to enable or disable RX interrupts
+ *
+ ****************************************************************************/
+
+static void devconsole_rxint(struct uart_dev_s *dev, bool enable)
+{
+}
+
+/****************************************************************************
+ * Name: devconsole_rxavailable
+ *
+ * Description:
+ *   Return true if the receive fifo is not empty
+ *
+ ****************************************************************************/
+
+static bool devconsole_rxavailable(struct uart_dev_s *dev)
+{
+  return simuart_checkc();
+}
+
+/****************************************************************************
+ * Name: devconsole_send
+ *
+ * Description:
+ *   This method will send one byte on the UART
+ *
+ ****************************************************************************/
+
+static void devconsole_send(struct uart_dev_s *dev, int ch)
+{
+  simuart_putc(ch);
+}
+
+/****************************************************************************
+ * Name: devconsole_txint
+ *
+ * Description:
+ *   Call to enable or disable TX interrupts
+ *
+ ****************************************************************************/
+
+static void devconsole_txint(struct uart_dev_s *dev, bool enable)
+{
+  if (enable)
     {
-      return -ret;
+      uart_xmitchars(&g_devconsole_dev);
     }
+}
+
+/****************************************************************************
+ * Name: devconsole_txready
+ *
+ * Description:
+ *   Return true if the tranmsit fifo is not full
+ *
+ ****************************************************************************/
 
-  return len;
+static bool devconsole_txready(struct uart_dev_s *dev)
+{
+  return true;
 }
 
 /****************************************************************************
- * Name: devconsole_poll
+ * Name: devconsole_txempty
+ *
+ * Description:
+ *   Return true if the transmit fifo is empty
+ *
  ****************************************************************************/
 
-static int devconsole_poll(FAR struct file *filep, FAR struct pollfd *fds,
-                           bool setup)
+static bool devconsole_txempty(struct uart_dev_s *dev)
 {
-  return OK;
+  return true;
 }
 
 /****************************************************************************
@@ -163,7 +289,20 @@ static int devconsole_poll(FAR struct file *filep, FAR struct pollfd *fds,
 
 void up_devconsole(void)
 {
-  register_driver("/dev/console", &devconsole_fops, 0666, NULL);
+  uart_register("/dev/console", &g_devconsole_dev);
+  uart_register("/dev/ttyS0", &g_devconsole_dev);
+}
+
+/****************************************************************************
+ * Name: up_devconloop
+ ****************************************************************************/
+
+void up_devconloop(void)
+{
+  if (simuart_checkc())
+    {
+      uart_recvchars(&g_devconsole_dev);
+    }
 }
 
 /****************************************************************************
diff --git a/arch/sim/src/sim/up_idle.c b/arch/sim/src/sim/up_idle.c
index 6e3ab02..1848d45 100644
--- a/arch/sim/src/sim/up_idle.c
+++ b/arch/sim/src/sim/up_idle.c
@@ -1,7 +1,8 @@
 /****************************************************************************
  * arch/sim/src/sim/up_idle.c
  *
- *   Copyright (C) 2007-2009, 2011-2012, 2014, 2016 Gregory Nutt. All rights reserved.
+ *   Copyright (C) 2007-2009, 2011-2012, 2014, 2016, 2020 Gregory Nutt. All
+ *     rights reserved.
  *   Author: Gregory Nutt <gn...@nuttx.org>
  *
  * Redistribution and use in source and binary forms, with or without
@@ -44,10 +45,6 @@
 
 #include <nuttx/arch.h>
 
-#ifdef CONFIG_PM
-#  include <nuttx/power/pm.h>
-#endif
-
 #ifdef CONFIG_SMP
 #  include <nuttx/spinlock.h>
 #endif
@@ -132,14 +129,7 @@ void up_idle(void)
 #ifdef USE_DEVCONSOLE
   /* Handle UART data availability */
 
-  if (g_uart_data_available)
-    {
-#ifdef CONFIG_PM
-      pm_activity(PM_IDLE_DOMAIN, 100);  /* Report important activity to PM */
-#endif
-      g_uart_data_available = 0;
-      simuart_post();
-    }
+  up_devconloop();
 #endif
 
 #if defined(CONFIG_NET_ETHERNET) && defined(CONFIG_SIM_NETDEV)
diff --git a/arch/sim/src/sim/up_internal.h b/arch/sim/src/sim/up_internal.h
index f40de35..dc14430 100644
--- a/arch/sim/src/sim/up_internal.h
+++ b/arch/sim/src/sim/up_internal.h
@@ -98,7 +98,7 @@
 #  endif
 #endif
 
-/* Context Switching Definitions ******************************************/
+/* Context Switching Definitions ********************************************/
 
 #if defined(CONFIG_HOST_X86_64) && !defined(CONFIG_SIM_M32)
   /* Storage order: %rbx, %rsp, %rbp, %r12, %r13, %r14, %r15, %rip */
@@ -155,7 +155,7 @@
 #  define JB_PC 9
 #endif
 
-/* Simulated Heap Definitions **********************************************/
+/* Simulated Heap Definitions ***********************************************/
 
 /* Size of the simulated heap */
 
@@ -204,10 +204,6 @@ extern volatile int g_eventloop;
 #endif
 #endif
 
-#ifdef USE_DEVCONSOLE
-extern volatile int g_uart_data_available;
-#endif
-
 #ifdef CONFIG_SMP
 /* These spinlocks are used in the SMP configuration in order to implement
  * up_cpu_pause().  The protocol for CPUn to pause CPUm is as follows
@@ -231,42 +227,42 @@ volatile spinlock_t g_cpu_paused[CONFIG_SMP_NCPUS] SP_SECTION;
  * Public Function Prototypes
  ****************************************************************************/
 
-/* up_setjmp32.S **********************************************************/
+/* up_setjmp32.S ************************************************************/
 
 int  up_setjmp(xcpt_reg_t *jb);
 void up_longjmp(xcpt_reg_t *jb, int val) noreturn_function;
 
-/* up_hostusleep.c ********************************************************/
+/* up_hostusleep.c **********************************************************/
 
 int up_hostusleep(unsigned int usec);
 
-/* up_simsmp.c ************************************************************/
+/* up_simsmp.c **************************************************************/
 
 #ifdef CONFIG_SMP
 int  sim_cpu0_initialize(void);
 void sim_cpu0_start(void);
 #endif
 
-/* up_smpsignal.c *********************************************************/
+/* up_smpsignal.c ***********************************************************/
 
 #ifdef CONFIG_SMP
 void sim_cpu_pause(int cpu, FAR volatile spinlock_t *wait,
                    FAR volatile unsigned char *paused);
 #endif
 
-/* up_smphook.c ***********************************************************/
+/* up_smphook.c *************************************************************/
 
 #ifdef CONFIG_SMP
 void sim_smp_hook(void);
 #endif
 
-/* up_tickless.c **********************************************************/
+/* up_tickless.c ************************************************************/
 
 #ifdef CONFIG_SCHED_TICKLESS
 void up_timer_update(void);
 #endif
 
-/* rpmsg_serialinit *******************************************************/
+/* rpmsg_serialinit *********************************************************/
 
 #ifdef CONFIG_RPMSG_UART
 void rpmsg_serialinit(void);
@@ -274,35 +270,30 @@ void rpmsg_serialinit(void);
 #  define rpmsg_serialinit()
 #endif
 
-/* up_devconsole.c ********************************************************/
+/* up_devconsole.c **********************************************************/
 
 void up_devconsole(void);
-void up_registerblockdevice(void);
+void up_devconloop(void);
 
-/* up_simuart.c ***********************************************************/
+/* up_simuart.c *************************************************************/
 
 void simuart_start(void);
 int  simuart_putc(int ch);
-int  simuart_getc(bool block);
+int  simuart_getc(void);
 bool simuart_checkc(void);
 
-/* up_uartwait.c **********************************************************/
-
-void simuart_initialize(void);
-void simuart_post(void);
-void simuart_wait(void);
-
-/* up_deviceimage.c *******************************************************/
+/* up_deviceimage.c *********************************************************/
 
 char *up_deviceimage(void);
+void up_registerblockdevice(void);
 
-/* up_netdev.c ************************************************************/
+/* up_netdev.c **************************************************************/
 
 #ifdef CONFIG_NET
 unsigned long up_getwalltime(void);
 #endif
 
-/* up_x11framebuffer.c ****************************************************/
+/* up_x11framebuffer.c ******************************************************/
 
 #ifdef CONFIG_SIM_X11FB
 int up_x11initialize(unsigned short width, unsigned short height,
@@ -315,45 +306,45 @@ int up_x11cmap(unsigned short first, unsigned short len,
 #endif
 #endif
 
-/* up_touchscreen.c *******************************************************/
+/* up_touchscreen.c *********************************************************/
 
 int  sim_tsc_initialize(int minor);
 void sim_tsc_uninitialize(void);
 
-/* up_pminitialize.c ******************************************************/
+/* up_pminitialize.c ********************************************************/
 
 #ifdef CONFIG_PM
 void up_pminitialize(void);
 #endif
 
-/* up_eventloop.c *********************************************************/
+/* up_eventloop.c ***********************************************************/
 
 #if defined(CONFIG_SIM_X11FB) && \
    (defined(CONFIG_SIM_TOUCHSCREEN) || defined(CONFIG_SIM_AJOYSTICK))
 void up_x11events(void);
 #endif
 
-/* up_eventloop.c *********************************************************/
+/* up_eventloop.c ***********************************************************/
 
 #if defined(CONFIG_SIM_X11FB) && \
    (defined(CONFIG_SIM_TOUCHSCREEN) || defined(CONFIG_SIM_AJOYSTICK))
 int up_buttonevent(int x, int y, int buttons);
 #endif
 
-/* up_ajoystick.c *********************************************************/
+/* up_ajoystick.c ***********************************************************/
 
 #ifdef CONFIG_SIM_AJOYSTICK
 int sim_ajoy_initialize(void);
 #endif
 
-/* up_ioexpander.c ********************************************************/
+/* up_ioexpander.c **********************************************************/
 
 #ifdef CONFIG_SIM_IOEXPANDER
 struct ioexpander_dev_s;
 FAR struct ioexpander_dev_s *sim_ioexpander_initialize(void);
 #endif
 
-/* up_tapdev.c ************************************************************/
+/* up_tapdev.c **************************************************************/
 
 #if defined(CONFIG_NET_ETHERNET) && !defined(__CYGWIN__)
 void tapdev_init(void);
@@ -369,7 +360,7 @@ void tapdev_ifdown(void);
 #  define netdev_ifdown()         tapdev_ifdown()
 #endif
 
-/* up_wpcap.c *************************************************************/
+/* up_wpcap.c ***************************************************************/
 
 #if defined(CONFIG_NET_ETHERNET) && defined(__CYGWIN__)
 void wpcap_init(void);
@@ -383,7 +374,7 @@ void wpcap_send(unsigned char *buf, unsigned int buflen);
 #  define netdev_ifdown()         {}
 #endif
 
-/* up_netdriver.c *********************************************************/
+/* up_netdriver.c ***********************************************************/
 
 #ifdef CONFIG_NET_ETHERNET
 int netdriver_init(void);
@@ -393,12 +384,12 @@ void netdriver_loop(void);
 
 #ifdef CONFIG_RPTUN
 
-/* up_shmem.c *************************************************************/
+/* up_shmem.c ***************************************************************/
 
 void *shmem_open(const char *name, size_t size, int master);
 void shmem_close(void *mem);
 
-/* up_rptun.c *************************************************************/
+/* up_rptun.c ***************************************************************/
 
 int up_rptun_init(void);
 void up_rptun_loop(void);
diff --git a/arch/sim/src/sim/up_simuart.c b/arch/sim/src/sim/up_simuart.c
index 86b9293..5c49b4f 100644
--- a/arch/sim/src/sim/up_simuart.c
+++ b/arch/sim/src/sim/up_simuart.c
@@ -42,42 +42,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <termios.h>
-#include <pthread.h>
-#include <errno.h>
-
-/****************************************************************************
- * Pre-processor Definitions
- ****************************************************************************/
-
-/* Simulated console UART input buffer size */
-/* Must match the defintion in up_internal.h */
-
-#define SIMUART_BUFSIZE 256
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static char g_uartbuffer[SIMUART_BUFSIZE];
-static volatile int  g_uarthead;
-static volatile int  g_uarttail;
-
-/****************************************************************************
- * Public Data
- ****************************************************************************/
-
-volatile int g_uart_data_available;
-
-/****************************************************************************
- * NuttX Domain Public Function Prototypes
- ****************************************************************************/
-
-void sched_lock(void);
-void sched_unlock(void);
-
-void simuart_initialize(void);
-void simuart_post(void);
-void simuart_wait(void);
+#include <poll.h>
 
 /****************************************************************************
  * Private Data
@@ -126,67 +91,6 @@ static void restoremode(void)
 }
 
 /****************************************************************************
- * Name: simuart_thread
- ****************************************************************************/
-
-static void *simuart_thread(void *arg)
-{
-  unsigned char ch;
-  ssize_t nread;
-  int next;
-  int prev;
-
-  /* Now loop, collecting a buffering data from stdin forever */
-
-  for (; ; )
-    {
-      /* Read one character from stdin */
-
-      nread = read(0, &ch, 1);
-
-      /* Check for failures (but don't do anything) */
-
-      if (nread == 1)
-        {
-          /* Get the index to the next slot in the UART buffer */
-
-          prev = g_uarthead;
-          next = prev + 1;
-          if (next >= SIMUART_BUFSIZE)
-            {
-              next = 0;
-            }
-
-          /* Would adding this character cause an overflow? */
-
-          if (next != g_uarttail)
-            {
-              /* No.. Add the character to the UART buffer */
-
-              g_uartbuffer[prev] = ch;
-
-              /* Update the head index (BEFORE posting) */
-
-              g_uarthead = next;
-
-              /* Was the buffer previously empty? */
-
-              if (prev == g_uarttail)
-                {
-                  /* Yes.. signal any (NuttX) threads waiting for serial
-                   * input.
-                   */
-
-                  g_uart_data_available = 1;
-                }
-            }
-        }
-    }
-
-  return NULL;
-}
-
-/****************************************************************************
  * Name: simuart_putraw
  ****************************************************************************/
 
@@ -213,13 +117,6 @@ int simuart_putraw(int ch)
 
 void simuart_start(void)
 {
-  pthread_t tid;
-
-  /* This thread runs in the host domain */
-  /* Perform the NuttX domain initialization */
-
-  simuart_initialize();
-
   /* Put stdin into raw mode */
 
   setrawmode();
@@ -227,12 +124,6 @@ void simuart_start(void)
   /* Restore the original terminal mode before exit */
 
   atexit(restoremode);
-
-  /* Start the simulated UART thread -- all default settings; no error
-   * checking.
-   */
-
-  pthread_create(&tid, NULL, simuart_thread, NULL);
 }
 
 /****************************************************************************
@@ -260,56 +151,24 @@ int simuart_putc(int ch)
  * Name: simuart_getc
  ****************************************************************************/
 
-int simuart_getc(bool block)
+int simuart_getc(void)
 {
-  int index;
+  int ret;
   int ch;
 
-  /* Locking the scheduler should eliminate the race conditions in the
-   * unlikely case of multiple reading threads.
-   */
-
-  sched_lock();
-  for (; ; )
-    {
-      /* Wait for a byte to become available */
-
-      if (!block && (g_uarthead == g_uarttail))
-        {
-          sched_unlock();
-          return -EAGAIN;
-        }
-
-      while (g_uarthead == g_uarttail)
-        {
-          simuart_wait();
-        }
-
-      /* The UART buffer is non-empty...  Take the next byte from the tail
-       * of the buffer.
-       */
-
-      index = g_uarttail;
-      ch    = (int)g_uartbuffer[index];
-
-      /* Increment the tai index (with wrapping) */
-
-      if (++index >= SIMUART_BUFSIZE)
-        {
-          index = 0;
-        }
-
-      g_uarttail = index;
-      sched_unlock();
-      return ch;
-    }
+  ret = read(0, &ch, 1);
+  return ret < 0 ? ret : ch;
 }
 
 /****************************************************************************
- * Name: simuart_getc
+ * Name: simuart_checkc
  ****************************************************************************/
 
 bool simuart_checkc(void)
 {
-  return g_uarthead != g_uarttail;
+  struct pollfd pfd;
+
+  pfd.fd     = 0;
+  pfd.events = POLLIN;
+  return poll(&pfd, 1, 0) == 1;
 }
diff --git a/arch/sim/src/sim/up_uartwait.c b/arch/sim/src/sim/up_uartwait.c
deleted file mode 100644
index f35abc8..0000000
--- a/arch/sim/src/sim/up_uartwait.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/****************************************************************************
- * arch/sim/src/sim/up_uartwait.c
- *
- *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
- *   Author: Gregory Nutt <gn...@nuttx.org>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in
- *    the documentation and/or other materials provided with the
- *    distribution.
- * 3. Neither the name NuttX nor the names of its contributors may be
- *    used to endorse or promote products derived from this software
- *    without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- ****************************************************************************/
-
-/****************************************************************************
- * Included Files
- ****************************************************************************/
-
-#include <nuttx/semaphore.h>
-
-#include "up_internal.h"
-
-/****************************************************************************
- * Private Data
- ****************************************************************************/
-
-static sem_t g_uartavail;
-
-/****************************************************************************
- * Public Functions
- ****************************************************************************/
-
-/****************************************************************************
- * Name: simuart_initialize
- ****************************************************************************/
-
-void simuart_initialize(void)
-{
-  /* The g_uartavail semaphore is used for signaling and, hence, should not
-   * have priority inheritance enabled.
-   */
-
-  nxsem_init(&g_uartavail, 0, 0);
-  nxsem_setprotocol(&g_uartavail, SEM_PRIO_NONE);
-}
-
-/****************************************************************************
- * Name: simuart_post
- ****************************************************************************/
-
-void simuart_post(void)
-{
-  nxsem_post(&g_uartavail);
-}
-
-/****************************************************************************
- * Name: simuart_wait
- ****************************************************************************/
-
-void simuart_wait(void)
-{
-  /* Should only fail if interrupted by a signal */
-
-  while (nxsem_wait(&g_uartavail) < 0);
-}