47
47
// Used to implement a range of pull capabilities
48
48
#define GPIO_PULL_DOWN (1)
49
49
#define GPIO_PULL_UP (2)
50
- #define GPIO_PULL_HOLD (4)
51
50
52
51
#if CONFIG_IDF_TARGET_ESP32
53
52
#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
253
252
mp_printf (print , "Pin(%u)" , self -> id );
254
253
}
255
254
256
- // pin.init(mode=None, pull=-1, *, value, drive)
255
+ // pin.init(mode=None, pull=-1, *, value, drive, hold )
257
256
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 };
259
258
static const mp_arg_t allowed_args [] = {
260
259
{ MP_QSTR_mode , MP_ARG_OBJ , {.u_obj = mp_const_none }},
261
260
{ MP_QSTR_pull , MP_ARG_OBJ , {.u_obj = MP_OBJ_NEW_SMALL_INT (-1 )}},
262
261
{ MP_QSTR_value , MP_ARG_KW_ONLY | MP_ARG_OBJ , {.u_obj = MP_OBJ_NULL }},
263
262
{ 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 }},
264
264
};
265
265
266
266
// parse args
@@ -285,6 +285,12 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
285
285
// configure the pin for gpio
286
286
gpio_pad_select_gpio (self -> id );
287
287
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
+
288
294
// set initial value (do this before configuring mode/pull)
289
295
if (args [ARG_value ].u_obj != MP_OBJ_NULL ) {
290
296
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_
325
331
} else {
326
332
gpio_pullup_dis (self -> id );
327
333
}
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 );
333
339
}
334
340
335
341
return mp_const_none ;
@@ -480,7 +486,6 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
480
486
{ MP_ROM_QSTR (MP_QSTR_OPEN_DRAIN ), MP_ROM_INT (GPIO_MODE_INPUT_OUTPUT_OD ) },
481
487
{ MP_ROM_QSTR (MP_QSTR_PULL_UP ), MP_ROM_INT (GPIO_PULL_UP ) },
482
488
{ 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 ) },
484
489
{ MP_ROM_QSTR (MP_QSTR_IRQ_RISING ), MP_ROM_INT (GPIO_PIN_INTR_POSEDGE ) },
485
490
{ MP_ROM_QSTR (MP_QSTR_IRQ_FALLING ), MP_ROM_INT (GPIO_PIN_INTR_NEGEDGE ) },
486
491
{ MP_ROM_QSTR (MP_QSTR_WAKE_LOW ), MP_ROM_INT (GPIO_PIN_INTR_LOLEVEL ) },
0 commit comments