diff --git a/drivers/rpmsg/rpmsg_ping.c b/drivers/rpmsg/rpmsg_ping.c index d615c3547aebf..9996285c4c254 100644 --- a/drivers/rpmsg/rpmsg_ping.c +++ b/drivers/rpmsg/rpmsg_ping.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -39,11 +40,14 @@ ****************************************************************************/ #define RPMSG_PING_EPT_NAME "rpmsg-ping" -#define RPMSG_PING_SEND 1 -#define RPMSG_PING_SEND_CHECK 2 -#define RPMSG_PING_SEND_NOACK 3 -#define RPMSG_PING_SEND_ACK 4 -#define RPMSG_PING_ACK 5 + +#define RPMSG_PING_ACK_MASK 0x00000001 +#define RPMSG_PING_CHECK_MASK 0x00000002 +#define RPMSG_PING_RANDOMLEN_MASK 0x00000004 + +#define RPMSG_PING_CMD_MASK 0x000000f0 +# define RPMSG_PING_CMD_REQ 0x00000000 +# define RPMSG_PING_CMD_RSP 0x00000020 /**************************************************************************** * Private Types @@ -68,12 +72,22 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept, FAR struct rpmsg_ping_msg_s *msg = data; FAR sem_t *sem = (FAR sem_t *)(uintptr_t)msg->cookie; - if (msg->cmd == RPMSG_PING_SEND) + /* Handle the ping response */ + + if ((msg->cmd & RPMSG_PING_CMD_MASK) == RPMSG_PING_CMD_RSP) + { + nxsem_post(sem); + return 0; + } + + /* Handle the ping request */ + + if ((msg->cmd & RPMSG_PING_ACK_MASK) == 0) { - msg->cmd = RPMSG_PING_ACK; - rpmsg_send(ept, msg, len); + return 0; } - else if (msg->cmd == RPMSG_PING_SEND_CHECK) + + if ((msg->cmd & RPMSG_PING_CHECK_MASK) != 0) { size_t data_len; size_t i; @@ -90,25 +104,24 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept, msg->data[i] = 0; } - - msg->cmd = RPMSG_PING_ACK; - rpmsg_send(ept, msg, len); } - else if (msg->cmd == RPMSG_PING_SEND_ACK) + + if ((msg->cmd & RPMSG_PING_CMD_MASK) == RPMSG_PING_CMD_REQ) { - msg->cmd = RPMSG_PING_ACK; - rpmsg_send(ept, msg, sizeof(*msg)); + msg->len = len; } - else if (msg->cmd == RPMSG_PING_ACK) + else { - nxsem_post(sem); + msg->len = sizeof(*msg); } + msg->cmd = RPMSG_PING_CMD_RSP; + rpmsg_send(ept, msg, msg->len); return 0; } static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len, - int ack, uint32_t *buf_len, char i) + int cmd, uint32_t *buf_len, char i) { FAR struct rpmsg_ping_msg_s *msg; int ret; @@ -122,36 +135,34 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len, len = MAX(len, sizeof(struct rpmsg_ping_msg_s)); len = MIN(len, *buf_len); - memset(msg, 0, len); + msg->cmd = cmd; - if (ack) + if ((msg->cmd & RPMSG_PING_RANDOMLEN_MASK) != 0) { - sem_t sem; - - if (ack == 1) - { - msg->cmd = RPMSG_PING_SEND; - } - else if (ack == 2) - { - msg->cmd = RPMSG_PING_SEND_CHECK; - } - else - { - msg->cmd = RPMSG_PING_SEND_ACK; - } + msg->len = nrand(len); + } + else + { + msg->len = len; + } - msg->len = len; - msg->cookie = (uintptr_t)&sem; + if ((msg->cmd & RPMSG_PING_CHECK_MASK) != 0) + { + memset(msg->data, i, msg->len - sizeof(struct rpmsg_ping_msg_s) + 1); + } + else + { + memset(msg->data, 0, msg->len); + } - if (msg->cmd == RPMSG_PING_SEND_CHECK) - { - memset(msg->data, i, len - sizeof(struct rpmsg_ping_msg_s) + 1); - } + if ((msg->cmd & RPMSG_PING_ACK_MASK) != 0) + { + sem_t sem; + msg->cookie = (uintptr_t)&sem; nxsem_init(&sem, 0, 0); - ret = rpmsg_send_nocopy(ept, msg, len); + ret = rpmsg_send_nocopy(ept, msg, msg->len); if (ret >= 0) { nxsem_wait_uninterruptible(&sem); @@ -161,9 +172,7 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len, } else { - msg->cmd = RPMSG_PING_SEND_NOACK; - msg->len = len; - ret = rpmsg_send_nocopy(ept, msg, len); + ret = rpmsg_send_nocopy(ept, msg, msg->len); } if (ret < 0) @@ -226,7 +235,7 @@ int rpmsg_ping(FAR struct rpmsg_endpoint *ept, { clock_t tm = perf_gettime(); - send_len = rpmsg_ping_once(ept, ping->len, ping->ack, &buf_len, i); + send_len = rpmsg_ping_once(ept, ping->len, ping->cmd, &buf_len, i); if (send_len < 0) { return send_len; diff --git a/include/nuttx/rpmsg/rpmsg_ping.h b/include/nuttx/rpmsg/rpmsg_ping.h index 4e1367f234735..f6b7cccf343ed 100644 --- a/include/nuttx/rpmsg/rpmsg_ping.h +++ b/include/nuttx/rpmsg/rpmsg_ping.h @@ -41,7 +41,7 @@ struct rpmsg_ping_s { int times; int len; - int ack; + int cmd; int sleep; /* unit: ms */ };