summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrobert-hh <robert@hammelrath.com>2024-06-09 15:31:59 +0200
committerDamien George <damien@micropython.org>2024-07-26 11:32:49 +1000
commit4a134d212e74fa6da7cc2d91ec4026e6f5218f0e (patch)
tree9a2cf0d646389e20c78a504153654ce9b33d713d
parent5e80416e6d6168ec5f1ad43191d4ddac1332c641 (diff)
nrf/modules/machine/pin: Disable IRQ with pin.irq(handler=None).
Before, the input was still set to `pin.irq()` mode, only the handler was disabled. That prevented switching the pin between input and output mode. Signed-off-by: robert-hh <robert@hammelrath.com>
-rw-r--r--ports/nrf/modules/machine/pin.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/ports/nrf/modules/machine/pin.c b/ports/nrf/modules/machine/pin.c
index 2191cc952..f46394d76 100644
--- a/ports/nrf/modules/machine/pin.c
+++ b/ports/nrf/modules/machine/pin.c
@@ -537,19 +537,24 @@ static mp_obj_t pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
nrfx_gpiote_pin_t pin = self->pin;
- nrfx_gpiote_in_config_t config = NRFX_GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
- if (args[ARG_trigger].u_int == NRF_GPIOTE_POLARITY_LOTOHI) {
- config.sense = NRF_GPIOTE_POLARITY_LOTOHI;
- } else if (args[ARG_trigger].u_int == NRF_GPIOTE_POLARITY_HITOLO) {
- config.sense = NRF_GPIOTE_POLARITY_HITOLO;
- }
- config.pull = NRF_GPIO_PIN_PULLUP;
+ if (args[ARG_handler].u_obj != mp_const_none) {
+ nrfx_gpiote_in_config_t config = NRFX_GPIOTE_CONFIG_IN_SENSE_TOGGLE(true);
+ if (args[ARG_trigger].u_int == NRF_GPIOTE_POLARITY_LOTOHI) {
+ config.sense = NRF_GPIOTE_POLARITY_LOTOHI;
+ } else if (args[ARG_trigger].u_int == NRF_GPIOTE_POLARITY_HITOLO) {
+ config.sense = NRF_GPIOTE_POLARITY_HITOLO;
+ }
+ config.pull = NRF_GPIO_PIN_PULLUP;
+ config.skip_gpio_setup = true;
- nrfx_err_t err_code = nrfx_gpiote_in_init(pin, &config, pin_common_irq_handler);
- if (err_code == NRFX_ERROR_INVALID_STATE) {
- // Re-init if already configured.
+ nrfx_err_t err_code = nrfx_gpiote_in_init(pin, &config, pin_common_irq_handler);
+ if (err_code == NRFX_ERROR_INVALID_STATE) {
+ // Re-init if already configured.
+ nrfx_gpiote_in_uninit(pin);
+ nrfx_gpiote_in_init(pin, &config, pin_common_irq_handler);
+ }
+ } else {
nrfx_gpiote_in_uninit(pin);
- nrfx_gpiote_in_init(pin, &config, pin_common_irq_handler);
}
MP_STATE_PORT(pin_irq_handlers)[pin] = args[ARG_handler].u_obj;