~aleteoryx/muditaos

6a80654b522edd35706173a3e30a40e71b7c8daf — Maciej Gibowicz 4 years ago fd0d821
[EGD-6457] Add power management for USB

When the USB is disconnected, we turn off the peripherals
by going into the suspend bus mode.
M module-bsp/board/linux/usb_cdc/usb_cdc.cpp => module-bsp/board/linux/usb_cdc/usb_cdc.cpp +5 -0
@@ 155,6 155,11 @@ namespace bsp
        LOG_INFO("usbReinit");
    }

    void usbSuspend()
    {
        LOG_INFO("usbSuspend");
    }

    int usbInit(xQueueHandle receiveQueue, xQueueHandle irqQueue, USBDeviceListener *)
    {


M module-bsp/board/rt1051/bsp/usb => module-bsp/board/rt1051/bsp/usb +1 -1
@@ 1,1 1,1 @@
Subproject commit 07460ac1a8e2f6234d2492c842e22b28e4363d84
Subproject commit f77faf3a05c0fc92df0c858a31c14c1e24bb4e7e

M module-bsp/bsp/usb/usb.hpp => module-bsp/bsp/usb/usb.hpp +1 -0
@@ 45,5 45,6 @@ namespace bsp
    int usbCDCSendRaw(const char *dataPtr, size_t dataLen);
    void usbDeinit();
    void usbReinit(const char *mtpRoot);
    void usbSuspend();

} // namespace bsp

M module-services/service-desktop/WorkerDesktop.cpp => module-services/service-desktop/WorkerDesktop.cpp +11 -0
@@ 8,6 8,7 @@
#include "parser/MessageHandler.hpp"
#include "parser/ParserFSM.hpp"
#include "endpoints/Context.hpp"
#include "Timers/TimerFactory.hpp"

#include <bsp/usb/usb.hpp>
#include <log/log.hpp>


@@ 36,6 37,9 @@ 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(); });

    return (bsp::usbInit(receiveQueue, irqQueue, this) < 0) ? false : true;
}



@@ 124,6 128,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
        LOG_DEBUG("USB status: %d", static_cast<int>(notification));

        if (notification == bsp::USBDeviceStatus::Connected) {
            usbSuspendTimer.stop();
            ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBConnected>(),
                                          service::name::service_desktop);
        }


@@ 133,6 138,7 @@ bool WorkerDesktop::handleMessage(uint32_t queueID)
                                          service::name::service_desktop);
        }
        else if (notification == bsp::USBDeviceStatus::Disconnected) {
            usbSuspendTimer.start();
            cpuSentinel->ReleaseMinimumFrequency();
            ownerService->bus.sendUnicast(std::make_shared<sdesktop::usb::USBDisconnected>(),
                                          service::name::service_desktop);


@@ 284,3 290,8 @@ void WorkerDesktop::uploadFileFailedResponse()
    responseContext.setResponseBody(responseJson);
    parserFSM::MessageHandler::putToSendQueue(responseContext.createSimpleResponse());
}

void WorkerDesktop::suspendUsb()
{
    bsp::usbSuspend();
}

M module-services/service-desktop/service-desktop/WorkerDesktop.hpp => module-services/service-desktop/service-desktop/WorkerDesktop.hpp +7 -0
@@ 14,6 14,11 @@
#include "bsp/usb/usb.hpp"
#include "USBSecurityModel.hpp"

namespace constants
{
    constexpr auto usbSuspendTimeout = std::chrono::seconds{1};
} // namespace constants

class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
{
  public:


@@ 56,6 61,7 @@ class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
    void startTransferTimer();
    void stopTransferTimer();
    void reloadTransferTimer();
    void suspendUsb();

    bool stateChangeWait();



@@ 69,6 75,7 @@ class WorkerDesktop : public sys::Worker, public bsp::USBDeviceListener
    const sdesktop::USBSecurityModel &securityModel;
    sys::Service *ownerService = nullptr;
    parserFSM::StateMachine parser;
    sys::TimerHandle usbSuspendTimer;

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