From 40626509255d46b53c8b91aaf321ee50f6e54b1e Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 00:36:58 +0100 Subject: [PATCH 1/9] At least the F_CPU define in host mock.h is needed by host Arduino.h - need to include Arduino.h further down in mock.h for this to work. --- tests/host/common/mock.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index 27a2da4c42..b9fce38cc9 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -84,10 +84,6 @@ typedef uint32_t uint32; // -#include - -// - #include #define RANDOM_REG32 ((uint32_t)random()) @@ -168,6 +164,10 @@ void mock_stop_littlefs (); // +#include + +// + #include // From eba004216f1f4958be0fced10c36cf9939710c4b Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Wed, 27 Nov 2019 11:10:54 +0100 Subject: [PATCH 2/9] Geting the include order right --- tests/host/common/mock.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/host/common/mock.h b/tests/host/common/mock.h index b9fce38cc9..27a2da4c42 100644 --- a/tests/host/common/mock.h +++ b/tests/host/common/mock.h @@ -84,6 +84,10 @@ typedef uint32_t uint32; // +#include + +// + #include #define RANDOM_REG32 ((uint32_t)random()) @@ -164,10 +168,6 @@ void mock_stop_littlefs (); // -#include - -// - #include // From 26f6ac8c4b607c0c86a65bca5e5c8e1932e515c5 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sun, 24 Nov 2019 23:09:56 +0100 Subject: [PATCH 3/9] According to leading core developer, runtime CPU frequency switch is unsupported, anyway. --- cores/esp8266/Esp.cpp | 5 ----- cores/esp8266/Esp.h | 11 +++++++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index 21ffe880ec..ad0d297ad1 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -264,11 +264,6 @@ uint8_t EspClass::getBootMode(void) return system_get_boot_mode(); } -uint8_t EspClass::getCpuFreqMHz(void) -{ - return system_get_cpu_freq(); -} - uint32_t EspClass::getFlashChipId(void) { diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index f4529c839a..f1e6a4becd 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -157,7 +157,12 @@ class EspClass { uint8_t getBootVersion(); uint8_t getBootMode(); +#ifndef CORE_MOCK + inline uint8_t getCpuFreqMHz() __attribute__((always_inline)); +#else uint8_t getCpuFreqMHz(); +#endif + uint32_t getFlashChipId(); uint8_t getFlashChipVendorId(); @@ -201,6 +206,12 @@ class EspClass { }; #ifndef CORE_MOCK + +uint8_t EspClass::getCpuFreqMHz() +{ + return clockCyclesPerMicrosecond(); +} + uint32_t EspClass::getCycleCount() { return esp_get_cycle_count(); From 689187fc31122022243483f7613f47ab1f531e7f Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Mon, 25 Nov 2019 15:05:28 +0100 Subject: [PATCH 4/9] Prepare for runtime CPU clock rate selection --- cores/esp8266/Esp.h | 4 ++++ cores/esp8266/core_esp8266_main.cpp | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index f1e6a4becd..36f279d767 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -209,7 +209,11 @@ class EspClass { uint8_t EspClass::getCpuFreqMHz() { +#if defined(F_CPU) return clockCyclesPerMicrosecond(); +#elif !defined(F_CPU) + return system_get_cpu_freq(); +#endif } uint32_t EspClass::getCycleCount() diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index a95c4b2c11..1e72e661a5 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -81,14 +81,17 @@ void initVariant() __attribute__((weak)); void initVariant() { } -void preloop_update_frequency() __attribute__((weak)); -void preloop_update_frequency() { +extern "C" void __preloop_update_frequency() { #if defined(F_CPU) && (F_CPU == 160000000L) - REG_SET_BIT(0x3ff00014, BIT(0)); ets_update_cpu_frequency(160); + REG_SET_BIT(0x3ff00014, BIT(0)); +#elif !defined(F_CPU) + if (system_get_cpu_freq() == 160) REG_SET_BIT(0x3ff00014, BIT(0)); #endif } +extern "C" void preloop_update_frequency() __attribute__((weak, alias("__preloop_update_frequency"))); + extern "C" bool can_yield() { return cont_can_yield(g_pcont); } From 426884e843dc1111a4ac61f9a968da9136449943 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 26 Nov 2019 13:23:15 +0100 Subject: [PATCH 5/9] Fix compile for not defined F_CPU If defined F_CPU, make getCpuFreqMHz() a constexpr --- cores/esp8266/Esp.cpp | 6 ++++++ cores/esp8266/Esp.h | 16 +++++----------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cores/esp8266/Esp.cpp b/cores/esp8266/Esp.cpp index ad0d297ad1..db29ec599c 100644 --- a/cores/esp8266/Esp.cpp +++ b/cores/esp8266/Esp.cpp @@ -264,6 +264,12 @@ uint8_t EspClass::getBootMode(void) return system_get_boot_mode(); } +#ifndef F_CPU +uint8_t EspClass::getCpuFreqMHz(void) +{ + return system_get_cpu_freq(); +} +#endif uint32_t EspClass::getFlashChipId(void) { diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 36f279d767..ac9b38faca 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -157,8 +157,11 @@ class EspClass { uint8_t getBootVersion(); uint8_t getBootMode(); -#ifndef CORE_MOCK - inline uint8_t getCpuFreqMHz() __attribute__((always_inline)); +#if !defined(CORE_MOCK) && defined(F_CPU) + constexpr uint8_t getCpuFreqMHz() const + { + return clockCyclesPerMicrosecond(); + } #else uint8_t getCpuFreqMHz(); #endif @@ -207,15 +210,6 @@ class EspClass { #ifndef CORE_MOCK -uint8_t EspClass::getCpuFreqMHz() -{ -#if defined(F_CPU) - return clockCyclesPerMicrosecond(); -#elif !defined(F_CPU) - return system_get_cpu_freq(); -#endif -} - uint32_t EspClass::getCycleCount() { return esp_get_cycle_count(); From 9968a629f88b1beef0d980c73d26b3eee6e16156 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 26 Nov 2019 14:01:18 +0100 Subject: [PATCH 6/9] Use defines for register CPU2X instead of hex value Prepare PolledTimeout for dynamic CPU frequency - would fail to compile if F_CPU is not defined, helps as marker that something needs to be done. --- cores/esp8266/PolledTimeout.h | 2 +- cores/esp8266/core_esp8266_main.cpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/PolledTimeout.h b/cores/esp8266/PolledTimeout.h index fe9c9ca4bc..715564a8e7 100644 --- a/cores/esp8266/PolledTimeout.h +++ b/cores/esp8266/PolledTimeout.h @@ -76,7 +76,7 @@ struct TimeSourceCycles using timeType = decltype(ESP.getCycleCount()); static timeType time() {return ESP.getCycleCount();} - static constexpr timeType ticksPerSecond = F_CPU; // 80'000'000 or 160'000'000 Hz + static constexpr timeType ticksPerSecond = ESP.getCpuFreqMHz() * 1000000UL; // 80'000'000 or 160'000'000 Hz static constexpr timeType ticksPerSecondMax = 160000000; // 160MHz }; diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index 1e72e661a5..dff0c63780 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -84,9 +84,11 @@ void initVariant() { extern "C" void __preloop_update_frequency() { #if defined(F_CPU) && (F_CPU == 160000000L) ets_update_cpu_frequency(160); - REG_SET_BIT(0x3ff00014, BIT(0)); + CPU2X |= 1; #elif !defined(F_CPU) - if (system_get_cpu_freq() == 160) REG_SET_BIT(0x3ff00014, BIT(0)); + if (system_get_cpu_freq() == 160) { + CPU2X |= 1; + } #endif } From 08927ba4d0558b728dc21cbb57d848876e4c3ed2 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 26 Nov 2019 14:52:47 +0100 Subject: [PATCH 7/9] Fix build for host - getCpuFreqMHz there was also in conflict with getCycleCount, using F_CPU: tests/host/common/mock.h:#define F_CPU 80000000 (!) --- cores/esp8266/Esp.h | 3 +-- tests/host/common/MockEsp.cpp | 5 ----- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index ac9b38faca..5bc3e2101c 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -157,7 +157,7 @@ class EspClass { uint8_t getBootVersion(); uint8_t getBootMode(); -#if !defined(CORE_MOCK) && defined(F_CPU) +#if defined(F_CPU) constexpr uint8_t getCpuFreqMHz() const { return clockCyclesPerMicrosecond(); @@ -166,7 +166,6 @@ class EspClass { uint8_t getCpuFreqMHz(); #endif - uint32_t getFlashChipId(); uint8_t getFlashChipVendorId(); diff --git a/tests/host/common/MockEsp.cpp b/tests/host/common/MockEsp.cpp index c5ca502eda..0854bdcd7d 100644 --- a/tests/host/common/MockEsp.cpp +++ b/tests/host/common/MockEsp.cpp @@ -118,11 +118,6 @@ uint32_t EspClass::getFreeSketchSpace() return 4 * 1024 * 1024; } -uint8_t EspClass::getCpuFreqMHz() -{ - return F_CPU / 1000000; -} - const char *EspClass::getSdkVersion() { return "2.5.0"; From 7210ad37d10ec926f2240549c82a9a3fd0eb7948 Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Tue, 26 Nov 2019 16:19:39 +0100 Subject: [PATCH 8/9] Asymmetrical includes and defines on host --- cores/esp8266/Esp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cores/esp8266/Esp.h b/cores/esp8266/Esp.h index 5bc3e2101c..01327747ef 100644 --- a/cores/esp8266/Esp.h +++ b/cores/esp8266/Esp.h @@ -157,7 +157,7 @@ class EspClass { uint8_t getBootVersion(); uint8_t getBootMode(); -#if defined(F_CPU) +#if defined(F_CPU) || defined(CORE_MOCK) constexpr uint8_t getCpuFreqMHz() const { return clockCyclesPerMicrosecond(); From f719bb2f8074d72bb1966a09452df61ec3fd348b Mon Sep 17 00:00:00 2001 From: "Dirk O. Kaar" Date: Sat, 11 Apr 2020 21:20:09 +0200 Subject: [PATCH 9/9] Support restart switch from 160MHz to 80MHz, e.g for OTA. Fixes #579 --- cores/esp8266/core_esp8266_main.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/core_esp8266_main.cpp b/cores/esp8266/core_esp8266_main.cpp index dff0c63780..0ec4f1f3b9 100644 --- a/cores/esp8266/core_esp8266_main.cpp +++ b/cores/esp8266/core_esp8266_main.cpp @@ -84,10 +84,16 @@ void initVariant() { extern "C" void __preloop_update_frequency() { #if defined(F_CPU) && (F_CPU == 160000000L) ets_update_cpu_frequency(160); - CPU2X |= 1; + CPU2X |= 1UL; +#elif defined(F_CPU) + ets_update_cpu_frequency(80); + CPU2X &= ~1UL; #elif !defined(F_CPU) if (system_get_cpu_freq() == 160) { - CPU2X |= 1; + CPU2X |= 1UL; + } + else { + CPU2X &= ~1UL; } #endif }