Merge pull request #15556 from benpicco/cpu/samd51-spurious_tamper

cpu/samd5x: RTC: add timeout to spurious tamper event
This commit is contained in:
benpicco 2021-01-12 18:22:49 +01:00 committed by GitHub
commit 20f2ab44ac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -25,7 +25,6 @@
*/ */
#include <stdint.h> #include <stdint.h>
#include "mutex.h"
#include "periph/rtc.h" #include "periph/rtc.h"
#include "periph/rtt.h" #include "periph/rtt.h"
#include "periph_conf.h" #include "periph_conf.h"
@ -337,14 +336,9 @@ int rtc_tamper_register(gpio_t pin, gpio_flank_t flank)
return 0; return 0;
} }
static void _unlock(void *m)
{
mutex_unlock(m);
}
void rtc_tamper_enable(void) void rtc_tamper_enable(void)
{ {
mutex_t m = MUTEX_INIT; DEBUG("enable tamper\n");
/* clear tamper id */ /* clear tamper id */
RTC->MODE0.TAMPID.reg = 0xF; RTC->MODE0.TAMPID.reg = 0xF;
@ -352,16 +346,32 @@ void rtc_tamper_enable(void)
/* work around errata 2.17.4: /* work around errata 2.17.4:
* ignore the first tamper event on the rising edge */ * ignore the first tamper event on the rising edge */
if (RTC->MODE0.TAMPCTRL.reg & RTC_TAMPCTRL_TAMLVL_Msk) { if (RTC->MODE0.TAMPCTRL.reg & RTC_TAMPCTRL_TAMLVL_Msk) {
mutex_lock(&m);
tamper_cb.cb = _unlock; /* If an RTC alarm happened before, the spurious tamper
tamper_cb.arg = &m; * event is sometimes not generated.
} * Tamper event must happen within one RTC clock period. */
unsigned timeout = CLOCK_CORECLOCK / 32768;
/* prevent RTC interrupt from triggering */
NVIC_DisableIRQ(RTC_IRQn);
/* enable tamper detect as wake-up source */ /* enable tamper detect as wake-up source */
RTC->MODE0.INTENSET.bit.TAMPER = 1; RTC->MODE0.INTENSET.bit.TAMPER = 1;
/* wait for first tamper event */ /* wait for first tamper event */
mutex_lock(&m); while (!RTC->MODE0.INTFLAG.bit.TAMPER && --timeout) {}
/* clear tamper flag flag */
RTC->MODE0.INTFLAG.reg = RTC_MODE0_INTFLAG_TAMPER;
/* restore RTC IRQ */
NVIC_EnableIRQ(RTC_IRQn);
} else {
/* no spurious event on falling edge */
RTC->MODE0.INTENSET.bit.TAMPER = 1;
}
DEBUG("tamper enabled\n");
} }
#endif /* RTC_NUM_OF_TAMPERS */ #endif /* RTC_NUM_OF_TAMPERS */