uart_rpmsg: add mutex to dmatx

Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
ligd
2022-09-05 17:37:31 +08:00
committed by Alan Carvalho de Assis
parent 37d37dcae5
commit d1b118d731
+12 -2
View File
@@ -30,6 +30,7 @@
#include <nuttx/fs/ioctl.h> #include <nuttx/fs/ioctl.h>
#include <nuttx/kmalloc.h> #include <nuttx/kmalloc.h>
#include <nuttx/mutex.h>
#include <nuttx/rptun/openamp.h> #include <nuttx/rptun/openamp.h>
#include <nuttx/serial/serial.h> #include <nuttx/serial/serial.h>
#include <nuttx/serial/uart_rpmsg.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 uart_rpmsg_priv_s
{ {
struct rpmsg_endpoint ept; struct rpmsg_endpoint ept;
mutex_t mutex;
FAR const char *devname; FAR const char *devname;
FAR const char *cpuname; FAR const char *cpuname;
FAR void *recv_data; 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; FAR struct uart_rpmsg_priv_s *priv = dev->priv;
nxmutex_lock(&priv->mutex);
if (is_rpmsg_ept_ready(&priv->ept) && dev->dmatx.length == 0) if (is_rpmsg_ept_ready(&priv->ept) && dev->dmatx.length == 0)
{ {
uart_xmitchars_dma(dev); uart_xmitchars_dma(dev);
} }
nxmutex_unlock(&priv->mutex);
} }
static void uart_rpmsg_send(FAR struct uart_dev_s *dev, int ch) 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_) size_t len, uint32_t src, FAR void *priv_)
{ {
FAR struct uart_dev_s *dev = 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_header_s *header = data;
FAR struct uart_rpmsg_write_s *msg = 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 */ /* Get write-cmd response, this tell how many data have sent */
nxmutex_lock(&priv->mutex);
dev->dmatx.nbytes = header->result; dev->dmatx.nbytes = header->result;
if (header->result < 0) 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); uart_xmitchars_done(dev);
nxmutex_unlock(&priv->mutex);
/* If have sent some data succeed, then continue send */ /* If have sent some data succeed, then continue send */
if (msg->count == header->result) 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) 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 */ /* Get write-cmd, there are some data, we need receive them */
priv->recv_data = data; priv->recv_data = data;
@@ -441,6 +450,7 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const char *devname,
goto fail; goto fail;
} }
nxmutex_init(&priv->mutex);
sprintf(dev_name, "%s%s", UART_RPMSG_DEV_PREFIX, devname); sprintf(dev_name, "%s%s", UART_RPMSG_DEV_PREFIX, devname);
uart_register(dev_name, dev); uart_register(dev_name, dev);