~aleteoryx/muditaos

9ece62c171d4a573c97f31e7c131cfd9002e985e — Lefucjusz 2 years ago 25a8f78
[MOS-903] Remove reboot to USB MSC mode

Remove mechanics enabling to perform reboot
to MSC mode by sending request to one of the
endpoints via serial port, as it is not
implemented in bootloader and may potentially
be unsafe.
M module-bsp/board/rt1051/bsp/lpm/RT1051LPMCommon.cpp => module-bsp/board/rt1051/bsp/lpm/RT1051LPMCommon.cpp +1 -4
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "RT1051LPMCommon.hpp"


@@ 46,9 46,6 @@ namespace bsp
        case RebootType::GoToRecoveryRestore:
            set_boot_reason(boot_reason_code_restore);
            break;
        case RebootType::GoToUsbMscMode:
            set_boot_reason(boot_reason_code_usb_mc_mode);
            break;
        case RebootType::NormalRestart:
            set_boot_reason(boot_reason_code_os);
            break;

M module-bsp/bsp/lpm/bsp_lpm.hpp => module-bsp/bsp/lpm/bsp_lpm.hpp +0 -1
@@ 26,7 26,6 @@ namespace bsp
        enum class RebootType
        {
            NormalRestart,
            GoToUsbMscMode,          // Reboot into USB MSC mode
            GoToRecoveryUpdate,       //! Goto recovery into the update mode
            GoToRecoveryFactoryReset, //! GOto recovery into the factory reset mode
            GoToRecoveryRecovery,     //! Goto to recovery into recovery mode

M module-services/service-desktop/endpoints/include/endpoints/JsonKeyNames.hpp => module-services/service-desktop/endpoints/include/endpoints/JsonKeyNames.hpp +1 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 40,7 40,6 @@ namespace sdesktop::endpoints::json
    inline constexpr auto state                  = "state";
    inline constexpr auto success                = "success";
    inline constexpr auto reboot                 = "reboot";
    inline constexpr auto rebootMode             = "rebootMode";
    inline constexpr auto request                = "request";
    inline constexpr auto restore                = "restore";
    inline constexpr auto finished               = "finished";

M module-services/service-desktop/endpoints/include/endpoints/update/UpdateHelper.hpp => module-services/service-desktop/endpoints/include/endpoints/update/UpdateHelper.hpp +1 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 15,7 15,6 @@ namespace sdesktop::endpoints
        explicit UpdateHelper(sys::Service *p);

        auto processPost(Context &context) -> ProcessResult final;
        auto processPut(Context &context) -> ProcessResult final;
        void preProcess(http::Method method, Context &context) final;

      private:

M module-services/service-desktop/endpoints/update/UpdateHelper.cpp => module-services/service-desktop/endpoints/update/UpdateHelper.cpp +2 -13
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <service-desktop/Constants.hpp>


@@ 165,7 165,7 @@ namespace sdesktop::endpoints
    {
        const auto &body = context.getBody();

        if (!(body[json::update] == true && body[json::reboot] == true)) {
        if (body[json::update] != true || body[json::reboot] != true) {
            return {sent::no, ResponseContext{.status = http::Code::BadRequest}};
        }



@@ 194,17 194,6 @@ namespace sdesktop::endpoints
        return {sent::no, ResponseContext{.status = http::Code::InternalServerError}};
    }

    auto UpdateHelper::processPut(Context &context) -> ProcessResult
    {
        const auto &body = context.getBody();
        auto code        = http::Code::BadRequest;
        if (body[json::rebootMode] == json::usbMscMode) {
            code = sys::SystemManagerCommon::RebootToUsbMscMode(owner) ? http::Code::NoContent
                                                                       : http::Code::InternalServerError;
        }

        return {sent::no, ResponseContext{.status = code}};
    }
    UpdateHelper::UpdateHelper(sys::Service *p)
        : BaseHelper(p), updatePackagePath{purefs::dir::getTemporaryPath() / "update"}, binariesPath{get_binary_dir()}
    {}

M module-sys/SystemManager/PowerManager.cpp => module-sys/SystemManager/PowerManager.cpp +1 -6
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "SystemManager/cpu/algorithm/FrequencyHold.hpp"


@@ 84,11 84,6 @@ namespace sys
        return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::NormalRestart);
    }

    int32_t PowerManager::RebootToUsbMscMode()
    {
        return lowPowerControl->Reboot(bsp::LowPowerMode::RebootType::GoToUsbMscMode);
    }

    int32_t PowerManager::RebootToRecovery(RecoveryReason reason)
    {
        switch (reason) {

M module-sys/SystemManager/SystemManagerCommon.cpp => module-sys/SystemManager/SystemManagerCommon.cpp +15 -37
@@ 133,9 133,6 @@ namespace sys
        case SystemManagerCommon::State::ShutdownReady:
            LOG_INFO("  ---> SHUTDOWN <--- ");
            break;
        case SystemManagerCommon::State::RebootToUsbMscMode:
            LOG_INFO("  ---> REBOOT TO USB MSC Mode <--- ");
            break;
        case SystemManagerCommon::State::RebootToRecovery:
            LOG_INFO("  ---> REBOOT TO RECOVERY <--- ");
            break;


@@ 157,9 154,6 @@ namespace sys
        case State::ShutdownReady:
            powerManager->PowerOff();
            break;
        case State::RebootToUsbMscMode:
            powerManager->RebootToUsbMscMode();
            break;
        case State::RebootToRecovery:
            powerManager->RebootToRecovery(recoveryReason);
            break;


@@ 294,13 288,6 @@ namespace sys
        return true;
    }

    bool SystemManagerCommon::RebootToUsbMscMode(Service *s)
    {
        s->bus.sendUnicast(std::make_shared<SystemManagerCmd>(Code::RebootToUsbMscMode, CloseReason::Reboot),
                           service::name::system_manager);
        return true;
    }

    bool SystemManagerCommon::RebootToRecovery(Service *s, RecoveryReason recoveryReason)
    {
        s->bus.sendUnicast(


@@ 311,13 298,13 @@ namespace sys

    bool SystemManagerCommon::SuspendService(const std::string &name, sys::Service *caller)
    {
        auto ret = caller->bus.sendUnicastSync(
        const auto ret = caller->bus.sendUnicastSync(
            std::make_shared<SystemMessage>(SystemMessageType::SwitchPowerMode, ServicePowerMode::SuspendToRAM),
            name,
            1000);
        auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);
        const auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);

        if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)) {
        if ((ret.first != ReturnCodes::Success) && (resp->retCode != ReturnCodes::Success)) {
            LOG_FATAL("Service %s failed to enter low-power mode", name.c_str());
        }
        return true;


@@ 325,11 312,11 @@ namespace sys

    bool SystemManagerCommon::ResumeService(const std::string &name, sys::Service *caller)
    {
        auto ret = caller->bus.sendUnicastSync(
        const auto ret = caller->bus.sendUnicastSync(
            std::make_shared<SystemMessage>(SystemMessageType::SwitchPowerMode, ServicePowerMode::Active), name, 1000);
        auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);
        const auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);

        if (ret.first != ReturnCodes::Success && (resp->retCode != ReturnCodes::Success)) {
        if ((ret.first != ReturnCodes::Success) && (resp->retCode != ReturnCodes::Success)) {
            LOG_FATAL("Service %s failed to exit low-power mode", name.c_str());
        }
        return true;


@@ 339,14 326,11 @@ namespace sys
    {
        service->StartService();

        auto msg  = std::make_shared<SystemMessage>(SystemMessageType::Start);
        auto ret  = caller->bus.sendUnicastSync(msg, service->GetName(), timeout);
        auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);
        const auto msg  = std::make_shared<SystemMessage>(SystemMessageType::Start);
        const auto ret  = caller->bus.sendUnicastSync(msg, service->GetName(), timeout);
        const auto resp = std::static_pointer_cast<ResponseMessage>(ret.second);

        if (ret.first == ReturnCodes::Success && (resp->retCode == ReturnCodes::Success)) {
            return true;
        }
        return false;
        return ((ret.first == ReturnCodes::Success) && (resp->retCode == ReturnCodes::Success));
    }

    bool SystemManagerCommon::RunSystemService(std::shared_ptr<Service> service, Service *caller, TickType_t timeout)


@@ 575,9 559,6 @@ namespace sys
                case Code::Reboot:
                    RebootHandler();
                    break;
                case Code::RebootToUsbMscMode:
                    RebootToUsbMscModeHandler(State::RebootToUsbMscMode);
                    break;
                case Code::RebootToRecovery:
                case Code::FactoryReset:
                    RebootToRecoveryHandler(data->closeReason, data->recoveryReason);


@@ 597,9 578,13 @@ namespace sys
            return MessageNone{};
        });

        /* Workaround for hardware issues with power supply. With USB cable connected the phone cannot
         * restart, so detect such state and perform reboot when right function button is pressed.
         * This way for the user the behavior looks as if the phone was normally turned on from shutdown
         * state. */
        connect(sevm::KbdMessage(), [&](Message *) {
            // we are in shutdown mode - we received that there was red key pressed -> we need to reboot
            if (state == State::Shutdown) {
                LOG_INFO("Rebooting phone after shutdown with USB connected...");
                set(State::Reboot);
            }
            return MessageNone{};


@@ 730,7 715,6 @@ namespace sys
        case CloseReason::RegularPowerDown:
        case CloseReason::SystemBrownout:
        case CloseReason::LowBattery:
        case CloseReason::RebootToUsbMscMode:
            DestroyServices(sys::state::regularClose::whitelist);
            set(State::Shutdown);
            break;


@@ 773,12 757,6 @@ namespace sys
        this->recoveryReason = recoveryReason;
    }

    void SystemManagerCommon::RebootToUsbMscModeHandler(State newState)
    {
        CloseSystemHandler(CloseReason::RebootToUsbMscMode);
        set(newState);
    }

    void SystemManagerCommon::FreqUpdateTick()
    {
        if (!cpuStatisticsTimerInit) {

M module-sys/SystemManager/include/SystemManager/PowerManager.hpp => module-sys/SystemManager/include/SystemManager/PowerManager.hpp +2 -7
@@ 1,8 1,7 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#ifndef PUREPHONE_POWERMANAGER_HPP
#define PUREPHONE_POWERMANAGER_HPP
#pragma once

#include <functional>



@@ 50,7 49,6 @@ namespace sys

        int32_t PowerOff();
        int32_t Reboot();
        int32_t RebootToUsbMscMode();
        int32_t RebootToRecovery(RecoveryReason reason);

        /// called periodically to calculate the CPU requirement


@@ 74,7 72,6 @@ namespace sys
        void LogPowerManagerStatistics();

      private:
        void ResetFrequencyShiftCounter();
        void SetCpuFrequency(bsp::CpuFrequencyMHz freq);

        void UpdateCpuFrequencyMonitor(bsp::CpuFrequencyMHz currentFreq);


@@ 95,5 92,3 @@ namespace sys
    };

} // namespace sys

#endif // PUREPHONE_POWERMANAGER_HPP

M module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp => module-sys/SystemManager/include/SystemManager/SystemManagerCommon.hpp +2 -10
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 43,7 43,6 @@ namespace sys
        Restore,
        Reboot,
        RebootToRecovery,
        RebootToUsbMscMode,
        FactoryReset,
        None,
    };


@@ 81,8 80,7 @@ namespace sys
            Shutdown,
            ShutdownReady,
            Reboot,
            RebootToRecovery,
            RebootToUsbMscMode
            RebootToRecovery
        } state = State::Running;

        explicit SystemManagerCommon(std::vector<std::unique_ptr<BaseServiceCreator>> &&creators);


@@ 100,8 98,6 @@ namespace sys

        static bool Reboot(Service *s);

        static bool RebootToUsbMscMode(Service *s);

        static bool RebootToRecovery(Service *s, RecoveryReason recoveryReason);

        static bool SuspendService(const std::string &name, Service *caller);


@@ 186,8 182,6 @@ namespace sys

        void RebootToRecoveryHandler(CloseReason closeReason, RecoveryReason recoveryReason);

        void RebootToUsbMscModeHandler(State newState);

        void FreqUpdateTick();

        /// used for power management control for the filesystem


@@ 234,8 228,6 @@ inline const char *c_str(sys::SystemManagerCommon::State state)
        return "Reboot";
    case sys::SystemManagerCommon::State::RebootToRecovery:
        return "RebootToRecovery";
    case sys::SystemManagerCommon::State::RebootToUsbMscMode:
        return "RebootToUsbMscModeUpdate";
    case sys::SystemManagerCommon::State::ShutdownReady:
        return "ShutdownReady";
    }

M module-sys/common/include/system/Common.hpp => module-sys/common/include/system/Common.hpp +1 -2
@@ 1,4 1,4 @@
// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once


@@ 50,7 50,6 @@ namespace sys
        RegularPowerDown,
        Reboot,
        RebootToRecovery,
        RebootToUsbMscMode,
        FactoryReset,
        SystemBrownout,
        LowBattery

M test/harness => test/harness +1 -1
@@ 1,1 1,1 @@
Subproject commit 8caddc3251a53173d4f470e47fca16d1e6a580c0
Subproject commit 4da3642f7f1306c5d282f68d037bc7c260874ef1