|
39 | 39 | #include "machine_rtc.h" |
40 | 40 | #include "modesp32.h" |
41 | 41 |
|
| 42 | +// Used to implement gpio_hold_en() functionality; value should be distinct from all IDF pull modes |
| 43 | +#define GPIO_PULLHOLD (8) |
| 44 | + |
42 | 45 | typedef struct _machine_pin_obj_t { |
43 | 46 | mp_obj_base_t base; |
44 | 47 | gpio_num_t id; |
@@ -168,7 +171,15 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_ |
168 | 171 | if (args[ARG_pull].u_obj == mp_const_none) { |
169 | 172 | gpio_set_pull_mode(self->id, GPIO_FLOATING); |
170 | 173 | } else { |
171 | | - gpio_set_pull_mode(self->id, mp_obj_get_int(args[ARG_pull].u_obj)); |
| 174 | + int mode = mp_obj_get_int(args[ARG_pull].u_obj); |
| 175 | + if (mode == GPIO_PULLHOLD) { |
| 176 | + gpio_hold_en(self->id); |
| 177 | + } else { |
| 178 | + if (GPIO_IS_VALID_OUTPUT_GPIO(self->id)) { |
| 179 | + gpio_hold_dis(self->id); |
| 180 | + } |
| 181 | + gpio_set_pull_mode(self->id, mode); |
| 182 | + } |
172 | 183 | } |
173 | 184 | } |
174 | 185 |
|
@@ -320,6 +331,7 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = { |
320 | 331 | { MP_ROM_QSTR(MP_QSTR_OPEN_DRAIN), MP_ROM_INT(GPIO_MODE_INPUT_OUTPUT_OD) }, |
321 | 332 | { MP_ROM_QSTR(MP_QSTR_PULL_UP), MP_ROM_INT(GPIO_PULLUP_ONLY) }, |
322 | 333 | { MP_ROM_QSTR(MP_QSTR_PULL_DOWN), MP_ROM_INT(GPIO_PULLDOWN_ONLY) }, |
| 334 | + { MP_ROM_QSTR(MP_QSTR_PULL_HOLD), MP_ROM_INT(GPIO_PULLHOLD) }, |
323 | 335 | { MP_ROM_QSTR(MP_QSTR_IRQ_RISING), MP_ROM_INT(GPIO_PIN_INTR_POSEDGE) }, |
324 | 336 | { MP_ROM_QSTR(MP_QSTR_IRQ_FALLING), MP_ROM_INT(GPIO_PIN_INTR_NEGEDGE) }, |
325 | 337 | { MP_ROM_QSTR(MP_QSTR_WAKE_LOW), MP_ROM_INT(GPIO_PIN_INTR_LOLEVEL) }, |
|
0 commit comments