Skip to content

Commit 5904db9

Browse files
committed
esp32/machine_pin: Rework pin holding functionality.
Remove `Pin.PULL_HOLD` and add a new `hold` boolean keyword argument instead.
1 parent d5ff8d9 commit 5904db9

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

ports/esp32/machine_pin.c

+14-9
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
// Used to implement a range of pull capabilities
4848
#define GPIO_PULL_DOWN (1)
4949
#define GPIO_PULL_UP (2)
50-
#define GPIO_PULL_HOLD (4)
5150

5251
#if CONFIG_IDF_TARGET_ESP32
5352
#define GPIO_FIRST_NON_OUTPUT (34)
@@ -253,14 +252,15 @@ STATIC void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_prin
253252
mp_printf(print, "Pin(%u)", self->id);
254253
}
255254

256-
// pin.init(mode=None, pull=-1, *, value, drive)
255+
// pin.init(mode=None, pull=-1, *, value, drive, hold)
257256
STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
258-
enum { ARG_mode, ARG_pull, ARG_value, ARG_drive };
257+
enum { ARG_mode, ARG_pull, ARG_value, ARG_drive, ARG_hold };
259258
static const mp_arg_t allowed_args[] = {
260259
{ MP_QSTR_mode, MP_ARG_OBJ, {.u_obj = mp_const_none}},
261260
{ MP_QSTR_pull, MP_ARG_OBJ, {.u_obj = MP_OBJ_NEW_SMALL_INT(-1)}},
262261
{ MP_QSTR_value, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
263262
{ MP_QSTR_drive, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
263+
{ MP_QSTR_hold, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL}},
264264
};
265265

266266
// parse args
@@ -285,6 +285,12 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
285285
// configure the pin for gpio
286286
gpio_pad_select_gpio(self->id);
287287

288+
// if hold keyword argument is supplied, disable hold before trying to configure anything else
289+
// do this even if hold=True as it allows us to reconfigure the pin and *then* hold that config
290+
if (args[ARG_hold].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(self->id)) {
291+
gpio_hold_dis(self->id);
292+
}
293+
288294
// set initial value (do this before configuring mode/pull)
289295
if (args[ARG_value].u_obj != MP_OBJ_NULL) {
290296
gpio_set_level(self->id, mp_obj_is_true(args[ARG_value].u_obj));
@@ -325,11 +331,11 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
325331
} else {
326332
gpio_pullup_dis(self->id);
327333
}
328-
if (mode & GPIO_PULL_HOLD) {
329-
gpio_hold_en(self->id);
330-
} else if (GPIO_IS_VALID_OUTPUT_GPIO(self->id)) {
331-
gpio_hold_dis(self->id);
332-
}
334+
}
335+
336+
// enable hold if requested
337+
if (args[ARG_hold].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(self->id) && mp_obj_is_true(args[ARG_hold].u_obj)) {
338+
gpio_hold_en(self->id);
333339
}
334340

335341
return mp_const_none;
@@ -480,7 +486,6 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
480486
{ MP_ROM_QSTR(MP_QSTR_OPEN_DRAIN), MP_ROM_INT(GPIO_MODE_INPUT_OUTPUT_OD) },
481487
{ MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(GPIO_PULL_UP) },
482488
{ MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(GPIO_PULL_DOWN) },
483-
{ MP_ROM_QSTR(MP_QSTR_PULL_HOLD), MP_ROM_INT(GPIO_PULL_HOLD) },
484489
{ MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(GPIO_PIN_INTR_POSEDGE) },
485490
{ MP_ROM_QSTR(MP_QSTR_IRQ_FALLING), MP_ROM_INT(GPIO_PIN_INTR_NEGEDGE) },
486491
{ MP_ROM_QSTR(MP_QSTR_WAKE_LOW), MP_ROM_INT(GPIO_PIN_INTR_LOLEVEL) },

0 commit comments

Comments
 (0)