Skip to content

Commit 8f113ea

Browse files
stanislav-poborilgalak
authored andcommitted
sample: Add RPMsg-Lite sample application
Add RPMsg-Lite sample application. It can be run on lpcxpresso54114 board at the moment. The application sends messages from slave to primary core. First, the slave core image has to be built from samples/subsys/ipc/rpmsg_lite/remote/. Then, buid primary core image from samples/subsys/ipc/rpmsg_lite/master/. Origin: Original Signed-off-by: Stanislav Poboril <[email protected]>
1 parent f8dd076 commit 8f113ea

File tree

9 files changed

+356
-0
lines changed

9 files changed

+356
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
set(BOARD lpcxpresso54114)
2+
3+
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
4+
project(NONE)
5+
6+
enable_language(C ASM)
7+
8+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite)
9+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/drivers)
10+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite/master/src)
11+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite/remote/build/zephyr)
12+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/include)
13+
if(CONFIG_SOC_SERIES_LPC54XXX)
14+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/include/platform/lpc5411x)
15+
endif()
16+
17+
if(ZEPHYR_GCC_VARIANT STREQUAL "zephyr")
18+
configure_file($ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite/remote/build/zephyr/core1_image.bin $ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite/master/build/core1_image.bin COPYONLY)
19+
endif()
20+
21+
if(CONFIG_IPC_RPMSG_LITE)
22+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/common/llist.c)
23+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_lite.c)
24+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_ns.c)
25+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_queue.c)
26+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/porting/environment/rpmsg_env_zephyr.c)
27+
if(CONFIG_SOC_SERIES_LPC54XXX)
28+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/porting/platform/lpc5411x/rpmsg_platform_zephyr_ipm.c)
29+
endif()
30+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/virtio/virtqueue.c)
31+
endif()
32+
33+
target_sources(app PRIVATE src/main_master.c)
34+
if(CONFIG_SOC_SERIES_LPC54XXX)
35+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/hal/nxp/mcux/devices/LPC54114/incbin.S)
36+
endif()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CONFIG_PRINTK=y
2+
CONFIG_IPM=y
3+
CONFIG_IPM_MCUX=y
4+
CONFIG_SLAVE_CORE_MCUX=y
5+
CONFIG_TIMESLICE_SIZE=1
6+
CONFIG_MAIN_STACK_SIZE=2048
7+
CONFIG_IPC_RPMSG_LITE=y
8+
CONFIG_HEAP_MEM_POOL_SIZE=4096
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
sample:
2+
description: TBD
3+
name: TBD
4+
tests:
5+
test:
6+
build_only: true
7+
filter: CONFIG_SOC_MCUX
8+
tags: samples ipm
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
/*
2+
* Copyright (c) 2018, NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr.h>
8+
#include <misc/printk.h>
9+
#include <device.h>
10+
#include <stdio.h>
11+
#include <stdlib.h>
12+
#include <string.h>
13+
#include "rpmsg_lite.h"
14+
#include "rpmsg_queue.h"
15+
#include "rpmsg_ns.h"
16+
17+
#define APP_TASK_STACK_SIZE (256)
18+
#define REMOTE_EPT_ADDR (30)
19+
#define LOCAL_EPT_ADDR (40)
20+
21+
K_THREAD_STACK_DEFINE(thread_stack, APP_TASK_STACK_SIZE);
22+
static struct k_thread thread_data;
23+
24+
#ifdef CPU_LPC54114J256BD64_cm4
25+
#define RPMSG_LITE_LINK_ID (RL_PLATFORM_LPC5411x_M4_M0_LINK_ID)
26+
#define SH_MEM_TOTAL_SIZE (6144)
27+
#else
28+
#error Please define RPMSG_LITE_LINK_ID and SH_MEM_TOTAL_SIZE for the CPU used.
29+
#endif
30+
31+
#if defined(__ICCARM__) /* IAR Workbench */
32+
#pragma location = "rpmsg_sh_mem_section"
33+
char rpmsg_lite_base[SH_MEM_TOTAL_SIZE];
34+
#elif defined(__GNUC__) /* LPCXpresso */
35+
char rpmsg_lite_base[SH_MEM_TOTAL_SIZE] __attribute__((
36+
section(".noinit.$rpmsg_sh_mem")
37+
));
38+
#elif defined(__CC_ARM) /* Keil MDK */
39+
char rpmsg_lite_base[SH_MEM_TOTAL_SIZE] __attribute__((
40+
section("rpmsg_sh_mem_section")
41+
));
42+
#else
43+
#error "RPMsg: Please provide your definition of rpmsg_lite_base[]!"
44+
#endif
45+
46+
struct the_message {
47+
u32_t DATA;
48+
};
49+
50+
struct the_message volatile msg = {0};
51+
52+
void app_nameservice_isr_cb(unsigned int new_ept, const char *new_ept_name,
53+
unsigned long flags, void *user_data)
54+
{
55+
unsigned long *data = (unsigned long *)user_data;
56+
57+
*data = new_ept;
58+
}
59+
60+
61+
void app_task(void *arg1, void *arg2, void *arg3)
62+
{
63+
ARG_UNUSED(arg1);
64+
ARG_UNUSED(arg2);
65+
ARG_UNUSED(arg3);
66+
67+
volatile unsigned long remote_addr = 0;
68+
struct rpmsg_lite_endpoint *my_ept;
69+
rpmsg_queue_handle my_queue;
70+
struct rpmsg_lite_instance *my_rpmsg;
71+
rpmsg_ns_handle ns_handle;
72+
int len;
73+
74+
/* Print the initial banner */
75+
printk("\r\nRPMsg demo starts\r\n");
76+
77+
my_rpmsg = rpmsg_lite_master_init(rpmsg_lite_base, SH_MEM_TOTAL_SIZE,
78+
RPMSG_LITE_LINK_ID, RL_NO_FLAGS);
79+
80+
my_queue = rpmsg_queue_create(my_rpmsg);
81+
my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR,
82+
rpmsg_queue_rx_cb, my_queue);
83+
ns_handle = rpmsg_ns_bind(my_rpmsg, app_nameservice_isr_cb,
84+
(void *)&remote_addr);
85+
86+
/* Wait until the secondary core application issues the nameservice isr
87+
* and the remote endpoint address is known.
88+
*/
89+
while (remote_addr == 0) {
90+
}
91+
92+
/* Send the first message to the remoteproc */
93+
msg.DATA = 0;
94+
rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg,
95+
sizeof(struct the_message), RL_DONT_BLOCK);
96+
97+
while (msg.DATA <= 100) {
98+
rpmsg_queue_recv(my_rpmsg, my_queue,
99+
(unsigned long *)&remote_addr, (char *)&msg,
100+
sizeof(struct the_message), &len, RL_BLOCK);
101+
printk("Primary core received a msg\r\n");
102+
printk("Message: Size=%x, DATA = %i\r\n", len, msg.DATA);
103+
msg.DATA++;
104+
105+
rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg,
106+
sizeof(struct the_message), RL_BLOCK);
107+
}
108+
109+
rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
110+
my_ept = NULL;
111+
rpmsg_queue_destroy(my_rpmsg, my_queue);
112+
my_queue = NULL;
113+
rpmsg_ns_unbind(my_rpmsg, ns_handle);
114+
rpmsg_lite_deinit(my_rpmsg);
115+
116+
/* Print the ending banner */
117+
printk("\r\nRPMsg demo ends\r\n");
118+
while (1) {
119+
}
120+
}
121+
122+
void main(void)
123+
{
124+
printk("===== app started ========\n");
125+
126+
k_thread_create(&thread_data, thread_stack, APP_TASK_STACK_SIZE,
127+
(k_thread_entry_t)app_task,
128+
NULL, NULL, NULL, K_PRIO_COOP(7), 0, 0);
129+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
set(BOARD lpcxpresso54114_m0)
2+
3+
include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE)
4+
project(NONE)
5+
6+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/samples/subsys/ipc/rpmsg_lite)
7+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/drivers)
8+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/include)
9+
if(CONFIG_SOC_SERIES_LPC54XXX)
10+
target_include_directories(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/include/platform/lpc5411x)
11+
endif()
12+
13+
if(CONFIG_IPC_RPMSG_LITE)
14+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/common/llist.c)
15+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_lite.c)
16+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_ns.c)
17+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/rpmsg_queue.c)
18+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/porting/environment/rpmsg_env_zephyr.c)
19+
if(CONFIG_SOC_SERIES_LPC54XXX)
20+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/rpmsg_lite/porting/platform/lpc5411x/rpmsg_platform_zephyr_ipm.c)
21+
endif()
22+
target_sources(app PRIVATE $ENV{ZEPHYR_BASE}/ext/lib/ipc/rpmsg_lite/lib/virtio/virtqueue.c)
23+
endif()
24+
25+
target_sources(app PRIVATE src/main_remote.c)
26+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CONFIG_KERNEL_BIN_NAME="core1_image"
2+
CONFIG_STDOUT_CONSOLE=n
3+
CONFIG_PRINTK=n
4+
CONFIG_IPM=y
5+
CONFIG_IPM_MCUX=y
6+
CONFIG_PLATFORM_SPECIFIC_INIT=n
7+
CONFIG_IPC_RPMSG_LITE=y
8+
CONFIG_HEAP_MEM_POOL_SIZE=4096
9+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
sample:
2+
description: TBD
3+
name: TBD
4+
tests:
5+
test:
6+
build_only: true
7+
filter: CONFIG_SOC_MCUX
8+
tags: samples ipm
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
/*
2+
* Copyright (c) 2018, NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr.h>
8+
#include <misc/printk.h>
9+
#include <device.h>
10+
#include <stdio.h>
11+
#include <stdlib.h>
12+
#include <string.h>
13+
#include "rpmsg_lite.h"
14+
#include "rpmsg_queue.h"
15+
#include "rpmsg_ns.h"
16+
17+
#define APP_TASK_STACK_SIZE (256)
18+
#define LOCAL_EPT_ADDR (30)
19+
20+
#ifdef CPU_LPC54114J256BD64_cm0plus
21+
#define RPMSG_LITE_LINK_ID (RL_PLATFORM_LPC5411x_M4_M0_LINK_ID)
22+
#define RPMSG_LITE_SHMEM_BASE (0x20026800)
23+
#define RPMSG_LITE_NS_USED (1)
24+
#define RPMSG_LITE_NS_ANNOUNCE_STRING "rpmsg-openamp-demo-channel"
25+
#else
26+
#error Please define ERPC_TRANSPORT_RPMSG_LITE_LINK_ID, RPMSG_LITE_SHMEM_BASE, \
27+
RPMSG_LITE_NS_USED and RPMSG_LITE_NS_ANNOUNCE_STRING values for the CPU used.
28+
#endif
29+
30+
K_THREAD_STACK_DEFINE(thread_stack, APP_TASK_STACK_SIZE);
31+
static struct k_thread thread_data;
32+
33+
struct the_message {
34+
u32_t DATA;
35+
};
36+
37+
struct the_message volatile msg = {0};
38+
39+
void app_nameservice_isr_cb(unsigned int new_ept, const char *new_ept_name,
40+
unsigned long flags, void *user_data)
41+
{
42+
}
43+
44+
void app_task(void *arg1, void *arg2, void *arg3)
45+
{
46+
ARG_UNUSED(arg1);
47+
ARG_UNUSED(arg2);
48+
ARG_UNUSED(arg3);
49+
50+
volatile unsigned long remote_addr;
51+
struct rpmsg_lite_endpoint *volatile my_ept;
52+
volatile rpmsg_queue_handle my_queue;
53+
struct rpmsg_lite_instance *volatile my_rpmsg;
54+
#ifdef RPMSG_LITE_NS_USED
55+
volatile rpmsg_ns_handle ns_handle;
56+
#endif /*RPMSG_LITE_NS_USED*/
57+
58+
my_rpmsg = rpmsg_lite_remote_init((void *)RPMSG_LITE_SHMEM_BASE,
59+
RPMSG_LITE_LINK_ID, RL_NO_FLAGS);
60+
61+
while (!rpmsg_lite_is_link_up(my_rpmsg)) {
62+
}
63+
64+
my_queue = rpmsg_queue_create(my_rpmsg);
65+
my_ept = rpmsg_lite_create_ept(my_rpmsg, LOCAL_EPT_ADDR,
66+
rpmsg_queue_rx_cb, my_queue);
67+
68+
#ifdef RPMSG_LITE_NS_USED
69+
ns_handle = rpmsg_ns_bind(my_rpmsg, app_nameservice_isr_cb, NULL);
70+
rpmsg_ns_announce(my_rpmsg, my_ept, RPMSG_LITE_NS_ANNOUNCE_STRING,
71+
RL_NS_CREATE);
72+
printk("Nameservice announce sent.\r\n");
73+
#endif /*RPMSG_LITE_NS_USED*/
74+
75+
while (msg.DATA <= 100) {
76+
printk("Waiting for ping...\r\n");
77+
rpmsg_queue_recv(my_rpmsg, my_queue,
78+
(unsigned long *)&remote_addr, (char *)&msg,
79+
sizeof(struct the_message), NULL, RL_BLOCK);
80+
msg.DATA++;
81+
printk("Sending pong...\r\n");
82+
rpmsg_lite_send(my_rpmsg, my_ept, remote_addr, (char *)&msg,
83+
sizeof(struct the_message), RL_BLOCK);
84+
}
85+
86+
rpmsg_lite_destroy_ept(my_rpmsg, my_ept);
87+
my_ept = NULL;
88+
rpmsg_queue_destroy(my_rpmsg, my_queue);
89+
my_queue = NULL;
90+
#ifdef RPMSG_LITE_NS_USED
91+
rpmsg_ns_unbind(my_rpmsg, ns_handle);
92+
#endif
93+
rpmsg_lite_deinit(my_rpmsg);
94+
msg.DATA = 0;
95+
96+
/* End of example */
97+
while (1) {
98+
}
99+
}
100+
101+
void main(void)
102+
{
103+
printk("===== app started ========\n");
104+
105+
k_thread_create(&thread_data, thread_stack, APP_TASK_STACK_SIZE,
106+
(k_thread_entry_t)app_task,
107+
NULL, NULL, NULL, K_PRIO_COOP(7), 0, 0);
108+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright (c) 2018, NXP
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef _RPMSG_CONFIG_H
8+
#define _RPMSG_CONFIG_H
9+
10+
/*
11+
* RPMsg config values.
12+
* See $ZEPHYR_BASE/ext/lib/ipc/rpmsg_lite/lib/include/rpmsg_default_config.h
13+
* for the list of all config items.
14+
*/
15+
16+
#define RL_MS_PER_INTERVAL (1)
17+
18+
#define RL_BUFFER_PAYLOAD_SIZE (496)
19+
20+
#define RL_API_HAS_ZEROCOPY (1)
21+
22+
#define RL_USE_STATIC_API (0)
23+
24+
#endif /* _RPMSG_CONFIG_H */

0 commit comments

Comments
 (0)