diff --git a/arch/arm/src/kinetis/kinetis_alarm.h b/arch/arm/src/kinetis/kinetis_alarm.h index 3815e374c88..3f814c2a205 100644 --- a/arch/arm/src/kinetis/kinetis_alarm.h +++ b/arch/arm/src/kinetis/kinetis_alarm.h @@ -84,6 +84,14 @@ struct alm_setalarm_s FAR void *as_arg; /* Argument for callback */ }; +/* Structure used to pass parameters to query an alarm */ + +struct alm_rdalarm_s +{ + int ar_id; /* enum alm_id_e */ + FAR struct rtc_time *ar_time;/* Argument for storing ALARM RTC time */ +}; + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -114,6 +122,22 @@ extern "C" int kinetis_rtc_setalarm(FAR const struct timespec *tp, alarmcb_t callback); +/************************************************************************************ + * Name: kinetis_rtc_rdalarm + * + * Description: + * Query an alarm configured in hardware. + * + * Input Parameters: + * alminfo - Information about the alarm configuration. + * + * Returned Value: + * Zero (OK) on success; a negated errno on failure + * + ************************************************************************************/ + +int kinetis_rtc_rdalarm(FAR struct alm_rdalarm_s *alminfo); + /**************************************************************************** * Name: kinetis_rtc_cancelalarm * diff --git a/arch/arm/src/kinetis/kinetis_rtc.c b/arch/arm/src/kinetis/kinetis_rtc.c index 824a72245d6..f2cc4301e02 100644 --- a/arch/arm/src/kinetis/kinetis_rtc.c +++ b/arch/arm/src/kinetis/kinetis_rtc.c @@ -584,4 +584,43 @@ int kinetis_rtc_cancelalarm(void) } #endif +/************************************************************************************ + * Name: kinetis_rtc_rdalarm + * + * Description: + * Query an alarm configured in hardware. + * + * Input Parameters: + * alminfo - Information about the alarm configuration. + * + * Returned Value: + * Zero (OK) on success; a negated errno on failure + * + ************************************************************************************/ + +#ifdef CONFIG_RTC_ALARM +int kinetis_rtc_rdalarm(FAR struct alm_rdalarm_s *alminfo) +{ + int ret = -EINVAL; + + ASSERT(alminfo != NULL); + + switch (alminfo->ar_id) + { + case RTC_ALARMA: + { +#warning Missing logic + ret = -ENOSYS; + } + break; + + default: + rtcerr("ERROR: Invalid ALARM%d\n", alminfo->ar_id); + break; + } + + return ret; +} +#endif + #endif /* KINETIS_RTC */ diff --git a/arch/arm/src/kinetis/kinetis_rtc_lowerhalf.c b/arch/arm/src/kinetis/kinetis_rtc_lowerhalf.c index b56fc5d44ac..769a22bffd9 100644 --- a/arch/arm/src/kinetis/kinetis_rtc_lowerhalf.c +++ b/arch/arm/src/kinetis/kinetis_rtc_lowerhalf.c @@ -109,6 +109,8 @@ static int kinetis_setrelative(FAR struct rtc_lowerhalf_s *lower, FAR const struct lower_setrelative_s *alarminfo); static int kinetis_cancelalarm(FAR struct rtc_lowerhalf_s *lower, int alarmid); +static int kinetis_rdalarm(FAR struct rtc_lowerhalf_s *lower, + FAR struct lower_rdalarm_s *alarminfo); #endif /**************************************************************************** @@ -126,6 +128,7 @@ static const struct rtc_ops_s g_rtc_ops = .setalarm = kinetis_setalarm, .setrelative = kinetis_setrelative, .cancelalarm = kinetis_cancelalarm, + .rdalarm = kinetis_rdalarm, #endif #ifdef CONFIG_RTC_IOCTL .ioctl = NULL, @@ -492,6 +495,52 @@ static int kinetis_cancelalarm(FAR struct rtc_lowerhalf_s *lower, int alarmid) } #endif +/**************************************************************************** + * Name: kinetis_rdalarm + * + * Description: + * Query the RTC alarm. + * + * Input Parameters: + * lower - A reference to RTC lower half driver state structure + * alarminfo - Provided information needed to query the alarm + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned + * on any failure. + * + ****************************************************************************/ + +#ifdef CONFIG_RTC_ALARM +static int kinetis_rdalarm(FAR struct rtc_lowerhalf_s *lower, + FAR struct lower_rdalarm_s *alarminfo) +{ + struct alm_rdalarm_s lowerinfo; + int ret = -EINVAL; + + ASSERT(lower != NULL && alarminfo != NULL && alarminfo->time != NULL); + DEBUGASSERT(alarminfo->id == RTC_ALARMA); + + if (alarminfo->id == RTC_ALARMA) + { + /* Disable pre-emption while we do this so that we don't have to worry + * about being suspended and working on an old time. + */ + + sched_lock(); + + lowerinfo.ar_id = alarminfo->id; + lowerinfo.ar_time = alarminfo->time; + + ret = kinetis_rtc_rdalarm(&lowerinfo); + + sched_unlock(); + } + + return ret; +} +#endif + /**************************************************************************** * Public Functions ****************************************************************************/