diff --git a/lib/GPIO_DirectAccess/GPIO_Direct_Access.cpp b/lib/GPIO_DirectAccess/GPIO_Direct_Access.cpp index 2e1962e67..8e1accc8c 100644 --- a/lib/GPIO_DirectAccess/GPIO_Direct_Access.cpp +++ b/lib/GPIO_DirectAccess/GPIO_Direct_Access.cpp @@ -31,10 +31,11 @@ void DIRECT_pinWrite(IO_REG_TYPE pin, bool pinstate) digitalWrite(pin, pinstate); return; } - # endif // ifdef ARDUINO_ARCH_ESP8266 - if (pinstate) { DIRECT_WRITE_HIGH(reg, PIN_TO_BITMASK(pin)); } else { DIRECT_WRITE_LOW(reg, PIN_TO_BITMASK(pin)); } + #else + directWrite(pin, pinstate ? 1u : 0u); + # endif // ifdef ARDUINO_ARCH_ESP8266 } void DIRECT_PINMODE_OUTPUT(IO_REG_TYPE pin) diff --git a/lib/GPIO_DirectAccess/GPIO_Direct_Access.h b/lib/GPIO_DirectAccess/GPIO_Direct_Access.h index 25481d2c2..7906db9aa 100644 --- a/lib/GPIO_DirectAccess/GPIO_Direct_Access.h +++ b/lib/GPIO_DirectAccess/GPIO_Direct_Access.h @@ -134,147 +134,52 @@ void DIRECT_PINMODE_INPUT_ISR(IO_REG_TYPE pin); int32_t DIRECT_measureWaitForPinState_ISR(IO_REG_TYPE gpio_pin_rx, uint32_t start_usec, int32_t timeout_usec, bool newState); #elif defined(ARDUINO_ARCH_ESP32) -#if ESP_IDF_VERSION_MAJOR < 5 -#include -#include -#else #include #include #include #include -#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 5, 0) #include -#endif -#endif +#include #define PIN_TO_BASEREG(pin) (0) #define PIN_TO_BITMASK(pin) (pin) #define IO_REG_TYPE uint32_t #define IO_REG_BASE_ATTR #define IO_REG_MASK_ATTR -static inline __attribute__((always_inline)) -IO_REG_TYPE directRead(IO_REG_TYPE pin) +__attribute__((always_inline)) +static inline IO_REG_TYPE directRead(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 - return (GPIO.in.val >> pin) & 0x1; -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32P4 - if ( pin < 32 ) - return (GPIO.in.val >> pin) & 0x1; - else if ( pin < SOC_GPIO_PIN_COUNT ) - return (GPIO.in1.val >> (pin - 32)) & 0x1; -#else // plain ESP32 - if ( pin < 32 ) - return (GPIO.in >> pin) & 0x1; - else if ( pin < SOC_GPIO_PIN_COUNT ) - return (GPIO.in1.val >> (pin - 32)) & 0x1; -#endif - - return 0; + return gpio_ll_get_level(&GPIO, pin); } -static inline __attribute__((always_inline)) -void directWriteLow(IO_REG_TYPE pin) +__attribute__((always_inline)) +static inline void directWrite(IO_REG_TYPE pin, IO_REG_TYPE level) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 - GPIO.out_w1tc.val = ((uint32_t)1 << pin); -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32P4 - if ( pin < 32 ) - GPIO.out_w1tc.val = ((uint32_t)1 << pin); - else if ( pin < SOC_GPIO_PIN_COUNT ) - GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32)); - -#else // plain ESP32 - if ( pin < 32 ) - GPIO.out_w1tc = ((uint32_t)1 << pin); - else if ( pin < SOC_GPIO_PIN_COUNT ) - GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32)); -#endif + gpio_ll_set_level(&GPIO, pin, level); } -static inline __attribute__((always_inline)) -void directWriteHigh(IO_REG_TYPE pin) +__attribute__((always_inline)) +static inline void directWriteLow(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 - GPIO.out_w1ts.val = ((uint32_t)1 << pin); -#elif CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32P4 - if ( pin < 32 ) - GPIO.out_w1ts.val = ((uint32_t)1 << pin); - else if ( pin < SOC_GPIO_PIN_COUNT ) - GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32)); - -#else // plain ESP32 - if ( pin < 32 ) - GPIO.out_w1ts = ((uint32_t)1 << pin); - else if ( pin < SOC_GPIO_PIN_COUNT ) - GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32)); -#endif + gpio_ll_set_level(&GPIO, pin, 0u); } -static inline __attribute__((always_inline)) -void directModeInput(IO_REG_TYPE pin) +__attribute__((always_inline)) +static inline void directWriteHigh(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 - GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); -#else - if ( GPIO_IS_VALID_GPIO(pin) ) - { -#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4 - uint32_t rtc_reg(rtc_gpio_desc[pin].reg); - - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); - } -#endif - // Input -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32P4 - if ( pin < 32 ) - GPIO.enable_w1tc.val = ((uint32_t)1 << pin); - else - GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); -#else - if ( pin < 32 ) - GPIO.enable_w1tc = ((uint32_t)1 << pin); - else - GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); -#endif - } -#endif + gpio_ll_set_level(&GPIO, pin, 1u); } -static inline __attribute__((always_inline)) -void directModeOutput(IO_REG_TYPE pin) +__attribute__((always_inline)) +static inline void directModeInput(IO_REG_TYPE pin) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C5 - GPIO.enable_w1ts.val = ((uint32_t)1 << (pin)); -#else - if ( GPIO_IS_VALID_GPIO(pin) && pin <= 33 ) // pins above 33 can be only inputs - { -#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4 - uint32_t rtc_reg(rtc_gpio_desc[pin].reg); + gpio_ll_output_disable(&GPIO, pin); +} - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown); - } -#endif - // Output -#if CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C61 || CONFIG_IDF_TARGET_ESP32P4 - if ( pin < 32 ) - GPIO.enable_w1ts.val = ((uint32_t)1 << pin); - else // already validated to pins <= 33 - GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32)); - -#else - if ( pin < 32 ) - GPIO.enable_w1ts = ((uint32_t)1 << pin); - else // already validated to pins <= 33 - GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32)); -#endif - } -#endif +__attribute__((always_inline)) +static inline void directModeOutput(IO_REG_TYPE pin) +{ + gpio_ll_output_enable(&GPIO, pin); } #define DIRECT_READ(base, pin) directRead(pin)