From 3b8c0f8885c9e590f4317d8de51ea3d669ccdfcd Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 20 Oct 2018 17:22:15 -0400 Subject: [PATCH 1/3] service: Add skeleton for psm service Seems to be the power controller. Listed in switchbrew under the category PTM services. --- src/common/logging/log.h | 1 + src/core/CMakeLists.txt | 2 ++ src/core/hle/service/ptm/psm.cpp | 48 ++++++++++++++++++++++++++++++++ src/core/hle/service/ptm/psm.h | 22 +++++++++++++++ src/core/hle/service/service.cpp | 2 ++ 5 files changed, 75 insertions(+) create mode 100644 src/core/hle/service/ptm/psm.cpp create mode 100644 src/core/hle/service/ptm/psm.h diff --git a/src/common/logging/log.h b/src/common/logging/log.h index abbd056ee1..c9161155ac 100644 --- a/src/common/logging/log.h +++ b/src/common/logging/log.h @@ -91,6 +91,7 @@ enum class Class : ClassType { Service_PM, ///< The PM service Service_PREPO, ///< The PREPO (Play report) service Service_PSC, ///< The PSC service + Service_PSM, ///< The PSM service Service_SET, ///< The SET (Settings) service Service_SM, ///< The SM (Service manager) service Service_SPL, ///< The SPL service diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 4755ec822d..5efc382ba4 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -327,6 +327,8 @@ add_library(core STATIC hle/service/prepo/prepo.h hle/service/psc/psc.cpp hle/service/psc/psc.h + hle/service/ptm/psm.cpp + hle/service/ptm/psm.h hle/service/service.cpp hle/service/service.h hle/service/set/set.cpp diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp new file mode 100644 index 0000000000..f6186b8098 --- /dev/null +++ b/src/core/hle/service/ptm/psm.cpp @@ -0,0 +1,48 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include + +#include "common/logging/log.h" +#include "core/hle/ipc_helpers.h" +#include "core/hle/service/ptm/psm.h" +#include "core/hle/service/service.h" +#include "core/hle/service/sm/sm.h" + +namespace Service::PSM { + +PSM::PSM() : ServiceFramework{"psm"} { + // clang-format off + static const FunctionInfo functions[] = { + {0, nullptr, "GetBatteryChargePercentage"}, + {1, nullptr, "GetChargerType"}, + {2, nullptr, "EnableBatteryCharging"}, + {3, nullptr, "DisableBatteryCharging"}, + {4, nullptr, "IsBatteryChargingEnabled"}, + {5, nullptr, "AcquireControllerPowerSupply"}, + {6, nullptr, "ReleaseControllerPowerSupply"}, + {7, nullptr, "OpenSession"}, + {8, nullptr, "EnableEnoughPowerChargeEmulation"}, + {9, nullptr, "DisableEnoughPowerChargeEmulation"}, + {10, nullptr, "EnableFastBatteryCharging"}, + {11, nullptr, "DisableFastBatteryCharging"}, + {12, nullptr, "GetBatteryVoltageState"}, + {13, nullptr, "GetRawBatteryChargePercentage"}, + {14, nullptr, "IsEnoughPowerSupplied"}, + {15, nullptr, "GetBatteryAgePercentage"}, + {16, nullptr, "GetBatteryChargeInfoEvent"}, + {17, nullptr, "GetBatteryChargeInfoFields"}, + }; + // clang-format on + + RegisterHandlers(functions); +} + +PSM::~PSM() = default; + +void InstallInterfaces(SM::ServiceManager& sm) { + std::make_shared()->InstallAsService(sm); +} + +} // namespace Service::PSM diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h new file mode 100644 index 0000000000..21955aa229 --- /dev/null +++ b/src/core/hle/service/ptm/psm.h @@ -0,0 +1,22 @@ +// Copyright 2018 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#pragma once +#include "core/hle/service/service.h" + +namespace Service::SM { +class ServiceManager; +} + +namespace Service::PSM { + +class PSM final : public ServiceFramework { +public: + explicit PSM(); + ~PSM() override; +}; + +void InstallInterfaces(SM::ServiceManager& sm); + +} // namespace Service::PSM diff --git a/src/core/hle/service/service.cpp b/src/core/hle/service/service.cpp index a225cb4cbd..fdd65cc68b 100644 --- a/src/core/hle/service/service.cpp +++ b/src/core/hle/service/service.cpp @@ -57,6 +57,7 @@ #include "core/hle/service/pm/pm.h" #include "core/hle/service/prepo/prepo.h" #include "core/hle/service/psc/psc.h" +#include "core/hle/service/ptm/psm.h" #include "core/hle/service/service.h" #include "core/hle/service/set/settings.h" #include "core/hle/service/sm/sm.h" @@ -244,6 +245,7 @@ void Init(std::shared_ptr& sm, FileSys::VfsFilesystem& vfs) PlayReport::InstallInterfaces(*sm); PM::InstallInterfaces(*sm); PSC::InstallInterfaces(*sm); + PSM::InstallInterfaces(*sm); Set::InstallInterfaces(*sm); Sockets::InstallInterfaces(*sm); SPL::InstallInterfaces(*sm); From 10a2d20e26e8f43dc15be0e13c570ab28bb57242 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sat, 20 Oct 2018 17:23:43 -0400 Subject: [PATCH 2/3] psm: Stub GetBatteryChargePercentage Used by LovePotion Lua Homebrew. Stubbed to return 100% charge. --- src/core/hle/service/ptm/psm.cpp | 12 +++++++++++- src/core/hle/service/ptm/psm.h | 3 +++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index f6186b8098..a8e3813c8a 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -12,10 +12,12 @@ namespace Service::PSM { +constexpr u32 BATTERY_FULLY_CHARGED = 100; // 100% Full + PSM::PSM() : ServiceFramework{"psm"} { // clang-format off static const FunctionInfo functions[] = { - {0, nullptr, "GetBatteryChargePercentage"}, + {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, {1, nullptr, "GetChargerType"}, {2, nullptr, "EnableBatteryCharging"}, {3, nullptr, "DisableBatteryCharging"}, @@ -41,6 +43,14 @@ PSM::PSM() : ServiceFramework{"psm"} { PSM::~PSM() = default; +void PSM::GetBatteryChargePercentage(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_PSM, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(BATTERY_FULLY_CHARGED); +} + void InstallInterfaces(SM::ServiceManager& sm) { std::make_shared()->InstallAsService(sm); } diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h index 21955aa229..113878bb72 100644 --- a/src/core/hle/service/ptm/psm.h +++ b/src/core/hle/service/ptm/psm.h @@ -15,6 +15,9 @@ class PSM final : public ServiceFramework { public: explicit PSM(); ~PSM() override; + +private: + void GetBatteryChargePercentage(Kernel::HLERequestContext& ctx); }; void InstallInterfaces(SM::ServiceManager& sm); From 314a9483732a2c9cb8861d4ae8b113ebb5ad9406 Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Sun, 21 Oct 2018 22:03:17 -0400 Subject: [PATCH 3/3] psm: Stub GetChargerType Used by LovePotion Lua Homebrew. Stubbed as connected to official Nintendo Switch dock. --- src/core/hle/service/ptm/psm.cpp | 41 +++++++++++++++++++++----------- src/core/hle/service/ptm/psm.h | 10 -------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/core/hle/service/ptm/psm.cpp b/src/core/hle/service/ptm/psm.cpp index a8e3813c8a..c2d5fda94d 100644 --- a/src/core/hle/service/ptm/psm.cpp +++ b/src/core/hle/service/ptm/psm.cpp @@ -12,13 +12,16 @@ namespace Service::PSM { -constexpr u32 BATTERY_FULLY_CHARGED = 100; // 100% Full +constexpr u32 BATTERY_FULLY_CHARGED = 100; // 100% Full +constexpr u32 BATTERY_CURRENTLY_CHARGING = 1; // Plugged into an official dock -PSM::PSM() : ServiceFramework{"psm"} { - // clang-format off +class PSM final : public ServiceFramework { +public: + explicit PSM() : ServiceFramework{"psm"} { + // clang-format off static const FunctionInfo functions[] = { {0, &PSM::GetBatteryChargePercentage, "GetBatteryChargePercentage"}, - {1, nullptr, "GetChargerType"}, + {1, &PSM::GetChargerType, "GetChargerType"}, {2, nullptr, "EnableBatteryCharging"}, {3, nullptr, "DisableBatteryCharging"}, {4, nullptr, "IsBatteryChargingEnabled"}, @@ -36,20 +39,30 @@ PSM::PSM() : ServiceFramework{"psm"} { {16, nullptr, "GetBatteryChargeInfoEvent"}, {17, nullptr, "GetBatteryChargeInfoFields"}, }; - // clang-format on + // clang-format on - RegisterHandlers(functions); -} + RegisterHandlers(functions); + } -PSM::~PSM() = default; + ~PSM() override = default; -void PSM::GetBatteryChargePercentage(Kernel::HLERequestContext& ctx) { - LOG_WARNING(Service_PSM, "(STUBBED) called"); +private: + void GetBatteryChargePercentage(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_PSM, "(STUBBED) called"); - IPC::ResponseBuilder rb{ctx, 3}; - rb.Push(RESULT_SUCCESS); - rb.Push(BATTERY_FULLY_CHARGED); -} + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(BATTERY_FULLY_CHARGED); + } + + void GetChargerType(Kernel::HLERequestContext& ctx) { + LOG_WARNING(Service_PSM, "(STUBBED) called"); + + IPC::ResponseBuilder rb{ctx, 3}; + rb.Push(RESULT_SUCCESS); + rb.Push(BATTERY_CURRENTLY_CHARGING); + } +}; void InstallInterfaces(SM::ServiceManager& sm) { std::make_shared()->InstallAsService(sm); diff --git a/src/core/hle/service/ptm/psm.h b/src/core/hle/service/ptm/psm.h index 113878bb72..a286793aee 100644 --- a/src/core/hle/service/ptm/psm.h +++ b/src/core/hle/service/ptm/psm.h @@ -3,7 +3,6 @@ // Refer to the license.txt file included. #pragma once -#include "core/hle/service/service.h" namespace Service::SM { class ServiceManager; @@ -11,15 +10,6 @@ class ServiceManager; namespace Service::PSM { -class PSM final : public ServiceFramework { -public: - explicit PSM(); - ~PSM() override; - -private: - void GetBatteryChargePercentage(Kernel::HLERequestContext& ctx); -}; - void InstallInterfaces(SM::ServiceManager& sm); } // namespace Service::PSM