mirror of
https://github.com/apache/nuttx.git
synced 2026-05-18 17:18:28 +08:00
sim/rptun: support multi(>2) core interactive by share memory
N/A Change-Id: Ia8254bfe369e40a04ed54adfa64afa38974b165c Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
+3
-8
@@ -228,17 +228,12 @@ endchoice
|
||||
|
||||
endif
|
||||
|
||||
config SIM_RPTUN_MASTER
|
||||
bool "Remote Processor Tunneling Role"
|
||||
depends on RPTUN
|
||||
|
||||
menu "Simulated Graphics/Input"
|
||||
|
||||
config SIM_X11FB
|
||||
bool "X11 graphics/input"
|
||||
default n
|
||||
select SCHED_LPWORK
|
||||
depends on SIM_WALLTIME
|
||||
bool "X11 graphics/input"
|
||||
default n
|
||||
select SCHED_LPWORK
|
||||
---help---
|
||||
Use X11 to provide graphics and input emulation to interact with host.
|
||||
|
||||
|
||||
@@ -312,7 +312,7 @@ void netdriver_loop(void);
|
||||
/* up_rptun.c ***************************************************************/
|
||||
|
||||
#ifdef CONFIG_RPTUN
|
||||
int up_rptun_init(void);
|
||||
int up_rptun_init(const char *shmemname, const char *cpuname, bool master);
|
||||
void up_rptun_loop(void);
|
||||
#endif
|
||||
|
||||
|
||||
+83
-86
@@ -23,23 +23,11 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/drivers/addrenv.h>
|
||||
#include <nuttx/fs/hostfs_rpmsg.h>
|
||||
#include <nuttx/rptun/rptun.h>
|
||||
#include <nuttx/serial/uart_rpmsg.h>
|
||||
#include <nuttx/syslog/syslog_rpmsg.h>
|
||||
#include <nuttx/timers/arch_rtc.h>
|
||||
#include <nuttx/timers/rpmsg_rtc.h>
|
||||
#include <nuttx/list.h>
|
||||
|
||||
#include "up_internal.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_SIM_RPTUN_MASTER
|
||||
#define CONFIG_SIM_RPTUN_MASTER 0
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
@@ -47,24 +35,23 @@
|
||||
struct sim_rptun_shmem_s
|
||||
{
|
||||
volatile uintptr_t base;
|
||||
#if CONFIG_SIM_RPTUN_MASTER
|
||||
volatile unsigned int seqrx;
|
||||
volatile unsigned int seqtx;
|
||||
#else
|
||||
volatile unsigned int seqtx;
|
||||
volatile unsigned int seqrx;
|
||||
#endif
|
||||
volatile unsigned int seqs;
|
||||
volatile unsigned int seqm;
|
||||
struct rptun_rsc_s rsc;
|
||||
char buf[0x10000];
|
||||
};
|
||||
|
||||
struct sim_rptun_dev_s
|
||||
{
|
||||
struct list_node node;
|
||||
struct rptun_dev_s rptun;
|
||||
rptun_callback_t callback;
|
||||
void *arg;
|
||||
unsigned int seqrx;
|
||||
bool master;
|
||||
unsigned int seq;
|
||||
struct sim_rptun_shmem_s *shmem;
|
||||
struct simple_addrenv_s addrenv[2];
|
||||
char cpuname[RPMSG_NAME_SIZE + 1];
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
@@ -73,7 +60,10 @@ struct sim_rptun_dev_s
|
||||
|
||||
static const char *sim_rptun_get_cpuname(struct rptun_dev_s *dev)
|
||||
{
|
||||
return CONFIG_SIM_RPTUN_MASTER ? "proxy" : "server";
|
||||
struct sim_rptun_dev_s *priv = container_of(dev,
|
||||
struct sim_rptun_dev_s, rptun);
|
||||
|
||||
return priv->cpuname;
|
||||
}
|
||||
|
||||
static const char *sim_rptun_get_firmware(struct rptun_dev_s *dev)
|
||||
@@ -82,14 +72,16 @@ static const char *sim_rptun_get_firmware(struct rptun_dev_s *dev)
|
||||
}
|
||||
|
||||
static const struct rptun_addrenv_s *
|
||||
sim_rptun_get_addrenv(struct rptun_dev_s *dev)
|
||||
sim_rptun_get_addrenv(struct rptun_dev_s *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct rptun_rsc_s *sim_rptun_get_resource(struct rptun_dev_s *dev)
|
||||
static struct rptun_rsc_s *
|
||||
sim_rptun_get_resource(struct rptun_dev_s *dev)
|
||||
{
|
||||
struct sim_rptun_dev_s *priv = (struct sim_rptun_dev_s *)dev;
|
||||
struct sim_rptun_dev_s *priv = container_of(dev,
|
||||
struct sim_rptun_dev_s, rptun);
|
||||
struct sim_rptun_shmem_s *shmem = priv->shmem;
|
||||
|
||||
return &shmem->rsc;
|
||||
@@ -102,7 +94,9 @@ static bool sim_rptun_is_autostart(struct rptun_dev_s *dev)
|
||||
|
||||
static bool sim_rptun_is_master(struct rptun_dev_s *dev)
|
||||
{
|
||||
return CONFIG_SIM_RPTUN_MASTER;
|
||||
struct sim_rptun_dev_s *priv = container_of(dev,
|
||||
struct sim_rptun_dev_s, rptun);
|
||||
return priv->master;
|
||||
}
|
||||
|
||||
static int sim_rptun_start(struct rptun_dev_s *dev)
|
||||
@@ -117,17 +111,27 @@ static int sim_rptun_stop(struct rptun_dev_s *dev)
|
||||
|
||||
static int sim_rptun_notify(struct rptun_dev_s *dev, uint32_t vqid)
|
||||
{
|
||||
struct sim_rptun_dev_s *priv = (struct sim_rptun_dev_s *)dev;
|
||||
struct sim_rptun_shmem_s *shmem = priv->shmem;
|
||||
struct sim_rptun_dev_s *priv = container_of(dev,
|
||||
struct sim_rptun_dev_s, rptun);
|
||||
|
||||
if (priv->master)
|
||||
{
|
||||
priv->shmem->seqm++;
|
||||
}
|
||||
else
|
||||
{
|
||||
priv->shmem->seqs++;
|
||||
}
|
||||
|
||||
shmem->seqtx++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sim_rptun_register_callback(struct rptun_dev_s *dev,
|
||||
rptun_callback_t callback, void *arg)
|
||||
rptun_callback_t callback,
|
||||
void *arg)
|
||||
{
|
||||
struct sim_rptun_dev_s *priv = (struct sim_rptun_dev_s *)dev;
|
||||
struct sim_rptun_dev_s *priv = container_of(dev,
|
||||
struct sim_rptun_dev_s, rptun);
|
||||
|
||||
priv->callback = callback;
|
||||
priv->arg = arg;
|
||||
@@ -152,10 +156,7 @@ static const struct rptun_ops_s g_sim_rptun_ops =
|
||||
.register_callback = sim_rptun_register_callback,
|
||||
};
|
||||
|
||||
static struct sim_rptun_dev_s g_dev =
|
||||
{
|
||||
.rptun.ops = &g_sim_rptun_ops
|
||||
};
|
||||
static struct list_node g_dev_list = LIST_INITIAL_VALUE(g_dev_list);
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
@@ -163,33 +164,57 @@ static struct sim_rptun_dev_s g_dev =
|
||||
|
||||
void up_rptun_loop(void)
|
||||
{
|
||||
struct sim_rptun_shmem_s *shmem = g_dev.shmem;
|
||||
struct sim_rptun_dev_s *dev;
|
||||
|
||||
if (shmem != NULL && g_dev.seqrx != shmem->seqrx)
|
||||
list_for_every_entry(&g_dev_list, dev,
|
||||
struct sim_rptun_dev_s, node)
|
||||
{
|
||||
g_dev.seqrx = shmem->seqrx;
|
||||
if (g_dev.callback != NULL)
|
||||
if (dev->shmem != NULL)
|
||||
{
|
||||
g_dev.callback(g_dev.arg, RPTUN_NOTIFY_ALL);
|
||||
if (dev->master && dev->seq != dev->shmem->seqs)
|
||||
{
|
||||
dev->seq = dev->shmem->seqs;
|
||||
}
|
||||
else if (!dev->master && dev->seq != dev->shmem->seqm)
|
||||
{
|
||||
dev->seq = dev->shmem->seqm;
|
||||
}
|
||||
|
||||
if (dev->callback != NULL)
|
||||
{
|
||||
dev->callback(dev->arg, RPTUN_NOTIFY_ALL);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int up_rptun_init(void)
|
||||
int up_rptun_init(const char *shmemname, const char *cpuname, bool master)
|
||||
{
|
||||
struct sim_rptun_dev_s *dev;
|
||||
int ret;
|
||||
|
||||
g_dev.shmem = host_alloc_shmem("rptun-shmem",
|
||||
sizeof(*g_dev.shmem),
|
||||
CONFIG_SIM_RPTUN_MASTER);
|
||||
if (g_dev.shmem == NULL)
|
||||
dev = kmm_zalloc(sizeof(*dev));
|
||||
if (dev == NULL)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (CONFIG_SIM_RPTUN_MASTER)
|
||||
dev->shmem = host_alloc_shmem(shmemname, sizeof(*dev->shmem),
|
||||
master);
|
||||
if (dev->shmem == NULL)
|
||||
{
|
||||
struct rptun_rsc_s *rsc = &g_dev.shmem->rsc;
|
||||
kmm_free(dev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev->master = master;
|
||||
dev->rptun.ops = &g_sim_rptun_ops;
|
||||
strncpy(dev->cpuname, cpuname, RPMSG_NAME_SIZE);
|
||||
list_add_tail(&g_dev_list, &dev->node);
|
||||
|
||||
if (master)
|
||||
{
|
||||
struct rptun_rsc_s *rsc = &dev->shmem->rsc;
|
||||
|
||||
rsc->rsc_tbl_hdr.ver = 1;
|
||||
rsc->rsc_tbl_hdr.num = 1;
|
||||
@@ -208,59 +233,31 @@ int up_rptun_init(void)
|
||||
rsc->config.rxbuf_size = 0x800;
|
||||
rsc->config.txbuf_size = 0x800;
|
||||
|
||||
g_dev.shmem->base = (uintptr_t)g_dev.shmem;
|
||||
dev->shmem->base = (uintptr_t)dev->shmem;
|
||||
}
|
||||
else
|
||||
{
|
||||
static struct simple_addrenv_s s_addrenv[2];
|
||||
|
||||
/* Wait untils master is ready */
|
||||
|
||||
while (g_dev.shmem->base == 0)
|
||||
while (dev->shmem->base == 0)
|
||||
{
|
||||
host_sleep(1000);
|
||||
}
|
||||
|
||||
s_addrenv[0].va = (uintptr_t)g_dev.shmem;
|
||||
s_addrenv[0].pa = g_dev.shmem->base;
|
||||
s_addrenv[0].size = sizeof(*g_dev.shmem);
|
||||
dev->addrenv[0].va = (uintptr_t)dev->shmem;
|
||||
dev->addrenv[0].pa = dev->shmem->base;
|
||||
dev->addrenv[0].size = sizeof(*dev->shmem);
|
||||
|
||||
simple_addrenv_initialize(s_addrenv);
|
||||
simple_addrenv_initialize(dev->addrenv);
|
||||
}
|
||||
|
||||
ret = rptun_initialize(&g_dev.rptun);
|
||||
ret = rptun_initialize(&dev->rptun);
|
||||
if (ret < 0)
|
||||
{
|
||||
host_free_shmem(g_dev.shmem);
|
||||
return ret;
|
||||
list_delete(&dev->node);
|
||||
host_free_shmem(dev->shmem);
|
||||
kmm_free(dev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSLOG_RPMSG_SERVER
|
||||
syslog_rpmsg_server_init();
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_RTC_RPMSG_SERVER
|
||||
up_rtc_set_lowerhalf(rpmsg_rtc_initialize(0));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_HOSTFS_RPMSG
|
||||
hostfs_rpmsg_init("server");
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_HOSTFS_RPMSG_SERVER
|
||||
hostfs_rpmsg_server_init();
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#if CONFIG_RPMSG_UART
|
||||
void rpmsg_serialinit(void)
|
||||
{
|
||||
#if CONFIG_SIM_RPTUN_MASTER
|
||||
uart_rpmsg_init("proxy", "proxy", 4096, false);
|
||||
#else
|
||||
uart_rpmsg_init("server", "proxy", 4096, true);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -10,6 +10,11 @@ config EXAMPLES_TOUCHSCREEN_BGCOLOR
|
||||
default 0x007b68ee
|
||||
depends on EXAMPLES_TOUCHSCREEN
|
||||
|
||||
config SIM_RPTUN_MASTER
|
||||
bool "Remote Processor Tunneling Role"
|
||||
default n
|
||||
depends on RPTUN
|
||||
|
||||
if SIM_TOUCHSCREEN
|
||||
|
||||
comment "NX Server Options"
|
||||
|
||||
@@ -34,14 +34,20 @@
|
||||
#include <nuttx/mtd/mtd.h>
|
||||
#include <nuttx/fs/fs.h>
|
||||
#include <nuttx/fs/nxffs.h>
|
||||
#include <nuttx/fs/hostfs_rpmsg.h>
|
||||
#include <nuttx/i2c/i2c_master.h>
|
||||
#include <nuttx/rc/lirc_dev.h>
|
||||
#include <nuttx/rc/dummy.h>
|
||||
#include <nuttx/sensors/fakesensor.h>
|
||||
#include <nuttx/sensors/mpu60x0.h>
|
||||
#include <nuttx/sensors/wtgahrs2.h>
|
||||
#include <nuttx/serial/uart_rpmsg.h>
|
||||
#include <nuttx/syslog/syslog_rpmsg.h>
|
||||
#include <nuttx/timers/arch_rtc.h>
|
||||
#include <nuttx/timers/oneshot.h>
|
||||
#include <nuttx/timers/rpmsg_rtc.h>
|
||||
#include <nuttx/video/fb.h>
|
||||
#include <nuttx/timers/oneshot.h>
|
||||
#include <nuttx/wireless/pktradio.h>
|
||||
#include <nuttx/wireless/bluetooth/bt_null.h>
|
||||
#include <nuttx/wireless/bluetooth/bt_uart_shim.h>
|
||||
@@ -62,8 +68,19 @@
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_RPMSG_UART
|
||||
void rpmsg_serialinit(void)
|
||||
{
|
||||
#ifdef CONFIG_SIM_RPTUN_MASTER
|
||||
uart_rpmsg_init("proxy", "proxy", 4096, false);
|
||||
#else
|
||||
uart_rpmsg_init("server", "proxy", 4096, true);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: sam_bringup
|
||||
* Name: sim_bringup
|
||||
*
|
||||
* Description:
|
||||
* Bring up simulated board features
|
||||
@@ -425,7 +442,27 @@ int sim_bringup(void)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_RPTUN
|
||||
up_rptun_init();
|
||||
#ifdef CONFIG_SIM_RPTUN_MASTER
|
||||
up_rptun_init("server-proxy", "proxy", true);
|
||||
#else
|
||||
up_rptun_init("server-proxy", "server", false);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYSLOG_RPMSG_SERVER
|
||||
syslog_rpmsg_server_init();
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_RTC_RPMSG_SERVER
|
||||
up_rtc_set_lowerhalf(rpmsg_rtc_initialize(0));
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_HOSTFS_RPMSG
|
||||
hostfs_rpmsg_init("server");
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FS_HOSTFS_RPMSG_SERVER
|
||||
hostfs_rpmsg_server_init();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SIM_WTGAHRS2_UARTN
|
||||
|
||||
Reference in New Issue
Block a user