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);