diff --git a/examples/linux/common/common.c b/examples/linux/common/common.c new file mode 100644 index 0000000..ae086bc --- /dev/null +++ b/examples/linux/common/common.c @@ -0,0 +1,189 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +int app_rpmsg_create_ept(int rpfd, struct rpmsg_endpoint_info *eptinfo) +{ + int ret; + + ret = ioctl(rpfd, RPMSG_CREATE_EPT_IOCTL, eptinfo); + if (ret) + perror("Failed to create endpoint.\n"); + return ret; +} + +char *get_rpmsg_ept_dev_name(const char *rpmsg_char_name, + const char *ept_name, + char *ept_dev_name) +{ + char sys_rpmsg_ept_name_path[64]; + char svc_name[64]; + char *sys_rpmsg_path = "/sys/class/rpmsg"; + FILE *fp; + int i; + int ept_name_len; + + for (i = 0; i < 128; i++) { + sprintf(sys_rpmsg_ept_name_path, "%s/%s/rpmsg%d/name", + sys_rpmsg_path, rpmsg_char_name, i); + printf("checking %s\n", sys_rpmsg_ept_name_path); + if (access(sys_rpmsg_ept_name_path, F_OK) < 0) + continue; + fp = fopen(sys_rpmsg_ept_name_path, "r"); + if (!fp) { + printf("failed to open %s\n", sys_rpmsg_ept_name_path); + break; + } + fgets(svc_name, sizeof(svc_name), fp); + fclose(fp); + printf("svc_name: %s.\n",svc_name); + ept_name_len = strlen(ept_name); + if (ept_name_len > sizeof(svc_name)) + ept_name_len = sizeof(svc_name); + if (!strncmp(svc_name, ept_name, ept_name_len)) { + sprintf(ept_dev_name, "rpmsg%d", i); + return ept_dev_name; + } + } + + printf("Not able to RPMsg endpoint file for %s:%s.\n", + rpmsg_char_name, ept_name); + return NULL; +} + +int bind_rpmsg_chrdev(const char *rpmsg_dev_name) +{ + char fpath[256]; + char *rpmsg_chdrv = "rpmsg_chrdev"; + int fd; + int ret; + + /* rpmsg dev overrides path */ + sprintf(fpath, "%s/devices/%s/driver_override", + RPMSG_BUS_SYS, rpmsg_dev_name); + printf("open %s\n", fpath); + fd = open(fpath, O_WRONLY); + if (fd < 0) { + fprintf(stderr, "Failed to open %s, %s\n", + fpath, strerror(errno)); + return -EINVAL; + } + ret = write(fd, rpmsg_chdrv, strlen(rpmsg_chdrv) + 1); + if (ret < 0) { + fprintf(stderr, "Failed to write %s to %s, %s\n", + rpmsg_chdrv, fpath, strerror(errno)); + close(fd); + return -EINVAL; + } + close(fd); + + /* bind the rpmsg device to rpmsg char driver */ + sprintf(fpath, "%s/drivers/%s/bind", RPMSG_BUS_SYS, rpmsg_chdrv); + fd = open(fpath, O_WRONLY); + if (fd < 0) { + fprintf(stderr, "Failed to open %s, %s\n", + fpath, strerror(errno)); + return -EINVAL; + } + printf("write %s to %s\n", rpmsg_dev_name, fpath); + ret = write(fd, rpmsg_dev_name, strlen(rpmsg_dev_name) + 1); + if (ret < 0) { + fprintf(stderr, "Failed to write %s to %s, %s\n", + rpmsg_dev_name, fpath, strerror(errno)); + close(fd); + return -EINVAL; + } + close(fd); + return 0; +} + +int get_rpmsg_chrdev_fd(const char *rpmsg_dev_name, char *rpmsg_ctrl_name) +{ + char dpath[2*NAME_MAX]; + DIR *dir; + struct dirent *ent; + int fd; + + sprintf(dpath, "%s/devices/%s/rpmsg", RPMSG_BUS_SYS, rpmsg_dev_name); + printf("opendir %s\n", dpath); + dir = opendir(dpath); + if (dir == NULL) { + fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); + return -EINVAL; + } + while ((ent = readdir(dir)) != NULL) { + if (!strncmp(ent->d_name, "rpmsg_ctrl", 10)) { + sprintf(dpath, "/dev/%s", ent->d_name); + closedir(dir); + printf("open %s\n", dpath); + fd = open(dpath, O_RDWR | O_NONBLOCK); + if (fd < 0) { + fprintf(stderr, "open %s, %s\n", + dpath, strerror(errno)); + return fd; + } + sprintf(rpmsg_ctrl_name, "%s", ent->d_name); + return fd; + } + } + + fprintf(stderr, "No rpmsg_ctrl file found in %s\n", dpath); + closedir(dir); + return -EINVAL; +} + +static void set_src_dst(char *out, struct rpmsg_endpoint_info *pep) +{ + long dst = 0; + char *lastdot = strrchr(out, '.'); + + if (lastdot == NULL) + return; + dst = strtol(lastdot + 1, NULL, 10); + if ((errno == ERANGE && (dst == LONG_MAX || dst == LONG_MIN)) + || (errno != 0 && dst == 0)) { + return; + } + pep->dst = (unsigned int)dst; +} + +/* + * return the first dirent matching rpmsg-openamp-demo-channel + * in /sys/bus/rpmsg/devices/ E.g.: + * virtio0.rpmsg-openamp-demo-channel.-1.1024 + */ +int lookup_channel(char *out, struct rpmsg_endpoint_info *pep) +{ + char dpath[] = RPMSG_BUS_SYS "/devices"; + struct dirent *ent; + DIR *dir = opendir(dpath); + + if (dir == NULL) { + fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); + return -EINVAL; + } + while ((ent = readdir(dir)) != NULL) { + if (strstr(ent->d_name, pep->name)) { + strncpy(out, ent->d_name, NAME_MAX); + set_src_dst(out, pep); + printf("using dev file: %s\n", out); + closedir(dir); + return 0; + } + } + closedir(dir); + fprintf(stderr, "No dev file for %s in %s\n", pep->name, dpath); + return -EINVAL; +} diff --git a/examples/linux/common/common.h b/examples/linux/common/common.h new file mode 100644 index 0000000..c5cba3e --- /dev/null +++ b/examples/linux/common/common.h @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: BSD-3-Clause + +#ifndef __COMMON__H__ +#define __COMMON__H__ + +#include + +#define RPMSG_BUS_SYS "/sys/bus/rpmsg" + +int app_rpmsg_create_ept(int rpfd, struct rpmsg_endpoint_info *eptinfo); +char *get_rpmsg_ept_dev_name(const char *rpmsg_char_name, + const char *ept_name, + char *ept_dev_name); +int bind_rpmsg_chrdev(const char *rpmsg_dev_name); +int get_rpmsg_chrdev_fd(const char *rpmsg_dev_name, char *rpmsg_ctrl_name); +int lookup_channel(char *out, struct rpmsg_endpoint_info *pep); + +#endif /* __COMMON__H__ */ diff --git a/examples/linux/rpmsg-echo-test/Makefile b/examples/linux/rpmsg-echo-test/Makefile index 31943f3..6707911 100644 --- a/examples/linux/rpmsg-echo-test/Makefile +++ b/examples/linux/rpmsg-echo-test/Makefile @@ -1,6 +1,6 @@ APP = echo_test -APP_OBJS = echo_test.o +APP_OBJS = echo_test.o ../common/common.o # Add any other object files to this list below @@ -11,7 +11,7 @@ $(APP): $(APP_OBJS) $(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS) clean: - rm -rf $(APP) *.o + rm -rf $(APP) $(APP_OBJS) %.o: %.c $(CC) -c $(CFLAGS) -o $@ $< diff --git a/examples/linux/rpmsg-echo-test/echo_test.c b/examples/linux/rpmsg-echo-test/echo_test.c index 827584e..e688d28 100644 --- a/examples/linux/rpmsg-echo-test/echo_test.c +++ b/examples/linux/rpmsg-echo-test/echo_test.c @@ -12,27 +12,24 @@ * to application which then app validates the data returned. */ -#include #include #include #include #include #include -#include #include #include #include #include +#include "../common/common.h" + struct _payload { unsigned long num; unsigned long size; char data[]; }; -struct _payload *i_payload; -struct _payload *r_payload; - #define RPMSG_GET_KFIFO_SIZE 1 #define RPMSG_GET_AVAIL_DATA_SIZE 2 #define RPMSG_GET_FREE_SPACE 3 @@ -64,178 +61,6 @@ void send_shutdown(int fd) perror("write SHUTDOWN_MSG\n"); } -int app_rpmsg_create_ept(int rpfd, struct rpmsg_endpoint_info *eptinfo) -{ - int ret; - - ret = ioctl(rpfd, RPMSG_CREATE_EPT_IOCTL, eptinfo); - if (ret) - perror("Failed to create endpoint.\n"); - return ret; -} - -static char *get_rpmsg_ept_dev_name(const char *rpmsg_char_name, - const char *ept_name, - char *ept_dev_name) -{ - char sys_rpmsg_ept_name_path[64]; - char svc_name[64]; - char *sys_rpmsg_path = "/sys/class/rpmsg"; - FILE *fp; - int i; - int ept_name_len; - - for (i = 0; i < 128; i++) { - sprintf(sys_rpmsg_ept_name_path, "%s/%s/rpmsg%d/name", - sys_rpmsg_path, rpmsg_char_name, i); - printf("checking %s\n", sys_rpmsg_ept_name_path); - if (access(sys_rpmsg_ept_name_path, F_OK) < 0) - continue; - fp = fopen(sys_rpmsg_ept_name_path, "r"); - if (!fp) { - printf("failed to open %s\n", sys_rpmsg_ept_name_path); - break; - } - fgets(svc_name, sizeof(svc_name), fp); - fclose(fp); - printf("svc_name: %s.\n",svc_name); - ept_name_len = strlen(ept_name); - if (ept_name_len > sizeof(svc_name)) - ept_name_len = sizeof(svc_name); - if (!strncmp(svc_name, ept_name, ept_name_len)) { - sprintf(ept_dev_name, "rpmsg%d", i); - return ept_dev_name; - } - } - - printf("Not able to RPMsg endpoint file for %s:%s.\n", - rpmsg_char_name, ept_name); - return NULL; -} - -static int bind_rpmsg_chrdev(const char *rpmsg_dev_name) -{ - char fpath[256]; - char *rpmsg_chdrv = "rpmsg_chrdev"; - int fd; - int ret; - - /* rpmsg dev overrides path */ - sprintf(fpath, "%s/devices/%s/driver_override", - RPMSG_BUS_SYS, rpmsg_dev_name); - PR_DBG("open %s\n", fpath); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - ret = write(fd, rpmsg_chdrv, strlen(rpmsg_chdrv) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_chdrv, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - - /* bind the rpmsg device to rpmsg char driver */ - sprintf(fpath, "%s/drivers/%s/bind", RPMSG_BUS_SYS, rpmsg_chdrv); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - PR_DBG("write %s to %s\n", rpmsg_dev_name, fpath); - ret = write(fd, rpmsg_dev_name, strlen(rpmsg_dev_name) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_dev_name, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - return 0; -} - -static int get_rpmsg_chrdev_fd(const char *rpmsg_dev_name, - char *rpmsg_ctrl_name) -{ - char dpath[2*NAME_MAX]; - DIR *dir; - struct dirent *ent; - int fd; - - sprintf(dpath, "%s/devices/%s/rpmsg", RPMSG_BUS_SYS, rpmsg_dev_name); - PR_DBG("opendir %s\n", dpath); - dir = opendir(dpath); - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return -EINVAL; - } - while ((ent = readdir(dir)) != NULL) { - if (!strncmp(ent->d_name, "rpmsg_ctrl", 10)) { - sprintf(dpath, "/dev/%s", ent->d_name); - closedir(dir); - PR_DBG("open %s\n", dpath); - fd = open(dpath, O_RDWR | O_NONBLOCK); - if (fd < 0) { - fprintf(stderr, "open %s, %s\n", - dpath, strerror(errno)); - return fd; - } - sprintf(rpmsg_ctrl_name, "%s", ent->d_name); - return fd; - } - } - - fprintf(stderr, "No rpmsg_ctrl file found in %s\n", dpath); - closedir(dir); - return -EINVAL; -} - -static void set_src_dst(char *out, struct rpmsg_endpoint_info *pep) -{ - long dst = 0; - char *lastdot = strrchr(out, '.'); - - if (lastdot == NULL) - return; - dst = strtol(lastdot + 1, NULL, 10); - if ((errno == ERANGE && (dst == LONG_MAX || dst == LONG_MIN)) - || (errno != 0 && dst == 0)) { - return; - } - pep->dst = (unsigned int)dst; -} - -/* - * return the first dirent matching rpmsg-openamp-demo-channel - * in /sys/bus/rpmsg/devices/ E.g.: - * virtio0.rpmsg-openamp-demo-channel.-1.1024 - */ -static void lookup_channel(char *out, struct rpmsg_endpoint_info *pep) -{ - char dpath[] = RPMSG_BUS_SYS "/devices"; - struct dirent *ent; - DIR *dir = opendir(dpath); - - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return; - } - while ((ent = readdir(dir)) != NULL) { - if (strstr(ent->d_name, pep->name)) { - strncpy(out, ent->d_name, NAME_MAX); - set_src_dst(out, pep); - PR_DBG("using dev file: %s\n", out); - closedir(dir); - return; - } - } - closedir(dir); - fprintf(stderr, "No dev file for %s in %s\n", pep->name, dpath); -} - void print_help(void) { extern char *__progname; @@ -263,6 +88,8 @@ int main(int argc, char *argv[]) }; char ept_dev_name[16]; char ept_dev_path[32]; + struct _payload *i_payload; + struct _payload *r_payload; printf("\r\n Echo test start \r\n"); lookup_channel(rpmsg_dev, &eptinfo); diff --git a/examples/linux/rpmsg-mat-mul/Makefile b/examples/linux/rpmsg-mat-mul/Makefile index aa89036..e711edb 100644 --- a/examples/linux/rpmsg-mat-mul/Makefile +++ b/examples/linux/rpmsg-mat-mul/Makefile @@ -1,6 +1,6 @@ APP = mat_mul_demo -APP_OBJS = mat_mul_demo.o +APP_OBJS = mat_mul_demo.o ../common/common.o # Add any other object files to this list below @@ -11,7 +11,7 @@ $(APP): $(APP_OBJS) $(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS) -lpthread clean: - rm -rf $(APP) *.o + rm -rf $(APP) $(APP_OBJS) %.o: %.c $(CC) -c $(CFLAGS) -o $@ $< diff --git a/examples/linux/rpmsg-mat-mul/mat_mul_demo.c b/examples/linux/rpmsg-mat-mul/mat_mul_demo.c index 0e33348..a4b3014 100644 --- a/examples/linux/rpmsg-mat-mul/mat_mul_demo.c +++ b/examples/linux/rpmsg-mat-mul/mat_mul_demo.c @@ -9,21 +9,21 @@ * and transmits the results back to this application. */ -#include #include +#include #include #include #include #include -#include #include #include #include #include +#include "../common/common.h" + #define RPMSG_BUS_SYS "/sys/bus/rpmsg" -#define PR_DBG(fmt, args ...) printf("%s():%u "fmt, __func__, __LINE__, ##args) #define SHUTDOWN_MSG 0xEF56A55A #define MATRIX_SIZE 6 @@ -36,14 +36,12 @@ static void matrix_print(struct _matrix *m) { int i, j; - /* Generate two random matrices */ - printf(" \r\n Host : Linux : Printing results \r\n"); - for (i = 0; i < m->size; ++i) { for (j = 0; j < m->size; ++j) - printf(" %d ", (unsigned int)m->elements[i][j]); + printf(" %3d ", (unsigned int)m->elements[i][j]); printf("\r\n"); } + printf("\r\n"); } static void generate_matrices(int num_matrices, @@ -60,229 +58,49 @@ static void generate_matrices(int num_matrices, /* Initialize workload */ p_matrix[i].size = matrix_size; - printf(" \r\n Host : Linux : Input matrix %d \r\n", i); for (j = 0; j < matrix_size; j++) { - printf("\r\n"); for (k = 0; k < matrix_size; k++) { value = (rand() & 0x7F); value = value % 10; p_matrix[i].elements[j][k] = value; - printf(" %d ", - (unsigned int)p_matrix[i].elements[j][k]); } } - printf("\r\n"); - } -} - -static int charfd = -1, fd; -static struct _matrix i_matrix[2]; -static struct _matrix r_matrix; - -void matrix_mult(int ntimes) -{ - int i; - - for (i=0; i < ntimes; i++){ - generate_matrices(2, MATRIX_SIZE, i_matrix); - - printf("%d: write rpmsg: %lu bytes\n", i, sizeof(i_matrix)); - ssize_t rc = write(fd, i_matrix, sizeof(i_matrix)); - if (rc < 0) - fprintf(stderr, "write,errno = %ld, %d\n", rc, errno); - - puts("read results"); - do { - rc = read(fd, &r_matrix, sizeof(r_matrix)); - } while (rc < (int)sizeof(r_matrix)); - matrix_print(&r_matrix); - printf("End of Matrix multiplication demo Round %d\n", i); + printf(" \r\n Host : Linux : Input matrix %d \r\n", i); + matrix_print(&p_matrix[i]); } -} -/* - * Probably an overkill to memset(.., sizeof(struct _matrix)) as - * the firmware looks for SHUTDOWN_MSG in the first 32 bits. - */ -void send_shutdown(int fd) -{ - memset(i_matrix, SHUTDOWN_MSG, sizeof(struct _matrix)); - if (write(fd, i_matrix, sizeof(i_matrix)) < 0) - perror("write SHUTDOWN_MSG\n"); -} - -int app_rpmsg_create_ept(int rpfd, struct rpmsg_endpoint_info *eptinfo) -{ - int ret; - - ret = ioctl(rpfd, RPMSG_CREATE_EPT_IOCTL, eptinfo); - if (ret) - perror("Failed to create endpoint.\n"); - return ret; } -static char *get_rpmsg_ept_dev_name(const char *rpmsg_char_name, - const char *ept_name, - char *ept_dev_name) +void matrix_mult(int fd) { - char sys_rpmsg_ept_name_path[64]; - char svc_name[64]; - char *sys_rpmsg_path = "/sys/class/rpmsg"; - FILE *fp; - int i; - int ept_name_len; - - for (i = 0; i < 128; i++) { - sprintf(sys_rpmsg_ept_name_path, "%s/%s/rpmsg%d/name", - sys_rpmsg_path, rpmsg_char_name, i); - printf("checking %s\n", sys_rpmsg_ept_name_path); - if (access(sys_rpmsg_ept_name_path, F_OK) < 0) - continue; - fp = fopen(sys_rpmsg_ept_name_path, "r"); - if (!fp) { - printf("failed to open %s\n", sys_rpmsg_ept_name_path); - break; - } - fgets(svc_name, sizeof(svc_name), fp); - fclose(fp); - printf("svc_name: %s.\n",svc_name); - ept_name_len = strlen(ept_name); - if (ept_name_len > sizeof(svc_name)) - ept_name_len = sizeof(svc_name); - if (!strncmp(svc_name, ept_name, ept_name_len)) { - sprintf(ept_dev_name, "rpmsg%d", i); - return ept_dev_name; - } - } - - printf("Not able to RPMsg endpoint file for %s:%s.\n", - rpmsg_char_name, ept_name); - return NULL; -} + struct _matrix i_matrix[2]; + struct _matrix r_matrix; -static int bind_rpmsg_chrdev(const char *rpmsg_dev_name) -{ - char fpath[256]; - char *rpmsg_chdrv = "rpmsg_chrdev"; - int fd; - int ret; - - /* rpmsg dev overrides path */ - sprintf(fpath, "%s/devices/%s/driver_override", - RPMSG_BUS_SYS, rpmsg_dev_name); - PR_DBG("open %s\n", fpath); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - ret = write(fd, rpmsg_chdrv, strlen(rpmsg_chdrv) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_chdrv, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - - /* bind the rpmsg device to rpmsg char driver */ - sprintf(fpath, "%s/drivers/%s/bind", RPMSG_BUS_SYS, rpmsg_chdrv); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - PR_DBG("write %s to %s\n", rpmsg_dev_name, fpath); - ret = write(fd, rpmsg_dev_name, strlen(rpmsg_dev_name) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_dev_name, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - return 0; -} + /* Generate two random matrices */ + generate_matrices(2, MATRIX_SIZE, i_matrix); -static int get_rpmsg_chrdev_fd(const char *rpmsg_dev_name, - char *rpmsg_ctrl_name) -{ - char dpath[2*NAME_MAX]; - DIR *dir; - struct dirent *ent; - int fd; - - sprintf(dpath, "%s/devices/%s/rpmsg", RPMSG_BUS_SYS, rpmsg_dev_name); - PR_DBG("opendir %s\n", dpath); - dir = opendir(dpath); - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return -EINVAL; - } - while ((ent = readdir(dir)) != NULL) { - if (!strncmp(ent->d_name, "rpmsg_ctrl", 10)) { - sprintf(dpath, "/dev/%s", ent->d_name); - closedir(dir); - PR_DBG("open %s\n", dpath); - fd = open(dpath, O_RDWR | O_NONBLOCK); - if (fd < 0) { - fprintf(stderr, "open %s, %s\n", - dpath, strerror(errno)); - return fd; - } - sprintf(rpmsg_ctrl_name, "%s", ent->d_name); - return fd; - } - } + printf("Sending RPMSG: %lu bytes\n", sizeof(i_matrix)); + ssize_t rc = write(fd, i_matrix, sizeof(i_matrix)); + if (rc < 0) + fprintf(stderr, "write,errno = %ld, %d\n", rc, errno); - fprintf(stderr, "No rpmsg_ctrl file found in %s\n", dpath); - closedir(dir); - return -EINVAL; -} + do { + rc = read(fd, &r_matrix, sizeof(r_matrix)); + } while (rc < (int)sizeof(r_matrix)); + printf("Received RPMSG: %lu bytes\n", rc); -static void set_src_dst(char *out, struct rpmsg_endpoint_info *pep) -{ - long dst = 0; - char *lastdot = strrchr(out, '.'); - - if (lastdot == NULL) - return; - dst = strtol(lastdot + 1, NULL, 10); - if ((errno == ERANGE && (dst == LONG_MAX || dst == LONG_MIN)) - || (errno != 0 && dst == 0)) { - return; - } - pep->dst = (unsigned int)dst; + printf(" \r\n Host : Linux : Printing results \r\n"); + matrix_print(&r_matrix); } -/* - * return the first dirent matching rpmsg-openamp-demo-channel - * in /sys/bus/rpmsg/devices/ E.g.: - * virtio0.rpmsg-openamp-demo-channel.-1.1024 - */ -static void lookup_channel(char *out, struct rpmsg_endpoint_info *pep) +/* The firmware looks for SHUTDOWN_MSG in the first 32 bits */ +void send_shutdown(int fd) { - char dpath[] = RPMSG_BUS_SYS "/devices"; - struct dirent *ent; - DIR *dir = opendir(dpath); - - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return; - } - while ((ent = readdir(dir)) != NULL) { - if (strstr(ent->d_name, pep->name)) { - strncpy(out, ent->d_name, NAME_MAX); - set_src_dst(out, pep); - PR_DBG("using dev file: %s\n", out); - closedir(dir); - return; - } - } - closedir(dir); - fprintf(stderr, "No dev file for %s in %s\n", pep->name, dpath); + uint32_t msg = SHUTDOWN_MSG; + if (write(fd, &msg, sizeof(msg)) < 0) + perror("write SHUTDOWN_MSG\n"); } void print_help(void) @@ -299,7 +117,7 @@ void print_help(void) int main(int argc, char *argv[]) { int ntimes = 1; - int opt, ret; + int opt, ret, fd, charfd = -1; char rpmsg_dev[NAME_MAX] = "virtio0.rpmsg-openamp-demo-channel.-1.0"; char rpmsg_ctrl_dev_name[NAME_MAX] = "virtio0.rpmsg_ctrl.0.0"; char rpmsg_char_name[16]; @@ -310,7 +128,7 @@ int main(int argc, char *argv[]) char ept_dev_name[16]; char ept_dev_path[32]; - printf("\r\n Matrix multiplication demo start \r\n"); + printf("Matrix multiplication demo start\n"); lookup_channel(rpmsg_dev, &eptinfo); while ((opt = getopt(argc, argv, "d:n:s:e:")) != -1) { @@ -352,7 +170,7 @@ int main(int argc, char *argv[]) } /* Create endpoint from rpmsg char driver */ - PR_DBG("app_rpmsg_create_ept: %s[src=%#x,dst=%#x]\n", + printf("Creating RPMSG endpoint with name: %s, src=%#x, dst=%#x\n", eptinfo.name, eptinfo.src, eptinfo.dst); ret = app_rpmsg_create_ept(charfd, &eptinfo); if (ret) { @@ -372,8 +190,11 @@ int main(int argc, char *argv[]) return -1; } - PR_DBG("matrix_mult(%d)\n", ntimes); - matrix_mult(ntimes); + printf("Start of Matrix multiplication demo with %d rounds\n", ntimes); + for (int i = 0; i < ntimes; i++) { + matrix_mult(fd); + printf("End of Matrix multiplication demo round %d\n", i); + } send_shutdown(fd); close(fd); diff --git a/examples/linux/rpmsg-proxy-app/Makefile b/examples/linux/rpmsg-proxy-app/Makefile index ad503a9..0d1e550 100644 --- a/examples/linux/rpmsg-proxy-app/Makefile +++ b/examples/linux/rpmsg-proxy-app/Makefile @@ -1,6 +1,6 @@ APP = proxy_app -APP_OBJS = proxy_app.o +APP_OBJS = proxy_app.o ../common/common.o # Add any other object files to this list below @@ -11,7 +11,7 @@ $(APP): $(APP_OBJS) $(CC) $(LDFLAGS) -o $@ $(APP_OBJS) $(LDLIBS) clean: - rm -rf $(APP) *.o + rm -rf $(APP) $(APP_OBJS) %.o: %.c $(CC) -c $(CFLAGS) -o $@ $< diff --git a/examples/linux/rpmsg-proxy-app/proxy_app.c b/examples/linux/rpmsg-proxy-app/proxy_app.c index 90939e0..b574560 100644 --- a/examples/linux/rpmsg-proxy-app/proxy_app.c +++ b/examples/linux/rpmsg-proxy-app/proxy_app.c @@ -1,6 +1,5 @@ //SPDX-License-Identifier: BSD-3-Clause -#include #include #include #include @@ -8,13 +7,12 @@ #include #include #include -#include #include #include #include "proxy_app.h" #include -#define RPMSG_BUS_SYS "/sys/bus/rpmsg" +#include "../common/common.h" #define RPC_BUFF_SIZE 512 #define PROXY_ENDPOINT 127 @@ -31,8 +29,6 @@ struct _proxy_data { }; static struct _proxy_data *proxy; -char fw_dst_path[] = "/lib/firmware/image_rpc_demo"; -char sbuf[512]; int handle_open(struct _sys_rpc *rpc) { @@ -209,177 +205,6 @@ void exit_action_handler(int signum) proxy->active = 0; } -static int app_rpmsg_create_ept(int rpfd, struct rpmsg_endpoint_info *eptinfo) -{ - int ret; - - ret = ioctl(rpfd, RPMSG_CREATE_EPT_IOCTL, eptinfo); - if (ret) - perror("Failed to create endpoint.\n"); - return ret; -} - -static char *get_rpmsg_ept_dev_name(const char *rpmsg_char_name, - const char *ept_name, - char *ept_dev_name) -{ - char sys_rpmsg_ept_name_path[64]; - char svc_name[64]; - char *sys_rpmsg_path = "/sys/class/rpmsg"; - FILE *fp; - int i; - int ept_name_len; - - for (i = 0; i < 128; i++) { - sprintf(sys_rpmsg_ept_name_path, "%s/%s/rpmsg%d/name", - sys_rpmsg_path, rpmsg_char_name, i); - printf("checking %s\n", sys_rpmsg_ept_name_path); - if (access(sys_rpmsg_ept_name_path, F_OK) < 0) - continue; - fp = fopen(sys_rpmsg_ept_name_path, "r"); - if (!fp) { - printf("failed to open %s\n", sys_rpmsg_ept_name_path); - break; - } - fgets(svc_name, sizeof(svc_name), fp); - fclose(fp); - printf("svc_name: %s.\n",svc_name); - ept_name_len = strlen(ept_name); - if (ept_name_len > sizeof(svc_name)) - ept_name_len = sizeof(svc_name); - if (!strncmp(svc_name, ept_name, ept_name_len)) { - sprintf(ept_dev_name, "rpmsg%d", i); - return ept_dev_name; - } - } - - printf("Not able to RPMsg endpoint file for %s:%s.\n", - rpmsg_char_name, ept_name); - return NULL; -} - -static int bind_rpmsg_chrdev(const char *rpmsg_dev_name) -{ - char fpath[256]; - char *rpmsg_chdrv = "rpmsg_chrdev"; - int fd; - int ret; - - /* rpmsg dev overrides path */ - sprintf(fpath, "%s/devices/%s/driver_override", - RPMSG_BUS_SYS, rpmsg_dev_name); - printf("open %s\n", fpath); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - ret = write(fd, rpmsg_chdrv, strlen(rpmsg_chdrv) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_chdrv, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - - /* bind the rpmsg device to rpmsg char driver */ - sprintf(fpath, "%s/drivers/%s/bind", RPMSG_BUS_SYS, rpmsg_chdrv); - fd = open(fpath, O_WRONLY); - if (fd < 0) { - fprintf(stderr, "Failed to open %s, %s\n", - fpath, strerror(errno)); - return -EINVAL; - } - printf("write %s to %s\n", rpmsg_dev_name, fpath); - ret = write(fd, rpmsg_dev_name, strlen(rpmsg_dev_name) + 1); - if (ret < 0) { - fprintf(stderr, "Failed to write %s to %s, %s\n", - rpmsg_dev_name, fpath, strerror(errno)); - return -EINVAL; - } - close(fd); - return 0; -} - -static int get_rpmsg_chrdev_fd(const char *rpmsg_dev_name, - char *rpmsg_ctrl_name) -{ - char dpath[2*NAME_MAX]; - DIR *dir; - struct dirent *ent; - int fd; - - sprintf(dpath, "%s/devices/%s/rpmsg", RPMSG_BUS_SYS, rpmsg_dev_name); - printf("opendir %s\n", dpath); - dir = opendir(dpath); - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return -EINVAL; - } - while ((ent = readdir(dir)) != NULL) { - if (!strncmp(ent->d_name, "rpmsg_ctrl", 10)) { - sprintf(dpath, "/dev/%s", ent->d_name); - printf("open %s\n", dpath); - fd = open(dpath, O_RDWR | O_NONBLOCK); - if (fd < 0) { - fprintf(stderr, "open %s, %s\n", - dpath, strerror(errno)); - return fd; - } - sprintf(rpmsg_ctrl_name, "%s", ent->d_name); - return fd; - } - } - - fprintf(stderr, "No rpmsg char dev file is found\n"); - return -EINVAL; -} - -static void set_src_dst(char *out, struct rpmsg_endpoint_info *pep) -{ - long dst = 0; - char *lastdot = strrchr(out, '.'); - - if (lastdot == NULL) - return; - dst = strtol(lastdot + 1, NULL, 10); - if ((errno == ERANGE && (dst == LONG_MAX || dst == LONG_MIN)) - || (errno != 0 && dst == 0)) { - return; - } - pep->dst = (unsigned int)dst; -} - -/* - * return the first dirent matching rpmsg-openamp-demo-channel - * in /sys/bus/rpmsg/devices/ E.g.: - * virtio0.rpmsg-openamp-demo-channel.-1.1024 - */ -static int lookup_channel(char *out, struct rpmsg_endpoint_info *pep) -{ - char dpath[] = RPMSG_BUS_SYS "/devices"; - struct dirent *ent; - DIR *dir = opendir(dpath); - - if (dir == NULL) { - fprintf(stderr, "opendir %s, %s\n", dpath, strerror(errno)); - return -EINVAL; - } - while ((ent = readdir(dir)) != NULL) { - if (strstr(ent->d_name, pep->name)) { - strncpy(out, ent->d_name, NAME_MAX); - set_src_dst(out, pep); - printf("using dev file: %s\n", out); - closedir(dir); - return 0; - } - } - closedir(dir); - fprintf(stderr, "No dev file for %s in %s\n", pep->name, dpath); - return -EINVAL; -} - void kill_action_handler(int signum) { printf("\r\nHost>RPC service killed !!\r\n");