diff --git a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp index c25845922..e15770022 100644 --- a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp +++ b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp @@ -22,80 +22,3 @@ #include "esp8266toEsp32.h" // ESP Stuff - -String ESP32GetResetReason(uint32_t cpu_no) -{ - // tools\sdk\include\esp32\rom\rtc.h - switch (rtc_get_reset_reason( (RESET_REASON) cpu_no)) { - case POWERON_RESET : return F("Vbat power on reset"); // 1 - case SW_RESET : return F("Software reset digital core"); // 3 - case OWDT_RESET : return F("Legacy watch dog reset digital core"); // 4 - case DEEPSLEEP_RESET : return F("Deep Sleep reset digital core"); // 5 - case SDIO_RESET : return F("Reset by SLC module, reset digital core"); // 6 - case TG0WDT_SYS_RESET : return F("Timer Group0 Watch dog reset digital core"); // 7 - case TG1WDT_SYS_RESET : return F("Timer Group1 Watch dog reset digital core"); // 8 - case RTCWDT_SYS_RESET : return F("RTC Watch dog Reset digital core"); // 9 - case INTRUSION_RESET : return F("Instrusion tested to reset CPU"); // 10 - case TGWDT_CPU_RESET : return F("Time Group reset CPU"); // 11 - case SW_CPU_RESET : return F("Software reset CPU"); // 12 - case RTCWDT_CPU_RESET : return F("RTC Watch dog Reset CPU"); // 13 - case EXT_CPU_RESET : return F("or APP CPU, reseted by PRO CPU"); // 14 - case RTCWDT_BROWN_OUT_RESET : return F("Reset when the vdd voltage is not stable"); // 15 - case RTCWDT_RTC_RESET : return F("RTC Watch dog reset digital core and rtc module"); // 16 - default : return F("NO_MEAN"); // 0 - } -} - -String ESP_getResetReason(void) -{ - return ESP32GetResetReason(0); // CPU 0 -} - -uint32_t ESP_ResetInfoReason(void) -{ - RESET_REASON reason = rtc_get_reset_reason(0); - if (POWERON_RESET == reason) { return REASON_DEFAULT_RST; } - if (SW_CPU_RESET == reason) { return REASON_SOFT_RESTART; } - if (DEEPSLEEP_RESET == reason) { return REASON_DEEP_SLEEP_AWAKE; } - if (SW_RESET == reason) { return REASON_EXT_SYS_RST; } -} - -uint32_t ESP_getBootVersion(void) -{ - return 1; -} - -void ESP_reset() -{ - ESP.restart(); -} - -uint32_t ESP_getFlashChipId() -{ - return 0; -} - -uint32_t ESP_getChipId() -{ - uint32_t id = 0; - for (uint32_t i = 0; i < 17; i = i +8) { - id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; - } - return id; -} - -String String_ESP_getChipId() -{ - uint64_t mac = ESP.getEfuseMac(); - return String(uint32_t(mac >> 32)) + String(uint32_t(mac)); -} - -uint32_t ESP_getSketchSize(void) -{ - static uint32_t sketchsize = 0; - - if (!sketchsize) { - sketchsize = ESP.getSketchSize(); // This takes almost 2 seconds on an ESP32 - } - return sketchsize; -} diff --git a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index 92184d4a7..6023507ae 100644 --- a/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -28,18 +28,6 @@ #include -// -// ESP32 -// -String ESP_getResetReason(void); -uint32_t ESP_ResetInfoReason(void); -uint32_t ESP_getBootVersion(void); -void ESP_reset(); -uint32_t ESP_getFlashChipId(); -uint32_t ESP_getChipId(); -String String_ESP_getChipId(); -uint32_t ESP_getSketchSize(); - // Analog inline void analogWrite(uint8_t pin, int val) { diff --git a/tasmota/support.ino b/tasmota/support.ino index 5e7764bf9..0afbe811f 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -99,11 +99,7 @@ uint32_t ResetReason(void) REASON_DEEP_SLEEP_AWAKE = 5, // "Deep-Sleep Wake" wake up from deep-sleep REASON_EXT_SYS_RST = 6 // "External System" external system reset */ -#ifdef ESP8266 - return resetInfo.reason; -#else return ESP_ResetInfoReason(); -#endif } String GetResetReason(void) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 18ead323a..b3beea79d 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -413,20 +413,34 @@ void CmndStatus(void) if ((0 == payload) || (1 == payload)) { Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS1_PARAMETER "\":{\"" D_JSON_BAUDRATE "\":%d,\"" D_CMND_SERIALCONFIG "\":\"%s\",\"" D_CMND_GROUPTOPIC "\":\"%s\",\"" D_CMND_OTAURL "\":\"%s\",\"" D_JSON_RESTARTREASON "\":\"%s\",\"" D_JSON_UPTIME "\":\"%s\",\"" D_JSON_STARTUPUTC "\":\"%s\",\"" D_CMND_SLEEP "\":%d,\"" - D_JSON_CONFIG_HOLDER "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"BCResetTime\":\"%s\",\"" D_JSON_SAVECOUNT "\":%d,\"" D_JSON_SAVEADDRESS "\":\"%X\"}}"), + D_JSON_CONFIG_HOLDER "\":%d,\"" D_JSON_BOOTCOUNT "\":%d,\"BCResetTime\":\"%s\",\"" D_JSON_SAVECOUNT "\":%d" +#ifdef ESP8266 + ",\"" D_JSON_SAVEADDRESS "\":\"%X\"" +#endif + "}}"), Settings.baudrate * 300, GetSerialConfig().c_str(), SettingsText(SET_MQTT_GRP_TOPIC), SettingsText(SET_OTAURL), GetResetReason().c_str(), GetUptime().c_str(), GetDateAndTime(DT_RESTART).c_str(), Settings.sleep, - Settings.cfg_holder, Settings.bootcount, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag, GetSettingsAddress()); + Settings.cfg_holder, Settings.bootcount, GetDateAndTime(DT_BOOTCOUNT).c_str(), Settings.save_flag +#ifdef ESP8266 + , GetSettingsAddress() +#endif + ); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "1")); } if ((0 == payload) || (2 == payload)) { - Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS2_FIRMWARE "\":{\"" D_JSON_VERSION "\":\"%s%s\",\"" D_JSON_BUILDDATETIME "\":\"%s\",\"" - D_JSON_BOOTVERSION "\":%d,\"" D_JSON_COREVERSION "\":\"" ARDUINO_CORE_RELEASE "\",\"" D_JSON_SDKVERSION "\":\"%s\"," + Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS2_FIRMWARE "\":{\"" D_JSON_VERSION "\":\"%s%s\",\"" D_JSON_BUILDDATETIME "\":\"%s\"" +#ifdef ESP8266 + ",\"" D_JSON_BOOTVERSION "\":%d" +#endif + ",\"" D_JSON_COREVERSION "\":\"" ARDUINO_CORE_RELEASE "\",\"" D_JSON_SDKVERSION "\":\"%s\"," "\"Hardware\":\"%s\"" "%s}}"), - my_version, my_image, GetBuildDateAndTime().c_str(), - ESP_getBootVersion(), ESP.getSdkVersion(), + my_version, my_image, GetBuildDateAndTime().c_str() +#ifdef ESP8266 + , ESP.getBootVersion() +#endif + , ESP.getSdkVersion(), GetDeviceHardware().c_str(), GetStatistics().c_str()); MqttPublishPrefixTopic_P(option, PSTR(D_CMND_STATUS "2")); @@ -445,10 +459,18 @@ void CmndStatus(void) if ((0 == payload) || (4 == payload)) { Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS4_MEMORY "\":{\"" D_JSON_PROGRAMSIZE "\":%d,\"" D_JSON_FREEMEMORY "\":%d,\"" D_JSON_HEAPSIZE "\":%d,\"" - D_JSON_PROGRAMFLASHSIZE "\":%d,\"" D_JSON_FLASHSIZE "\":%d,\"" D_JSON_FLASHCHIPID "\":\"%06X\",\"" D_JSON_FLASHMODE "\":%d,\"" + D_JSON_PROGRAMFLASHSIZE "\":%d,\"" D_JSON_FLASHSIZE "\":%d" +#ifdef ESP8266 + ",\"" D_JSON_FLASHCHIPID "\":\"%06X\"" +#endif + ",\"" D_JSON_FLASHMODE "\":%d,\"" D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"), ESP_getSketchSize()/1024, ESP.getFreeSketchSpace()/1024, ESP.getFreeHeap()/1024, - ESP.getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024, ESP_getFlashChipId(), ESP.getFlashChipMode(), + ESP.getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024 +#ifdef ESP8266 + , ESP.getFlashChipId() +#endif + , ESP.getFlashChipMode(), LANGUAGE_LCID, feature_drv1, feature_drv2, feature_sns1, feature_sns2, feature5, feature6); XsnsDriverState(); ResponseAppend_P(PSTR(",\"Sensors\":")); diff --git a/tasmota/support_esp32.ino b/tasmota/support_esp32.ino index d9f6ab390..14ce6ac82 100644 --- a/tasmota/support_esp32.ino +++ b/tasmota/support_esp32.ino @@ -17,6 +17,48 @@ along with this program. If not, see . */ +/*********************************************************************************************\ + * ESP8266 Support +\*********************************************************************************************/ + +#ifdef ESP8266 + +extern "C" { +extern struct rst_info resetInfo; +} + +uint32_t ESP_ResetInfoReason(void) +{ + return resetInfo.reason; +} + +String ESP_getResetReason(void) +{ + return ESP.getResetReason(); +} + +uint32_t ESP_getChipId(void) +{ + return ESP.getChipId(); +} + +uint32_t ESP_getSketchSize(void) +{ + return ESP.getSketchSize(); +} + +void ESP_Restart(void) +{ +// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 + ESP.reset(); +} + +#endif + +/*********************************************************************************************\ + * ESP32 Support +\*********************************************************************************************/ + #ifdef ESP32 #include @@ -82,16 +124,6 @@ void SettingsWrite(const void *pSettings, unsigned nSettingsLen) NvmSave("main", "Settings", pSettings, nSettingsLen); } -void SettingsLoadUpg(void *pSettings, unsigned nSettingsLen) -{ - NvmLoad("upg", "Settings", pSettings, nSettingsLen); -} - -void SettingsLoadUpgH(void *pSettings, unsigned nSettingsLen) -{ - NvmLoad("upg", "SettingsH", pSettings, nSettingsLen); -} - void QPCRead(void *pSettings, unsigned nSettingsLen) { NvmLoad("qpc", "pcreg", pSettings, nSettingsLen); @@ -184,4 +216,69 @@ void DisableBrownout(void) WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // Disable brownout detector } +// +// ESP32 Alternatives +// + +String ESP32GetResetReason(uint32_t cpu_no) +{ + // tools\sdk\include\esp32\rom\rtc.h + switch (rtc_get_reset_reason( (RESET_REASON) cpu_no)) { + case POWERON_RESET : return F("Vbat power on reset"); // 1 + case SW_RESET : return F("Software reset digital core"); // 3 + case OWDT_RESET : return F("Legacy watch dog reset digital core"); // 4 + case DEEPSLEEP_RESET : return F("Deep Sleep reset digital core"); // 5 + case SDIO_RESET : return F("Reset by SLC module, reset digital core"); // 6 + case TG0WDT_SYS_RESET : return F("Timer Group0 Watch dog reset digital core"); // 7 + case TG1WDT_SYS_RESET : return F("Timer Group1 Watch dog reset digital core"); // 8 + case RTCWDT_SYS_RESET : return F("RTC Watch dog Reset digital core"); // 9 + case INTRUSION_RESET : return F("Instrusion tested to reset CPU"); // 10 + case TGWDT_CPU_RESET : return F("Time Group reset CPU"); // 11 + case SW_CPU_RESET : return F("Software reset CPU"); // 12 + case RTCWDT_CPU_RESET : return F("RTC Watch dog Reset CPU"); // 13 + case EXT_CPU_RESET : return F("or APP CPU, reseted by PRO CPU"); // 14 + case RTCWDT_BROWN_OUT_RESET : return F("Reset when the vdd voltage is not stable"); // 15 + case RTCWDT_RTC_RESET : return F("RTC Watch dog reset digital core and rtc module"); // 16 + default : return F("NO_MEAN"); // 0 + } +} + +String ESP_getResetReason(void) +{ + return ESP32GetResetReason(0); // CPU 0 +} + +uint32_t ESP_ResetInfoReason(void) +{ + RESET_REASON reason = rtc_get_reset_reason(0); + if (POWERON_RESET == reason) { return REASON_DEFAULT_RST; } + if (SW_CPU_RESET == reason) { return REASON_SOFT_RESTART; } + if (DEEPSLEEP_RESET == reason) { return REASON_DEEP_SLEEP_AWAKE; } + if (SW_RESET == reason) { return REASON_EXT_SYS_RST; } +} + +uint32_t ESP_getChipId(void) +{ + uint32_t id = 0; + for (uint32_t i = 0; i < 17; i = i +8) { + id |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i; + } + return id; +} + +uint32_t ESP_getSketchSize(void) +{ + static uint32_t sketchsize = 0; + + if (!sketchsize) { + sketchsize = ESP.getSketchSize(); // This takes almost 2 seconds on an ESP32 + } + return sketchsize; +} + +void ESP_Restart(void) +{ + ESP.restart(); +} + #endif // ESP32 diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 18c026562..4648db9a1 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -708,8 +708,7 @@ void EspRestart(void) ResetPwm(); WifiShutdown(true); CrashDumpClear(); // Clear the stack dump in RTC -// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 - ESP_reset(); + ESP_Restart(); } #ifndef ARDUINO_ESP8266_RELEASE_2_3_0 diff --git a/tasmota/tasmota_compat.h b/tasmota/tasmota_compat.h index 5119c9021..598ca5619 100644 --- a/tasmota/tasmota_compat.h +++ b/tasmota/tasmota_compat.h @@ -2,7 +2,6 @@ #ifdef ESP32 #include -#define PACKED __attribute((__packed__)) // Modul #undef MODULE #define MODULE WEMOS // [Module] Select default model @@ -10,13 +9,6 @@ #ifdef ESP8266 // ESP8266 -#define PACKED -#define ESP_getResetReason() ESP.getResetReason() -#define ESP_reset() ESP.reset() -#define ESP_getBootVersion() ESP.getBootVersion() -#define ESP_getFlashChipId() ESP.getFlashChipId() -#define ESP_getSketchSize() ESP.getSketchSize() -#define ESP_getChipId() ESP.getChipId() // // UDP #define PortUdp_write(p,n) PortUdp.write(p, n) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 1a54edb76..693a8f1a7 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2123,7 +2123,11 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1" D_BUILD_DATE_AND_TIME "}2%s"), GetBuildDateAndTime().c_str()); WSContentSend_P(PSTR("}1" D_CORE_AND_SDK_VERSION "}2" ARDUINO_CORE_RELEASE "/%s"), ESP.getSdkVersion()); WSContentSend_P(PSTR("}1" D_UPTIME "}2%s"), GetUptime().c_str()); +#ifdef ESP8266 WSContentSend_P(PSTR("}1" D_FLASH_WRITE_COUNT "}2%d at 0x%X"), Settings.save_flag, GetSettingsAddress()); +#else + WSContentSend_P(PSTR("}1" D_FLASH_WRITE_COUNT "}2%d"), Settings.save_flag); +#endif WSContentSend_P(PSTR("}1" D_BOOT_COUNT "}2%d"), Settings.bootcount); WSContentSend_P(PSTR("}1" D_RESTART_REASON "}2%s"), GetResetReason().c_str()); uint32_t maxfn = (devices_present > MAX_FRIENDLYNAMES) ? MAX_FRIENDLYNAMES : devices_present; @@ -2197,7 +2201,9 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1}2 ")); // Empty line WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d"), ESP_getChipId()); - WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP_getFlashChipId()); +#ifdef ESP8266 + WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP.getFlashChipId()); +#endif WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%dkB"), ESP.getFlashChipRealSize() / 1024); WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%dkB"), ESP.getFlashChipSize() / 1024); WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%dkB"), ESP_getSketchSize() / 1024);