From ba8a610e7bc2cab37dd251b6575a2987d99ab5ef Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Mon, 24 Apr 2023 01:25:29 +0300 Subject: [PATCH] [Y2R] Add more service calls --- include/services/y2r.hpp | 18 ++++++++++++++++ src/core/services/y2r.cpp | 43 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/include/services/y2r.hpp b/include/services/y2r.hpp index 6bd7e6f2..6b8464e8 100644 --- a/include/services/y2r.hpp +++ b/include/services/y2r.hpp @@ -17,11 +17,29 @@ class Y2RService { std::optional transferEndEvent; bool transferEndInterruptEnabled; + enum class BusyStatus : u32 { + NotBusy = 0, + Busy = 1 + }; + + enum class InputFormat : u32 { + YUV422_Individual8 = 0, + YUV420_Individual8 = 1, + YUV422_Individual16 = 2, + YUV420_Individual16 = 3, + YUV422_Batch = 4, + }; + + InputFormat inputFmt; + // Service commands void driverInitialize(u32 messagePointer); + void isBusyConversion(u32 messagePointer); void pingProcess(u32 messagePointer); void setTransferEndInterrupt(u32 messagePointer); void getTransferEndEvent(u32 messagePointer); + void setInputFormat(u32 messagePointer); + void stopConversion(u32 messagePointer); public: Y2RService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} diff --git a/src/core/services/y2r.cpp b/src/core/services/y2r.cpp index 3cbd7137..5ace7878 100644 --- a/src/core/services/y2r.cpp +++ b/src/core/services/y2r.cpp @@ -4,8 +4,11 @@ namespace Y2RCommands { enum : u32 { + SetInputFormat = 0x00010040, SetTransferEndInterrupt = 0x000D0040, GetTransferEndEvent = 0x000F0000, + StopConversion = 0x00270000, + IsBusyConversion = 0x00280000, PingProcess = 0x002A0000, DriverInitialize = 0x002B0000 }; @@ -20,6 +23,8 @@ namespace Result { void Y2RService::reset() { transferEndInterruptEnabled = false; transferEndEvent = std::nullopt; + + inputFmt = InputFormat::YUV422_Individual8; } void Y2RService::handleSyncRequest(u32 messagePointer) { @@ -27,8 +32,11 @@ void Y2RService::handleSyncRequest(u32 messagePointer) { switch (command) { case Y2RCommands::DriverInitialize: driverInitialize(messagePointer); break; case Y2RCommands::GetTransferEndEvent: getTransferEndEvent(messagePointer); break; + case Y2RCommands::IsBusyConversion: isBusyConversion(messagePointer); break; case Y2RCommands::PingProcess: pingProcess(messagePointer); break; + case Y2RCommands::SetInputFormat: setInputFormat(messagePointer); break; case Y2RCommands::SetTransferEndInterrupt: setTransferEndInterrupt(messagePointer); break; + case Y2RCommands::StopConversion: stopConversion(messagePointer); break; default: Helpers::panic("Y2R service requested. Command: %08X\n", command); } } @@ -63,4 +71,39 @@ void Y2RService::setTransferEndInterrupt(u32 messagePointer) { mem.write32(messagePointer, IPC::responseHeader(0xD, 1, 0)); mem.write32(messagePointer + 4, Result::Success); transferEndInterruptEnabled = enable; +} + +// We don't need to actually do anything for this. +// Cause it assumes that +// a) Y2R conversion works +// b) It isn't instant +void Y2RService::stopConversion(u32 messagePointer) { + log("Y2R::StopConversion\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x27, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + +// See above. Our Y2R conversion (when implemented) will be instant because there's really no point trying to delay it +// This is a modern enough console for us to screw timings +void Y2RService::isBusyConversion(u32 messagePointer) { + log("Y2R::IsBusyConversion\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x28, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write32(messagePointer + 8, static_cast(BusyStatus::NotBusy)); +} + +void Y2RService::setInputFormat(u32 messagePointer) { + const u32 format = mem.read32(messagePointer + 4); + log("Y2R::SetInputFormat (format = %d)\n", format); + + if (format > 4) { + Helpers::warn("Warning: Invalid input format for Y2R conversion\n"); + } else { + inputFmt = static_cast(format); + } + + mem.write32(messagePointer, IPC::responseHeader(0x1, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); } \ No newline at end of file