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

@@ -0,0 +1,38 @@
// 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/ns/notify_service.h"
#include "core/hle/service/ns/service_getter_interface.h"
namespace Service::NS {
INotifyService::INotifyService(Core::System& system_)
: ServiceFramework{system_, "pdm:ntfy"}, system{system_} {
// clang-format off
static const FunctionInfo functions[] = {
{0, nullptr, "Unknown0"},
{100, D<&INotifyService::Unknown100>, "Unknown100"}, // [20.0.0+]
{101, D<&INotifyService::Unknown101>, "Unknown101"}, // [20.0.0+]
};
// clang-format on
RegisterHandlers(functions);
}
INotifyService::~INotifyService() = default;
Result INotifyService::Unknown100(Out<SharedPointer<IServiceGetterInterface>> out_interface) {
LOG_WARNING(Service_NS, "(STUBBED) called Unknown100 [20.0.0+]");
*out_interface = std::make_shared<IServiceGetterInterface>(system, "pdm:ntfy");
R_SUCCEED();
}
Result INotifyService::Unknown101(Out<SharedPointer<IServiceGetterInterface>> out_interface) {
LOG_WARNING(Service_NS, "(STUBBED) called Unknown101 [20.0.0+]");
*out_interface = std::make_shared<IServiceGetterInterface>(system, "pdm:ntfy");
R_SUCCEED();
}
} // namespace Service::NS

View File

@@ -0,0 +1,30 @@
// SPDX-FileCopyrightText: Copyright 2025 citron Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include "core/hle/service/cmif_types.h"
#include "core/hle/service/service.h"
namespace Service::NS {
class IServiceGetterInterface;
}
namespace Core {
class System;
}
namespace Service::NS {
class INotifyService final : public ServiceFramework<INotifyService> {
public:
explicit INotifyService(Core::System& system_);
~INotifyService() override;
private:
Result Unknown100(Out<SharedPointer<IServiceGetterInterface>> out_interface); // [20.0.0+]
Result Unknown101(Out<SharedPointer<IServiceGetterInterface>> out_interface); // [20.0.0+]
Core::System& system;
};
} // namespace Service::NS

View File

@@ -3,6 +3,7 @@
#include "core/hle/service/ns/develop_interface.h"
#include "core/hle/service/ns/ns.h"
#include "core/hle/service/ns/notify_service.h"
#include "core/hle/service/ns/platform_service_manager.h"
#include "core/hle/service/ns/query_service.h"
#include "core/hle/service/ns/service_getter_interface.h"
@@ -33,6 +34,7 @@ void LoopProcess(Core::System& system) {
server_manager->RegisterNamedService("ns:vm",
std::make_shared<IVulnerabilityManagerInterface>(system));
server_manager->RegisterNamedService("pdm:qry", std::make_shared<IQueryService>(system));
server_manager->RegisterNamedService("pdm:ntfy", std::make_shared<INotifyService>(system));
server_manager->RegisterNamedService("pl:s",
std::make_shared<IPlatformServiceManager>(system, "pl:s"));