From b040f6e431ba9045af28459a22b99f34e136440a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 10 May 2023 09:56:13 +0200 Subject: [PATCH 1/2] periman-implementation --- cores/esp32/esp32-hal-gpio.c | 50 ++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index 5569da5c0f1..e3f93010d20 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -13,6 +13,7 @@ // limitations under the License. #include "esp32-hal-gpio.h" +#include "esp32-hal-periman.h" #include "hal/gpio_hal.h" #include "soc/soc_caps.h" @@ -89,6 +90,10 @@ static InterruptHandle_t __pinInterruptHandlers[SOC_GPIO_PIN_COUNT] = {0,}; #include "driver/rtc_io.h" +static bool gpioDetachBus(void * bus){ + return true; +} + extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) { #ifdef RGB_BUILTIN @@ -102,6 +107,14 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) log_e("Invalid pin selected"); return; } + + if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL){ + perimanSetBusDeinit(ESP32_BUS_TYPE_GPIO, gpioDetachBus); + if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_INIT, NULL)){ + log_e("Deinit of previous bus failed"); + return; + } + } gpio_hal_context_t gpiohal; gpiohal.dev = GPIO_LL_GET_HW(GPIO_PORT_0); @@ -130,24 +143,41 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) log_e("GPIO config failed"); return; } + if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) == NULL){ + if(!perimanSetPinBus(pin, ESP32_BUS_TYPE_GPIO, (void *)(pin+1))){ + //gpioDetachBus((void *)(pin+1)); + return; + } + } } extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { - #ifdef RGB_BUILTIN - if(pin == RGB_BUILTIN){ - //use RMT to set all channels on/off - const uint8_t comm_val = val != 0 ? RGB_BRIGHTNESS : 0; - neopixelWrite(RGB_BUILTIN, comm_val, comm_val, comm_val); - return; - } - #endif - gpio_set_level((gpio_num_t)pin, val); + if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL){ + #ifdef RGB_BUILTIN + if(pin == RGB_BUILTIN){ + //use RMT to set all channels on/off + const uint8_t comm_val = val != 0 ? RGB_BRIGHTNESS : 0; + neopixelWrite(RGB_BUILTIN, comm_val, comm_val, comm_val); + return; + } + #endif + gpio_set_level((gpio_num_t)pin, val); + } + else { + log_e("Pin is not set as GPIO."); + } } extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { - return gpio_get_level((gpio_num_t)pin); + if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL){ + return gpio_get_level((gpio_num_t)pin); + } + else { + log_e("Pin is not set as GPIO."); + return 0; + } } static void ARDUINO_ISR_ATTR __onPinInterrupt(void * arg) { From 871ed6a9d692483f0d7963e9d2123d73fa1a3a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Procha=CC=81zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 11 May 2023 12:59:33 +0200 Subject: [PATCH 2/2] fix RGB_BUILTIN and remove space --- cores/esp32/esp32-hal-gpio.c | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/cores/esp32/esp32-hal-gpio.c b/cores/esp32/esp32-hal-gpio.c index e3f93010d20..f4687641e7f 100644 --- a/cores/esp32/esp32-hal-gpio.c +++ b/cores/esp32/esp32-hal-gpio.c @@ -153,26 +153,25 @@ extern void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode) extern void ARDUINO_ISR_ATTR __digitalWrite(uint8_t pin, uint8_t val) { - if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL){ - #ifdef RGB_BUILTIN - if(pin == RGB_BUILTIN){ - //use RMT to set all channels on/off - const uint8_t comm_val = val != 0 ? RGB_BRIGHTNESS : 0; - neopixelWrite(RGB_BUILTIN, comm_val, comm_val, comm_val); - return; - } - #endif - gpio_set_level((gpio_num_t)pin, val); - } - else { - log_e("Pin is not set as GPIO."); - } + #ifdef RGB_BUILTIN + if(pin == RGB_BUILTIN){ + //use RMT to set all channels on/off + const uint8_t comm_val = val != 0 ? RGB_BRIGHTNESS : 0; + neopixelWrite(RGB_BUILTIN, comm_val, comm_val, comm_val); + return; + } + #endif + if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL){ + gpio_set_level((gpio_num_t)pin, val); + } else { + log_e("Pin is not set as GPIO."); + } } extern int ARDUINO_ISR_ATTR __digitalRead(uint8_t pin) { if(perimanGetPinBus(pin, ESP32_BUS_TYPE_GPIO) != NULL){ - return gpio_get_level((gpio_num_t)pin); + return gpio_get_level((gpio_num_t)pin); } else { log_e("Pin is not set as GPIO.");