STM32 RTC Alarm: Add Neil's alarm cancellation logic
This commit is contained in:
parent
65dc922a2e
commit
19aa5880e7
@ -1,7 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* arch/arm/src/stm32/stm32_rtc_lowerhalf.c
|
* arch/arm/src/stm32/stm32_rtc_lowerhalf.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2015 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2015-2016 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
@ -33,6 +33,8 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* REVISIT: This driver is *not* thread-safe! */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -490,9 +492,11 @@ static int stm32_setrelative(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
|
|
||||||
seconds = mktime(&time);
|
seconds = mktime(&time);
|
||||||
|
|
||||||
/* Add the seconds offset */
|
/* Add the seconds offset. Add one to the number of seconds
|
||||||
|
* because we are unsure of the phase of the timer.
|
||||||
|
*/
|
||||||
|
|
||||||
seconds += alarminfo->reltime;
|
seconds += (alarminfo->reltime + 1);
|
||||||
|
|
||||||
/* And convert the time back to broken out format */
|
/* And convert the time back to broken out format */
|
||||||
|
|
||||||
@ -563,9 +567,11 @@ static int stm32_setrelative(FAR struct rtc_lowerhalf_s *lower,
|
|||||||
ts.tv_nsec = 0;
|
ts.tv_nsec = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Add the seconds offset */
|
/* Add the seconds offset. Add one to the number of seconds because
|
||||||
|
* we are unsure of the phase of the timer.
|
||||||
|
*/
|
||||||
|
|
||||||
ts.tv_sec += alarminfo->reltime;
|
ts.tv_sec += (alarminfo->reltime + 1);
|
||||||
|
|
||||||
/* Remember the callback information */
|
/* Remember the callback information */
|
||||||
|
|
||||||
|
@ -787,7 +787,7 @@ static int rtchw_set_alrmar(rtc_alarmreg_t alarmreg)
|
|||||||
ret = rtchw_check_alrawf();
|
ret = rtchw_check_alrawf();
|
||||||
if (ret != OK)
|
if (ret != OK)
|
||||||
{
|
{
|
||||||
goto rtchw_set_alrmar_exit;
|
goto errout_with_wprunlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the RTC Alarm register */
|
/* Set the RTC Alarm register */
|
||||||
@ -802,7 +802,7 @@ static int rtchw_set_alrmar(rtc_alarmreg_t alarmreg)
|
|||||||
cr |= (RTC_CR_ALRAE | RTC_CR_ALRAIE);
|
cr |= (RTC_CR_ALRAE | RTC_CR_ALRAIE);
|
||||||
putreg32(cr, STM32_RTC_CR);
|
putreg32(cr, STM32_RTC_CR);
|
||||||
|
|
||||||
rtchw_set_alrmar_exit:
|
errout_with_wprunlock:
|
||||||
rtc_wprlock();
|
rtc_wprlock();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1406,4 +1406,124 @@ int stm32_rtc_setalarm(FAR struct alm_setalarm_s *alminfo)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: stm32_rtc_cancelalarm
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* Cancel an alaram.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* alarmid - Identifies the alarm to be cancelled
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* Zero (OK) on success; a negated errno on failure
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef CONFIG_RTC_ALARM
|
||||||
|
int stm32_rtc_cancelalarm(enum alm_id_e alarmid)
|
||||||
|
{
|
||||||
|
int ret = -EINVAL;
|
||||||
|
|
||||||
|
DEBUGASSERT(RTC_ALARM_LAST > alarmid);
|
||||||
|
|
||||||
|
/* Cancel the alarm in hardware and disable interrupts */
|
||||||
|
|
||||||
|
switch (alarmid)
|
||||||
|
{
|
||||||
|
case RTC_ALARMA:
|
||||||
|
{
|
||||||
|
/* Cancel the global callback function */
|
||||||
|
|
||||||
|
g_alarmcb[alarmid].ac_cb = NULL;
|
||||||
|
g_alarmcb[alarmid].ac_arg = NULL;
|
||||||
|
|
||||||
|
/* Need to follow RTC register wrote protection.
|
||||||
|
* Disable the write protection for RTC registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtc_wprunlock();
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Set Initialization mode */
|
||||||
|
|
||||||
|
ret = rtc_enterinit();
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto errout_with_wprunlock;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable RTC alarm and interrupt */
|
||||||
|
|
||||||
|
modifyreg32(STM32_RTC_CR, (RTC_CR_ALRAE | RTC_CR_ALRAIE), 0);
|
||||||
|
|
||||||
|
ret = rtchw_check_alrawf();
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto errout_with_wprunlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unset the alarm */
|
||||||
|
|
||||||
|
putreg32(-1, STM32_RTC_ALRMAR);
|
||||||
|
rtc_wprlock();
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RTC_ALARMB:
|
||||||
|
{
|
||||||
|
/* Cancel the global callback function */
|
||||||
|
|
||||||
|
g_alarmcb[alarmid].ac_cb = NULL;
|
||||||
|
g_alarmcb[alarmid].ac_arg = NULL;
|
||||||
|
|
||||||
|
/* Need to follow RTC register wrote protection.
|
||||||
|
* Disable the write protection for RTC registers
|
||||||
|
*/
|
||||||
|
|
||||||
|
rtc_wprunlock();
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Set Initialization mode */
|
||||||
|
|
||||||
|
ret = rtc_enterinit();
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto errout_with_wprunlock;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Disable RTC alarm and interrupt */
|
||||||
|
|
||||||
|
modifyreg32(STM32_RTC_CR, (RTC_CR_ALRBE | RTC_CR_ALRBIE), 0);
|
||||||
|
|
||||||
|
ret = rtchw_check_alrbwf();
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
goto errout_with_wprunlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unset the alarm */
|
||||||
|
|
||||||
|
putreg32(-1, STM32_RTC_ALRMBR);
|
||||||
|
rtc_wprlock();
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
rtcvdbg("ERROR: Invalid ALARM%d\n", alminfo->as_id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
errout_with_wprunlock:
|
||||||
|
rtc_wprlock();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_RTC */
|
#endif /* CONFIG_RTC */
|
||||||
|
@ -34,6 +34,8 @@
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
/* REVISIT: This driver is *not* thread-safe! */
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
Loading…
Reference in New Issue
Block a user