From 3ad0fc6a564cda013f7da08f6860d380b36fbb67 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Thu, 13 Jul 2023 20:28:32 +0300 Subject: [PATCH] IR please stop --- include/services/ir_user.hpp | 12 +++++++++++- src/core/services/ir_user.cpp | 31 ++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/include/services/ir_user.hpp b/include/services/ir_user.hpp index 213147c9..186d9717 100644 --- a/include/services/ir_user.hpp +++ b/include/services/ir_user.hpp @@ -11,6 +11,10 @@ class Kernel; class IRUserService { + enum class DeviceID : u8 { + CirclePadPro = 1, + }; + Handle handle = KernelHandles::IR_USER; Memory& mem; Kernel& kernel; @@ -20,10 +24,16 @@ class IRUserService { void disconnect(u32 messagePointer); void finalizeIrnop(u32 messagePointer); void getConnectionStatusEvent(u32 messagePointer); + void getReceiveEvent(u32 messagePointer); void initializeIrnopShared(u32 messagePointer); void requireConnection(u32 messagePointer); + void sendIrnop(u32 messagePointer); + + using IREvent = std::optional; + + IREvent connectionStatusEvent = std::nullopt; + IREvent receiveEvent = std::nullopt; - std::optional connectionStatusEvent = std::nullopt; std::optional sharedMemory = std::nullopt; bool connectedDevice = false; diff --git a/src/core/services/ir_user.cpp b/src/core/services/ir_user.cpp index 0d6286ae..47a2299a 100644 --- a/src/core/services/ir_user.cpp +++ b/src/core/services/ir_user.cpp @@ -10,13 +10,16 @@ namespace IRUserCommands { FinalizeIrnop = 0x00020000, RequireConnection = 0x00060040, Disconnect = 0x00090000, + GetReceiveEvent = 0x000A0000, GetConnectionStatusEvent = 0x000C0000, + SendIrnop = 0x000D0042, InitializeIrnopShared = 0x00180182 }; } void IRUserService::reset() { connectionStatusEvent = std::nullopt; + receiveEvent = std::nullopt; sharedMemory = std::nullopt; connectedDevice = false; } @@ -26,9 +29,11 @@ void IRUserService::handleSyncRequest(u32 messagePointer) { switch (command) { case IRUserCommands::Disconnect: disconnect(messagePointer); break; case IRUserCommands::FinalizeIrnop: finalizeIrnop(messagePointer); break; + case IRUserCommands::GetReceiveEvent: getReceiveEvent(messagePointer); break; case IRUserCommands::GetConnectionStatusEvent: getConnectionStatusEvent(messagePointer); break; case IRUserCommands::InitializeIrnopShared: initializeIrnopShared(messagePointer); break; case IRUserCommands::RequireConnection: requireConnection(messagePointer); break; + case IRUserCommands::SendIrnop: sendIrnop(messagePointer); break; default: Helpers::panic("ir:USER service requested. Command: %08X\n", command); } } @@ -84,6 +89,7 @@ void IRUserService::getConnectionStatusEvent(u32 messagePointer) { if (!connectionStatusEvent.has_value()) { connectionStatusEvent = kernel.makeEvent(ResetType::OneShot); } + //kernel.signalEvent(connectionStatusEvent.value()); // ?????????????? mem.write32(messagePointer, IPC::responseHeader(0xC, 1, 2)); mem.write32(messagePointer + 4, Result::Success); @@ -91,6 +97,20 @@ void IRUserService::getConnectionStatusEvent(u32 messagePointer) { mem.write32(messagePointer + 12, connectionStatusEvent.value()); } +void IRUserService::getReceiveEvent(u32 messagePointer) { + log("IR:USER: GetReceiveEvent\n"); + + if (!receiveEvent.has_value()) { + receiveEvent = kernel.makeEvent(ResetType::OneShot); + } + + mem.write32(messagePointer, IPC::responseHeader(0xA, 1, 2)); + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, 0x40000000); + // TOOD: Descriptor here + mem.write32(messagePointer + 12, receiveEvent.value()); +} + void IRUserService::requireConnection(u32 messagePointer) { const u8 deviceID = mem.read8(messagePointer + 4); log("IR:USER: RequireConnection (device: %d)\n", deviceID); @@ -99,9 +119,8 @@ void IRUserService::requireConnection(u32 messagePointer) { if (sharedMemory.has_value()) { u32 sharedMemAddress = sharedMemory.value().addr; - // Seems to be the CirclePad Pro ID - if (deviceID == 1) { - mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionStatus), 2); + if (deviceID == u8(DeviceID::CirclePadPro)) { + mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionStatus), 2); // Citra uses 2 here but only 1 works?? mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, connectionRole), 2); mem.write8(sharedMemAddress + offsetof(SharedMemoryStatus, isConnected), 1); @@ -120,6 +139,12 @@ void IRUserService::requireConnection(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void IRUserService::sendIrnop(u32 messagePointer) { + Helpers::panic("IR:USER: SendIrnop\n"); + + mem.write32(messagePointer + 4, Result::Success); +} + void IRUserService::disconnect(u32 messagePointer) { log("IR:USER: Disconnect\n");