mirror of
https://github.com/apache/nuttx.git
synced 2026-08-17 02:13:19 +00:00
drivers/timer/rpmsg_rtc: export ept about rtc to remote cpu
Export rpmsg endpoint to allow remote CPU to access RTC services. Simplify the initialization flow and remove unnecessary Kconfig options. Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
parent
a73ff585f1
commit
37729ecb51
5 changed files with 56 additions and 75 deletions
|
|
@ -64,7 +64,6 @@ CONFIG_RTC_ARCH=y
|
|||
CONFIG_RTC_DRIVER=y
|
||||
CONFIG_RTC_EXTERNAL=y
|
||||
CONFIG_RTC_RPMSG=y
|
||||
CONFIG_RTC_RPMSG_SERVER_NAME="server"
|
||||
CONFIG_SCHED_CHILD_STATUS=y
|
||||
CONFIG_SCHED_HAVE_PARENT=y
|
||||
CONFIG_SCHED_WAITPID=y
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ CONFIG_RTC_ARCH=y
|
|||
CONFIG_RTC_DRIVER=y
|
||||
CONFIG_RTC_EXTERNAL=y
|
||||
CONFIG_RTC_RPMSG=y
|
||||
CONFIG_RTC_RPMSG_SERVER_NAME="server"
|
||||
CONFIG_SCHED_CHILD_STATUS=y
|
||||
CONFIG_SCHED_HAVE_PARENT=y
|
||||
CONFIG_SCHED_WAITPID=y
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ CONFIG_RTC_ARCH=y
|
|||
CONFIG_RTC_DRIVER=y
|
||||
CONFIG_RTC_EXTERNAL=y
|
||||
CONFIG_RTC_RPMSG=y
|
||||
CONFIG_RTC_RPMSG_SERVER_NAME="server"
|
||||
CONFIG_SCHED_CHILD_STATUS=y
|
||||
CONFIG_SCHED_HAVE_PARENT=y
|
||||
CONFIG_SCHED_WAITPID=y
|
||||
|
|
|
|||
|
|
@ -416,13 +416,6 @@ config RTC_RPMSG_SERVER
|
|||
bool "The RTC RPMSG Role"
|
||||
depends on RPMSG
|
||||
|
||||
config RTC_RPMSG_SERVER_NAME
|
||||
string "The name of RTC RPMSG Server"
|
||||
depends on RTC_RPMSG
|
||||
---help---
|
||||
The proc name of RTC server. Client requests time from
|
||||
specified name of remote proc.
|
||||
|
||||
config RTC_RPMSG_SYNC_BASETIME
|
||||
bool "Update g_basetime from rpmsg."
|
||||
default n
|
||||
|
|
|
|||
|
|
@ -142,10 +142,12 @@ struct rpmsg_rtc_client_s
|
|||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_RTC_RPMSG_SERVER
|
||||
static void rpmsg_rtc_device_created(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv);
|
||||
static void rpmsg_rtc_device_destroy(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv);
|
||||
static bool rpmsg_rtc_device_ns_match(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv, FAR const char *name,
|
||||
uint32_t dest);
|
||||
static void rpmsg_rtc_device_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv, FAR const char *name,
|
||||
uint32_t dest);
|
||||
static void rpmsg_rtc_alarm_fire_handler(FAR struct rpmsg_endpoint *ept,
|
||||
FAR void *data, size_t len, uint32_t src, FAR void *priv);
|
||||
static int rpmsg_rtc_ept_cb(FAR struct rpmsg_endpoint *ept, FAR void *data,
|
||||
|
|
@ -250,32 +252,23 @@ static struct rtc_ops_s g_rpmsg_rtc_server_ops =
|
|||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_RTC_RPMSG_SERVER
|
||||
static void rpmsg_rtc_device_created(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv)
|
||||
static bool rpmsg_rtc_device_ns_match(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv, FAR const char *name,
|
||||
uint32_t dest)
|
||||
{
|
||||
FAR struct rpmsg_rtc_lowerhalf_s *lower = priv;
|
||||
|
||||
if (strcmp(CONFIG_RTC_RPMSG_SERVER_NAME,
|
||||
rpmsg_get_cpuname(rdev)) == 0)
|
||||
{
|
||||
lower->ept.priv = lower;
|
||||
|
||||
rpmsg_create_ept(&lower->ept, rdev, RPMSG_RTC_EPT_NAME,
|
||||
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
|
||||
rpmsg_rtc_ept_cb, NULL);
|
||||
}
|
||||
return !strcmp(name, RPMSG_RTC_EPT_NAME);
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_device_destroy(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv)
|
||||
static void rpmsg_rtc_device_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv, FAR const char *name,
|
||||
uint32_t dest)
|
||||
{
|
||||
FAR struct rpmsg_rtc_lowerhalf_s *lower = priv;
|
||||
|
||||
if (strcmp(CONFIG_RTC_RPMSG_SERVER_NAME,
|
||||
rpmsg_get_cpuname(rdev)) == 0)
|
||||
{
|
||||
rpmsg_destroy_ept(&lower->ept);
|
||||
}
|
||||
lower->ept.priv = lower;
|
||||
rpmsg_create_ept(&lower->ept, rdev, RPMSG_RTC_EPT_NAME,
|
||||
RPMSG_ADDR_ANY, dest,
|
||||
rpmsg_rtc_ept_cb, rpmsg_destroy_ept);
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_alarm_fire_handler(FAR struct rpmsg_endpoint *ept,
|
||||
|
|
@ -716,14 +709,6 @@ static int rpmsg_rtc_server_ept_cb(FAR struct rpmsg_endpoint *ept,
|
|||
}
|
||||
}
|
||||
|
||||
static bool rpmsg_rtc_server_ns_match(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv,
|
||||
FAR const char *name,
|
||||
uint32_t dest)
|
||||
{
|
||||
return !strcmp(name, RPMSG_RTC_EPT_NAME);
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_server_ept_release(FAR struct rpmsg_endpoint *ept)
|
||||
{
|
||||
FAR struct rpmsg_rtc_client_s *client = container_of(ept,
|
||||
|
|
@ -736,19 +721,40 @@ static void rpmsg_rtc_server_ept_release(FAR struct rpmsg_endpoint *ept)
|
|||
kmm_free(client);
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv,
|
||||
FAR const char *name,
|
||||
uint32_t dest)
|
||||
static void rpmsg_rtc_server_sync(FAR struct rpmsg_rtc_server_s *server,
|
||||
FAR struct rpmsg_rtc_client_s *client)
|
||||
{
|
||||
struct rtc_time rtctime;
|
||||
|
||||
if (server->lower->ops->rdtime(server->lower, &rtctime) >= 0)
|
||||
{
|
||||
struct rpmsg_rtc_set_s msg;
|
||||
|
||||
msg.sec = timegm((FAR struct tm *)&rtctime);
|
||||
msg.nsec = rtctime.tm_nsec;
|
||||
msg.base_sec = g_basetime.tv_sec;
|
||||
msg.base_nsec = g_basetime.tv_nsec;
|
||||
|
||||
msg.header.command = RPMSG_RTC_SYNC;
|
||||
rpmsg_send(&client->ept, &msg, sizeof(msg));
|
||||
}
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_server_ns_bound(FAR struct rpmsg_endpoint *ept)
|
||||
{
|
||||
FAR struct rpmsg_rtc_client_s *client;
|
||||
FAR struct rpmsg_rtc_server_s *server;
|
||||
|
||||
client = container_of(ept, struct rpmsg_rtc_client_s, ept);
|
||||
server = client->ept.priv;
|
||||
rpmsg_rtc_server_sync(server, client);
|
||||
}
|
||||
|
||||
static void rpmsg_rtc_server_created(FAR struct rpmsg_device *rdev,
|
||||
FAR void *priv)
|
||||
{
|
||||
FAR struct rpmsg_rtc_server_s *server = priv;
|
||||
FAR struct rpmsg_rtc_client_s *client;
|
||||
struct rpmsg_rtc_set_s msg;
|
||||
irqstate_t flags;
|
||||
struct rtc_time rtctime =
|
||||
{
|
||||
0
|
||||
};
|
||||
|
||||
client = kmm_zalloc(sizeof(*client));
|
||||
if (client == NULL)
|
||||
|
|
@ -758,9 +764,10 @@ static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
|
|||
|
||||
client->ept.priv = server;
|
||||
client->ept.release_cb = rpmsg_rtc_server_ept_release;
|
||||
client->ept.ns_bound_cb = rpmsg_rtc_server_ns_bound;
|
||||
|
||||
if (rpmsg_create_ept(&client->ept, rdev, RPMSG_RTC_EPT_NAME,
|
||||
RPMSG_ADDR_ANY, dest,
|
||||
RPMSG_ADDR_ANY, RPMSG_ADDR_ANY,
|
||||
rpmsg_rtc_server_ept_cb,
|
||||
rpmsg_destroy_ept) < 0)
|
||||
{
|
||||
|
|
@ -768,20 +775,6 @@ static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
|
|||
return;
|
||||
}
|
||||
|
||||
if (server->lower->ops->rdtime(server->lower, &rtctime) >= 0)
|
||||
{
|
||||
msg.sec = timegm((FAR struct tm *)&rtctime);
|
||||
msg.nsec = rtctime.tm_nsec;
|
||||
|
||||
flags = spin_lock_irqsave(&g_basetime_lock);
|
||||
msg.base_sec = g_basetime.tv_sec;
|
||||
msg.base_nsec = g_basetime.tv_nsec;
|
||||
spin_unlock_irqrestore(&g_basetime_lock, flags);
|
||||
|
||||
msg.header.command = RPMSG_RTC_SYNC;
|
||||
rpmsg_send(&client->ept, &msg, sizeof(msg));
|
||||
}
|
||||
|
||||
nxmutex_lock(&server->lock);
|
||||
list_add_tail(&server->list, &client->node);
|
||||
nxmutex_unlock(&server->lock);
|
||||
|
|
@ -811,17 +804,16 @@ FAR struct rtc_lowerhalf_s *rpmsg_rtc_initialize(void)
|
|||
{
|
||||
lower->ops = &g_rpmsg_rtc_ops;
|
||||
|
||||
rpmsg_register_callback(lower,
|
||||
rpmsg_rtc_device_created,
|
||||
rpmsg_rtc_device_destroy,
|
||||
NULL,
|
||||
NULL);
|
||||
rpmsg_register_callback(lower, NULL, NULL,
|
||||
rpmsg_rtc_device_ns_match,
|
||||
rpmsg_rtc_device_ns_bind);
|
||||
}
|
||||
|
||||
return (FAR struct rtc_lowerhalf_s *)lower;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
/****************************************************************************
|
||||
* Name: rpmsg_rtc_server_initialize
|
||||
*
|
||||
|
|
@ -847,9 +839,8 @@ FAR struct rtc_lowerhalf_s *rpmsg_rtc_server_initialize(
|
|||
server->lower = lower;
|
||||
list_initialize(&server->list);
|
||||
nxmutex_init(&server->lock);
|
||||
if (rpmsg_register_callback(server, NULL, NULL,
|
||||
rpmsg_rtc_server_ns_match,
|
||||
rpmsg_rtc_server_ns_bind) < 0)
|
||||
if (rpmsg_register_callback(server, rpmsg_rtc_server_created, NULL,
|
||||
NULL, NULL) < 0)
|
||||
{
|
||||
nxmutex_destroy(&server->lock);
|
||||
kmm_free(server);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue