sim/uart: check if txbuffer is not full before uart write

Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
dongjiuzhu1 2022-12-09 22:10:39 +08:00 committed by Xiang Xiao
parent 4fa163ade7
commit eb102a668f
4 changed files with 45 additions and 27 deletions

View File

@ -199,10 +199,10 @@ int host_uart_setcflag(int fd, unsigned int cflag)
}
/****************************************************************************
* Name: host_uart_checkc
* Name: host_uart_checkin
****************************************************************************/
bool host_uart_checkc(int fd)
bool host_uart_checkin(int fd)
{
struct pollfd pfd;
@ -210,3 +210,16 @@ bool host_uart_checkc(int fd)
pfd.events = POLLIN;
return poll(&pfd, 1, 0) == 1;
}
/****************************************************************************
* Name: host_uart_checkout
****************************************************************************/
bool host_uart_checkout(int fd)
{
struct pollfd pfd;
pfd.fd = fd;
pfd.events = POLLOUT;
return poll(&pfd, 1, 0) == 1;
}

View File

@ -195,7 +195,8 @@ int host_uart_open(const char *pathname);
void host_uart_close(int fd);
int host_uart_putc(int fd, int ch);
int host_uart_getc(int fd);
bool host_uart_checkc(int fd);
bool host_uart_checkin(int fd);
bool host_uart_checkout(int fd);
int host_uart_setcflag(int fd, unsigned int cflag);
int host_uart_getcflag(int fd, unsigned int *cflag);

View File

@ -40,6 +40,13 @@
#define CONFIG_SIM_UART_BUFFER_SIZE 256
#endif
#define TTY_RECVSEND(port) \
if (g_tty##port##_priv.fd > 0) \
{ \
uart_recvchars(&g_tty##port##_dev); \
uart_xmitchars(&g_tty##port##_dev); \
} \
/****************************************************************************
* Private Types
****************************************************************************/
@ -391,7 +398,7 @@ static bool tty_rxavailable(struct uart_dev_s *dev)
{
struct tty_priv_s *priv = dev->priv;
return host_uart_checkc(dev->isconsole ? 0 : priv->fd);
return host_uart_checkin(dev->isconsole ? 0 : priv->fd);
}
/****************************************************************************
@ -457,7 +464,9 @@ static void tty_txint(struct uart_dev_s *dev, bool enable)
static bool tty_txready(struct uart_dev_s *dev)
{
return true;
struct tty_priv_s *priv = dev->priv;
return host_uart_checkout(dev->isconsole ? 0 : priv->fd);
}
/****************************************************************************
@ -518,38 +527,24 @@ void sim_uartinit(void)
void sim_uartloop(void)
{
#ifdef USE_DEVCONSOLE
if (host_uart_checkc(0))
{
uart_recvchars(&g_console_dev);
}
uart_recvchars(&g_console_dev);
uart_xmitchars(&g_console_dev);
#endif
#ifdef CONFIG_SIM_UART0_NAME
if (g_tty0_priv.fd > 0 && host_uart_checkc(g_tty0_priv.fd))
{
uart_recvchars(&g_tty0_dev);
}
TTY_RECVSEND(0)
#endif
#ifdef CONFIG_SIM_UART1_NAME
if (g_tty1_priv.fd > 0 && host_uart_checkc(g_tty1_priv.fd))
{
uart_recvchars(&g_tty1_dev);
}
TTY_RECVSEND(1)
#endif
#ifdef CONFIG_SIM_UART2_NAME
if (g_tty2_priv.fd > 0 && host_uart_checkc(g_tty2_priv.fd))
{
uart_recvchars(&g_tty2_dev);
}
TTY_RECVSEND(2)
#endif
#ifdef CONFIG_SIM_UART3_NAME
if (g_tty3_priv.fd > 0 && host_uart_checkc(g_tty3_priv.fd))
{
uart_recvchars(&g_tty3_dev);
}
TTY_RECVSEND(3)
#endif
}

View File

@ -126,10 +126,10 @@ int host_uart_setcflag(int fd, unsigned int cflag)
}
/****************************************************************************
* Name: host_uart_checkc
* Name: host_uart_checkin
****************************************************************************/
bool host_uart_checkc(int fd)
bool host_uart_checkin(int fd)
{
DWORD size;
@ -140,3 +140,12 @@ bool host_uart_checkc(int fd)
return false;
}
/****************************************************************************
* Name: host_uart_checkout
****************************************************************************/
bool host_uart_checkout(int fd)
{
return true;
}