Skip to content

Commit 4b77dd0

Browse files
wyr-7GUIDINGLI
authored andcommitted
rpmsg_ping.c: change msg cmd type for more compatible
Use bit mask method to represent the command, because it's more convenient to express multiple characteristics simultaneously. Signed-off-by: Yongrong Wang <[email protected]>
1 parent 1cf97ac commit 4b77dd0

File tree

2 files changed

+55
-46
lines changed

2 files changed

+55
-46
lines changed

drivers/rpmsg/rpmsg_ping.c

Lines changed: 54 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include <nuttx/config.h>
2626
#include <nuttx/arch.h>
27+
#include <nuttx/lib/lib.h>
2728
#include <nuttx/signal.h>
2829

2930
#include <inttypes.h>
@@ -39,11 +40,14 @@
3940
****************************************************************************/
4041

4142
#define RPMSG_PING_EPT_NAME "rpmsg-ping"
42-
#define RPMSG_PING_SEND 1
43-
#define RPMSG_PING_SEND_CHECK 2
44-
#define RPMSG_PING_SEND_NOACK 3
45-
#define RPMSG_PING_SEND_ACK 4
46-
#define RPMSG_PING_ACK 5
43+
44+
#define RPMSG_PING_ACK_MASK 0x00000001
45+
#define RPMSG_PING_CHECK_MASK 0x00000002
46+
#define RPMSG_PING_RANDOMLEN_MASK 0x00000004
47+
48+
#define RPMSG_PING_CMD_MASK 0x000000f0
49+
# define RPMSG_PING_CMD_REQ 0x00000000
50+
# define RPMSG_PING_CMD_RSP 0x00000020
4751

4852
/****************************************************************************
4953
* Private Types
@@ -68,12 +72,22 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept,
6872
FAR struct rpmsg_ping_msg_s *msg = data;
6973
FAR sem_t *sem = (FAR sem_t *)(uintptr_t)msg->cookie;
7074

71-
if (msg->cmd == RPMSG_PING_SEND)
75+
/* Handle the ping response */
76+
77+
if ((msg->cmd & RPMSG_PING_CMD_MASK) == RPMSG_PING_CMD_RSP)
78+
{
79+
nxsem_post(sem);
80+
return 0;
81+
}
82+
83+
/* Handle the ping request */
84+
85+
if ((msg->cmd & RPMSG_PING_ACK_MASK) == 0)
7286
{
73-
msg->cmd = RPMSG_PING_ACK;
74-
rpmsg_send(ept, msg, len);
87+
return 0;
7588
}
76-
else if (msg->cmd == RPMSG_PING_SEND_CHECK)
89+
90+
if ((msg->cmd & RPMSG_PING_CHECK_MASK) != 0)
7791
{
7892
size_t data_len;
7993
size_t i;
@@ -90,25 +104,24 @@ static int rpmsg_ping_ept_cb(FAR struct rpmsg_endpoint *ept,
90104

91105
msg->data[i] = 0;
92106
}
93-
94-
msg->cmd = RPMSG_PING_ACK;
95-
rpmsg_send(ept, msg, len);
96107
}
97-
else if (msg->cmd == RPMSG_PING_SEND_ACK)
108+
109+
if ((msg->cmd & RPMSG_PING_CMD_MASK) == RPMSG_PING_CMD_REQ)
98110
{
99-
msg->cmd = RPMSG_PING_ACK;
100-
rpmsg_send(ept, msg, sizeof(*msg));
111+
msg->len = len;
101112
}
102-
else if (msg->cmd == RPMSG_PING_ACK)
113+
else
103114
{
104-
nxsem_post(sem);
115+
msg->len = sizeof(*msg);
105116
}
106117

118+
msg->cmd = RPMSG_PING_CMD_RSP;
119+
rpmsg_send(ept, msg, msg->len);
107120
return 0;
108121
}
109122

110123
static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len,
111-
int ack, uint32_t *buf_len, char i)
124+
int cmd, uint32_t *buf_len, char i)
112125
{
113126
FAR struct rpmsg_ping_msg_s *msg;
114127
int ret;
@@ -122,36 +135,34 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len,
122135
len = MAX(len, sizeof(struct rpmsg_ping_msg_s));
123136
len = MIN(len, *buf_len);
124137

125-
memset(msg, 0, len);
138+
msg->cmd = cmd;
126139

127-
if (ack)
140+
if ((msg->cmd & RPMSG_PING_RANDOMLEN_MASK) != 0)
128141
{
129-
sem_t sem;
130-
131-
if (ack == 1)
132-
{
133-
msg->cmd = RPMSG_PING_SEND;
134-
}
135-
else if (ack == 2)
136-
{
137-
msg->cmd = RPMSG_PING_SEND_CHECK;
138-
}
139-
else
140-
{
141-
msg->cmd = RPMSG_PING_SEND_ACK;
142-
}
142+
msg->len = nrand(len);
143+
}
144+
else
145+
{
146+
msg->len = len;
147+
}
143148

144-
msg->len = len;
145-
msg->cookie = (uintptr_t)&sem;
149+
if ((msg->cmd & RPMSG_PING_CHECK_MASK) != 0)
150+
{
151+
memset(msg->data, i, msg->len - sizeof(struct rpmsg_ping_msg_s) + 1);
152+
}
153+
else
154+
{
155+
memset(msg->data, 0, msg->len);
156+
}
146157

147-
if (msg->cmd == RPMSG_PING_SEND_CHECK)
148-
{
149-
memset(msg->data, i, len - sizeof(struct rpmsg_ping_msg_s) + 1);
150-
}
158+
if ((msg->cmd & RPMSG_PING_ACK_MASK) != 0)
159+
{
160+
sem_t sem;
151161

162+
msg->cookie = (uintptr_t)&sem;
152163
nxsem_init(&sem, 0, 0);
153164

154-
ret = rpmsg_send_nocopy(ept, msg, len);
165+
ret = rpmsg_send_nocopy(ept, msg, msg->len);
155166
if (ret >= 0)
156167
{
157168
nxsem_wait_uninterruptible(&sem);
@@ -161,9 +172,7 @@ static int rpmsg_ping_once(FAR struct rpmsg_endpoint *ept, int len,
161172
}
162173
else
163174
{
164-
msg->cmd = RPMSG_PING_SEND_NOACK;
165-
msg->len = len;
166-
ret = rpmsg_send_nocopy(ept, msg, len);
175+
ret = rpmsg_send_nocopy(ept, msg, msg->len);
167176
}
168177

169178
if (ret < 0)
@@ -226,7 +235,7 @@ int rpmsg_ping(FAR struct rpmsg_endpoint *ept,
226235
{
227236
clock_t tm = perf_gettime();
228237

229-
send_len = rpmsg_ping_once(ept, ping->len, ping->ack, &buf_len, i);
238+
send_len = rpmsg_ping_once(ept, ping->len, ping->cmd, &buf_len, i);
230239
if (send_len < 0)
231240
{
232241
return send_len;

include/nuttx/rpmsg/rpmsg_ping.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ struct rpmsg_ping_s
4141
{
4242
int times;
4343
int len;
44-
int ack;
44+
int cmd;
4545
int sleep; /* unit: ms */
4646
};
4747

0 commit comments

Comments
 (0)