Merge pull request #15556 from benpicco/cpu/samd51-spurious_tamper
cpu/samd5x: RTC: add timeout to spurious tamper event
This commit is contained in:
commit
20f2ab44ac
@ -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 */
|
||||||
|
RTC->MODE0.INTENSET.bit.TAMPER = 1;
|
||||||
|
|
||||||
|
/* wait for first tamper event */
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* enable tamper detect as wake-up source */
|
DEBUG("tamper enabled\n");
|
||||||
RTC->MODE0.INTENSET.bit.TAMPER = 1;
|
|
||||||
|
|
||||||
/* wait for first tamper event */
|
|
||||||
mutex_lock(&m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* RTC_NUM_OF_TAMPERS */
|
#endif /* RTC_NUM_OF_TAMPERS */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user