linuxOS_D21X/source/artinchip/test-mbox/test_mbox.c
2024-11-29 16:23:11 +08:00

140 lines
3.1 KiB
C

/*
* Copyright (C) 2020-2021 Artinchip Technology Co., Ltd.
* Authors: Matteo <duanmt@artinchip.com>
*/
#include <sys/time.h>
#include <pthread.h>
#include <linux/rpmsg_aic.h>
#include <artinchip/sample_base.h>
/* Global macro and variables */
#define MSG_CNT_DEFAULT 10
#define MSG_MAX_LEN 512
static const char sopts[] = "d:c:h";
static const struct option lopts[] = {
{"device", required_argument, NULL, 'd'},
{"count", required_argument, NULL, 'c'},
{"usage", no_argument, NULL, 'h'},
{0, 0, 0, 0}
};
static int g_msg_fd = -1;
static char g_dev_name[32] = "";
static char g_send_buf[MSG_MAX_LEN] = "";
static char g_recv_buf[MSG_MAX_LEN] = "";
/* Functions */
void usage(char *program)
{
printf("Usage: %s [options]: \n", program);
printf("\t -d, --device\t\tthe device file of RPMsg device\n");
printf("\t -c, --count\t\tthe number of RPMsg msg, 10 as default\n");
printf("\t -h, --usage \n");
printf("\n");
printf("Example: %s -d /dev/rpmsg0 -c 3\n", program);
}
/* Open a device file to be needed. */
int device_open(char *_fname, int _flag)
{
s32 fd = -1;
fd = open(_fname, _flag);
if (fd < 0) {
ERR("Failed to open %s errno: %d[%s]\n",
_fname, errno, strerror(errno));
exit(0);
}
return fd;
}
static void *recv_msg_thread(void *arg)
{
int i = 0, ret = 0, msg_cnt = *(int *)arg;
struct aic_rpmsg *msg = (struct aic_rpmsg *)g_recv_buf;
while (i < msg_cnt && g_msg_fd > 0) {
memset(msg, 0, MSG_MAX_LEN);
ret = read(g_msg_fd, msg, MSG_MAX_LEN);
if (ret < 0) {
ERR("Failed to read msg!\n");
return NULL;
}
printf("\n%s: Recv cmd 0x%x, seq %d, len %d, data |%s|\n",
g_dev_name,
msg->cmd, msg->seq, msg->len, (char *)msg->data);
}
return NULL;
}
int main(int argc, char **argv)
{
int c, msg_cnt = MSG_CNT_DEFAULT;
int i, ret = 0;
struct timeval start, end;
struct aic_rpmsg *msg = (struct aic_rpmsg *)g_send_buf;
pthread_t thid = 0;
while ((c = getopt_long(argc, argv, sopts, lopts, NULL)) != -1) {
switch (c) {
case 'd':
strncpy(g_dev_name, optarg, 32);
continue;
case 'c':
msg_cnt = str2int(optarg);
continue;
case 'h':
usage(argv[0]);
return 0;
default:
break;
}
}
g_msg_fd = device_open(g_dev_name, O_RDWR);
if (strstr(g_dev_name, "rpmsg"))
printf("Will send %d msg by RPMsg mode\n", msg_cnt);
else
printf("Will send %d msg by Mailbox mode\n", msg_cnt);
ret = pthread_create(&thid, NULL, recv_msg_thread, &msg_cnt);
if (ret < 0) {
ERR("Failed to create recv_msg thread!\n");
goto end;
}
gettimeofday(&start, NULL);
for (i = 0; i < msg_cnt; i++) {
msg->cmd = RPMSG_CMD_DDR_RDY;
msg->seq = i;
msg->len = 6;
snprintf((char *)msg->data, 32, "Hi! I'm CSYS %d", i);
printf("\n%s: Send cmd 0x%x, seq %d, len %d, data |%s|\n",
g_dev_name,
msg->cmd, msg->seq, msg->len, (char *)msg->data);
ret = write(g_msg_fd, msg, AIC_RPMSG_REAL_SIZE(msg->len));
if (ret < 0) {
ERR("%s: Failed to send msg %d\n", g_dev_name, i);
break;
}
sleep(2);
}
gettimeofday(&end, NULL);
end:
if (g_msg_fd > 0)
close(g_msg_fd);
if (ret < 0)
return ret;
else
return 0;
}