diff --git a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp index 18cfee1e0..9bdfb9733 100644 --- a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp +++ b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp @@ -39,6 +39,8 @@ TasmotaSerial *tms_obj_list[16]; #ifdef ESP32 #include "driver/uart.h" +#include "driver/gpio.h" +#include "esp_rom_gpio.h" static uint32_t tasmota_serial_uart_bitmap = 0; // Assigned UARTs @@ -466,6 +468,7 @@ size_t TasmotaSerial::write(uint8_t b) { return size; } +#ifdef ESP8266 void IRAM_ATTR TasmotaSerial::rxRead(void) { if (!m_nwmode) { uint32_t start = ESP.getCycleCount(); @@ -586,3 +589,4 @@ void IRAM_ATTR TasmotaSerial::rxRead(void) { } } } +#endif // ESP8266 diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index c544d5d30..07bc9c2d5 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -53,7 +53,7 @@ uint8_t ledcReadResolution(uint8_t chan); // was not yet attached. // // Returns: hardware channel number, or -1 if it failed -int analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated +int32_t analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated // change both freq and range // `0`: set to global value diff --git a/lib/libesp32/berry_mapping/src/be_cb_module.c b/lib/libesp32/berry_mapping/src/be_cb_module.c index 7bf729a0b..111ba95e0 100644 --- a/lib/libesp32/berry_mapping/src/be_cb_module.c +++ b/lib/libesp32/berry_mapping/src/be_cb_module.c @@ -22,10 +22,10 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D * We allow 4 parameters, or 3 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -typedef int32_t (*berry_callback_t)(int32_t v0, int32_t v1, int32_t v2, int32_t v3); -static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, int32_t v3); +typedef int (*berry_callback_t)(int v0, int v1, int v2, int v3); +static int call_berry_cb(int num, int v0, int v1, int v2, int v3); -#define BERRY_CB(n) int32_t berry_cb_##n(int32_t v0, int32_t v1, int32_t v2, int32_t v3) { return call_berry_cb(n, v0, v1, v2, v3); } +#define BERRY_CB(n) int berry_cb_##n(int v0, int v1, int v2, int v3) { return call_berry_cb(n, v0, v1, v2, v3); } // list the callbacks BERRY_CB(0); BERRY_CB(1); @@ -85,7 +85,7 @@ typedef struct be_callback_handler_list_t { static be_callback_hook be_cb_hooks[BE_MAX_CB] = {0}; -static int32_t be_cb_gen_cb(bvm *vm); +static int be_cb_gen_cb(bvm *vm); static be_callback_handler_list_t be_callback_default_gen_cb = { NULL, be_const_func(&be_cb_gen_cb), @@ -102,7 +102,7 @@ static be_callback_handler_list_t *be_callback_handler_list_head = &be_callback_ * * arg1: function (or closure) \*********************************************************************************************/ -static int32_t be_cb_add_handler(bvm *vm) { +static int be_cb_add_handler(bvm *vm) { int32_t top = be_top(vm); if (top >= 1 && be_isfunction(vm, 1)) { bvalue *v = be_indexof(vm, 1); @@ -129,7 +129,7 @@ static int32_t be_cb_add_handler(bvm *vm) { * * No args \*********************************************************************************************/ -static int32_t be_cb_list_handlers(bvm *vm) { +static int be_cb_list_handlers(bvm *vm) { be_newobject(vm, "list"); for (be_callback_handler_list_t *elt = be_callback_handler_list_head; elt != NULL; elt = elt->next) { if (elt->vm == vm) { /* on purpose don't show the default handler, just pretend it's not there since it's default */ @@ -153,7 +153,7 @@ static int32_t be_cb_list_handlers(bvm *vm) { * arg2: type name for callback (optional) * argN: any other callback specific arguments (unlimited number, passed as-is) \*********************************************************************************************/ -static int32_t be_cb_make_cb(bvm *vm) { +static int be_cb_make_cb(bvm *vm) { int32_t argc = be_top(vm); if (argc >= 1 && be_isfunction(vm, 1)) { @@ -187,7 +187,7 @@ static int32_t be_cb_make_cb(bvm *vm) { * * arg1: function (or closure) \*********************************************************************************************/ -static int32_t be_cb_gen_cb(bvm *vm) { +static int be_cb_gen_cb(bvm *vm) { int32_t top = be_top(vm); // tasmota_log_C(LOG_LEVEL_DEBUG, "BRY: gen_cb() called"); if (top >= 1 && be_isfunction(vm, 1)) { @@ -217,7 +217,7 @@ static int32_t be_cb_gen_cb(bvm *vm) { * `get_cb_list`: Return the list of callbacks for this vm * \*********************************************************************************************/ -static int32_t be_cb_get_cb_list(bvm *vm) { +static int be_cb_get_cb_list(bvm *vm) { be_newobject(vm, "list"); for (uint32_t i=0; i < BE_MAX_CB; i++) { if (be_cb_hooks[i].vm) { @@ -242,7 +242,7 @@ static int32_t be_cb_get_cb_list(bvm *vm) { * We allow 4 parameters, or 3 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, int32_t v3) { +static int call_berry_cb(int num, int v0, int v1, int v2, int v3) { // call berry cb dispatcher int32_t ret = 0; // retrieve vm and function diff --git a/lib/libesp32/berry_matter/src/be_matter_misc.cpp b/lib/libesp32/berry_matter/src/be_matter_misc.cpp index 2ec805183..0e57c2aa5 100644 --- a/lib/libesp32/berry_matter/src/be_matter_misc.cpp +++ b/lib/libesp32/berry_matter/src/be_matter_misc.cpp @@ -31,6 +31,7 @@ static uint8_t ip_bytes[16] = {}; extern "C" const void* matter_get_ip_bytes(const char* ip_str, size_t* ret_len) { IPAddress ip; if (ip.fromString(ip_str)) { +#ifdef USE_IPV6 if (ip.isV4()) { uint32_t ip_32 = ip; memcpy(ip_bytes, &ip_32, 4); @@ -39,6 +40,11 @@ extern "C" const void* matter_get_ip_bytes(const char* ip_str, size_t* ret_len) memcpy(ip_bytes, ip.raw6(), 16); *ret_len = 16; } +#else + uint32_t ip_32 = ip; + memcpy(ip_bytes, &ip_32, 4); + *ret_len = 4; +#endif return ip_bytes; } else { *ret_len = 0; diff --git a/lib/libesp32/berry_matter/src/be_matter_qrcode.c b/lib/libesp32/berry_matter/src/be_matter_qrcode.c index 5bcddef86..9892cda93 100644 --- a/lib/libesp32/berry_matter/src/be_matter_qrcode.c +++ b/lib/libesp32/berry_matter/src/be_matter_qrcode.c @@ -32,7 +32,7 @@ // `matter.QRCode.encode_str(content:string) -> map` // -int32_t qr_encode_str(bvm *vm) { +int qr_encode_str(bvm *vm) { int32_t argc = be_top(vm); if (argc >= 1 && be_isstring(vm, 1)) { const char * data_str = be_tostring(vm, 1); diff --git a/lib/libesp32/berry_tasmota/include/be_ctypes.h b/lib/libesp32/berry_tasmota/include/be_ctypes.h index 5e029100b..abaffa8c3 100644 --- a/lib/libesp32/berry_tasmota/include/be_ctypes.h +++ b/lib/libesp32/berry_tasmota/include/be_ctypes.h @@ -60,7 +60,13 @@ typedef struct be_ctypes_classes_t { const be_ctypes_class_t * classes; } be_ctypes_classes_t; -BE_EXPORT_VARIABLE const bclass be_class_ctypes_bytes; +#ifdef __cplusplus +extern "C" { +#endif + extern const bclass be_class_ctypes_bytes; +#ifdef __cplusplus +} +#endif static void ctypes_register_class(bvm *vm, const bclass * ctypes_class) { be_pushntvclass(vm, ctypes_class); diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 67a149347..a74efb45f 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -406,6 +406,7 @@ void setup(void) { #ifdef CONFIG_IDF_TARGET_ESP32 // restore GPIO16/17 if no PSRAM is found + #if ESP_IDF_VERSION_MAJOR < 5 // TODO for esp-idf 5 if (!FoundPSRAM()) { // test if the CPU is not pico uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG); @@ -415,6 +416,7 @@ void setup(void) { gpio_reset_pin(GPIO_NUM_17); } } + #endif #endif // CONFIG_IDF_TARGET_ESP32 #endif // ESP32 diff --git a/tasmota/tasmota_support/support_crash_recorder.ino b/tasmota/tasmota_support/support_crash_recorder.ino index 07bcc8db4..bf55869cd 100644 --- a/tasmota/tasmota_support/support_crash_recorder.ino +++ b/tasmota/tasmota_support/support_crash_recorder.ino @@ -30,7 +30,7 @@ void CmndWDT(void) { volatile uint32_t dummy = 0; while (1) { - dummy++; + dummy = dummy + 1; } } diff --git a/tasmota/tasmota_support/support_esp.ino b/tasmota/tasmota_support/support_esp.ino index 4d3373e15..c7d284ae7 100644 --- a/tasmota/tasmota_support/support_esp.ino +++ b/tasmota/tasmota_support/support_esp.ino @@ -214,7 +214,6 @@ String GetCodeCores(void) { #ifdef ESP32 -#include "bootloader_flash.h" #include "soc/soc.h" #include "soc/spi_reg.h" // ESP32_ARCH contains the name of the architecture (used by autoconf) @@ -256,6 +255,10 @@ String GetCodeCores(void) { #include "rom/rtc.h" #endif +#if ESP_IDF_VERSION_MAJOR >= 5 + #include "esp_chip_info.h" +#endif + // Set the Stacksize for Arduino core. Default is 8192, some builds may need a bigger one size_t getArduinoLoopTaskStackSize(void) { return SET_ESP32_STACK_SIZE; @@ -724,7 +727,12 @@ uint8_t* FlashDirectAccess(void) { } extern "C" { - bool esp_spiram_is_initialized(void); + #if ESP_IDF_VERSION_MAJOR >= 5 + // bool IRAM_ATTR __attribute__((pure)) esp_psram_is_initialized(void) + bool esp_psram_is_initialized(void); + #else + bool esp_spiram_is_initialized(void); + #endif } // this function is a replacement for `psramFound()`. @@ -734,7 +742,11 @@ bool FoundPSRAM(void) { #if CONFIG_IDF_TARGET_ESP32C3 return psramFound(); #else - return psramFound() && esp_spiram_is_initialized(); + #if ESP_IDF_VERSION_MAJOR >= 5 + return psramFound() && esp_psram_is_initialized(); + #else + return psramFound() && esp_spiram_is_initialized(); + #endif #endif } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino index ca0af5319..6609ca082 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino @@ -21,9 +21,17 @@ #ifdef USE_BERRY #include -#include "esp_spi_flash.h" + +#include "esp_idf_version.h" +#if ESP_IDF_VERSION_MAJOR >= 5 + // esp_spi_flash.h is deprecated, please use spi_flash_mmap.h instead + #include "spi_flash_mmap.h" +#else + #include "esp_spi_flash.h" +#endif size_t FlashWriteSubSector(uint32_t address_start, const uint8_t *data, size_t size) { +#if ESP_IDF_VERSION_MAJOR < 5 uint32_t addr = address_start; size_t size_left = size; size_t current_offset = 0; @@ -59,6 +67,9 @@ size_t FlashWriteSubSector(uint32_t address_start, const uint8_t *data, size_t s } return current_offset; +#else + // TODO ESPIDF 5 +#endif } /*********************************************************************************************\ @@ -73,6 +84,7 @@ extern "C" { // If length is not specified, it is full block 4KB int32_t p_flash_read(struct bvm *vm); int32_t p_flash_read(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 1 && be_isint(vm, 1) && (argc < 2 || be_isint(vm, 2)) ) { // optional second argument must be int @@ -91,6 +103,7 @@ extern "C" { be_pushbytes(vm, buf.get(), length); be_return(vm); } +#endif be_raise(vm, kTypeError, nullptr); } @@ -98,6 +111,7 @@ extern "C" { // if `no_erase` is true, just call spi_flash_write int32_t p_flash_write(struct bvm *vm); int32_t p_flash_write(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isinstance(vm, 2)) { be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ @@ -126,6 +140,7 @@ extern "C" { } } } +#endif be_raise(vm, kTypeError, nullptr); } @@ -134,6 +149,7 @@ extern "C" { // Address and length must be 4KB aligned int32_t p_flash_erase(struct bvm *vm); int32_t p_flash_erase(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isint(vm, 2)) { int32_t address = be_toint(vm, 1); @@ -147,6 +163,7 @@ extern "C" { esp_err_t ret = spi_flash_erase_range(address, length); be_return_nil(vm); } +#endif be_raise(vm, kTypeError, nullptr); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index 9dcf44ccb..eb5b7feb4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -582,6 +582,7 @@ public: size_t write(const uint8_t *buffer, size_t size) override { // AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size); if (size > 0) { +#if ESP_IDF_VERSION_MAJOR < 5 // TODO later esp_err_t ret = spi_flash_write(addr_start + offset, buffer, size); if (ret != ESP_OK) { return 0; } // error offset += size; @@ -590,6 +591,7 @@ public: if (((offset - size) / STREAM_FLASH_PROGRESS_THRESHOLD) != (offset / STREAM_FLASH_PROGRESS_THRESHOLD)) { AddLog(LOG_LEVEL_DEBUG, D_LOG_UPLOAD "Progress %d kB", offset / 1024); } +#endif } return size; } @@ -611,6 +613,7 @@ protected: extern "C" { int32_t wc_writeflash(struct bvm *vm); int32_t wc_writeflash(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); if (argc >= 2 && be_isint(vm, 2)) { HTTPClientLight * cl = wc_getclient(vm); @@ -650,6 +653,7 @@ extern "C" { be_pushint(vm, written); be_return(vm); /* return code */ } +#endif be_raise(vm, kTypeError, nullptr); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 2f504d673..e1856b5e3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -24,6 +24,9 @@ #define XDRV_68 68 + +#if !defined(ESP32) || (ESP_IDF_VERSION_MAJOR < 5) // temporarily disable for IDF 5.0 + static const uint8_t TRIGGER_PERIOD = 75; #define ZCDIMMERSET_SHOW 1 @@ -298,4 +301,7 @@ bool Xdrv68(uint32_t function) } return result; } + +#endif // !enabled(ESP32) || (ESP_IDF_VERSION_MAJOR < 5) + #endif // USE_AC_ZERO_CROSS_DIMMER diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index c6c352b64..0be99724e 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -24,6 +24,12 @@ #define XSNS_02 2 +#ifdef ESP32 + #if ESP_IDF_VERSION_MAJOR >= 5 + #include "esp32-hal-adc.h" + #endif +#endif + #ifdef ESP8266 #define ANALOG_RESOLUTION 10 // 12 = 4095, 11 = 2047, 10 = 1023 #define ANALOG_RANGE 1023 // 4095 = 12, 2047 = 11, 1023 = 10 @@ -176,6 +182,11 @@ bool adcAttachPin(uint8_t pin) { return (ADC0_PIN == pin); } #endif +#if defined(ESP32) && (ESP_IDF_VERSION_MAJOR >= 5) + bool adcAttachPin(uint8_t pin) { + return true; // TODO - no more needed? + } +#endif void AdcSaveSettings(uint32_t idx) { char parameters[32];