From c46e219795db804c04d80ec474b555510ab300b3 Mon Sep 17 00:00:00 2001 From: Jeff Epler Date: Tue, 8 Nov 2022 15:46:48 -0600 Subject: [PATCH] Having an input-only pin is rare, save a string on other ports --- ports/espressif/mpconfigport.h | 2 ++ py/circuitpy_mpconfig.h | 4 ++++ shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c | 4 ++++ shared-bindings/digitalio/DigitalInOut.c | 2 ++ shared-bindings/digitalio/DigitalInOut.h | 2 ++ 5 files changed, 14 insertions(+) diff --git a/ports/espressif/mpconfigport.h b/ports/espressif/mpconfigport.h index 632a7a13cd..1b154b4b99 100644 --- a/ports/espressif/mpconfigport.h +++ b/ports/espressif/mpconfigport.h @@ -99,4 +99,6 @@ #define CIRCUITPY_PORT_NUM_SUPERVISOR_ALLOCATIONS (1) #endif +#define CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY (1) + #endif // MICROPY_INCLUDED_ESPRESSIF_MPCONFIGPORT_H diff --git a/py/circuitpy_mpconfig.h b/py/circuitpy_mpconfig.h index d6d8419c8f..dc528d0787 100644 --- a/py/circuitpy_mpconfig.h +++ b/py/circuitpy_mpconfig.h @@ -582,6 +582,10 @@ void supervisor_run_background_tasks_if_tick(void); #define MICROPY_WRAP_MP_EXECUTE_BYTECODE PLACE_IN_ITCM #endif +#ifndef CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY +#define CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY (0) +#endif + #ifndef CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL #define CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL (0) #endif diff --git a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c index afb11856e2..6626d27f77 100644 --- a/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c +++ b/shared-bindings/adafruit_bus_device/spi_device/SPIDevice.c @@ -105,9 +105,13 @@ STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type if (args[ARG_chip_select].u_obj != MP_OBJ_NULL) { digitalinout_result_t result = common_hal_digitalio_digitalinout_switch_to_output(MP_OBJ_TO_PTR(args[ARG_chip_select].u_obj), true, DRIVE_MODE_PUSH_PULL); + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY if (result == DIGITALINOUT_INPUT_ONLY) { mp_raise_NotImplementedError(translate("Pin is input only")); } + #else + (void)result; + #endif } return (mp_obj_t)self; diff --git a/shared-bindings/digitalio/DigitalInOut.c b/shared-bindings/digitalio/DigitalInOut.c index eb3c1ec69d..e6fe592a65 100644 --- a/shared-bindings/digitalio/DigitalInOut.c +++ b/shared-bindings/digitalio/DigitalInOut.c @@ -53,8 +53,10 @@ STATIC void check_result(digitalinout_result_t result) { return; case DIGITALINOUT_PIN_BUSY: mp_raise_ValueError_varg(translate("%q in use"), MP_QSTR_Pin); + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY case DIGITALINOUT_INPUT_ONLY: mp_raise_ValueError_varg(translate("Invalid %q"), MP_QSTR_direction); + #endif #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL case DIGITALINOUT_INVALID_PULL: mp_raise_ValueError_varg(translate("Invalid %q"), MP_QSTR_pull); diff --git a/shared-bindings/digitalio/DigitalInOut.h b/shared-bindings/digitalio/DigitalInOut.h index 80c3970f0e..79a700c905 100644 --- a/shared-bindings/digitalio/DigitalInOut.h +++ b/shared-bindings/digitalio/DigitalInOut.h @@ -38,7 +38,9 @@ extern const mp_obj_type_t digitalio_digitalinout_type; typedef enum { DIGITALINOUT_OK, DIGITALINOUT_PIN_BUSY, + #if CIRCUITPY_DIGITALIO_HAVE_INPUT_ONLY DIGITALINOUT_INPUT_ONLY, + #endif #if CIRCUITPY_DIGITALIO_HAVE_INVALID_PULL DIGITALINOUT_INVALID_PULL, #endif