~aleteoryx/muditaos

0c098808e8f7456d27d882205f5fbfe38febeeb5 — Wojtek Rzepecki 5 years ago 2a29e27
[EGD-5660] Add PWM Cpu sentinel

Change of PWM frequency due
to main clock change in low
power operation.
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(&timestamp);
    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){};