diff --git a/lib/OneWire/OneWire.cpp b/lib/OneWire/OneWire.cpp index 8d4b66c..2416697 100644 --- a/lib/OneWire/OneWire.cpp +++ b/lib/OneWire/OneWire.cpp @@ -195,11 +195,7 @@ uint8_t OneWire::reset(void) // Write a bit. Port and bit is used to cut lookup time and provide // more certain timing. // -#if defined(ARDUINO_ARCH_ESP32) -void IRAM_ATTR OneWire::write_bit(uint8_t v) -#else void OneWire::write_bit(uint8_t v) -#endif { IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg; @@ -227,11 +223,7 @@ void OneWire::write_bit(uint8_t v) // Read a bit. Port and bit is used to cut lookup time and provide // more certain timing. // -#if defined(ARDUINO_ARCH_ESP32) -uint8_t IRAM_ATTR OneWire::read_bit(void) -#else uint8_t OneWire::read_bit(void) -#endif { IO_REG_TYPE mask IO_REG_MASK_ATTR = bitmask; volatile IO_REG_TYPE *reg IO_REG_BASE_ATTR = baseReg; @@ -585,4 +577,4 @@ uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc) } #endif -#endif +#endif \ No newline at end of file diff --git a/lib/OneWire/OneWire.h b/lib/OneWire/OneWire.h index a8126f7..9c5a4ac 100644 --- a/lib/OneWire/OneWire.h +++ b/lib/OneWire/OneWire.h @@ -99,18 +99,10 @@ class OneWire // Write a bit. The bus is always left powered at the end, see // note in write() about that. - #if defined (ARDUINO_ARCH_ESP32) - void IRAM_ATTR write_bit(uint8_t v); - #else void write_bit(uint8_t v); - #endif // Read a bit. - #if defined (ARDUINO_ARCH_ESP32) - uint8_t IRAM_ATTR read_bit(void); - #else uint8_t read_bit(void); - #endif // Stop forcing power onto the bus. You only need to do this if // you used the 'power' flag to write() or used a write_bit() call @@ -187,4 +179,4 @@ class OneWire #endif #endif // __cplusplus -#endif // OneWire_h +#endif // OneWire_h \ No newline at end of file diff --git a/lib/OneWire/util/OneWire_direct_gpio.h b/lib/OneWire/util/OneWire_direct_gpio.h index 8df13c8..32e7553 100644 --- a/lib/OneWire/util/OneWire_direct_gpio.h +++ b/lib/OneWire/util/OneWire_direct_gpio.h @@ -127,10 +127,14 @@ static inline __attribute__((always_inline)) IO_REG_TYPE directRead(IO_REG_TYPE pin) { +#if CONFIG_IDF_TARGET_ESP32C3 + return (GPIO.in.val >> pin) & 0x1; +#else // plain ESP32 if ( pin < 32 ) return (GPIO.in >> pin) & 0x1; - else if ( pin < 40 ) + else if ( pin < 46 ) return (GPIO.in1.val >> (pin - 32)) & 0x1; +#endif return 0; } @@ -138,38 +142,38 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directWriteLow(IO_REG_TYPE pin) { +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.out_w1tc.val = ((uint32_t)1 << pin); +#else // plain ESP32 if ( pin < 32 ) GPIO.out_w1tc = ((uint32_t)1 << pin); - else if ( pin < 34 ) + else if ( pin < 46 ) GPIO.out1_w1tc.val = ((uint32_t)1 << (pin - 32)); +#endif } static inline __attribute__((always_inline)) void directWriteHigh(IO_REG_TYPE pin) { +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.out_w1ts.val = ((uint32_t)1 << pin); +#else // plain ESP32 if ( pin < 32 ) GPIO.out_w1ts = ((uint32_t)1 << pin); - else if ( pin < 34 ) + else if ( pin < 46 ) GPIO.out1_w1ts.val = ((uint32_t)1 << (pin - 32)); +#endif } static inline __attribute__((always_inline)) void directModeInput(IO_REG_TYPE pin) { +#if CONFIG_IDF_TARGET_ESP32C3 + GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); +#else if ( digitalPinIsValid(pin) ) { - #if defined(ESP_ARDUINO_VERSION) - #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) - int pin_io = rtc_io_number_get((gpio_num_t)pin); - uint32_t rtc_reg(rtc_io_desc[pin_io].reg); - - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin_io].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin_io].pullup | rtc_io_desc[pin_io].pulldown); - } - #endif - #else +#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 @@ -177,40 +181,25 @@ void directModeInput(IO_REG_TYPE pin) 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 - +#endif + // Input if ( pin < 32 ) GPIO.enable_w1tc = ((uint32_t)1 << pin); else GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); - - uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? - pinFunction |= FUN_IE; // input enable but required for output as well? - pinFunction |= ((uint32_t)2 << MCU_SEL_S); - - ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - - GPIO.pin[pin].val = 0; } +#endif } static inline __attribute__((always_inline)) 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 ) // pins above 33 can be only inputs { - #if defined(ESP_ARDUINO_VERSION) - #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) - int pin_io = rtc_io_number_get((gpio_num_t)pin); - uint32_t rtc_reg(rtc_io_desc[pin_io].reg); - - if ( rtc_reg ) // RTC pins PULL settings - { - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin_io].mux); - ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin_io].pullup | rtc_io_desc[pin_io].pulldown); - } - #endif - #else +#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 @@ -218,21 +207,14 @@ void directModeOutput(IO_REG_TYPE pin) 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 - +#endif + // Output 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)); - - uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? - pinFunction |= FUN_IE; // input enable but required for output as well? - pinFunction |= ((uint32_t)2 << MCU_SEL_S); - - ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - - GPIO.pin[pin].val = 0; } +#endif } #define DIRECT_READ(base, pin) directRead(pin) @@ -445,6 +427,20 @@ void directWriteHigh(IO_REG_TYPE mask) #define DIRECT_MODE_INPUT(base, mask) directModeInput(mask) #define DIRECT_MODE_OUTPUT(base, mask) directModeOutput(mask) +#elif defined(ARDUINO_ARCH_MBED_RP2040)|| defined(ARDUINO_ARCH_RP2040) +#define delayMicroseconds(time) busy_wait_us(time) +#define PIN_TO_BASEREG(pin) (0) +#define PIN_TO_BITMASK(pin) (pin) +#define IO_REG_TYPE unsigned int +#define IO_REG_BASE_ATTR +#define IO_REG_MASK_ATTR +#define DIRECT_READ(base, pin) digitalRead(pin) +#define DIRECT_WRITE_LOW(base, pin) digitalWrite(pin, LOW) +#define DIRECT_WRITE_HIGH(base, pin) digitalWrite(pin, HIGH) +#define DIRECT_MODE_INPUT(base, pin) pinMode(pin,INPUT) +#define DIRECT_MODE_OUTPUT(base, pin) pinMode(pin,OUTPUT) +#warning "OneWire. RP2040 in Fallback mode. Using API calls for pinMode,digitalRead and digitalWrite." + #else #define PIN_TO_BASEREG(pin) (0) #define PIN_TO_BITMASK(pin) (pin) @@ -460,4 +456,4 @@ void directWriteHigh(IO_REG_TYPE mask) #endif -#endif +#endif \ No newline at end of file