rpmsg/rtc: add server to response client request about getting time

N/A

Change-Id: I1380adcb8a4f489353666b98f7143fe171d7d798
Signed-off-by: Jiuzhu Dong <dongjiuzhu1@xiaomi.com>
This commit is contained in:
Jiuzhu Dong
2021-03-15 11:49:14 +08:00
committed by dongjiuzhu1
parent 93604983eb
commit 07a69b728c
3 changed files with 99 additions and 1 deletions
-1
View File
@@ -295,7 +295,6 @@ config RTC_RPMSG
bool "Rpmsg RTC Driver"
default n
depends on OPENAMP
depends on RTC_EXTERNAL
select ARCH_HAVE_RTC_SUBSECONDS
endif # RTC
+97
View File
@@ -111,6 +111,11 @@ struct rpmsg_rtc_lowerhalf_s
#endif
};
struct rpmsg_rtc_server_s
{
struct rpmsg_endpoint ept;
};
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
@@ -365,6 +370,79 @@ static int rpmsg_rtc_rdalarm(FAR struct rtc_lowerhalf_s *lower_,
}
#endif
static void rpmsg_rtc_server_ns_unbind(FAR struct rpmsg_endpoint *ept)
{
FAR struct rpmsg_rtc_server_s *priv = ept->priv;
rpmsg_destroy_ept(&priv->ept);
kmm_free(priv);
}
static int rpmsg_rtc_server_ept_cb(FAR struct rpmsg_endpoint *ept,
FAR void *data, size_t len, uint32_t src,
FAR void *priv)
{
FAR struct rpmsg_rtc_header_s *header= data;
struct timespec ts;
switch (header->command)
{
case RPMSG_RTC_GET:
{
FAR struct rpmsg_rtc_get_s *msg = data;
header->result = clock_gettime(CLOCK_REALTIME, &ts);
msg->sec = ts.tv_sec;
msg->nsec = ts.tv_nsec;
return rpmsg_send(ept, msg, sizeof(*msg));
}
case RPMSG_RTC_SET:
{
FAR struct rpmsg_rtc_set_s *msg = data;
ts.tv_sec = msg->sec;
ts.tv_nsec = msg->nsec;
header->result = clock_settime(CLOCK_REALTIME, &ts);
return rpmsg_send(ept, msg, sizeof(*msg));
}
default:
header->result = -ENOSYS;
return rpmsg_send(ept, header, sizeof(*header));
}
}
static void rpmsg_rtc_server_ns_bind(FAR struct rpmsg_device *rdev,
FAR void *priv_,
FAR const char *name,
uint32_t dest)
{
FAR struct rpmsg_rtc_server_s *priv;
int ret;
if (strcmp(name, RPMSG_RTC_EPT_NAME))
{
return;
}
priv = kmm_zalloc(sizeof(*priv));
if (!priv)
{
return;
}
priv->ept.priv = priv;
ret = rpmsg_create_ept(&priv->ept, rdev, RPMSG_RTC_EPT_NAME,
RPMSG_ADDR_ANY, dest,
rpmsg_rtc_server_ept_cb,
rpmsg_rtc_server_ns_unbind);
if (ret < 0)
{
kmm_free(priv);
}
}
/****************************************************************************
* Name: rpmsg_rtc_initialize
*
@@ -402,3 +480,22 @@ FAR struct rtc_lowerhalf_s *rpmsg_rtc_initialize(FAR const char *cpuname,
return (FAR struct rtc_lowerhalf_s *)lower;
}
/****************************************************************************
* Name: rpmsg_rtc_server_initialize
*
* Description:
* Sync RTC info to remote core without external RTC hardware through rpmsg.
*
* Returned Value:
* Zero (OK) on success; a negated errno on failure
*
****************************************************************************/
int rpmsg_rtc_server_initialize(void)
{
return rpmsg_register_callback(NULL,
NULL,
NULL,
rpmsg_rtc_server_ns_bind);
}
+2
View File
@@ -45,6 +45,8 @@ extern "C"
FAR struct rtc_lowerhalf_s *rpmsg_rtc_initialize(FAR const char *cpu_name,
int minor);
int rpmsg_rtc_server_initialize(void);
#endif /* CONFIG_RTC_RPMSG */
#undef EXTERN