From 0851b7b852e2caf60a68944510e18993003ce823 Mon Sep 17 00:00:00 2001 From: luojects Date: Tue, 23 Aug 2022 10:48:50 +0800 Subject: [PATCH] openamp_demo: refactor the code and building framework * using cmake to build, such as openamp_demo, rpmsg_pty_demo * refactor the code, split them into modules, such as remoteproc_module, virtio_module, rpmsg_pty Signed-off-by: luojects --- mcs/CMakeLists.txt | 57 +++++ mcs/README.md | 3 +- mcs/modules/remoteproc_module.c | 79 +++++++ mcs/modules/remoteproc_module.h | 33 +++ .../rpmsg_app.c => modules/rpmsg_pty.c} | 88 ++----- mcs/modules/rpmsg_pty.h | 7 + .../rpmsg_ping.c => modules/virtio_module.c} | 12 +- .../virtio_module.h} | 18 +- mcs/openamp_demo/Makefile | 14 -- mcs/openamp_demo/rpmsg_main.c | 218 +++++++---------- mcs/openamp_demo/zephyr.bin | Bin 0 -> 105392 bytes mcs/openamp_demo_pty_multithread/Makefile | 14 -- .../rpmsg-internal.h | 43 ---- mcs/openamp_demo_pty_multithread/rpmsg_ping.c | 220 ------------------ mcs/openamp_demo_pty_multithread/rpmsg_pty.c | 153 ------------ .../rpmsg_main.c | 205 ++++++---------- mcs/rpmsg_pty_demo/zephyr.bin | Bin 0 -> 163296 bytes mcs/zephyr/zephyr.elf | Bin 1336560 -> 0 bytes 18 files changed, 363 insertions(+), 801 deletions(-) create mode 100644 mcs/CMakeLists.txt create mode 100644 mcs/modules/remoteproc_module.c create mode 100644 mcs/modules/remoteproc_module.h rename mcs/{openamp_demo/rpmsg_app.c => modules/rpmsg_pty.c} (52%) create mode 100644 mcs/modules/rpmsg_pty.h rename mcs/{openamp_demo/rpmsg_ping.c => modules/virtio_module.c} (96%) rename mcs/{openamp_demo/rpmsg-internal.h => modules/virtio_module.h} (78%) delete mode 100644 mcs/openamp_demo/Makefile create mode 100644 mcs/openamp_demo/zephyr.bin delete mode 100644 mcs/openamp_demo_pty_multithread/Makefile delete mode 100644 mcs/openamp_demo_pty_multithread/rpmsg-internal.h delete mode 100644 mcs/openamp_demo_pty_multithread/rpmsg_ping.c delete mode 100644 mcs/openamp_demo_pty_multithread/rpmsg_pty.c rename mcs/{openamp_demo_pty_multithread => rpmsg_pty_demo}/rpmsg_main.c (35%) create mode 100644 mcs/rpmsg_pty_demo/zephyr.bin delete mode 100755 mcs/zephyr/zephyr.elf diff --git a/mcs/CMakeLists.txt b/mcs/CMakeLists.txt new file mode 100644 index 00000000..c5c0241f --- /dev/null +++ b/mcs/CMakeLists.txt @@ -0,0 +1,57 @@ +cmake_minimum_required(VERSION 3.19) + +project(openamp_demo) + +set(CMAKE_C_COMPILER ${CC}) + +message(STATUS "SDKTARGETSYSROOT=$ENV{SDKTARGETSYSROOT}") +message(STATUS "DEMO_TARGET=${DEMO_TARGET}") + +set(SHARED_LINK_LIBS + $ENV{SDKTARGETSYSROOT}/usr/lib64/libopen_amp.so + $ENV{SDKTARGETSYSROOT}/usr/lib64/libmetal.so + $ENV{SDKTARGETSYSROOT}/lib64/libsysfs.so +) + +add_library(remoteproc STATIC + ./modules/remoteproc_module.c +) +target_link_libraries(remoteproc + ${SHARED_LINK_LIBS} +) + +add_library(virtio STATIC + ./modules/virtio_module.c +) +target_link_libraries(virtio + ${SHARED_LINK_LIBS} +) + +add_library(pty STATIC + ./modules/rpmsg_pty.c +) + +set(INC_PATH + $ENV{SDKTARGETSYSROOT}/usr/include + ./modules +) + +if(DEMO_TARGET MATCHES "openamp_demo") + list(APPEND INC_PATH "./openamp_demo") + list(APPEND SRC_FILE "./openamp_demo/rpmsg_main.c") + list(APPEND STATIC_LINK_LIBS "remoteproc;virtio") +elseif(DEMO_TARGET MATCHES "rpmsg_pty_demo") + list(APPEND INC_PATH "./rpmsg_pty_demo") + list(APPEND SRC_FILE "./rpmsg_pty_demo/rpmsg_main.c") + list(APPEND STATIC_LINK_LIBS "remoteproc;virtio;pty") +else() + message(FATAL_ERROR "DEMO_TARGET: choose a target to build. + [openamp_demo|rpmsg_pty_demo]") #rsc_table_demo|cyclitest_demo|rpmsg_service_demo +endif() + +include_directories(${INC_PATH}) +add_executable(rpmsg_main ${SRC_FILE}) +target_link_libraries(rpmsg_main + ${SHARED_LINK_LIBS} + ${STATIC_LINK_LIBS} +) \ No newline at end of file diff --git a/mcs/README.md b/mcs/README.md index 87220c14..f2387dc2 100644 --- a/mcs/README.md +++ b/mcs/README.md @@ -42,7 +42,8 @@ OpenAMP包括如下三大重要组件: 3. 编译用户态程序rpmsg_main,编译方式如下: ```` - cd openamp_demo + cmake -S . -B build -DDEMO_TARGET=openamp_demo + cd build make ```` diff --git a/mcs/modules/remoteproc_module.c b/mcs/modules/remoteproc_module.c new file mode 100644 index 00000000..e12f5002 --- /dev/null +++ b/mcs/modules/remoteproc_module.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include +#include "remoteproc_module.h" + +#define BOOTCMD_MAXSIZE 100 + +static struct remoteproc *rproc_init(struct remoteproc *rproc, + const struct remoteproc_ops *ops, void *args) +{ + struct rproc_priv *priv; + + (void)rproc; + priv = metal_allocate_memory(sizeof(*priv)); + if (!priv) + return NULL; + + memcpy(priv, (struct rproc_priv *)args, sizeof(*priv)); + priv->rproc->ops = ops; + metal_list_init(&priv->rproc->mems); + priv->rproc->priv = priv; + rproc->state = RPROC_READY; + return priv->rproc; +} + +static void rproc_remove(struct remoteproc *rproc) +{ + struct rproc_priv *priv; + + priv = (struct rproc_priv *)rproc->priv; + metal_free_memory(priv); +} + +static int rproc_start(struct remoteproc *rproc) +{ + int cpu_handler_fd; + int ret; + char on[BOOTCMD_MAXSIZE]; + struct rproc_priv *args = (struct rproc_priv *)rproc->priv; + + (void)snprintf(on, sizeof(on), "%d%s%d", args->cpu_id, "@", args->boot_address); + + cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); + if (cpu_handler_fd < 0) { + printf("failed to open %s\n", DEV_CLIENT_OS_AGENT); + return cpu_handler_fd; + } + + ret = write(cpu_handler_fd, on, sizeof(on)); + return 0; +} + +static int rproc_stop(struct remoteproc *rproc) +{ +#if 0 + /* send message to zephyr, zephyr shut itself down by PSCI */ + int ret = send_message("shutdown\r\n", 10); + sleep(3); +#endif + return 0; +} + +const struct remoteproc_ops rproc_ops = { + .init = rproc_init, + .remove = rproc_remove, + .start = rproc_start, + .stop = rproc_stop, +}; + +/* create remoteproc */ +struct remoteproc *platform_create_proc(struct rproc_priv *args) +{ + struct remoteproc *rproc = remoteproc_init(args->rproc, &rproc_ops, args); + if (!rproc) + return NULL; + + return rproc; +} diff --git a/mcs/modules/remoteproc_module.h b/mcs/modules/remoteproc_module.h new file mode 100644 index 00000000..d8b51b32 --- /dev/null +++ b/mcs/modules/remoteproc_module.h @@ -0,0 +1,33 @@ +#ifndef REMOTEPROC_MODULE_H +#define REMOTEPROC_MODULE_H + +#include + +#define DEV_CLIENT_OS_AGENT "/dev/cpu_handler" + +struct rproc_priv { + struct remoteproc *rproc; /* pass a remoteproc instance pointer */ + unsigned int idx; /* remoteproc instance idx */ + unsigned int cpu_id; /* related arg: cpu id */ + unsigned int boot_address; /* related arg: boot address(in hex format) */ +}; + +/* create remoteproc */ +struct remoteproc *platform_create_proc(struct rproc_priv *args); + +/* + start remoteproc: refet to + int remoteproc_start(struct remoteproc *rproc); +*/ + +/* + stop remoteproc: refet to + int remoteproc_stop(struct remoteproc *rproc); +*/ + +/* + remove remoteproc: refet to + int remoteproc_remove(struct remoteproc *rproc); +*/ + +#endif \ No newline at end of file diff --git a/mcs/openamp_demo/rpmsg_app.c b/mcs/modules/rpmsg_pty.c similarity index 52% rename from mcs/openamp_demo/rpmsg_app.c rename to mcs/modules/rpmsg_pty.c index 749603ff..af2750f6 100644 --- a/mcs/openamp_demo/rpmsg_app.c +++ b/mcs/modules/rpmsg_pty.c @@ -1,17 +1,14 @@ #define _XOPEN_SOURCE 600 #include +#include #include #include #include -#include -#include - -#include "rpmsg-internal.h" +#include +#include "virtio_module.h" /* define the keys according to your terminfo */ #define KEY_CTRL_C 3 -#define KEY_BACKSPACE 127 -#define KEY_ENTER '\r' void open_pty(int *pfdm, int *pfds) { @@ -39,66 +36,30 @@ void open_pty(int *pfdm, int *pfds) *pfds = fds; } -int simple_shell(int fdm, unsigned char *cmd, int cmd_len, int *real_len) -{ - int i; - int ret; - char display[64] = "\ruart:~$ "; - const int title_len = strlen(display); - int dislen = strlen(display); - int dislen_echo; - - memset(cmd, 0, cmd_len); - for (i = 0; i < cmd_len; i++) { - ret = read(fdm, &cmd[i], 1); - - display[dislen] = cmd[i]; - dislen++; - dislen_echo = dislen; - - if (cmd[i] == KEY_CTRL_C) { /* special key: ctrl+c */ - pthread_exit(NULL); - } - - if ((cmd[i] == KEY_BACKSPACE) && (dislen > title_len)) { /* special key: backspace */ - dislen -= 2; - display[dislen] = ' '; - dislen_echo = dislen + 1; - } - - if (cmd[i] == KEY_ENTER) { /* special key: enter */ - cmd[i] = '\n'; - break; - } - - ret = write(fdm, display, dislen_echo); /* the command echo */ - } - - ret = write(fdm, "\ruart:~$ ", title_len); /* override the command return from rtos */ - *real_len = i + 1; - return ret; -} - void *shell_user(void *arg) { int ret; int fdm, fds; - unsigned char cmd[64] = {0}; - int cmd_len; - unsigned char reply[2048] = {0}; + unsigned char cmd[1]; + unsigned char reply[2048]; int reply_len; /* open PTY, pts binds to terminal, using screen to open pts */ open_pty(&fdm, &fds); while (1) { - ret = simple_shell(fdm, cmd, sizeof(cmd), &cmd_len); /* get command from ptmx */ + memset(cmd, 0, 1); + ret = read(fdm, cmd, 1); /* get command from ptmx */ if (ret < 0) { - printf("shell_user: simple_shell(%s) failed: %d\n", cmd, ret); + printf("shell_user: get from ptmx failed: %d\n", ret); return (void*)-1; } - ret = send_message(cmd, cmd_len); /* send command to rtos */ + if (cmd[0] == KEY_CTRL_C) /* special key: ctrl+c */ + //pthread_exit(NULL); + return (void*)0; + + ret = send_message(cmd, 1); /* send command to rtos */ if (ret < 0) { printf("shell_user: send_message(%s) failed: %d\n", cmd, ret); return (void*)-1; @@ -106,7 +67,7 @@ void *shell_user(void *arg) ret = receive_message(reply, sizeof(reply), &reply_len); /* receive reply from rtos */ if (ret < 0) { - printf("shell_user: receive_message(%s) failed: %d\n", reply, ret); + printf("shell_user: receive_message failed: %d\n", ret); return (void*)-1; } @@ -123,30 +84,11 @@ void *shell_user(void *arg) void *log_user(void *arg) { int ret; - int cmd_fd, log_fd; - unsigned char cmd[64] = {0}; - int cmd_len; + int log_fd; unsigned char log[2048] = {0}; int log_len; - const char *cmd_file = "/tmp/zephyr_cmd.txt"; const char *log_file = "/tmp/zephyr_log.txt"; - /* read command from file */ - cmd_fd = open(cmd_file, O_RDONLY); - if (cmd_fd < 0) { - printf("log_user: open (%s) failed: %d\n", cmd_file, cmd_fd); - return (void*)-1; - } - cmd_len = read(cmd_fd, cmd, sizeof(cmd)); - cmd[cmd_len] = '\n'; - close(cmd_fd); - - ret = send_message(cmd, cmd_len + 1); /* send command to rtos */ - if (ret < 0) { - printf("shell_user: send_message(%s) failed: %d\n", cmd, ret); - return (void*)-1; - } - ret = receive_message(log, sizeof(log), &log_len); /* receive log from rtos */ if (ret < 0) { printf("log_user: receive_message(%s) failed: %d\n", log, ret); diff --git a/mcs/modules/rpmsg_pty.h b/mcs/modules/rpmsg_pty.h new file mode 100644 index 00000000..59da943b --- /dev/null +++ b/mcs/modules/rpmsg_pty.h @@ -0,0 +1,7 @@ +#ifndef RPMSG_PTY_H +#define RPMSG_PTY_H + +void *shell_user(void *arg); +void *log_user(void *arg); + +#endif \ No newline at end of file diff --git a/mcs/openamp_demo/rpmsg_ping.c b/mcs/modules/virtio_module.c similarity index 96% rename from mcs/openamp_demo/rpmsg_ping.c rename to mcs/modules/virtio_module.c index ff9b1135..6a440270 100644 --- a/mcs/openamp_demo/rpmsg_ping.c +++ b/mcs/modules/virtio_module.c @@ -5,8 +5,7 @@ #include #include #include - -#include "rpmsg-internal.h" +#include "virtio_module.h" static struct virtio_vring_info rvrings[2] = { [0] = { @@ -102,7 +101,7 @@ void ns_bind_cb(struct rpmsg_device *rdev, const char *name, uint32_t dest) /* message standard receive interface */ int receive_message(unsigned char *message, int message_len, int *real_len) { - int ret = -1; + int ret; int cpu_handler_fd; struct pollfd fds; @@ -136,9 +135,10 @@ int receive_message(unsigned char *message, int message_len, int *real_len) } } - if (received_len >= message_len) { + if (received_len > message_len) { printf("receive_message: buffer is too small.\n"); *real_len = 0; + ret = -1; goto _cleanup; } @@ -159,12 +159,14 @@ int send_message(unsigned char *message, int len) static struct rpmsg_virtio_shm_pool shpool; -void rpmsg_endpoint_init(void) +void virtio_init(void) { int status = 0; char message[100] = {0}; int len; + printf("Initialize the virtio, virtqueue, return rpmsg device...\n"); + g_memfd = open("/dev/mem", O_RDWR); tx_addr = mmap((void *)VRING_TX_ADDRESS, VDEV_STATUS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, VRING_TX_ADDRESS); rx_addr = mmap((void *)VRING_RX_ADDRESS, VDEV_STATUS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, VRING_RX_ADDRESS); diff --git a/mcs/openamp_demo/rpmsg-internal.h b/mcs/modules/virtio_module.h similarity index 78% rename from mcs/openamp_demo/rpmsg-internal.h rename to mcs/modules/virtio_module.h index 6e07328f..d4c0d300 100644 --- a/mcs/openamp_demo/rpmsg-internal.h +++ b/mcs/modules/virtio_module.h @@ -1,9 +1,5 @@ -#ifndef RPMSG_INTERNAL_H_ -#define RPMSG_INTERNAL_H_ - -#include -#include -#include +#ifndef VIRTIO_MODULE_H +#define VIRTIO_MODULE_H #define VDEV_START_ADDR 0x70000000 #define VDEV_SIZE 0x30000 @@ -23,14 +19,12 @@ #define IRQ_SENDTO_CLIENTOS _IOW('A', 0, int) #define DEV_CLIENT_OS_AGENT "/dev/cpu_handler" -extern char *cpu_id; -extern struct metal_io_region *io; +void virtio_init(void); -void rpmsg_endpoint_init(void); int receive_message(unsigned char *message, int message_len, int *real_len); int send_message(unsigned char *message, int len); -void *shell_user(void *arg); -void *log_user(void *arg); +extern char *cpu_id; +extern struct metal_io_region *io; -#endif +#endif \ No newline at end of file diff --git a/mcs/openamp_demo/Makefile b/mcs/openamp_demo/Makefile deleted file mode 100644 index daccc80d..00000000 --- a/mcs/openamp_demo/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -rpmsg_main: clean rpmsg_main.o rpmsg_ping.o rpmsg_app.o - $(CC) rpmsg_main.o rpmsg_ping.o rpmsg_app.o $(SDKTARGETSYSROOT)/usr/lib64/libmetal.so $(SDKTARGETSYSROOT)/usr/lib64/libopen_amp.so $(SDKTARGETSYSROOT)/lib64/libsysfs.so -o rpmsg_main - -rpmsg_main.o: rpmsg_main.c rpmsg-internal.h - $(CC) -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_main.c -o rpmsg_main.o - -rpmsg_ping.o: rpmsg_ping.c rpmsg-internal.h - $(CC) -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_ping.c -o rpmsg_ping.o - -rpmsg_app.o: rpmsg_ping.c rpmsg-internal.h - $(CC) -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_app.c -o rpmsg_app.o - -clean: - rm -rf *.o rpmsg_main diff --git a/mcs/openamp_demo/rpmsg_main.c b/mcs/openamp_demo/rpmsg_main.c index a95d0311..a0e86dff 100644 --- a/mcs/openamp_demo/rpmsg_main.c +++ b/mcs/openamp_demo/rpmsg_main.c @@ -1,130 +1,90 @@ #include #include #include -#include #include #include #include +#include "remoteproc_module.h" +#include "virtio_module.h" -#include "rpmsg-internal.h" - -#define BOOTCMD_MAXSIZE 100 - -static struct remoteproc rproc_inst; -static struct remoteproc_ops ops; +#define MAX_BIN_BUFLEN (10 * 1024 * 1024) char *cpu_id; static char *boot_address; +static char *target_binfile; +static char *target_binaddr; -struct rproc_priv { - struct remoteproc *rproc; - unsigned int id; -}; - -static void cleanup(void) -{ - printf("\nOpenAMP demo ended.\n"); - remoteproc_stop(&rproc_inst); - remoteproc_remove(&rproc_inst); - if (io) - free(io); -} - -static void handler(int sig) -{ - exit(0); -} - -static struct remoteproc *rproc_init(struct remoteproc *rproc, - const struct remoteproc_ops *ops, void *arg) -{ - struct rproc_priv *priv; - unsigned int id = *((unsigned int *)arg); - - priv = metal_allocate_memory(sizeof(*priv)); - if (!priv) - return NULL; - - memset(priv, 0, sizeof(*priv)); - priv->rproc = rproc; - priv->id = id; - priv->rproc->ops = ops; - metal_list_init(&priv->rproc->mems); - priv->rproc->priv = priv; - rproc->state = RPROC_READY; - return priv->rproc; -} - -static int rproc_start(struct remoteproc *rproc) +static int load_bin(void) { - int cpu_handler_fd; - int ret; - char on[BOOTCMD_MAXSIZE]; - - (void)snprintf(on, sizeof(on), "%s%s%s", cpu_id, "@", boot_address); + int memfd = open("/dev/mem", O_RDWR); + int bin_fd = open(target_binfile, O_RDONLY); + void *access_address = NULL, *bin_buffer = NULL; + long bin_size; + long long int bin_addr = strtoll(target_binaddr, NULL, 0); + + if (bin_fd < 0 || memfd < 0) { + printf("invalid bin file fd\n"); + exit(-1); + } - cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); - if (cpu_handler_fd < 0) { - printf("failed to open %s\n", DEV_CLIENT_OS_AGENT); - return cpu_handler_fd; + bin_buffer = (void *)malloc(MAX_BIN_BUFLEN); + if (!bin_buffer) { + printf("malloc bin_buffer failed\n"); + exit(-1); } - ret = write(cpu_handler_fd, on, sizeof(on)); - return 0; -} + bin_size = read(bin_fd, bin_buffer, MAX_BIN_BUFLEN); + if (bin_size == 0) { + printf("read bin file failed\n"); + exit(-1); + } -static int rproc_stop(struct remoteproc *rproc) -{ -#if 0 - /* send message to zephyr, zephyr shut itself down by PSCI */ - int ret = send_message("shutdown\r\n", 10); - sleep(3); -#endif + 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; } -static void rproc_remove(struct remoteproc *rproc) +int rpmsg_app_master(void) { - struct rproc_priv *priv; + int ret; + unsigned int message = 0; + int len; - priv = (struct rproc_priv *)rproc->priv; - metal_free_memory(priv); -} + printf("start processing OpenAMP demo...\n"); -struct remoteproc_ops rproc_ops = { - .init = rproc_init, - .remove = rproc_remove, - .start = rproc_start, - .stop = rproc_stop, -}; + while (message < 99) { + ret = send_message((unsigned char*)&message, sizeof(message)); + if (ret < 0) { + printf("send_message(%u) failed with status %d\n", message, ret); + return ret; + } -static struct remoteproc *platform_create_proc(unsigned int id) -{ - struct remoteproc *rproc; + sleep(1); + ret = receive_message((unsigned char*)&message, sizeof(message), &len); + if (ret < 0) { + printf("receive_message failed with status %d\n", ret); + return ret; + } + printf("Master core received a message: %u\n", message); - ops = rproc_ops; - rproc = remoteproc_init(&rproc_inst, &ops, &id); - if (!rproc) - return NULL; + message++; + sleep(1); + } - return &rproc_inst; + return 0; } int main(int argc, char **argv) { - struct remoteproc *rproc = NULL; - unsigned int id = 1; int ret; int opt; - pthread_t tida, tidb, tidc; - void *reta, *retb, *retc; + struct remoteproc rproc; + struct rproc_priv args = { &rproc, 1 }; + struct remoteproc *rproc_inst; - /* ctrl+c signal, exit program and do cleanup */ - atexit(cleanup); - signal(SIGINT, handler); - - /* using qemu arg: -device loader,file=zephyr.elf,cpu-num=1 */ - while ((opt = getopt(argc, argv, "c:b:")) != -1) { + while ((opt = getopt(argc, argv, "c:b:t:a:")) != -1) { switch (opt) { case 'c': cpu_id = optarg; @@ -132,62 +92,52 @@ int main(int argc, char **argv) case 'b': boot_address = optarg; break; + case 't': + target_binfile = optarg; + break; + case 'a': + target_binaddr = optarg; + break; default: break; } } - rproc = platform_create_proc(id); - if (!rproc) { + args.cpu_id = strtol(cpu_id, NULL, 10); + args.boot_address = strtol(boot_address, NULL, 16); + rproc_inst = platform_create_proc(&args); + if (!rproc_inst) { printf("create rproc failed\n"); return -1; } - ret = remoteproc_start(rproc); + ret = load_bin(); if (ret) { - printf("start processor failed\n"); + printf("failed to load client os\n"); return ret; } - sleep(5); - printf("start processing OpenAMP demo...\n"); - rpmsg_endpoint_init(); + ret = remoteproc_start(rproc_inst); + if (ret) { + printf("start processor failed\n"); + return ret; + } - /* Multi-thread processing user requests */ - printf("Multi-thread processing user requests...\n"); + sleep(5); /* wait for zephyr booting */ + virtio_init(); - /* userA: user shell, open with screen */ - if (pthread_create(&tida, NULL, shell_user, NULL) < 0) { - perror("userA pthread_create"); - return -1; - } -#if 0 - /* userB: dual user shell, open with screen */ - if (pthread_create(&tidb, NULL, shell_user, NULL) < 0) { - perror("userB pthread_create"); - return -1; - } -#endif - /* userC: zephyr log */ - if (pthread_create(&tidc, NULL, log_user, NULL) < 0) { - perror("userC pthread_create"); - return -1; + ret = rpmsg_app_master(); + if (ret) { + printf("openamp demo run failed\n"); + return ret; } - pthread_join(tida, &reta); - if ((long)reta) { - printf("userA return failed: %ld", (long)reta); - } -#if 0 - pthread_join(tidb, &retb); - if ((long)retb) { - printf("userB return failed: %ld", (long)retb); - } -#endif - pthread_join(tidc, &retc); - if ((long)retc) { - printf("userC return failed: %ld", (long)retc); - } + printf("\nOpenAMP demo ended.\n"); + if (io) + free(io); + remoteproc_stop(rproc_inst); + rproc_inst->state = RPROC_OFFLINE; + remoteproc_remove(rproc_inst); return 0; } diff --git a/mcs/openamp_demo/zephyr.bin b/mcs/openamp_demo/zephyr.bin new file mode 100644 index 0000000000000000000000000000000000000000..585dd2d37f30ff057677080ce98ed06fb1b0c2ae GIT binary patch literal 105392 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 XE$3fjx$pd|zEupL$+i1ezx{s#@cHM< literal 0 HcmV?d00001 diff --git a/mcs/openamp_demo_pty_multithread/Makefile b/mcs/openamp_demo_pty_multithread/Makefile deleted file mode 100644 index 2e7a8f5c..00000000 --- a/mcs/openamp_demo_pty_multithread/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -rpmsg_main: rpmsg_main.o rpmsg_ping.o rpmsg_pty.o - $(CC) -g rpmsg_main.o rpmsg_ping.o rpmsg_pty.o $(SDKTARGETSYSROOT)/usr/lib64/libmetal.so $(SDKTARGETSYSROOT)/usr/lib64/libopen_amp.so $(SDKTARGETSYSROOT)/lib64/libsysfs.so $(SDKTARGETSYSROOT)/lib64/libpthread.so.0 -o rpmsg_main - -rpmsg_main.o: rpmsg_main.c rpmsg-internal.h - $(CC) -g -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_main.c -o rpmsg_main.o - -rpmsg_ping.o: rpmsg_ping.c rpmsg-internal.h - $(CC) -g -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_ping.c -o rpmsg_ping.o - -rpmsg_pty.o: rpmsg_pty.c - $(CC) -g -I$(SDKTARGETSYSROOT)/usr/include -c rpmsg_pty.c -o rpmsg_pty.o - -clean: - rm -rf *.o rpmsg_main diff --git a/mcs/openamp_demo_pty_multithread/rpmsg-internal.h b/mcs/openamp_demo_pty_multithread/rpmsg-internal.h deleted file mode 100644 index 105d6c7c..00000000 --- a/mcs/openamp_demo_pty_multithread/rpmsg-internal.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef RPMSG_INTERNAL_H_ -#define RPMSG_INTERNAL_H_ - -#include -#include -#include - -#define VDEV_START_ADDR 0x70000000 -#define VDEV_SIZE 0x30000 - -#define VDEV_STATUS_ADDR VDEV_START_ADDR -#define VDEV_STATUS_SIZE 0x4000 - -#define SHM_START_ADDR (VDEV_START_ADDR + VDEV_STATUS_SIZE) -#define SHM_SIZE (VDEV_SIZE - VDEV_STATUS_SIZE) - -#define VRING_COUNT 2 -#define VRING_RX_ADDRESS (VDEV_START_ADDR + SHM_SIZE - VDEV_STATUS_SIZE) -#define VRING_TX_ADDRESS (VDEV_START_ADDR + SHM_SIZE) -#define VRING_ALIGNMENT 4 -#define VRING_SIZE 16 - -#define IRQ_SENDTO_CLIENTOS _IOW('A', 0, int) -#define DEV_CLIENT_OS_AGENT "/dev/cpu_handler" - -extern char *cpu_id; -extern struct metal_io_region *io; - -struct thread_args { - int fd; - int *pipefd; -}; - -struct remoteproc *platform_create_proc(unsigned int id); -int load_bin(void); -void rpmsg_endpoint_init(void); -int rpmsg_endpoint_app(int fds, int ns_setup); - -void open_pty(int *pfdm, int *pfds); -void *master(void *arg_list); -void *slave(void *arg_list); - -#endif diff --git a/mcs/openamp_demo_pty_multithread/rpmsg_ping.c b/mcs/openamp_demo_pty_multithread/rpmsg_ping.c deleted file mode 100644 index 722b0853..00000000 --- a/mcs/openamp_demo_pty_multithread/rpmsg_ping.c +++ /dev/null @@ -1,220 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include - -#include "rpmsg-internal.h" - -static struct virtio_vring_info rvrings[2] = { - [0] = { - .info.align = VRING_ALIGNMENT, - }, - [1] = { - .info.align = VRING_ALIGNMENT, - }, -}; - -static int g_memfd; -volatile unsigned int received_data; -static struct virtio_device vdev; -static struct rpmsg_virtio_device rvdev; -struct metal_io_region *io; -struct virtqueue *vq[2]; -static void *tx_addr, *rx_addr, *shm_start_addr; -static metal_phys_addr_t shm_physmap[] = { SHM_START_ADDR }; - -static unsigned char virtio_get_status(struct virtio_device *vdev) -{ - return VIRTIO_CONFIG_STATUS_DRIVER_OK; -} - -static void virtio_set_status(struct virtio_device *vdev, unsigned char status) -{ - void *stat_addr = NULL; - stat_addr = mmap((void *)VDEV_STATUS_ADDR, VDEV_STATUS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, VDEV_STATUS_ADDR); - *(volatile unsigned int *)stat_addr = (unsigned int)status; -} - -static uint32_t virtio_get_features(struct virtio_device *vdev) -{ - return 1 << VIRTIO_RPMSG_F_NS; -} - -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) { - printf("open %s failed\n", DEV_CLIENT_OS_AGENT); - return; - } - - ret = ioctl(cpu_handler_fd, IRQ_SENDTO_CLIENTOS, cpu_num); - if (ret) { - printf("send ipi tp second os failed\n"); - } - - close(cpu_handler_fd); - return; -} - -struct virtio_dispatch dispatch = { - .get_status = virtio_get_status, - .set_status = virtio_set_status, - .get_features = virtio_get_features, - .notify = virtio_notify, -}; - -int endpoint_cb(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv) -{ - received_data = *((unsigned int *) data); - return RPMSG_SUCCESS; -} - -struct rpmsg_endpoint my_ept; -struct rpmsg_endpoint *ep = &my_ept; - -static void rpmsg_service_unbind(struct rpmsg_endpoint *ept) -{ - (void)ept; - rpmsg_destroy_ept(ep); -} - -void ns_bind_cb(struct rpmsg_device *rdev, const char *name, uint32_t dest) -{ - (void)rpmsg_create_ept(ep, rdev, name, - RPMSG_ADDR_ANY, dest, - endpoint_cb, - rpmsg_service_unbind); -} - -static struct rpmsg_virtio_shm_pool shpool; - -void rpmsg_endpoint_init(void) -{ - int status = 0; - - g_memfd = open("/dev/mem", O_RDWR); - tx_addr = mmap((void *)VRING_TX_ADDRESS, VDEV_STATUS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, VRING_TX_ADDRESS); - rx_addr = mmap((void *)VRING_RX_ADDRESS, VDEV_STATUS_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, VRING_RX_ADDRESS); - shm_start_addr = mmap((void *)SHM_START_ADDR, SHM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, g_memfd, SHM_START_ADDR); - - io = malloc(sizeof(struct metal_io_region)); - if (!io) { - printf("malloc io failed\n"); - return; - } - metal_io_init(io, shm_start_addr, shm_physmap, SHM_SIZE, -1, 0, NULL); - - /* setup vdev */ - vq[0] = virtqueue_allocate(VRING_SIZE); - if (vq[0] == NULL) { - printf("virtqueue_allocate failed to alloc vq[0]\n"); - free(io); - return; - } - vq[1] = virtqueue_allocate(VRING_SIZE); - if (vq[1] == NULL) { - printf("virtqueue_allocate failed to alloc vq[1]\n"); - free(io); - return; - } - - vdev.role = RPMSG_MASTER; - vdev.vrings_num = VRING_COUNT; - vdev.func = &dispatch; - rvrings[0].io = io; - rvrings[0].info.vaddr = tx_addr; - rvrings[0].info.num_descs = VRING_SIZE; - rvrings[0].info.align = VRING_ALIGNMENT; - rvrings[0].vq = vq[0]; - - rvrings[1].io = io; - rvrings[1].info.vaddr = rx_addr; - rvrings[1].info.num_descs = VRING_SIZE; - rvrings[1].info.align = VRING_ALIGNMENT; - rvrings[1].vq = vq[1]; - - vdev.vrings_info = &rvrings[0]; - - /* setup rvdev */ - rpmsg_virtio_init_shm_pool(&shpool, shm_start_addr, SHM_SIZE); - status = rpmsg_init_vdev(&rvdev, &vdev, ns_bind_cb, io, &shpool); - if (status != 0) { - printf("rpmsg_init_vdev failed %d\n", status); - free(io); - return; - } -} - -int rpmsg_endpoint_app(int fds, int ns_setup) -{ - int cpu_handler_fd; - struct pollfd poll_fd[2] = {0}; - - cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); - if (cpu_handler_fd < 0) { - printf("open %s failed.\n", DEV_CLIENT_OS_AGENT); - return -1; - } - - poll_fd[0].fd = fds; - poll_fd[0].events = POLLIN; - poll_fd[1].fd = cpu_handler_fd; - poll_fd[1].events = POLLIN; - - /* Wait for data from slave side of PTY, and data from endpoint of openamp, blocked */ - if (poll(poll_fd, 2, -1) == -1) { - printf("Error %d on poll()\n", errno); - goto err; - } - - close(cpu_handler_fd); - - /* If data on slave side of PTY */ - if (poll_fd[0].revents & POLLIN) { - char recv_buf[200] = {0}; - unsigned int number; - - poll_fd[0].revents = 0; - if (read(fds, recv_buf, sizeof(recv_buf)) > 0) { - number = atoi(recv_buf); - //printf("Master core sending messages: %d\n", number); - rpmsg_send(ep, &number, sizeof(number)); - } - } - - /* If data on endpoint of openamp */ - if (poll_fd[1].revents & POLLIN) { - char send_buf[200] = {0}; - int wc; - - poll_fd[1].revents = 0; - virtqueue_notification(vq[0]); - //printf("Master core receiving messages: %d\n", received_data); - - /* Check whether poll event is ns setup */ - if (ns_setup == 1) - return 0; - - received_data++; - wc = snprintf(send_buf, sizeof(send_buf), "Output number: %d\n", received_data); - if (write(fds, send_buf, wc) == -1) { - printf("Error %d on rpmsg_endpoint_app write()\n", errno); - goto err; - } - } - - return 0; -err: - close(cpu_handler_fd); - return -1; -} diff --git a/mcs/openamp_demo_pty_multithread/rpmsg_pty.c b/mcs/openamp_demo_pty_multithread/rpmsg_pty.c deleted file mode 100644 index 57251928..00000000 --- a/mcs/openamp_demo_pty_multithread/rpmsg_pty.c +++ /dev/null @@ -1,153 +0,0 @@ -#define _XOPEN_SOURCE 600 -#define _DEFAULT_SOURCE -#include -#include -#include -#include -#include -#include - -#include - -#include "rpmsg-internal.h" - -void open_pty(int *pfdm, int *pfds) -{ - int rc, fdm, fds; - - /* Open the master side of the PTY */ - fdm = posix_openpt(O_RDWR | O_NOCTTY); - if (fdm < 0) - printf("Error %d on posix_openpt()\n", errno); - - rc = grantpt(fdm); - if (rc != 0) - printf("Error %d on grantpt()\n", errno); - - rc = unlockpt(fdm); - if (rc != 0) - printf("Error %d on unlockpt()\n", errno); - - /* Open the slave side of the PTY */ - fds = open(ptsname(fdm), O_RDWR | O_NOCTTY); - - *pfdm = fdm; - *pfds = fds; -} - -static void ptmx_read_write(const char *name, int in, int out) -{ - char input[200]; - int rc, ret; - - rc = read(in, input, sizeof(input)); - if (rc == -1) - printf("Error %d on ptmx_read %s\n", errno, name); - - ret = write(out, input, rc); - if (ret == -1) - printf("Error %d on ptmx_write %s\n", errno, name); -} - -void *master(void *arg_list) -{ - fd_set fd_in; - char buf[50] = {0}; - int nullfd; - struct thread_args *args = (struct thread_args*)arg_list; - - /* Wait for child */ - close(args->pipefd[1]); - while (read(args->pipefd[0], buf, sizeof(buf)) > 0) { - if (strcmp(buf, "init done\n") == 0) - break; - } - - //printf("This is thread3: %ld, pid:%d\n", pthread_self(), getpid()); //T3 - //printf("thread3 fd:%d, pipefd[0]:%d, pipefd[1]:%d\n", args->fd, args->pipefd[0], args->pipefd[1]); - - printf("----------PTY Terminal----------\n"); - printf("Input number: "); - fflush(stdout); - - for (;;) { - /* Wait for data from standard input and master side of PTY */ - FD_ZERO(&fd_in); - FD_SET(0, &fd_in); - FD_SET(args->fd, &fd_in); - - if (select(args->fd + 1, &fd_in, NULL, NULL, NULL) == -1) - printf("Error %d on select()\n", errno); - - /* If data on standard input */ - if (FD_ISSET(0, &fd_in)) { - ptmx_read_write("standard input", 0, args->fd); - - /* flush data to /dev/null on ptmx, avoid printing repeatedly */ - nullfd = open("/dev/null", O_RDWR); - ptmx_read_write("standard input", args->fd, nullfd); - } - - /* If data on master side of PTY */ - if (FD_ISSET(args->fd, &fd_in)) { - ptmx_read_write("master pty", args->fd, 1); - printf("Input number: "); - fflush(stdout); - } - } -} - -void *slave(void *arg_list) -{ - struct remoteproc *rproc = NULL; - unsigned int id = 1; - int ret; - struct thread_args *args = (struct thread_args*)arg_list; - - //printf("This is thread4: %ld, pid:%d\n", pthread_self(), getpid()); //T4 - //printf("thread4 fd:%d, pipefd[0]:%d, pipefd[1]:%d\n", args->fd, args->pipefd[0], args->pipefd[1]); - - rproc = platform_create_proc(id); - if (!rproc) { - printf("create rproc failed\n"); - return (void*)1; - } - - ret = load_bin(); - if (ret) { - printf("failed to load client os\n"); - return (void*)1; - } - - ret = remoteproc_start(rproc); - if (ret) { - printf("start processor failed\n"); - return (void*)1; - } - - sleep(5); /* wait for clientos booting */ - rpmsg_endpoint_init(); - - /* Since we are using name service, we need to wait for a response - * from NS setup and then we need to process it - */ - rpmsg_endpoint_app(args->fd, 1); - - /* now wake up parent using unamed pipe, init console */ - close(args->pipefd[0]); - ret = write(args->pipefd[1], "init done\n", strlen("init done\n")); - if (ret == -1) { - printf("failed to wake up parent\n"); - return (void*)1; - } - - for (;;) { - ret = rpmsg_endpoint_app(args->fd, 0); - if (ret) { - printf("rpmsg_endpoint_app failed\n"); - return (void*)1; - } - } - - return (void*)0; -} diff --git a/mcs/openamp_demo_pty_multithread/rpmsg_main.c b/mcs/rpmsg_pty_demo/rpmsg_main.c similarity index 35% rename from mcs/openamp_demo_pty_multithread/rpmsg_main.c rename to mcs/rpmsg_pty_demo/rpmsg_main.c index b8e230ba..639afbe2 100644 --- a/mcs/openamp_demo_pty_multithread/rpmsg_main.c +++ b/mcs/rpmsg_pty_demo/rpmsg_main.c @@ -1,44 +1,21 @@ #include #include #include -#include #include #include #include -#include - -#include "rpmsg-internal.h" +#include "remoteproc_module.h" +#include "virtio_module.h" +#include "rpmsg_pty.h" #define MAX_BIN_BUFLEN (10 * 1024 * 1024) -#define BOOTCMD_MAXSIZE 100 - -static struct remoteproc rproc_inst; -static struct remoteproc_ops ops; char *cpu_id; static char *boot_address; static char *target_binfile; static char *target_binaddr; -struct rproc_priv { - struct remoteproc *rproc; - unsigned int id; -}; - -static void cleanup(void) -{ - printf("\nOpenAMP demo ended.\n"); - remoteproc_remove(&rproc_inst); - if (io) - free(io); -} - -static void handler(int sig) -{ - exit(0); -} - -int load_bin(void) +static int load_bin(void) { int memfd = open("/dev/mem", O_RDWR); int bin_fd = open(target_binfile, O_RDONLY); @@ -70,80 +47,57 @@ int load_bin(void) return 0; } -static struct remoteproc *rproc_init(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *arg) +int rpmsg_app_master(void) { - struct rproc_priv *priv; - unsigned int id = *((unsigned int *)arg); - - priv = metal_allocate_memory(sizeof(*priv)); - if (!priv) - return NULL; - - memset(priv, 0, sizeof(*priv)); - priv->rproc = rproc; - priv->id = id; - priv->rproc->ops = ops; - metal_list_init(&priv->rproc->mems); - priv->rproc->priv = priv; - rproc->state = RPROC_READY; - return priv->rproc; -} + pthread_t tida, tidb, tidc; + void *reta, *retb, *retc; -static int rproc_start(struct remoteproc *rproc) -{ - int cpu_handler_fd; - int ret; - char on[BOOTCMD_MAXSIZE]; + printf("Multi-thread processing user requests...\n"); - (void)snprintf(on, sizeof(on), "%s%s%s", cpu_id, "@", boot_address); + /* userA: user shell, open with screen */ + if (pthread_create(&tida, NULL, shell_user, NULL) < 0) { + perror("userA pthread_create"); + return -1; + } +#if 0 + /* userB: dual user shell, open with screen */ + if (pthread_create(&tidb, NULL, shell_user, NULL) < 0) { + perror("userB pthread_create"); + return -1; + } +#endif + /* userC: zephyr log */ + if (pthread_create(&tidc, NULL, log_user, NULL) < 0) { + perror("userC pthread_create"); + return -1; + } - cpu_handler_fd = open(DEV_CLIENT_OS_AGENT, O_RDWR); - if (cpu_handler_fd < 0) { - printf("failed to open %s\n", DEV_CLIENT_OS_AGENT); - return cpu_handler_fd; + pthread_join(tida, &reta); + if ((long)reta) { + printf("userA return failed: %ld", (long)reta); + } +#if 0 + pthread_join(tidb, &retb); + if ((long)retb) { + printf("userB return failed: %ld", (long)retb); + } +#endif + pthread_join(tidc, &retc); + if ((long)retc) { + printf("userC return failed: %ld", (long)retc); } - ret = write(cpu_handler_fd, on, sizeof(on)); return 0; } -static void rproc_remove(struct remoteproc *rproc) -{ - struct rproc_priv *priv; - - priv = (struct rproc_priv *)rproc->priv; - metal_free_memory(priv); -} - -struct remoteproc_ops rproc_ops = { - .init = rproc_init, - .remove = rproc_remove, - .start = rproc_start, -}; - -struct remoteproc *platform_create_proc(unsigned int id) -{ - struct remoteproc *rproc; - - ops = rproc_ops; - rproc = remoteproc_init(&rproc_inst, &ops, &id); - if (!rproc) - return NULL; - - return &rproc_inst; -} - int main(int argc, char **argv) { + int ret; int opt; - int fdm = -1, fds = -1; - pid_t pid; - int pipefd[2]; - pthread_t tidm, tids; - struct thread_args args; - void *retval; -#if 0 + struct remoteproc rproc; + struct rproc_priv args = { &rproc, 1 }; + struct remoteproc *rproc_inst; + while ((opt = getopt(argc, argv, "c:b:t:a:")) != -1) { switch (opt) { case 'c': @@ -162,55 +116,42 @@ int main(int argc, char **argv) break; } } -#endif - cpu_id = "3"; - boot_address = "0x7a000ffc"; - target_binfile = "zephyr.bin"; - target_binaddr = "0x7a000000"; + args.cpu_id = strtol(cpu_id, NULL, 10); + args.boot_address = strtol(boot_address, NULL, 16); + rproc_inst = platform_create_proc(&args); + if (!rproc_inst) { + printf("create rproc failed\n"); + return -1; + } - /* Open the master side and the slave side of the PTY */ - open_pty(&fdm, &fds); + ret = load_bin(); + if (ret) { + printf("failed to load client os\n"); + return ret; + } - /* Create unamed pipe */ - if (pipe(pipefd) < 0) { - perror("pipe"); - return -1; + ret = remoteproc_start(rproc_inst); + if (ret) { + printf("start processor failed\n"); + return ret; } - /* Create the child process */ - if ((pid = fork()) < 0) { - perror("fork"); - return -1; - } else if (pid > 0) { - close(fds); /* Close the slave side of the PTY */ - - args.fd = fdm; - args.pipefd = pipefd; - if (pthread_create(&tidm, NULL, master, (void*)&args) < 0) { //T3 - perror("parent pthread_create"); - exit(1); - } - //printf("This is thread1: %ld, pid:%d\n", pthread_self(), getpid()); //T1 - pthread_join(tidm, NULL); - } else { - /* ctrl+c signal, exit program and do cleanup */ - atexit(cleanup); - signal(SIGINT, handler); - - close(fdm); /* Close the master side of the PTY */ - - args.fd = fds; - args.pipefd = pipefd; - if (pthread_create(&tids, NULL, slave, (void*)&args) < 0) { //T4 - perror("child pthread_create"); - exit(1); - } - //printf("This is thread2: %ld, pid:%d\n", pthread_self(), getpid()); //T2 - pthread_join(tids, &retval); - if (*(int*)retval) - exit(1); + sleep(5); /* wait for zephyr booting */ + virtio_init(); + + ret = rpmsg_app_master(); + if (ret) { + printf("openamp demo run failed\n"); + return ret; } + printf("\nOpenAMP demo ended.\n"); + if (io) + free(io); + remoteproc_stop(rproc_inst); + rproc_inst->state = RPROC_OFFLINE; + remoteproc_remove(rproc_inst); + return 0; } diff --git a/mcs/rpmsg_pty_demo/zephyr.bin b/mcs/rpmsg_pty_demo/zephyr.bin new file mode 100644 index 0000000000000000000000000000000000000000..3d3f85216423e18b262099e489f35b5fc8ea9969 GIT binary patch literal 163296 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 o?brXy8gsV2VQR)3pfKjOzX@>aw$H$yAv;Y7A literal 0 HcmV?d00001 diff --git a/mcs/zephyr/zephyr.elf b/mcs/zephyr/zephyr.elf deleted file mode 100755 index c7145bc26b204e3f2a0193a7a37ee02490b76c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1336560 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