M module-bsp/board/linux/eink_frontlight/eink_frontlight.cpp => module-bsp/board/linux/eink_frontlight/eink_frontlight.cpp +3 -0
@@ 23,4 23,7 @@ namespace bsp::eink_frontlight
void setGammaFactor(float)
{}
+ void updateClockFrequency(CpuFrequencyHz newFrequency)
+ {}
+
} // namespace bsp::eink_frontlight
M module-bsp/board/rt1051/bsp/eink_frontlight/eink_frontlight.cpp => module-bsp/board/rt1051/bsp/eink_frontlight/eink_frontlight.cpp +5 -0
@@ 60,4 60,9 @@ namespace bsp::eink_frontlight
gammaFactor = gamma;
}
+ void updateClockFrequency(CpuFrequencyHz newFrequency)
+ {
+ pwm->UpdateClockFrequency(static_cast<std::uint32_t>(newFrequency));
+ }
+
} // namespace bsp::eink_frontlight
M module-bsp/board/rt1051/drivers/RT1051DriverPWM.cpp => module-bsp/board/rt1051/drivers/RT1051DriverPWM.cpp +18 -8
@@ 59,7 59,7 @@ namespace drivers
PWM_GetDefaultConfig(&pwmConfig);
PWM_Init(base, pwmModule, &pwmConfig);
- SetupPWMChannel(parameters.channel, parameters.frequency);
+ SetupPWMChannel(parameters.channel);
Start();
}
@@ 69,13 69,13 @@ namespace drivers
LOG_DEBUG("Deinit: PWM");
}
- void RT1051DriverPWM::SetDutyCycle(std::uint8_t duty_cycle_percent)
+ void RT1051DriverPWM::SetDutyCycle(std::uint8_t dutyCyclePercent)
{
- cpp_freertos::LockGuard lock(dutyCycleMutex);
pwm_mode_t pwmMode = kPWM_SignedCenterAligned;
std::uint8_t dutyCycle =
- std::clamp(duty_cycle_percent, static_cast<std::uint8_t>(0), static_cast<std::uint8_t>(100));
+ std::clamp(dutyCyclePercent, static_cast<std::uint8_t>(0), static_cast<std::uint8_t>(100));
+
PWM_UpdatePwmDutycycle(base, pwmModule, pwmSignalConfig.pwmChannel, pwmMode, dutyCycle);
PWM_SetPwmLdok(base, 1 << pwmModule, true);
}
@@ 92,7 92,7 @@ namespace drivers
ForceLowOutput();
}
- void RT1051DriverPWM::SetupPWMChannel(PWMChannel channel, std::uint32_t pwm_frequency)
+ void RT1051DriverPWM::SetupPWMChannel(PWMChannel channel)
{
switch (parameters.channel) {
case PWMChannel::A:
@@ 111,9 111,7 @@ namespace drivers
// Currently connected to IPbus clock
const auto clockSource = CLOCK_GetFreq(kCLOCK_IpgClk);
- pwm_mode_t pwmMode = kPWM_SignedCenterAligned;
-
- PWM_SetupPwm(base, pwmModule, &pwmSignalConfig, 1, pwmMode, pwm_frequency, clockSource);
+ SetupPWMInstance(clockSource);
PWM_SetupFaultDisableMap(base, pwmModule, pwmSignalConfig.pwmChannel, kPWM_faultchannel_0, 0);
@@ 122,6 120,12 @@ namespace drivers
base->SM[pwmModule].CTRL2 |= PWM_CTRL2_FRCEN(1U);
}
+ void RT1051DriverPWM::SetupPWMInstance(std::uint32_t clockFrequency)
+ {
+ pwm_mode_t pwmMode = kPWM_SignedCenterAligned;
+ PWM_SetupPwm(base, pwmModule, &pwmSignalConfig, 1, pwmMode, parameters.frequency, clockFrequency);
+ }
+
void RT1051DriverPWM::ForceLowOutput()
{
PWM_SetupForceSignal(base, pwmModule, pwmSignalConfig.pwmChannel, kPWM_SoftwareControl);
@@ 134,4 138,10 @@ namespace drivers
base->SM[pwmModule].CTRL2 |= PWM_CTRL2_FORCE(1U);
}
+ void RT1051DriverPWM::UpdateClockFrequency(std::uint32_t newFrequency)
+ {
+ cpp_freertos::LockGuard lock(frequencyChangeMutex);
+ SetupPWMInstance(newFrequency);
+ }
+
} // namespace drivers
M module-bsp/board/rt1051/drivers/RT1051DriverPWM.hpp => module-bsp/board/rt1051/drivers/RT1051DriverPWM.hpp +7 -3
@@ 19,14 19,18 @@ namespace drivers
~RT1051DriverPWM() final;
- void SetDutyCycle(std::uint8_t duty_cycle_percent) final;
+ void SetDutyCycle(std::uint8_t dutyCyclePercent) final;
void Start() final;
void Stop() final;
+ void UpdateClockFrequency(std::uint32_t newFrequency) final;
+
private:
- void SetupPWMChannel(PWMChannel channel, std::uint32_t frequency);
+ void SetupPWMChannel(PWMChannel channel);
+
+ void SetupPWMInstance(std::uint32_t clockFrequency);
void ForceLowOutput();
@@ 44,7 48,7 @@ namespace drivers
std::uint8_t lastDutyCycle = 0;
- cpp_freertos::MutexStandard dutyCycleMutex;
+ cpp_freertos::MutexStandard frequencyChangeMutex;
};
} // namespace drivers
M module-bsp/bsp/eink_frontlight/eink_frontlight.hpp => module-bsp/bsp/eink_frontlight/eink_frontlight.hpp +2 -0
@@ 29,4 29,6 @@ namespace bsp::eink_frontlight
void turnOff();
void setGammaFactor(float gamma);
+
+ void updateClockFrequency(CpuFrequencyHz newFrequency);
} // namespace bsp::eink_frontlight
M module-bsp/drivers/pwm/DriverPWM.hpp => module-bsp/drivers/pwm/DriverPWM.hpp +2 -0
@@ 57,6 57,8 @@ namespace drivers
virtual void Stop() = 0;
+ virtual void UpdateClockFrequency(std::uint32_t) = 0;
+
protected:
PWMInstances instance;
PWMModules module;
M module-services/service-evtmgr/WorkerEvent.cpp => module-services/service-evtmgr/WorkerEvent.cpp +14 -0
@@ 29,6 29,7 @@
#include <service-desktop/Constants.hpp>
#include <service-desktop/DesktopMessages.hpp>
#include <SystemManager/SystemManager.hpp>
+#include <SystemManager/messages/SentinelRegistrationMessage.hpp>
extern "C"
{
@@ 221,6 222,14 @@ bool WorkerEvent::init(std::list<sys::WorkerQueueInfo> queuesList)
bsp::rtc_GetCurrentTimestamp(×tamp);
bsp::rtc_SetMinuteAlarm(timestamp);
+ cpuSentinel = std::make_shared<sys::CpuSentinel>(
+ service::name::evt_manager, service, [this](bsp::CpuFrequencyHz newFrequency) {
+ updateResourcesAfterCpuFrequencyChange(newFrequency);
+ });
+
+ auto sentinelRegistrationMsg = std::make_shared<sys::SentinelRegistrationMessage>(cpuSentinel);
+ service->bus.sendUnicast(std::move(sentinelRegistrationMsg), service::name::system_manager);
+
return true;
}
@@ 247,6 256,11 @@ bool WorkerEvent::deinit(void)
return true;
}
+void WorkerEvent::updateResourcesAfterCpuFrequencyChange(bsp::CpuFrequencyHz newFrequency)
+{
+ bsp::eink_frontlight::updateClockFrequency(newFrequency);
+}
+
void WorkerEvent::processKeyEvent(bsp::KeyEvents event, bsp::KeyCodes code)
{
auto message = std::make_shared<sevm::KbdMessage>();
M module-services/service-evtmgr/screen-light-control/ScreenLightControl.cpp => module-services/service-evtmgr/screen-light-control/ScreenLightControl.cpp +1 -1
@@ 175,7 175,7 @@ namespace screen_light_control
{
bsp::eink_frontlight::turnOn();
bsp::light_sensor::wakeup();
- if (automaticMode) {
+ if (automaticMode == ScreenLightMode::Automatic) {
enableTimers();
}
lightOn = true;
M module-services/service-evtmgr/service-evtmgr/WorkerEvent.hpp => module-services/service-evtmgr/service-evtmgr/WorkerEvent.hpp +4 -0
@@ 11,6 11,7 @@
#include <bsp/common.hpp>
#include <bsp/keyboard/key_codes.hpp>
#include <bsp/keyboard/key_codes.hpp>
+#include <Service/CpuSentinel.hpp>
#include <cstdint>
#include <list>
@@ 52,6 53,8 @@ class WorkerEvent : public sys::Worker
* @note It sends message to service if event is processed successfully.
*/
void processKeyEvent(bsp::KeyEvents event, bsp::KeyCodes code);
+
+ void updateResourcesAfterCpuFrequencyChange(bsp::CpuFrequencyHz newFrequency);
/**
* @brief list of keys with long press enabled. First item is key code, second is long press time.
*/
@@ 60,6 63,7 @@ class WorkerEvent : public sys::Worker
bsp::KeyEvents lastState = bsp::KeyEvents::Released;
bsp::KeyCodes lastPressed = static_cast<bsp::KeyCodes>(0);
sys::Service *service = nullptr;
+ std::shared_ptr<sys::CpuSentinel> cpuSentinel;
public:
WorkerEvent(sys::Service *service) : sys::Worker(service), service(service){};