M module-bsp/board/linux/lpm/LinuxLPM.cpp => module-bsp/board/linux/lpm/LinuxLPM.cpp +3 -0
@@ 25,6 25,9 @@ namespace bsp
currentFrequency = freq;
}
+ void LinuxLPM::SetHighestCoreVoltage()
+ {}
+
uint32_t LinuxLPM::GetCpuFrequency() const noexcept
{
return 0;
M module-bsp/board/linux/lpm/LinuxLPM.h => module-bsp/board/linux/lpm/LinuxLPM.h +1 -0
@@ 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;
};
M module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp => module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.cpp +7 -1
@@ 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
M module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp => module-bsp/board/rt1051/bsp/lpm/CpuFreqLPM.hpp +2 -1
@@ 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
M module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPM.cpp +5 -0
@@ 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();
M module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPM.hpp +1 -0
@@ 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;
M module-bsp/bsp/lpm/bsp_lpm.hpp => module-bsp/bsp/lpm/bsp_lpm.hpp +1 -0
@@ 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;
M module-sys/SystemManager/PowerManager.cpp => module-sys/SystemManager/PowerManager.cpp +5 -2
@@ 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