~aleteoryx/muditaos

619685d70acba6f2d00eaf751bad4f248990f824 — Maciej Gibowicz 3 years ago 3811b1a
[MOS-339] Fix rapid change of CPU frequency

After disconnecting the USB cable, the CPU consumption
increased to over 80% (for 4 MHz), which resulted
in a cyclical change in the CPU frequency and finally
a much shorter battery life.
M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +7 -9
@@ 47,13 47,12 @@ bool WorkerDesktop::init(std::list<sys::WorkerQueueInfo> queues)
    auto sentinelRegistrationMsg = std::make_shared<sys::SentinelRegistrationMessage>(cpuSentinel);
    ownerService->bus.sendUnicast(sentinelRegistrationMsg, service::name::system_manager);

    usbSuspendTimer = sys::TimerFactory::createSingleShotTimer(
        ownerService, "usbSuspend", constants::usbSuspendTimeout, [this](sys::Timer &) { suspendUsb(); });

    bsp::usbInitParams initParams = {receiveQueue, irqQueue, serialNumber.c_str()};

    initialized = bsp::usbInit(initParams) >= 0;

    cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyMHz::Level_4);

    return initialized;
}



@@ 76,11 75,14 @@ void WorkerDesktop::closeWorker(void)

    this->close();

    cpuSentinel->ReleaseMinimumFrequency();
    auto sentinelRemoveMsg = std::make_shared<sys::SentinelRemovalMessage>("WorkerDesktop");
    ownerService->bus.sendUnicast(sentinelRemoveMsg, service::name::system_manager);
    auto result            = ownerService->bus.sendUnicastSync(sentinelRemoveMsg, service::name::system_manager, 1000);
    if (result.first != sys::ReturnCodes::Success) {
        LOG_ERROR("Sentinel %s could not be removed!", cpuSentinel->GetName().c_str());
    }
    cpuSentinel.reset();

    usbSuspendTimer.reset();
    LOG_DEBUG("deinit end");
    initialized = false;
}


@@ 151,13 153,11 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
        LOG_DEBUG("USB status: %d", static_cast<int>(notification));

        if (notification == bsp::USBDeviceStatus::Connected) {
            usbSuspendTimer.stop();
            ownerService->bus.sendMulticast(std::make_shared<sdesktop::usb::USBConnected>(),
                                            sys::BusChannel::USBNotifications);
            usbStatus = bsp::USBDeviceStatus::Connected;
        }
        else if (notification == bsp::USBDeviceStatus::Configured) {
            cpuSentinel->HoldMinimumFrequency(bsp::CpuFrequencyMHz::Level_4);
            if (usbStatus == bsp::USBDeviceStatus::Connected) {
                ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBConfigured>(
                                                  sdesktop::usb::USBConfigurationType::firstConfiguration),


@@ 171,8 171,6 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
            usbStatus = bsp::USBDeviceStatus::Configured;
        }
        else if (notification == bsp::USBDeviceStatus::Disconnected) {
            usbSuspendTimer.start();
            cpuSentinel->ReleaseMinimumFrequency();
            ownerService->bus.sendMulticast(std::make_shared<sdesktop::usb::USBDisconnected>(),
                                            sys::BusChannel::USBNotifications);
            usbStatus = bsp::USBDeviceStatus::Disconnected;

M module-services/service-desktop/WorkerDesktop.hpp => module-services/service-desktop/WorkerDesktop.hpp +0 -1
@@ 51,7 51,6 @@ class WorkerDesktop : public sys::Worker
    const std::string serialNumber;
    sys::Service *ownerService = nullptr;
    sdesktop::endpoints::StateMachine parser;
    sys::TimerHandle usbSuspendTimer;
    bsp::USBDeviceStatus usbStatus = bsp::USBDeviceStatus::Disconnected;

    std::shared_ptr<sys::CpuSentinel> cpuSentinel;

M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +1 -1
@@ 608,7 608,7 @@ namespace sys
            auto msg = static_cast<sys::SentinelRemovalMessage *>(message);
            powerManager->RemoveSentinel(msg->getSentinelName());

            return sys::MessageNone{};
            return std::make_shared<sys::ResponseMessage>();
        });

        connect(typeid(sys::HoldCpuFrequencyMessage), [this](sys::Message *message) -> sys::MessagePointer {

M third-party/usb_stack => third-party/usb_stack +1 -1
@@ 1,1 1,1 @@
Subproject commit 7321e1f348b09234c57ba2b64edcbc1caabfeb01
Subproject commit 42f05834a8b1798b2bcf0e9ccee736d821edf1a5