Add Firmware 20.0.0-21.0.0 IPC support and stubs

This commit implements comprehensive firmware 20.0.0 through 21.0.0
support for Citron, including:

- Updated firmware version constants to 21.0.0 in api_version.h
- Updated HID service firmware version string to 21.0.0
- Added IPC command stubs for firmware 20.0.0+ in:
  * ISystemSettingsServer (commands 263, 264, 282, 283, 289, 300, 301, 306, 307)
  * IFirmwareDebugSettingsServer (command 24)
  * IApplicationFunctions (command 330)
  * IOlscServiceForSystemService (command 914)
  * IRemoteStorageController (commands 28, 901)
  * IService (migration) (commands 2250, 2260)
  * IAudioController (command 10200)

- Created new service interfaces with proper stubs:
  * IContinuousRecorder (grcsrv) - command 5 [20.2.0+] with 0x20-byte input
  * IDownloadContext (news) - command 4 [20.0.0+]
  * INotifyService (pdm:ntfy) - commands 100, 101 [20.0.0+] returning outinterfaces

- Added all new source files to CMakeLists.txt build system
- Fixed logging tag usage (Service_Migration instead of Service_MIG)
- Added required CMIF serialization headers for proper template instantiation

All stubs return success explicitly, eliminating the need for auto-stubbing.
All implementations follow Switchbrew documentation as closely as possible.

Based on Switchbrew documentation:
- https://switchbrew.org/wiki/21.0.0
- https://switchbrew.org/wiki/20.5.0
- https://switchbrew.org/wiki/20.4.0
- https://switchbrew.org/wiki/20.3.0
- https://switchbrew.org/wiki/20.2.0
- https://switchbrew.org/wiki/20.1.5
- https://switchbrew.org/wiki/20.1.1
- https://switchbrew.org/wiki/20.1.0
- https://switchbrew.org/wiki/20.0.1
- https://switchbrew.org/wiki/20.0.0

Signed-off-by: Zephyron <zephyron@citron-emu.org>
This commit is contained in:
Zephyron
2025-11-11 18:52:10 +10:00
parent 1127d30fd8
commit d59eb9a1a8
25 changed files with 341 additions and 10 deletions

View File

@@ -1,6 +1,9 @@
// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "common/logging/log.h"
#include "core/hle/service/cmif_serialization.h"
#include "core/hle/service/set/firmware_debug_settings_server.h"
namespace Service::Set {
@@ -18,6 +21,7 @@ IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_
{21, nullptr, "SetAllowedSslHosts"},
{22, nullptr, "SetHostFsMountPoint"},
{23, nullptr, "SetMemoryUsageRateFlag"},
{24, D<&IFirmwareDebugSettingsServer::Unknown24>, "Unknown24"}, // [20.0.0+]
};
// clang-format on
@@ -26,4 +30,9 @@ IFirmwareDebugSettingsServer::IFirmwareDebugSettingsServer(Core::System& system_
IFirmwareDebugSettingsServer::~IFirmwareDebugSettingsServer() = default;
Result IFirmwareDebugSettingsServer::Unknown24() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown24 [20.0.0+]");
R_SUCCEED();
}
} // namespace Service::Set

View File

@@ -15,6 +15,9 @@ class IFirmwareDebugSettingsServer final : public ServiceFramework<IFirmwareDebu
public:
explicit IFirmwareDebugSettingsServer(Core::System& system_);
~IFirmwareDebugSettingsServer() override;
private:
Result Unknown24(); // [20.0.0+]
};
} // namespace Service::Set

View File

@@ -301,6 +301,15 @@ ISystemSettingsServer::ISystemSettingsServer(Core::System& system_)
{208, nullptr, "SetHearingProtectionSafeguardFlag"},
{209, nullptr, "GetHearingProtectionSafeguardRemainingTime"},
{210, nullptr, "SetHearingProtectionSafeguardRemainingTime"},
{263, C<&ISystemSettingsServer::Unknown263>, "Unknown263"}, // [20.0.0+]
{264, C<&ISystemSettingsServer::Unknown264>, "Unknown264"}, // [20.0.0+]
{282, C<&ISystemSettingsServer::Unknown282>, "Unknown282"}, // [20.0.0+]
{283, C<&ISystemSettingsServer::Unknown283>, "Unknown283"}, // [20.0.0+]
{289, C<&ISystemSettingsServer::Unknown289>, "Unknown289"}, // [20.0.0+]
{300, C<&ISystemSettingsServer::Unknown300>, "Unknown300"}, // [20.0.0+]
{301, C<&ISystemSettingsServer::Unknown301>, "Unknown301"}, // [20.0.0+]
{306, C<&ISystemSettingsServer::Unknown306>, "Unknown306"}, // [20.0.0+]
{307, C<&ISystemSettingsServer::Unknown307>, "Unknown307"}, // [20.0.0+]
};
// clang-format on
@@ -1389,4 +1398,49 @@ Result ISystemSettingsServer::GetSettingsItemValueImpl(std::span<u8> out_value,
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown263() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown263 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown264() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown264 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown282() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown282 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown283() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown283 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown289() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown289 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown300() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown300 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown301() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown301 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown306() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown306 [20.0.0+]");
R_SUCCEED();
}
Result ISystemSettingsServer::Unknown307() {
LOG_WARNING(Service_SET, "(STUBBED) called Unknown307 [20.0.0+]");
R_SUCCEED();
}
} // namespace Service::Set

View File

@@ -155,6 +155,15 @@ public:
Result GetFieldTestingFlag(Out<bool> out_field_testing_flag);
Result GetPanelCrcMode(Out<s32> out_panel_crc_mode);
Result SetPanelCrcMode(s32 panel_crc_mode);
Result Unknown263(); // [20.0.0+]
Result Unknown264(); // [20.0.0+]
Result Unknown282(); // [20.0.0+]
Result Unknown283(); // [20.0.0+]
Result Unknown289(); // [20.0.0+]
Result Unknown300(); // [20.0.0+]
Result Unknown301(); // [20.0.0+]
Result Unknown306(); // [20.0.0+]
Result Unknown307(); // [20.0.0+]
private:
bool LoadSettingsFile(std::filesystem::path& path, auto&& default_func);