@@ -50,7 +50,6 @@ const alarm_sleep_memory_obj_t alarm_sleep_memory_obj = {
50
50
// TODO: make a custom enum to avoid weird values like PM_SLEEPCFG_SLEEPMODE_BACKUP_Val?
51
51
STATIC volatile uint32_t _target ;
52
52
STATIC bool fake_sleep ;
53
- STATIC bool pin_alarm = false;
54
53
55
54
void alarm_reset (void ) {
56
55
// Reset the alarm flag
@@ -68,7 +67,9 @@ samd_sleep_source_t alarm_get_wakeup_cause(void) {
68
67
return SAMD_WAKEUP_RTC ;
69
68
}
70
69
if (RSTC -> RCAUSE .bit .BACKUP ) {
71
- if (RTC -> MODE0 .INTFLAG .bit .TAMPER ) {
70
+ // not able to detect PinAlarm wake since registers are getting reset
71
+ // TODO: come up with a way to detect a TAMPER
72
+ if (RTC -> MODE0 .TAMPID .reg || RTC -> MODE0 .INTFLAG .bit .TAMPER ) {
72
73
return SAMD_WAKEUP_GPIO ;
73
74
}
74
75
return SAMD_WAKEUP_RTC ;
@@ -189,33 +190,30 @@ void NORETURN common_hal_alarm_enter_deep_sleep(void) {
189
190
(void )__get_FPSCR ();
190
191
}
191
192
192
- // hacky way of checking if time alarm or pin alarm
193
- // TODO: find better way of determining pin vs time
193
+ // PinAlarm (hacky way of checking if time alarm or pin alarm)
194
194
if (RTC -> MODE0 .INTENSET .bit .TAMPER ) {
195
195
// Disable interrupts
196
196
NVIC_DisableIRQ (RTC_IRQn );
197
-
198
197
// Must disable the RTC before writing to EVCTRL and TMPCTRL
199
198
RTC -> MODE0 .CTRLA .bit .ENABLE = 0 ; // Disable the RTC
200
199
while (RTC -> MODE0 .SYNCBUSY .bit .ENABLE ); // Wait for synchronization
201
-
202
200
RTC -> MODE0 .CTRLA .bit .SWRST = 1 ; // Software reset the RTC
203
201
while (RTC -> MODE0 .SYNCBUSY .bit .SWRST ); // Wait for synchronization
204
-
205
202
RTC -> MODE0 .CTRLA .reg = RTC_MODE0_CTRLA_PRESCALER_DIV1024 | // Set prescaler to 1024
206
203
RTC_MODE0_CTRLA_MODE_COUNT32 ; // Set RTC to mode 0, 32-bit timer
207
204
208
205
// TODO: map requested pin to limited selection of TAMPER pins
209
- //PA02 = IN2
210
206
RTC -> MODE0 .TAMPCTRL .bit .DEBNC2 = 1 ; // Edge triggered when INn is stable for 4 CLK_RTC_DEB periods
211
207
RTC -> MODE0 .TAMPCTRL .bit .TAMLVL2 = 1 ; // rising edge
212
- RTC -> MODE0 .TAMPCTRL .bit .IN2ACT = 1 ; // WAKE (doesn't save timestamp)
208
+ //PA02 = IN2
209
+ RTC -> MODE0 .TAMPCTRL .bit .IN2ACT = 1 ; // WAKE on IN2 (doesn't save timestamp)
213
210
214
211
// Enable interrupts
215
212
NVIC_SetPriority (RTC_IRQn , 0 );
216
213
NVIC_EnableIRQ (RTC_IRQn );
217
214
// Set interrupts for TAMPER or overflow
218
215
RTC -> MODE0 .INTENSET .reg = RTC_MODE0_INTENSET_TAMPER ;
216
+ // TimeAlarm
219
217
} else {
220
218
// Retrieve COMP1 value before resetting RTC
221
219
// Disable interrupts
@@ -269,9 +267,6 @@ MP_NOINLINE void common_hal_alarm_pretending_deep_sleep(void) {
269
267
SAMD_ALARM_FLAG = 1 ;
270
268
while (RTC -> MODE0 .SYNCBUSY .reg );
271
269
fake_sleep = true;
272
- // if () {
273
- // pin_alarm=true;
274
- // }
275
270
} else {
276
271
port_idle_until_interrupt ();
277
272
}
0 commit comments