From b19ddb719e89470fc5b531e73fbe7034db4b4142 Mon Sep 17 00:00:00 2001 From: Wojtek Rzepecki Date: Tue, 13 Jul 2021 16:09:37 +0200 Subject: [PATCH] [EGD-6928] Fix system powe instability Improved frequency switching mechanism --- module-bsp/board/linux/lpm/LinuxLPM.cpp | 3 +++ module-bsp/board/linux/lpm/LinuxLPM.h | 1 + module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp | 8 +++++++- module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp | 3 ++- module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp | 5 +++++ module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp | 1 + module-bsp/bsp/lpm/bsp_lpm.hpp | 1 + module-sys/SystemManager/PowerManager.cpp | 7 +++++-- 8 files changed, 25 insertions(+), 4 deletions(-) diff --git a/module-bsp/board/linux/lpm/LinuxLPM.cpp b/module-bsp/board/linux/lpm/LinuxLPM.cpp index daa8e215ebe61340b4f04683eb7cc1ecda92f487..7ddee932e29f4e6b5b3beb2ab090adfc490bbc21 100644 --- a/module-bsp/board/linux/lpm/LinuxLPM.cpp +++ b/module-bsp/board/linux/lpm/LinuxLPM.cpp @@ -25,6 +25,9 @@ namespace bsp currentFrequency = freq; } + void LinuxLPM::SetHighestCoreVoltage() + {} + uint32_t LinuxLPM::GetCpuFrequency() const noexcept { return 0; diff --git a/module-bsp/board/linux/lpm/LinuxLPM.h b/module-bsp/board/linux/lpm/LinuxLPM.h index 512807298c4d2d5747278c0d224d79da785147e7..2f61a31205a1a88d09c65a768d760c84ec87f158 100644 --- a/module-bsp/board/linux/lpm/LinuxLPM.h +++ b/module-bsp/board/linux/lpm/LinuxLPM.h @@ -15,6 +15,7 @@ namespace bsp int32_t PowerOff() override final; int32_t Reboot(RebootType reason) override final; void SetCpuFrequency(CpuFrequencyHz freq) final; + void SetHighestCoreVoltage() final; [[nodiscard]] uint32_t GetCpuFrequency() const noexcept final; void SwitchOscillatorSource(OscillatorSource source) final; }; diff --git a/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp b/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp index 11a43319b7889212bb575b45c690c9cd7c86d09c..019a5c00b83ea57d12e7a2958ece4cdd1c8fceaa 100644 --- a/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp +++ b/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "CpuFreqLPM.hpp" @@ -65,4 +65,10 @@ namespace bsp /* Set SystemCoreClock variable. */ SystemCoreClockUpdate(); } + + void CpuFreqLPM::SetHighestCoreVoltage() + { + DCDC_AdjustTargetVoltage(DCDC, VDDRun_1275_mV, VDDStandby_925_mV); + } + } // namespace bsp diff --git a/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp b/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp index 20b494337a0560a3d401849020614cd460e643b3..a94bd03987126ec862aadd345730e9c4bec374bd 100644 --- a/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp +++ b/module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp @@ -1,4 +1,4 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #ifndef PUREPHONE_CPUFREQLPM_HPP @@ -33,6 +33,7 @@ namespace bsp CpuFreqLPM(); void SetCpuFrequency(CpuClock freq); + void SetHighestCoreVoltage(); }; } // namespace bsp diff --git a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp index 3b293f330c826909233ca58f4782e3e90869af57..a46771f42871df1217b986ee57b02e6c02481409 100644 --- a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp +++ b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp @@ -92,6 +92,11 @@ namespace bsp LOG_INFO("CPU frequency changed to %lu", CLOCK_GetFreq(kCLOCK_CpuClk)); } + void RT1051LPM::SetHighestCoreVoltage() + { + CpuFreq->SetHighestCoreVoltage(); + } + uint32_t RT1051LPM::GetCpuFrequency() const noexcept { return CLOCK_GetCpuClkFreq(); diff --git a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp index 8a1eaefcbb1bf2a98538cfcfbb4bc6dd53bb910f..ffb26d3bc4a4415821f287374b964793c7341e59 100644 --- a/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp +++ b/module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp @@ -17,6 +17,7 @@ namespace bsp int32_t PowerOff() override final; int32_t Reboot(RebootType reason) override final; void SetCpuFrequency(CpuFrequencyHz freq) final; + void SetHighestCoreVoltage() final; [[nodiscard]] uint32_t GetCpuFrequency() const noexcept final; void SwitchOscillatorSource(OscillatorSource source) final; diff --git a/module-bsp/bsp/lpm/bsp_lpm.hpp b/module-bsp/bsp/lpm/bsp_lpm.hpp index 1dd5c97f9859d3bc63f7dfd19a9311e712d1f430..eb99090ef8f1749770213a7eb371cf7b415a3660 100644 --- a/module-bsp/bsp/lpm/bsp_lpm.hpp +++ b/module-bsp/bsp/lpm/bsp_lpm.hpp @@ -35,6 +35,7 @@ namespace bsp virtual int32_t Reboot(RebootType reason) = 0; virtual void SetCpuFrequency(CpuFrequencyHz freq) = 0; + virtual void SetHighestCoreVoltage() = 0; [[nodiscard]] CpuFrequencyHz GetCurrentFrequencyLevel() const noexcept; [[nodiscard]] virtual uint32_t GetCpuFrequency() const noexcept = 0; diff --git a/module-sys/SystemManager/PowerManager.cpp b/module-sys/SystemManager/PowerManager.cpp index b3a064bd9a32669f9c598a8a95c29b9557c72520..65f95e11a87c165b52ba8ea0d67228357d6a457b 100644 --- a/module-sys/SystemManager/PowerManager.cpp +++ b/module-sys/SystemManager/PowerManager.cpp @@ -75,13 +75,16 @@ namespace sys const auto freq = lowPowerControl->GetCurrentFrequencyLevel(); if (freq == bsp::CpuFrequencyHz::Level_1) { - // switch osc source first + // Switch DCDC to full throttle during oscillator switch + lowPowerControl->SetHighestCoreVoltage(); + // switch oscillator source lowPowerControl->SwitchOscillatorSource(bsp::LowPowerMode::OscillatorSource::External); - // then switch external RAM clock source if (driverSEMC) { driverSEMC->SwitchToPLL2ClockSource(); } + // Add intermediate step in frequency + SetCpuFrequency(bsp::CpuFrequencyHz::Level_4); } // and increase frequency