From 6a80654b522edd35706173a3e30a40e71b7c8daf Mon Sep 17 00:00:00 2001 From: Maciej Gibowicz Date: Thu, 15 Apr 2021 09:26:10 +0200 Subject: [PATCH] [EGD-6457] Add power management for USB When the USB is disconnected, we turn off the peripherals by going into the suspend bus mode. --- module-bsp/board/linux/usb_cdc/usb_cdc.cpp | 5 +++++ module-bsp/board/rt1051/bsp/usb | 2 +- module-bsp/bsp/usb/usb.hpp | 1 + module-services/service-desktop/WorkerDesktop.cpp | 11 +++++++++++ .../service-desktop/service-desktop/WorkerDesktop.hpp | 7 +++++++ 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/module-bsp/board/linux/usb_cdc/usb_cdc.cpp b/module-bsp/board/linux/usb_cdc/usb_cdc.cpp index 1213c8ca0ab8e03961e7891230e79b5272e196d6..08d362cb3c68ecd7b801f9458b0a35372324811a 100644 --- a/module-bsp/board/linux/usb_cdc/usb_cdc.cpp +++ b/module-bsp/board/linux/usb_cdc/usb_cdc.cpp @@ -155,6 +155,11 @@ namespace bsp LOG_INFO("usbReinit"); } + void usbSuspend() + { + LOG_INFO("usbSuspend"); + } + int usbInit(xQueueHandle receiveQueue, xQueueHandle irqQueue, USBDeviceListener *) { diff --git a/module-bsp/board/rt1051/bsp/usb b/module-bsp/board/rt1051/bsp/usb index 07460ac1a8e2f6234d2492c842e22b28e4363d84..f77faf3a05c0fc92df0c858a31c14c1e24bb4e7e 160000 --- a/module-bsp/board/rt1051/bsp/usb +++ b/module-bsp/board/rt1051/bsp/usb @@ -1 +1 @@ -Subproject commit 07460ac1a8e2f6234d2492c842e22b28e4363d84 +Subproject commit f77faf3a05c0fc92df0c858a31c14c1e24bb4e7e diff --git a/module-bsp/bsp/usb/usb.hpp b/module-bsp/bsp/usb/usb.hpp index a1913f56e7535f0d5ee97472ddd4ccb74ccad15f..9716190cd7abd365e8772a03bd5522449570a094 100644 --- a/module-bsp/bsp/usb/usb.hpp +++ b/module-bsp/bsp/usb/usb.hpp @@ -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 diff --git a/module-services/service-desktop/WorkerDesktop.cpp b/module-services/service-desktop/WorkerDesktop.cpp index d016e8d879dc22ca6305707c849890a0bf5e29a2..fea58f69a1986bbeccca4682c2321668423f8fea 100644 --- a/module-services/service-desktop/WorkerDesktop.cpp +++ b/module-services/service-desktop/WorkerDesktop.cpp @@ -8,6 +8,7 @@ #include "parser/MessageHandler.hpp" #include "parser/ParserFSM.hpp" #include "endpoints/Context.hpp" +#include "Timers/TimerFactory.hpp" #include #include @@ -36,6 +37,9 @@ bool WorkerDesktop::init(std::list queues) auto sentinelRegistrationMsg = std::make_shared(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(notification)); if (notification == bsp::USBDeviceStatus::Connected) { + usbSuspendTimer.stop(); ownerService->bus.sendUnicast(std::make_shared(), 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(), service::name::service_desktop); @@ -284,3 +290,8 @@ void WorkerDesktop::uploadFileFailedResponse() responseContext.setResponseBody(responseJson); parserFSM::MessageHandler::putToSendQueue(responseContext.createSimpleResponse()); } + +void WorkerDesktop::suspendUsb() +{ + bsp::usbSuspend(); +} diff --git a/module-services/service-desktop/service-desktop/WorkerDesktop.hpp b/module-services/service-desktop/service-desktop/WorkerDesktop.hpp index 3bd47554eb63b38843dd371c160c27bc84f15eef..d8a7c0a5ab33e7dfa420a1296e308beed73c03e9 100644 --- a/module-services/service-desktop/service-desktop/WorkerDesktop.hpp +++ b/module-services/service-desktop/service-desktop/WorkerDesktop.hpp @@ -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 cpuSentinel; };