Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 37 additions & 8 deletions util/OneWire_direct_gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,11 @@ bool directRead(IO_REG_TYPE mask)
#define DIRECT_WRITE_HIGH(base, mask) (mask > 0x8000) ? GP16O |= 1 : (GPOS = (mask))

#elif defined(ARDUINO_ARCH_ESP32)
#include <Arduino.h>
#include <driver/rtc_io.h>
#if ESP_ARDUINO_VERSION > ESP_ARDUINO_VERSION_VAL(3,0,0)
#include <soc/gpio_struct.h>
#endif
#define PIN_TO_BASEREG(pin) (0)
#define PIN_TO_BITMASK(pin) (pin)
#define IO_REG_TYPE uint32_t
Expand All @@ -169,13 +172,17 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin)
{
#if CONFIG_IDF_TARGET_ESP32C3
return (GPIO.in.val >> pin) & 0x1;
#elif CONFIG_IDF_TARGET_ESP32S3
if ( pin < 32 )
return (GPIO.in >> pin) & 0x1;
else if ( pin < 48 ) // ESP32S3 supports up to GPIO47
return (GPIO.in1.val >> (pin - 32)) & 0x1;
#else // plain ESP32
if ( pin < 32 )
return (GPIO.in >> pin) & 0x1;
else if ( pin < 46 )
return (GPIO.in1.val >> (pin - 32)) & 0x1;
#endif

return 0;
}

Expand All @@ -184,6 +191,11 @@ void directWriteLow(IO_REG_TYPE pin)
{
#if CONFIG_IDF_TARGET_ESP32C3
GPIO.out_w1tc.val = ((uint32_t)1 << pin);
#elif CONFIG_IDF_TARGET_ESP32S3
if ( pin < 32 )
GPIO.out_w1tc = ((uint32_t)1 << pin);
else if ( pin < 48 ) // ESP32S3 supports up to GPIO47
GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32));
#else // plain ESP32
if ( pin < 32 )
GPIO.out_w1tc = ((uint32_t)1 << pin);
Expand All @@ -197,6 +209,11 @@ void directWriteHigh(IO_REG_TYPE pin)
{
#if CONFIG_IDF_TARGET_ESP32C3
GPIO.out_w1ts.val = ((uint32_t)1 << pin);
#elif CONFIG_IDF_TARGET_ESP32S3
if ( pin < 32 )
GPIO.out_w1ts = ((uint32_t)1 << pin);
else if ( pin < 48 ) // ESP32S3 supports up to GPIO47
GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32));
#else // plain ESP32
if ( pin < 32 )
GPIO.out_w1ts = ((uint32_t)1 << pin);
Expand All @@ -210,19 +227,25 @@ void directModeInput(IO_REG_TYPE pin)
{
#if CONFIG_IDF_TARGET_ESP32C3
GPIO.enable_w1tc.val = ((uint32_t)1 << (pin));
#else
#elif CONFIG_IDF_TARGET_ESP32S3
if ( digitalPinIsValid(pin) )
{
if ( pin < 32 )
GPIO.enable_w1tc = ((uint32_t)1 << pin);
else if ( pin < 48 ) // ESP32S3 supports up to GPIO47
GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32));
}
#else // plain ESP32
if ( digitalPinIsValid(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 ( pin < 32 )
GPIO.enable_w1tc = ((uint32_t)1 << pin);
else
Expand All @@ -236,19 +259,25 @@ void directModeOutput(IO_REG_TYPE pin)
{
#if CONFIG_IDF_TARGET_ESP32C3
GPIO.enable_w1ts.val = ((uint32_t)1 << (pin));
#else
if ( digitalPinIsValid(pin) /* && pin <= 33 */ ) // Use Any In/Out pins
#elif CONFIG_IDF_TARGET_ESP32S3
if ( digitalPinIsValid(pin) )
{
if ( pin < 32 )
GPIO.enable_w1ts = ((uint32_t)1 << pin);
else if ( pin < 48 ) // ESP32S3 supports up to GPIO47
GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32));
}
#else // plain ESP32
if ( digitalPinIsValid(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);

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 ( pin < 32 )
GPIO.enable_w1ts = ((uint32_t)1 << pin);
else // already validated to pins <= 33
Expand Down