mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-22 10:51:50 -05:00
service: btm: Migrate service to new IPC
This commit is contained in:
parent
c7588c042b
commit
9c0724b270
13 changed files with 469 additions and 267 deletions
|
@ -545,6 +545,16 @@ add_library(core STATIC
|
||||||
hle/service/btdrv/btdrv.h
|
hle/service/btdrv/btdrv.h
|
||||||
hle/service/btm/btm.cpp
|
hle/service/btm/btm.cpp
|
||||||
hle/service/btm/btm.h
|
hle/service/btm/btm.h
|
||||||
|
hle/service/btm/btm_debug.cpp
|
||||||
|
hle/service/btm/btm_debug.h
|
||||||
|
hle/service/btm/btm_system.cpp
|
||||||
|
hle/service/btm/btm_system.h
|
||||||
|
hle/service/btm/btm_system_core.cpp
|
||||||
|
hle/service/btm/btm_system_core.h
|
||||||
|
hle/service/btm/btm_user.cpp
|
||||||
|
hle/service/btm/btm_user.h
|
||||||
|
hle/service/btm/btm_user_core.cpp
|
||||||
|
hle/service/btm/btm_user_core.h
|
||||||
hle/service/caps/caps.cpp
|
hle/service/caps/caps.cpp
|
||||||
hle/service/caps/caps.h
|
hle/service/caps/caps.h
|
||||||
hle/service/caps/caps_a.cpp
|
hle/service/caps/caps_a.cpp
|
||||||
|
|
|
@ -3,141 +3,18 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "common/logging/log.h"
|
|
||||||
#include "core/core.h"
|
|
||||||
#include "core/hle/kernel/k_event.h"
|
|
||||||
#include "core/hle/service/btm/btm.h"
|
#include "core/hle/service/btm/btm.h"
|
||||||
#include "core/hle/service/ipc_helpers.h"
|
#include "core/hle/service/btm/btm_debug.h"
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
#include "core/hle/service/btm/btm_system.h"
|
||||||
|
#include "core/hle/service/btm/btm_user.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
namespace Service::BTM {
|
namespace Service::BTM {
|
||||||
|
|
||||||
class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
|
class IBtm final : public ServiceFramework<IBtm> {
|
||||||
public:
|
public:
|
||||||
explicit IBtmUserCore(Core::System& system_)
|
explicit IBtm(Core::System& system_) : ServiceFramework{system_, "btm"} {
|
||||||
: ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &IBtmUserCore::AcquireBleScanEvent, "AcquireBleScanEvent"},
|
|
||||||
{1, nullptr, "GetBleScanFilterParameter"},
|
|
||||||
{2, nullptr, "GetBleScanFilterParameter2"},
|
|
||||||
{3, nullptr, "StartBleScanForGeneral"},
|
|
||||||
{4, nullptr, "StopBleScanForGeneral"},
|
|
||||||
{5, nullptr, "GetBleScanResultsForGeneral"},
|
|
||||||
{6, nullptr, "StartBleScanForPaired"},
|
|
||||||
{7, nullptr, "StopBleScanForPaired"},
|
|
||||||
{8, nullptr, "StartBleScanForSmartDevice"},
|
|
||||||
{9, nullptr, "StopBleScanForSmartDevice"},
|
|
||||||
{10, nullptr, "GetBleScanResultsForSmartDevice"},
|
|
||||||
{17, &IBtmUserCore::AcquireBleConnectionEvent, "AcquireBleConnectionEvent"},
|
|
||||||
{18, nullptr, "BleConnect"},
|
|
||||||
{19, nullptr, "BleDisconnect"},
|
|
||||||
{20, nullptr, "BleGetConnectionState"},
|
|
||||||
{21, nullptr, "AcquireBlePairingEvent"},
|
|
||||||
{22, nullptr, "BlePairDevice"},
|
|
||||||
{23, nullptr, "BleUnPairDevice"},
|
|
||||||
{24, nullptr, "BleUnPairDevice2"},
|
|
||||||
{25, nullptr, "BleGetPairedDevices"},
|
|
||||||
{26, &IBtmUserCore::AcquireBleServiceDiscoveryEvent, "AcquireBleServiceDiscoveryEvent"},
|
|
||||||
{27, nullptr, "GetGattServices"},
|
|
||||||
{28, nullptr, "GetGattService"},
|
|
||||||
{29, nullptr, "GetGattIncludedServices"},
|
|
||||||
{30, nullptr, "GetBelongingGattService"},
|
|
||||||
{31, nullptr, "GetGattCharacteristics"},
|
|
||||||
{32, nullptr, "GetGattDescriptors"},
|
|
||||||
{33, &IBtmUserCore::AcquireBleMtuConfigEvent, "AcquireBleMtuConfigEvent"},
|
|
||||||
{34, nullptr, "ConfigureBleMtu"},
|
|
||||||
{35, nullptr, "GetBleMtu"},
|
|
||||||
{36, nullptr, "RegisterBleGattDataPath"},
|
|
||||||
{37, nullptr, "UnregisterBleGattDataPath"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
|
|
||||||
scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
|
|
||||||
connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
|
|
||||||
service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
|
|
||||||
config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
|
|
||||||
}
|
|
||||||
|
|
||||||
~IBtmUserCore() override {
|
|
||||||
service_context.CloseEvent(scan_event);
|
|
||||||
service_context.CloseEvent(connection_event);
|
|
||||||
service_context.CloseEvent(service_discovery_event);
|
|
||||||
service_context.CloseEvent(config_event);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void AcquireBleScanEvent(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(true);
|
|
||||||
rb.PushCopyObjects(scan_event->GetReadableEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AcquireBleConnectionEvent(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(true);
|
|
||||||
rb.PushCopyObjects(connection_event->GetReadableEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AcquireBleServiceDiscoveryEvent(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(true);
|
|
||||||
rb.PushCopyObjects(service_discovery_event->GetReadableEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
void AcquireBleMtuConfigEvent(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(true);
|
|
||||||
rb.PushCopyObjects(config_event->GetReadableEvent());
|
|
||||||
}
|
|
||||||
|
|
||||||
KernelHelpers::ServiceContext service_context;
|
|
||||||
|
|
||||||
Kernel::KEvent* scan_event;
|
|
||||||
Kernel::KEvent* connection_event;
|
|
||||||
Kernel::KEvent* service_discovery_event;
|
|
||||||
Kernel::KEvent* config_event;
|
|
||||||
};
|
|
||||||
|
|
||||||
class BTM_USR final : public ServiceFramework<BTM_USR> {
|
|
||||||
public:
|
|
||||||
explicit BTM_USR(Core::System& system_) : ServiceFramework{system_, "btm:u"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &BTM_USR::GetCore, "GetCore"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GetCore(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushIpcInterface<IBtmUserCore>(system);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class BTM final : public ServiceFramework<BTM> {
|
|
||||||
public:
|
|
||||||
explicit BTM(Core::System& system_) : ServiceFramework{system_, "btm"} {
|
|
||||||
// clang-format off
|
// clang-format off
|
||||||
static const FunctionInfo functions[] = {
|
static const FunctionInfo functions[] = {
|
||||||
{0, nullptr, "GetState"},
|
{0, nullptr, "GetState"},
|
||||||
|
@ -232,144 +109,13 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class BTM_DBG final : public ServiceFramework<BTM_DBG> {
|
|
||||||
public:
|
|
||||||
explicit BTM_DBG(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, nullptr, "AcquireDiscoveryEvent"},
|
|
||||||
{1, nullptr, "StartDiscovery"},
|
|
||||||
{2, nullptr, "CancelDiscovery"},
|
|
||||||
{3, nullptr, "GetDeviceProperty"},
|
|
||||||
{4, nullptr, "CreateBond"},
|
|
||||||
{5, nullptr, "CancelBond"},
|
|
||||||
{6, nullptr, "SetTsiMode"},
|
|
||||||
{7, nullptr, "GeneralTest"},
|
|
||||||
{8, nullptr, "HidConnect"},
|
|
||||||
{9, nullptr, "GeneralGet"},
|
|
||||||
{10, nullptr, "GetGattClientDisconnectionReason"},
|
|
||||||
{11, nullptr, "GetBleConnectionParameter"},
|
|
||||||
{12, nullptr, "GetBleConnectionParameterRequest"},
|
|
||||||
{13, nullptr, "Unknown13"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
|
|
||||||
public:
|
|
||||||
explicit IBtmSystemCore(Core::System& system_) : ServiceFramework{system_, "IBtmSystemCore"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &IBtmSystemCore::StartGamepadPairing, "StartGamepadPairing"},
|
|
||||||
{1, &IBtmSystemCore::CancelGamepadPairing, "CancelGamepadPairing"},
|
|
||||||
{2, nullptr, "ClearGamepadPairingDatabase"},
|
|
||||||
{3, nullptr, "GetPairedGamepadCount"},
|
|
||||||
{4, nullptr, "EnableRadio"},
|
|
||||||
{5, nullptr, "DisableRadio"},
|
|
||||||
{6, &IBtmSystemCore::IsRadioEnabled, "IsRadioEnabled"},
|
|
||||||
{7, nullptr, "AcquireRadioEvent"},
|
|
||||||
{8, nullptr, "AcquireGamepadPairingEvent"},
|
|
||||||
{9, nullptr, "IsGamepadPairingStarted"},
|
|
||||||
{10, nullptr, "StartAudioDeviceDiscovery"},
|
|
||||||
{11, nullptr, "StopAudioDeviceDiscovery"},
|
|
||||||
{12, nullptr, "IsDiscoveryingAudioDevice"},
|
|
||||||
{13, nullptr, "GetDiscoveredAudioDevice"},
|
|
||||||
{14, nullptr, "AcquireAudioDeviceConnectionEvent"},
|
|
||||||
{15, nullptr, "ConnectAudioDevice"},
|
|
||||||
{16, nullptr, "IsConnectingAudioDevice"},
|
|
||||||
{17, &IBtmSystemCore::GetConnectedAudioDevices, "GetConnectedAudioDevices"},
|
|
||||||
{18, nullptr, "DisconnectAudioDevice"},
|
|
||||||
{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
|
|
||||||
{20, &IBtmSystemCore::GetPairedAudioDevices, "GetPairedAudioDevices"},
|
|
||||||
{21, nullptr, "RemoveAudioDevicePairing"},
|
|
||||||
{22, &IBtmSystemCore::RequestAudioDeviceConnectionRejection, "RequestAudioDeviceConnectionRejection"},
|
|
||||||
{23, &IBtmSystemCore::CancelAudioDeviceConnectionRejection, "CancelAudioDeviceConnectionRejection"}
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void IsRadioEnabled(HLERequestContext& ctx) {
|
|
||||||
LOG_DEBUG(Service_BTM, "(STUBBED) called"); // Spams a lot when controller applet is running
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void StartGamepadPairing(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CancelGamepadPairing(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CancelAudioDeviceConnectionRejection(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GetConnectedAudioDevices(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push<u32>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void GetPairedAudioDevices(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 3};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.Push<u32>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void RequestAudioDeviceConnectionRejection(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
class BTM_SYS final : public ServiceFramework<BTM_SYS> {
|
|
||||||
public:
|
|
||||||
explicit BTM_SYS(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {
|
|
||||||
// clang-format off
|
|
||||||
static const FunctionInfo functions[] = {
|
|
||||||
{0, &BTM_SYS::GetCore, "GetCore"},
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
RegisterHandlers(functions);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
void GetCore(HLERequestContext& ctx) {
|
|
||||||
LOG_WARNING(Service_BTM, "called");
|
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
|
||||||
rb.Push(ResultSuccess);
|
|
||||||
rb.PushIpcInterface<IBtmSystemCore>(system);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
void LoopProcess(Core::System& system) {
|
void LoopProcess(Core::System& system) {
|
||||||
auto server_manager = std::make_unique<ServerManager>(system);
|
auto server_manager = std::make_unique<ServerManager>(system);
|
||||||
|
|
||||||
server_manager->RegisterNamedService("btm", std::make_shared<BTM>(system));
|
server_manager->RegisterNamedService("btm", std::make_shared<IBtm>(system));
|
||||||
server_manager->RegisterNamedService("btm:dbg", std::make_shared<BTM_DBG>(system));
|
server_manager->RegisterNamedService("btm:dbg", std::make_shared<IBtmDebug>(system));
|
||||||
server_manager->RegisterNamedService("btm:sys", std::make_shared<BTM_SYS>(system));
|
server_manager->RegisterNamedService("btm:sys", std::make_shared<IBtmSystem>(system));
|
||||||
server_manager->RegisterNamedService("btm:u", std::make_shared<BTM_USR>(system));
|
server_manager->RegisterNamedService("btm:u", std::make_shared<IBtmUser>(system));
|
||||||
ServerManager::RunServer(std::move(server_manager));
|
ServerManager::RunServer(std::move(server_manager));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
namespace Service::SM {
|
|
||||||
class ServiceManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
};
|
};
|
||||||
|
|
33
src/core/hle/service/btm/btm_debug.cpp
Normal file
33
src/core/hle/service/btm/btm_debug.cpp
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "core/hle/service/btm/btm_debug.h"
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
IBtmDebug::IBtmDebug(Core::System& system_) : ServiceFramework{system_, "btm:dbg"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, nullptr, "AcquireDiscoveryEvent"},
|
||||||
|
{1, nullptr, "StartDiscovery"},
|
||||||
|
{2, nullptr, "CancelDiscovery"},
|
||||||
|
{3, nullptr, "GetDeviceProperty"},
|
||||||
|
{4, nullptr, "CreateBond"},
|
||||||
|
{5, nullptr, "CancelBond"},
|
||||||
|
{6, nullptr, "SetTsiMode"},
|
||||||
|
{7, nullptr, "GeneralTest"},
|
||||||
|
{8, nullptr, "HidConnect"},
|
||||||
|
{9, nullptr, "GeneralGet"},
|
||||||
|
{10, nullptr, "GetGattClientDisconnectionReason"},
|
||||||
|
{11, nullptr, "GetBleConnectionParameter"},
|
||||||
|
{12, nullptr, "GetBleConnectionParameterRequest"},
|
||||||
|
{13, nullptr, "Unknown13"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
IBtmDebug::~IBtmDebug() = default;
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
21
src/core/hle/service/btm/btm_debug.h
Normal file
21
src/core/hle/service/btm/btm_debug.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
class IBtmDebug final : public ServiceFramework<IBtmDebug> {
|
||||||
|
public:
|
||||||
|
explicit IBtmDebug(Core::System& system_);
|
||||||
|
~IBtmDebug() override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
32
src/core/hle/service/btm/btm_system.cpp
Normal file
32
src/core/hle/service/btm/btm_system.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/hle/service/btm/btm_system.h"
|
||||||
|
#include "core/hle/service/btm/btm_system_core.h"
|
||||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
IBtmSystem::IBtmSystem(Core::System& system_) : ServiceFramework{system_, "btm:sys"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, C<&IBtmSystem::GetCore>, "GetCore"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
IBtmSystem::~IBtmSystem() = default;
|
||||||
|
|
||||||
|
Result IBtmSystem::GetCore(OutInterface<IBtmSystemCore> out_interface) {
|
||||||
|
LOG_WARNING(Service_BTM, "called");
|
||||||
|
|
||||||
|
*out_interface = std::make_shared<IBtmSystemCore>(system);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
25
src/core/hle/service/btm/btm_system.h
Normal file
25
src/core/hle/service/btm/btm_system.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
class IBtmSystemCore;
|
||||||
|
|
||||||
|
class IBtmSystem final : public ServiceFramework<IBtmSystem> {
|
||||||
|
public:
|
||||||
|
explicit IBtmSystem(Core::System& system_);
|
||||||
|
~IBtmSystem() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result GetCore(OutInterface<IBtmSystemCore> out_interface);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
92
src/core/hle/service/btm/btm_system_core.cpp
Normal file
92
src/core/hle/service/btm/btm_system_core.cpp
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/hle/service/btm/btm_system_core.h"
|
||||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/service/server_manager.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
IBtmSystemCore::IBtmSystemCore(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "IBtmSystemCore"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, C<&IBtmSystemCore::StartGamepadPairing>, "StartGamepadPairing"},
|
||||||
|
{1, C<&IBtmSystemCore::CancelGamepadPairing>, "CancelGamepadPairing"},
|
||||||
|
{2, nullptr, "ClearGamepadPairingDatabase"},
|
||||||
|
{3, nullptr, "GetPairedGamepadCount"},
|
||||||
|
{4, nullptr, "EnableRadio"},
|
||||||
|
{5, nullptr, "DisableRadio"},
|
||||||
|
{6, C<&IBtmSystemCore::IsRadioEnabled>, "IsRadioEnabled"},
|
||||||
|
{7, nullptr, "AcquireRadioEvent"},
|
||||||
|
{8, nullptr, "AcquireGamepadPairingEvent"},
|
||||||
|
{9, nullptr, "IsGamepadPairingStarted"},
|
||||||
|
{10, nullptr, "StartAudioDeviceDiscovery"},
|
||||||
|
{11, nullptr, "StopAudioDeviceDiscovery"},
|
||||||
|
{12, nullptr, "IsDiscoveryingAudioDevice"},
|
||||||
|
{13, nullptr, "GetDiscoveredAudioDevice"},
|
||||||
|
{14, nullptr, "AcquireAudioDeviceConnectionEvent"},
|
||||||
|
{15, nullptr, "ConnectAudioDevice"},
|
||||||
|
{16, nullptr, "IsConnectingAudioDevice"},
|
||||||
|
{17, C<&IBtmSystemCore::GetConnectedAudioDevices>, "GetConnectedAudioDevices"},
|
||||||
|
{18, nullptr, "DisconnectAudioDevice"},
|
||||||
|
{19, nullptr, "AcquirePairedAudioDeviceInfoChangedEvent"},
|
||||||
|
{20, C<&IBtmSystemCore::GetPairedAudioDevices>, "GetPairedAudioDevices"},
|
||||||
|
{21, nullptr, "RemoveAudioDevicePairing"},
|
||||||
|
{22, C<&IBtmSystemCore::RequestAudioDeviceConnectionRejection>, "RequestAudioDeviceConnectionRejection"},
|
||||||
|
{23, C<&IBtmSystemCore::CancelAudioDeviceConnectionRejection>, "CancelAudioDeviceConnectionRejection"}
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
IBtmSystemCore::~IBtmSystemCore() = default;
|
||||||
|
|
||||||
|
Result IBtmSystemCore::StartGamepadPairing() {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::CancelGamepadPairing() {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::IsRadioEnabled(Out<bool> out_is_enabled) {
|
||||||
|
LOG_DEBUG(Service_BTM, "(STUBBED) called"); // Spams a lot when controller applet is running
|
||||||
|
|
||||||
|
*out_is_enabled = true;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::GetConnectedAudioDevices(
|
||||||
|
Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_count = 0;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::GetPairedAudioDevices(
|
||||||
|
Out<s32> out_count, OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_count = 0;
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmSystemCore::CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called, applet_resource_user_id={}", aruid.pid);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
37
src/core/hle/service/btm/btm_system_core.h
Normal file
37
src/core/hle/service/btm/btm_system_core.h
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
class IBtmSystemCore final : public ServiceFramework<IBtmSystemCore> {
|
||||||
|
public:
|
||||||
|
explicit IBtmSystemCore(Core::System& system_);
|
||||||
|
~IBtmSystemCore() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result StartGamepadPairing();
|
||||||
|
Result CancelGamepadPairing();
|
||||||
|
Result IsRadioEnabled(Out<bool> out_is_enabled);
|
||||||
|
|
||||||
|
Result GetConnectedAudioDevices(
|
||||||
|
Out<s32> out_count,
|
||||||
|
OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
|
||||||
|
|
||||||
|
Result GetPairedAudioDevices(
|
||||||
|
Out<s32> out_count,
|
||||||
|
OutArray<std::array<u8, 0xFF>, BufferAttr_HipcPointer> out_audio_devices);
|
||||||
|
|
||||||
|
Result RequestAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
|
||||||
|
Result CancelAudioDeviceConnectionRejection(ClientAppletResourceUserId aruid);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
32
src/core/hle/service/btm/btm_user.cpp
Normal file
32
src/core/hle/service/btm/btm_user.cpp
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/hle/service/btm/btm_user.h"
|
||||||
|
#include "core/hle/service/btm/btm_user_core.h"
|
||||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
IBtmUser::IBtmUser(Core::System& system_) : ServiceFramework{system_, "btm:u"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, C<&IBtmUser::GetCore>, "GetCore"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
}
|
||||||
|
|
||||||
|
IBtmUser::~IBtmUser() = default;
|
||||||
|
|
||||||
|
Result IBtmUser::GetCore(OutInterface<IBtmUserCore> out_interface) {
|
||||||
|
LOG_WARNING(Service_BTM, "called");
|
||||||
|
|
||||||
|
*out_interface = std::make_shared<IBtmUserCore>(system);
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
25
src/core/hle/service/btm/btm_user.h
Normal file
25
src/core/hle/service/btm/btm_user.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
class IBtmUserCore;
|
||||||
|
|
||||||
|
class IBtmUser final : public ServiceFramework<IBtmUser> {
|
||||||
|
public:
|
||||||
|
explicit IBtmUser(Core::System& system_);
|
||||||
|
~IBtmUser() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result GetCore(OutInterface<IBtmUserCore> out_interface);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
106
src/core/hle/service/btm/btm_user_core.cpp
Normal file
106
src/core/hle/service/btm/btm_user_core.cpp
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
#include "common/logging/log.h"
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/hle/kernel/k_event.h"
|
||||||
|
#include "core/hle/service/btm/btm_user_core.h"
|
||||||
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
|
#include "core/hle/service/ipc_helpers.h"
|
||||||
|
#include "core/hle/service/server_manager.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
IBtmUserCore::IBtmUserCore(Core::System& system_)
|
||||||
|
: ServiceFramework{system_, "IBtmUserCore"}, service_context{system_, "IBtmUserCore"} {
|
||||||
|
// clang-format off
|
||||||
|
static const FunctionInfo functions[] = {
|
||||||
|
{0, C<&IBtmUserCore::AcquireBleScanEvent>, "AcquireBleScanEvent"},
|
||||||
|
{1, nullptr, "GetBleScanFilterParameter"},
|
||||||
|
{2, nullptr, "GetBleScanFilterParameter2"},
|
||||||
|
{3, nullptr, "StartBleScanForGeneral"},
|
||||||
|
{4, nullptr, "StopBleScanForGeneral"},
|
||||||
|
{5, nullptr, "GetBleScanResultsForGeneral"},
|
||||||
|
{6, nullptr, "StartBleScanForPaired"},
|
||||||
|
{7, nullptr, "StopBleScanForPaired"},
|
||||||
|
{8, nullptr, "StartBleScanForSmartDevice"},
|
||||||
|
{9, nullptr, "StopBleScanForSmartDevice"},
|
||||||
|
{10, nullptr, "GetBleScanResultsForSmartDevice"},
|
||||||
|
{17, C<&IBtmUserCore::AcquireBleConnectionEvent>, "AcquireBleConnectionEvent"},
|
||||||
|
{18, nullptr, "BleConnect"},
|
||||||
|
{19, nullptr, "BleDisconnect"},
|
||||||
|
{20, nullptr, "BleGetConnectionState"},
|
||||||
|
{21, nullptr, "AcquireBlePairingEvent"},
|
||||||
|
{22, nullptr, "BlePairDevice"},
|
||||||
|
{23, nullptr, "BleUnPairDevice"},
|
||||||
|
{24, nullptr, "BleUnPairDevice2"},
|
||||||
|
{25, nullptr, "BleGetPairedDevices"},
|
||||||
|
{26, C<&IBtmUserCore::AcquireBleServiceDiscoveryEvent>, "AcquireBleServiceDiscoveryEvent"},
|
||||||
|
{27, nullptr, "GetGattServices"},
|
||||||
|
{28, nullptr, "GetGattService"},
|
||||||
|
{29, nullptr, "GetGattIncludedServices"},
|
||||||
|
{30, nullptr, "GetBelongingGattService"},
|
||||||
|
{31, nullptr, "GetGattCharacteristics"},
|
||||||
|
{32, nullptr, "GetGattDescriptors"},
|
||||||
|
{33, C<&IBtmUserCore::AcquireBleMtuConfigEvent>, "AcquireBleMtuConfigEvent"},
|
||||||
|
{34, nullptr, "ConfigureBleMtu"},
|
||||||
|
{35, nullptr, "GetBleMtu"},
|
||||||
|
{36, nullptr, "RegisterBleGattDataPath"},
|
||||||
|
{37, nullptr, "UnregisterBleGattDataPath"},
|
||||||
|
};
|
||||||
|
// clang-format on
|
||||||
|
RegisterHandlers(functions);
|
||||||
|
|
||||||
|
scan_event = service_context.CreateEvent("IBtmUserCore:ScanEvent");
|
||||||
|
connection_event = service_context.CreateEvent("IBtmUserCore:ConnectionEvent");
|
||||||
|
service_discovery_event = service_context.CreateEvent("IBtmUserCore:DiscoveryEvent");
|
||||||
|
config_event = service_context.CreateEvent("IBtmUserCore:ConfigEvent");
|
||||||
|
}
|
||||||
|
|
||||||
|
IBtmUserCore::~IBtmUserCore() {
|
||||||
|
service_context.CloseEvent(scan_event);
|
||||||
|
service_context.CloseEvent(connection_event);
|
||||||
|
service_context.CloseEvent(service_discovery_event);
|
||||||
|
service_context.CloseEvent(config_event);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmUserCore::AcquireBleScanEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_is_valid = true;
|
||||||
|
*out_event = &scan_event->GetReadableEvent();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmUserCore::AcquireBleConnectionEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_is_valid = true;
|
||||||
|
*out_event = &connection_event->GetReadableEvent();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmUserCore::AcquireBleServiceDiscoveryEvent(
|
||||||
|
Out<bool> out_is_valid, OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_is_valid = true;
|
||||||
|
*out_event = &service_discovery_event->GetReadableEvent();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
Result IBtmUserCore::AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event) {
|
||||||
|
LOG_WARNING(Service_BTM, "(STUBBED) called");
|
||||||
|
|
||||||
|
*out_is_valid = true;
|
||||||
|
*out_event = &config_event->GetReadableEvent();
|
||||||
|
R_SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
47
src/core/hle/service/btm/btm_user_core.h
Normal file
47
src/core/hle/service/btm/btm_user_core.h
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "core/hle/service/cmif_types.h"
|
||||||
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
#include "core/hle/service/service.h"
|
||||||
|
|
||||||
|
namespace Kernel {
|
||||||
|
class KEvent;
|
||||||
|
class KReadableEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Core {
|
||||||
|
class System;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace Service::BTM {
|
||||||
|
|
||||||
|
class IBtmUserCore final : public ServiceFramework<IBtmUserCore> {
|
||||||
|
public:
|
||||||
|
explicit IBtmUserCore(Core::System& system_);
|
||||||
|
~IBtmUserCore() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Result AcquireBleScanEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
|
||||||
|
Result AcquireBleConnectionEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
|
||||||
|
Result AcquireBleServiceDiscoveryEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
|
||||||
|
Result AcquireBleMtuConfigEvent(Out<bool> out_is_valid,
|
||||||
|
OutCopyHandle<Kernel::KReadableEvent> out_event);
|
||||||
|
|
||||||
|
KernelHelpers::ServiceContext service_context;
|
||||||
|
|
||||||
|
Kernel::KEvent* scan_event;
|
||||||
|
Kernel::KEvent* connection_event;
|
||||||
|
Kernel::KEvent* service_discovery_event;
|
||||||
|
Kernel::KEvent* config_event;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Service::BTM
|
Loading…
Reference in a new issue