You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ac...@apache.org on 2022/09/09 23:27:30 UTC

[incubator-nuttx] branch master updated: uart_rpmsg: add mutex to dmatx

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

acassis 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 d1b118d731 uart_rpmsg: add mutex to dmatx
d1b118d731 is described below

commit d1b118d731dac3e68f260d6e7de58eda6b130897
Author: ligd <li...@xiaomi.com>
AuthorDate: Mon Sep 5 17:37:31 2022 +0800

    uart_rpmsg: add mutex to dmatx
    
    Signed-off-by: ligd <li...@xiaomi.com>
---
 drivers/serial/uart_rpmsg.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/serial/uart_rpmsg.c b/drivers/serial/uart_rpmsg.c
index 351f82ee72..ad8d4bef87 100644
--- a/drivers/serial/uart_rpmsg.c
+++ b/drivers/serial/uart_rpmsg.c
@@ -30,6 +30,7 @@
 
 #include <nuttx/fs/ioctl.h>
 #include <nuttx/kmalloc.h>
+#include <nuttx/mutex.h>
 #include <nuttx/rptun/openamp.h>
 #include <nuttx/serial/serial.h>
 #include <nuttx/serial/uart_rpmsg.h>
@@ -73,6 +74,7 @@ begin_packed_struct struct uart_rpmsg_wakeup_s
 struct uart_rpmsg_priv_s
 {
   struct rpmsg_endpoint ept;
+  mutex_t               mutex;
   FAR const char        *devname;
   FAR const char        *cpuname;
   FAR void              *recv_data;
@@ -258,10 +260,14 @@ static void uart_rpmsg_dmatxavail(FAR struct uart_dev_s *dev)
 {
   FAR struct uart_rpmsg_priv_s *priv = dev->priv;
 
+  nxmutex_lock(&priv->mutex);
+
   if (is_rpmsg_ept_ready(&priv->ept) && dev->dmatx.length == 0)
     {
       uart_xmitchars_dma(dev);
     }
+
+  nxmutex_unlock(&priv->mutex);
 }
 
 static void uart_rpmsg_send(FAR struct uart_dev_s *dev, int ch)
@@ -340,6 +346,7 @@ static int uart_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data,
                              size_t len, uint32_t src, FAR void *priv_)
 {
   FAR struct uart_dev_s *dev = priv_;
+  FAR struct uart_rpmsg_priv_s *priv = dev->priv;
   FAR struct uart_rpmsg_header_s *header = data;
   FAR struct uart_rpmsg_write_s *msg = data;
 
@@ -347,6 +354,8 @@ static int uart_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data,
     {
       /* Get write-cmd response, this tell how many data have sent */
 
+      nxmutex_lock(&priv->mutex);
+
       dev->dmatx.nbytes = header->result;
       if (header->result < 0)
         {
@@ -355,6 +364,8 @@ static int uart_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data,
 
       uart_xmitchars_done(dev);
 
+      nxmutex_unlock(&priv->mutex);
+
       /* If have sent some data succeed, then continue send */
 
       if (msg->count == header->result)
@@ -364,8 +375,6 @@ static int uart_rpmsg_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data,
     }
   else if (header->command == UART_RPMSG_TTY_WRITE)
     {
-      FAR struct uart_rpmsg_priv_s *priv = dev->priv;
-
       /* Get write-cmd, there are some data, we need receive them */
 
       priv->recv_data = data;
@@ -441,6 +450,7 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const char *devname,
       goto fail;
     }
 
+  nxmutex_init(&priv->mutex);
   sprintf(dev_name, "%s%s", UART_RPMSG_DEV_PREFIX, devname);
   uart_register(dev_name, dev);