Skip to content

Commit 1dbeed8

Browse files
authored
Merge pull request #5253 from tannewt/fix_nrf_gpiote_crash
Fix GPIOTE crashes by checking everything is ok
2 parents 6ef5241 + eabceb9 commit 1dbeed8

File tree

7 files changed

+41
-20
lines changed

7 files changed

+41
-20
lines changed

ports/nrf/common-hal/alarm/pin/PinAlarm.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,6 @@ void alarm_pin_pinalarm_reset(void) {
141141
}
142142

143143
static void configure_pins_for_sleep(void) {
144-
nrfx_err_t err;
145-
if (nrfx_gpiote_is_init()) {
146-
nrfx_gpiote_uninit();
147-
}
148-
err = nrfx_gpiote_init(NRFX_GPIOTE_CONFIG_IRQ_PRIORITY);
149-
assert(err == NRFX_SUCCESS);
150-
(void)err; // to suppress unused warning
151-
152144
_pinhandler_gpiote_count = 0;
153145

154146
nrfx_gpiote_in_config_t cfg = {
@@ -176,9 +168,10 @@ static void configure_pins_for_sleep(void) {
176168
cfg.sense = NRF_GPIOTE_POLARITY_TOGGLE;
177169
cfg.pull = NRF_GPIO_PIN_NOPULL;
178170
}
179-
err = nrfx_gpiote_in_init((nrfx_gpiote_pin_t)i, &cfg,
171+
nrfx_err_t err = nrfx_gpiote_in_init((nrfx_gpiote_pin_t)i, &cfg,
180172
pinalarm_gpiote_handler);
181173
assert(err == NRFX_SUCCESS);
174+
(void)err; // In case the assert doesn't use err.
182175
nrfx_gpiote_in_event_enable((nrfx_gpiote_pin_t)i, true);
183176
if (((high_alarms & mask) != 0) && ((low_alarms & mask) == 0)) {
184177
nrf_gpio_cfg_sense_set((uint32_t)i, NRF_GPIO_PIN_SENSE_HIGH);

ports/nrf/common-hal/countio/Counter.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11

22
#include "common-hal/countio/Counter.h"
3+
4+
#include "py/runtime.h"
5+
36
#include "nrfx_gpiote.h"
47

58
// obj array to map pin number -> self since nrfx hide the mapping
@@ -29,11 +32,14 @@ void common_hal_countio_counter_construct(countio_counter_obj_t *self,
2932
.skip_gpio_setup = false
3033
};
3134

32-
nrfx_gpiote_in_init(self->pin_a, &cfg, _intr_handler);
35+
36+
nrfx_err_t err = nrfx_gpiote_in_init(self->pin_a, &cfg, _intr_handler);
37+
if (err != NRFX_SUCCESS) {
38+
mp_raise_RuntimeError(translate("All channels in use"));
39+
}
3340
nrfx_gpiote_in_event_enable(self->pin_a, true);
3441

3542
claim_pin(pin_a);
36-
3743
}
3844

3945
bool common_hal_countio_counter_deinited(countio_counter_obj_t *self) {

ports/nrf/common-hal/microcontroller/Processor.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include "py/runtime.h"
2828

2929
#include "common-hal/microcontroller/Processor.h"
30+
31+
#include "common-hal/alarm/__init__.h"
3032
#include "shared-bindings/microcontroller/ResetReason.h"
3133
#include "supervisor/shared/translate.h"
3234

@@ -136,6 +138,14 @@ mcu_reset_reason_t common_hal_mcu_processor_get_reset_reason(void) {
136138
r = RESET_REASON_WATCHDOG;
137139
} else if (reset_reason_saved & POWER_RESETREAS_SREQ_Msk) {
138140
r = RESET_REASON_SOFTWARE;
141+
#if CIRCUITPY_ALARM
142+
// Our "deep sleep" is still actually light sleep followed by a software
143+
// reset. Adding this check here ensures we treat it as-if we're waking
144+
// from deep sleep.
145+
if (sleepmem_wakeup_event != SLEEPMEM_WAKEUP_BY_NONE) {
146+
r = RESET_REASON_DEEP_SLEEP_ALARM;
147+
}
148+
#endif
139149
} else if ((reset_reason_saved & POWER_RESETREAS_OFF_Msk) ||
140150
(reset_reason_saved & POWER_RESETREAS_LPCOMP_Msk) ||
141151
(reset_reason_saved & POWER_RESETREAS_NFC_Msk) ||

ports/nrf/common-hal/pulseio/PulseIn.c

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,6 @@ static void _pulsein_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action
112112
}
113113

114114
void pulsein_reset(void) {
115-
if (nrfx_gpiote_is_init()) {
116-
nrfx_gpiote_uninit();
117-
}
118-
nrfx_gpiote_init(NRFX_GPIOTE_CONFIG_IRQ_PRIORITY);
119-
120115
if (timer != NULL) {
121116
nrf_peripherals_free_timer(timer);
122117
}
@@ -178,7 +173,10 @@ void common_hal_pulseio_pulsein_construct(pulseio_pulsein_obj_t *self, const mcu
178173
.hi_accuracy = true,
179174
.skip_gpio_setup = false
180175
};
181-
nrfx_gpiote_in_init(self->pin, &cfg, _pulsein_handler);
176+
nrfx_err_t err = nrfx_gpiote_in_init(self->pin, &cfg, _pulsein_handler);
177+
if (err != NRFX_SUCCESS) {
178+
mp_raise_RuntimeError(translate("All channels in use"));
179+
}
182180
nrfx_gpiote_in_event_enable(self->pin, true);
183181
}
184182

ports/nrf/common-hal/rotaryio/IncrementalEncoder.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,15 @@ void common_hal_rotaryio_incrementalencoder_construct(rotaryio_incrementalencode
6464
.hi_accuracy = true,
6565
.skip_gpio_setup = false
6666
};
67-
nrfx_gpiote_in_init(self->pin_a, &cfg, _intr_handler);
68-
nrfx_gpiote_in_init(self->pin_b, &cfg, _intr_handler);
67+
nrfx_err_t err = nrfx_gpiote_in_init(self->pin_a, &cfg, _intr_handler);
68+
if (err != NRFX_SUCCESS) {
69+
mp_raise_RuntimeError(translate("All channels in use"));
70+
}
71+
err = nrfx_gpiote_in_init(self->pin_b, &cfg, _intr_handler);
72+
if (err != NRFX_SUCCESS) {
73+
nrfx_gpiote_in_uninit(self->pin_a);
74+
mp_raise_RuntimeError(translate("All channels in use"));
75+
}
6976
nrfx_gpiote_in_event_enable(self->pin_a, true);
7077
nrfx_gpiote_in_event_enable(self->pin_b, true);
7178

ports/nrf/supervisor/port.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
#include "nrfx/hal/nrf_clock.h"
3535
#include "nrfx/hal/nrf_power.h"
36+
#include "nrfx/drivers/include/nrfx_gpiote.h"
3637
#include "nrfx/drivers/include/nrfx_power.h"
3738
#include "nrfx/drivers/include/nrfx_rtc.h"
3839

@@ -252,6 +253,12 @@ void reset_port(void) {
252253
watchdog_reset();
253254
#endif
254255

256+
// Always reset GPIOTE because it is shared.
257+
if (nrfx_gpiote_is_init()) {
258+
nrfx_gpiote_uninit();
259+
}
260+
nrfx_gpiote_init(NRFX_GPIOTE_CONFIG_IRQ_PRIORITY);
261+
255262
reset_all_pins();
256263
}
257264

supervisor/shared/bluetooth/file_transfer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ STATIC uint8_t _process_delete(const uint8_t *raw_buf, size_t command_len) {
404404
FATFS *fs = &((fs_user_mount_t *)MP_STATE_VM(vfs_mount_table)->obj)->fatfs;
405405
char *path = (char *)((uint8_t *)command) + header_size;
406406
path[command->path_length] = '\0';
407-
FRESULT result;
407+
FRESULT result = FR_OK;
408408
FILINFO file;
409409
if (f_stat(fs, path, &file) == FR_OK) {
410410
if ((file.fattrib & AM_DIR) != 0) {

0 commit comments

Comments
 (0)