From 130dbd6e6649edf1e0b5ed15d7f22e0b845087ab Mon Sep 17 00:00:00 2001 From: Garcia Date: Tue, 25 Feb 2025 23:41:57 -0300 Subject: [PATCH 1/6] feat(gpio): allows mixing digital and analog read/write operations --- cores/esp32/esp32-hal-gpio.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index b11636daf81..0e27d5fba16 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -170,11 +170,11 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { return; } #endif // RGB_BUILTIN - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { - gpio_set_level((gpio_num_t)pin, val); - } else { - log_e("IO %i is not set as GPIO.", pin); + // if the pin is not in GPIO mode, make it happen + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { + __pinMode(uint8_t pin, OUTPUT); } + gpio_set_level((gpio_num_t)pin, val); } extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { @@ -184,12 +184,11 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { } #endif - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { - return gpio_get_level((gpio_num_t)pin); - } else { - log_e("IO %i is not set as GPIO.", pin); - return 0; + // if the pin is not in GPIO mode, make it happen + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { + __pinMode(uint8_t pin, INPUT); } + return gpio_get_level((gpio_num_t)pin); } static void ARDUINO_ISR_ATTR __onPinInterrupt(void *arg) { From 8bdee600e055e868e09a063d5fdf2a5f88b1017f Mon Sep 17 00:00:00 2001 From: Garcia Date: Wed, 26 Feb 2025 00:00:02 -0300 Subject: [PATCH 2/6] fix(gpio): simple mistake in calling __pinMode() fnuction --- cores/esp32/esp32-hal-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 0e27d5fba16..a1e1ba98716 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -172,7 +172,7 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { #endif // RGB_BUILTIN // if the pin is not in GPIO mode, make it happen if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { - __pinMode(uint8_t pin, OUTPUT); + __pinMode(pin, OUTPUT); } gpio_set_level((gpio_num_t)pin, val); } From 993ddd96859935a36379c8ea4a377b17fd28f09f Mon Sep 17 00:00:00 2001 From: Garcia Date: Wed, 26 Feb 2025 00:00:13 -0300 Subject: [PATCH 3/6] fix(gpio): simple mistake in calling __pinMode() fnuction --- cores/esp32/esp32-hal-gpio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index a1e1ba98716..81e71b2e120 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -186,7 +186,7 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { // if the pin is not in GPIO mode, make it happen if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { - __pinMode(uint8_t pin, INPUT); + __pinMode(pin, INPUT); } return gpio_get_level((gpio_num_t)pin); } From b34be47d6c53775889c576cbf8e8609da8646ab9 Mon Sep 17 00:00:00 2001 From: Garcia Date: Thu, 27 Feb 2025 11:45:55 -0300 Subject: [PATCH 4/6] feat(gpio): update the log message to tell the solution for the error. --- cores/esp32/esp32-hal-gpio.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 81e71b2e120..0a0602ab58e 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -170,11 +170,11 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { return; } #endif // RGB_BUILTIN - // if the pin is not in GPIO mode, make it happen - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { - __pinMode(pin, OUTPUT); + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { + gpio_set_level((gpio_num_t)pin, val); + } else { + log_e("IO %i is not set as GPIO. Execute digitalMode(pin, OUTPUT) first.", pin); } - gpio_set_level((gpio_num_t)pin, val); } extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { From 97d78bc62b9f732ed57d0df3c64594450d86c1b4 Mon Sep 17 00:00:00 2001 From: Garcia Date: Thu, 27 Feb 2025 11:54:30 -0300 Subject: [PATCH 5/6] feat(gpio): warn user about digitalRead() used with non GPIO pin --- cores/esp32/esp32-hal-gpio.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 0a0602ab58e..9709f127598 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -182,11 +182,10 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { if (pin == RGB_BUILTIN) { return RGB_BUILTIN_storage; } -#endif - - // if the pin is not in GPIO mode, make it happen - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { - __pinMode(pin, INPUT); +#endif // RGB_BUILTIN + // This work when the pin is set as GPIO and in INPUT mode. For all other pin functions, it may return inconsistent response + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { + log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value."); } return gpio_get_level((gpio_num_t)pin); } From 8cd18aca444bfdf58c1b99936619ec367aec0835 Mon Sep 17 00:00:00 2001 From: Garcia Date: Fri, 28 Feb 2025 12:47:57 -0300 Subject: [PATCH 6/6] fix(gpio): wrong peripheral manager test case --- cores/esp32/esp32-hal-gpio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 9709f127598..c681be077b3 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -173,7 +173,7 @@ extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { gpio_set_level((gpio_num_t)pin, val); } else { - log_e("IO %i is not set as GPIO. Execute digitalMode(pin, OUTPUT) first.", pin); + log_e("IO %i is not set as GPIO. Execute digitalMode(%i, OUTPUT) first.", pin, pin); } } @@ -184,7 +184,7 @@ extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { } #endif // RGB_BUILTIN // This work when the pin is set as GPIO and in INPUT mode. For all other pin functions, it may return inconsistent response - if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL) { + if (perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL) { log_w("IO %i is not set as GPIO. digitalRead() may return an inconsistent value."); } return gpio_get_level((gpio_num_t)pin);