mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 11:56:10 +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
|
endif
|
||||||
|
|
||||||
config SIM_RPTUN_MASTER
|
|
||||||
bool "Remote Processor Tunneling Role"
|
|
||||||
depends on RPTUN
|
|
||||||
|
|
||||||
menu "Simulated Graphics/Input"
|
menu "Simulated Graphics/Input"
|
||||||
|
|
||||||
config SIM_X11FB
|
config SIM_X11FB
|
||||||
bool "X11 graphics/input"
|
bool "X11 graphics/input"
|
||||||
default n
|
default n
|
||||||
select SCHED_LPWORK
|
select SCHED_LPWORK
|
||||||
depends on SIM_WALLTIME
|
|
||||||
---help---
|
---help---
|
||||||
Use X11 to provide graphics and input emulation to interact with host.
|
Use X11 to provide graphics and input emulation to interact with host.
|
||||||
|
|
||||||
|
|||||||
@@ -312,7 +312,7 @@ void netdriver_loop(void);
|
|||||||
/* up_rptun.c ***************************************************************/
|
/* up_rptun.c ***************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_RPTUN
|
#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);
|
void up_rptun_loop(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
+83
-86
@@ -23,23 +23,11 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/drivers/addrenv.h>
|
#include <nuttx/drivers/addrenv.h>
|
||||||
#include <nuttx/fs/hostfs_rpmsg.h>
|
|
||||||
#include <nuttx/rptun/rptun.h>
|
#include <nuttx/rptun/rptun.h>
|
||||||
#include <nuttx/serial/uart_rpmsg.h>
|
#include <nuttx/list.h>
|
||||||
#include <nuttx/syslog/syslog_rpmsg.h>
|
|
||||||
#include <nuttx/timers/arch_rtc.h>
|
|
||||||
#include <nuttx/timers/rpmsg_rtc.h>
|
|
||||||
|
|
||||||
#include "up_internal.h"
|
#include "up_internal.h"
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Pre-processor Definitions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
#ifndef CONFIG_SIM_RPTUN_MASTER
|
|
||||||
#define CONFIG_SIM_RPTUN_MASTER 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Types
|
* Private Types
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -47,24 +35,23 @@
|
|||||||
struct sim_rptun_shmem_s
|
struct sim_rptun_shmem_s
|
||||||
{
|
{
|
||||||
volatile uintptr_t base;
|
volatile uintptr_t base;
|
||||||
#if CONFIG_SIM_RPTUN_MASTER
|
volatile unsigned int seqs;
|
||||||
volatile unsigned int seqrx;
|
volatile unsigned int seqm;
|
||||||
volatile unsigned int seqtx;
|
|
||||||
#else
|
|
||||||
volatile unsigned int seqtx;
|
|
||||||
volatile unsigned int seqrx;
|
|
||||||
#endif
|
|
||||||
struct rptun_rsc_s rsc;
|
struct rptun_rsc_s rsc;
|
||||||
char buf[0x10000];
|
char buf[0x10000];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sim_rptun_dev_s
|
struct sim_rptun_dev_s
|
||||||
{
|
{
|
||||||
|
struct list_node node;
|
||||||
struct rptun_dev_s rptun;
|
struct rptun_dev_s rptun;
|
||||||
rptun_callback_t callback;
|
rptun_callback_t callback;
|
||||||
void *arg;
|
void *arg;
|
||||||
unsigned int seqrx;
|
bool master;
|
||||||
|
unsigned int seq;
|
||||||
struct sim_rptun_shmem_s *shmem;
|
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)
|
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)
|
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 *
|
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;
|
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;
|
struct sim_rptun_shmem_s *shmem = priv->shmem;
|
||||||
|
|
||||||
return &shmem->rsc;
|
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)
|
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)
|
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)
|
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_dev_s *priv = container_of(dev,
|
||||||
struct sim_rptun_shmem_s *shmem = priv->shmem;
|
struct sim_rptun_dev_s, rptun);
|
||||||
|
|
||||||
|
if (priv->master)
|
||||||
|
{
|
||||||
|
priv->shmem->seqm++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
priv->shmem->seqs++;
|
||||||
|
}
|
||||||
|
|
||||||
shmem->seqtx++;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sim_rptun_register_callback(struct rptun_dev_s *dev,
|
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->callback = callback;
|
||||||
priv->arg = arg;
|
priv->arg = arg;
|
||||||
@@ -152,10 +156,7 @@ static const struct rptun_ops_s g_sim_rptun_ops =
|
|||||||
.register_callback = sim_rptun_register_callback,
|
.register_callback = sim_rptun_register_callback,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct sim_rptun_dev_s g_dev =
|
static struct list_node g_dev_list = LIST_INITIAL_VALUE(g_dev_list);
|
||||||
{
|
|
||||||
.rptun.ops = &g_sim_rptun_ops
|
|
||||||
};
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
@@ -163,33 +164,57 @@ static struct sim_rptun_dev_s g_dev =
|
|||||||
|
|
||||||
void up_rptun_loop(void)
|
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 (dev->shmem != NULL)
|
||||||
if (g_dev.callback != 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;
|
int ret;
|
||||||
|
|
||||||
g_dev.shmem = host_alloc_shmem("rptun-shmem",
|
dev = kmm_zalloc(sizeof(*dev));
|
||||||
sizeof(*g_dev.shmem),
|
if (dev == NULL)
|
||||||
CONFIG_SIM_RPTUN_MASTER);
|
|
||||||
if (g_dev.shmem == NULL)
|
|
||||||
{
|
{
|
||||||
return -ENOMEM;
|
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.ver = 1;
|
||||||
rsc->rsc_tbl_hdr.num = 1;
|
rsc->rsc_tbl_hdr.num = 1;
|
||||||
@@ -208,59 +233,31 @@ int up_rptun_init(void)
|
|||||||
rsc->config.rxbuf_size = 0x800;
|
rsc->config.rxbuf_size = 0x800;
|
||||||
rsc->config.txbuf_size = 0x800;
|
rsc->config.txbuf_size = 0x800;
|
||||||
|
|
||||||
g_dev.shmem->base = (uintptr_t)g_dev.shmem;
|
dev->shmem->base = (uintptr_t)dev->shmem;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
static struct simple_addrenv_s s_addrenv[2];
|
|
||||||
|
|
||||||
/* Wait untils master is ready */
|
/* Wait untils master is ready */
|
||||||
|
|
||||||
while (g_dev.shmem->base == 0)
|
while (dev->shmem->base == 0)
|
||||||
{
|
{
|
||||||
host_sleep(1000);
|
host_sleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
s_addrenv[0].va = (uintptr_t)g_dev.shmem;
|
dev->addrenv[0].va = (uintptr_t)dev->shmem;
|
||||||
s_addrenv[0].pa = g_dev.shmem->base;
|
dev->addrenv[0].pa = dev->shmem->base;
|
||||||
s_addrenv[0].size = sizeof(*g_dev.shmem);
|
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)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
host_free_shmem(g_dev.shmem);
|
list_delete(&dev->node);
|
||||||
return ret;
|
host_free_shmem(dev->shmem);
|
||||||
|
kmm_free(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SYSLOG_RPMSG_SERVER
|
return ret;
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#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
|
default 0x007b68ee
|
||||||
depends on EXAMPLES_TOUCHSCREEN
|
depends on EXAMPLES_TOUCHSCREEN
|
||||||
|
|
||||||
|
config SIM_RPTUN_MASTER
|
||||||
|
bool "Remote Processor Tunneling Role"
|
||||||
|
default n
|
||||||
|
depends on RPTUN
|
||||||
|
|
||||||
if SIM_TOUCHSCREEN
|
if SIM_TOUCHSCREEN
|
||||||
|
|
||||||
comment "NX Server Options"
|
comment "NX Server Options"
|
||||||
|
|||||||
@@ -34,14 +34,20 @@
|
|||||||
#include <nuttx/mtd/mtd.h>
|
#include <nuttx/mtd/mtd.h>
|
||||||
#include <nuttx/fs/fs.h>
|
#include <nuttx/fs/fs.h>
|
||||||
#include <nuttx/fs/nxffs.h>
|
#include <nuttx/fs/nxffs.h>
|
||||||
|
#include <nuttx/fs/hostfs_rpmsg.h>
|
||||||
#include <nuttx/i2c/i2c_master.h>
|
#include <nuttx/i2c/i2c_master.h>
|
||||||
#include <nuttx/rc/lirc_dev.h>
|
#include <nuttx/rc/lirc_dev.h>
|
||||||
#include <nuttx/rc/dummy.h>
|
#include <nuttx/rc/dummy.h>
|
||||||
#include <nuttx/sensors/fakesensor.h>
|
#include <nuttx/sensors/fakesensor.h>
|
||||||
#include <nuttx/sensors/mpu60x0.h>
|
#include <nuttx/sensors/mpu60x0.h>
|
||||||
#include <nuttx/sensors/wtgahrs2.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/oneshot.h>
|
||||||
|
#include <nuttx/timers/rpmsg_rtc.h>
|
||||||
#include <nuttx/video/fb.h>
|
#include <nuttx/video/fb.h>
|
||||||
|
#include <nuttx/timers/oneshot.h>
|
||||||
#include <nuttx/wireless/pktradio.h>
|
#include <nuttx/wireless/pktradio.h>
|
||||||
#include <nuttx/wireless/bluetooth/bt_null.h>
|
#include <nuttx/wireless/bluetooth/bt_null.h>
|
||||||
#include <nuttx/wireless/bluetooth/bt_uart_shim.h>
|
#include <nuttx/wireless/bluetooth/bt_uart_shim.h>
|
||||||
@@ -62,8 +68,19 @@
|
|||||||
* Public Functions
|
* 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:
|
* Description:
|
||||||
* Bring up simulated board features
|
* Bring up simulated board features
|
||||||
@@ -425,7 +442,27 @@ int sim_bringup(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_RPTUN
|
#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
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SIM_WTGAHRS2_UARTN
|
#ifdef CONFIG_SIM_WTGAHRS2_UARTN
|
||||||
|
|||||||
Reference in New Issue
Block a user