diff --git a/mcs/README.md b/mcs/README.md index 281ba153e4ee848d3d62d3b4e8d6a1e0a8039c97..4fe5c00a4326a49315336ac4b742623c2baa9296 100644 --- a/mcs/README.md +++ b/mcs/README.md @@ -29,18 +29,28 @@ openamp_demo: 提供OpenAMP用户态程序样例,支持与指定Client OS进 make ```` +注意:此处定义OpenAMP通信设备共享内存起始地址为0x70000000,可根据实际内存分配进行修改。 + 4. 将编译好的KO模块、用户态程序,以及zephyr.bin镜像拷贝到OpenEuler Embedded 系统的目录下。如何拷贝可以参考使用手册中共享文件系统场景。 +5. 将OpenAMP的依赖库libmetal.so,libopen_amp.so,libsysfs.so拷贝至文件系统/lib64目录。如何拷贝可以参考使用手册中共享文件系统场景。 #### 使用说明 1. 在openEuler Embedded系统上插入内核KO模块cpu_handler_dev.ko。 +```` + insmod cpu_handler_dev.ko +```` + 2. 运行rpmsg_main程序,使用方式如下: ```` ./rpmsg_main -c [cpu_id] -b [boot_address] -t [target_binfile] -a [target_binaddress] eg: - ./rpmsg_main -c 3 -b 0xc0000ffc -t /tmp/zephyr.bin -a 0xc0000000 + ./rpmsg_main -c 3 -b 0x7a000ffc -t /tmp/zephyr.bin -a 0x7a000000 ```` +此处定义Client OS起始地址为0x7a000000,启动地址为0x7a000ffc。 + +注意:以上述demo为例,需要预留出地址0x70000000为起始的内存用于OpenAMP demo和Client OS启动。通过QEMU启动时,当指定-m 1G时默认使用0x40000000-0x80000000的系统内存。添加内核启动参数`mem=768M`,可预留地址为0x70000000-0x80000000的256M内存,可根据实际情况进行调整。 diff --git a/mcs/openamp_demo/rpmsg-internal.h b/mcs/openamp_demo/rpmsg-internal.h index 44d80c141c66cfd1b8f37ef07fa97b4c49e1889f..ebfde5fbf7248ab013d243ee8b1551b75ea990d4 100644 --- a/mcs/openamp_demo/rpmsg-internal.h +++ b/mcs/openamp_demo/rpmsg-internal.h @@ -5,7 +5,7 @@ #include #include -#define VDEV_START_ADDR 0xD0000000 +#define VDEV_START_ADDR 0x70000000 #define VDEV_SIZE 0x30000 #define VDEV_STATUS_ADDR VDEV_START_ADDR @@ -23,5 +23,7 @@ #define IRQ_SENDTO_CLIENTOS _IOW('A', 0, int) #define DEV_CLIENT_OS_AGENT "/dev/cpu_handler" +extern char *cpu_id; + void rpmsg_app_master(void); #endif diff --git a/mcs/openamp_demo/rpmsg_main.c b/mcs/openamp_demo/rpmsg_main.c index 2ac2726f8364a47a57214dc80dc6ab4bf7e8dcfb..037ec8e9fbc96a4237ef26e12dd72f865777efef 100644 --- a/mcs/openamp_demo/rpmsg_main.c +++ b/mcs/openamp_demo/rpmsg_main.c @@ -14,7 +14,7 @@ static struct remoteproc rproc_inst; static struct remoteproc_ops ops; -static char *cpu_id; +char *cpu_id; static char *boot_address; static char *target_binfile; static char *target_binaddr; @@ -52,6 +52,7 @@ static int load_bin(void) access_address = mmap((void *)bin_addr, MAX_BIN_BUFLEN, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, bin_addr); memcpy(access_address, bin_buffer, bin_size); + free(bin_buffer); return 0; } diff --git a/mcs/openamp_demo/rpmsg_ping.c b/mcs/openamp_demo/rpmsg_ping.c index 0cb75168819422614b4d3439cdc3ba67f64cc6f6..6cea999abbefa3aa2b4ad203511ade24a4f75792 100644 --- a/mcs/openamp_demo/rpmsg_ping.c +++ b/mcs/openamp_demo/rpmsg_ping.c @@ -46,6 +46,7 @@ static void virtio_notify(struct virtqueue *vq) (void)vq; int cpu_handler_fd; int ret; + int cpu_num = strtol(cpu_id, NULL, 0); cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); if (cpu_handler_fd < 0) { @@ -53,7 +54,7 @@ static void virtio_notify(struct virtqueue *vq) return; } - ret = ioctl(cpu_handler_fd, IRQ_SENDTO_CLIENTOS, 3); + ret = ioctl(cpu_handler_fd, IRQ_SENDTO_CLIENTOS, cpu_num); if (ret) { printf("send ipi tp second os failed\n"); } diff --git a/mcs/zephyr/zephyr.bin b/mcs/zephyr/zephyr.bin new file mode 100644 index 0000000000000000000000000000000000000000..585dd2d37f30ff057677080ce98ed06fb1b0c2ae Binary files /dev/null and b/mcs/zephyr/zephyr.bin differ