From 5255fac387cf014be1da2f5b08310a64af130d99 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Thu, 7 Sep 2023 18:22:26 +0300 Subject: [PATCH] Stub some more cam:u functions (#263) * Stub some cam:u functions * Update cam.cpp --- include/services/cam.hpp | 3 +++ src/core/services/cam.cpp | 42 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/include/services/cam.hpp b/include/services/cam.hpp index 97729209..611a3b6d 100644 --- a/include/services/cam.hpp +++ b/include/services/cam.hpp @@ -25,6 +25,9 @@ class CAMService { void driverInitialize(u32 messagePointer); void getMaxLines(u32 messagePointer); void getBufferErrorInterruptEvent(u32 messagePointer); + void setContrast(u32 messagePointer); + void setFrameRate(u32 messagePointer); + void setTransferLines(u32 messagePointer); public: CAMService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {} diff --git a/src/core/services/cam.cpp b/src/core/services/cam.cpp index e0acab37..a0206077 100644 --- a/src/core/services/cam.cpp +++ b/src/core/services/cam.cpp @@ -6,7 +6,10 @@ namespace CAMCommands { enum : u32 { GetBufferErrorInterruptEvent = 0x00060040, DriverInitialize = 0x00390000, + SetTransferLines = 0x00090100, GetMaxLines = 0x000A0080, + SetFrameRate = 0x00200080, + SetContrast = 0x00230080, }; } @@ -18,7 +21,12 @@ void CAMService::handleSyncRequest(u32 messagePointer) { case CAMCommands::DriverInitialize: driverInitialize(messagePointer); break; case CAMCommands::GetBufferErrorInterruptEvent: getBufferErrorInterruptEvent(messagePointer); break; case CAMCommands::GetMaxLines: getMaxLines(messagePointer); break; - default: Helpers::panic("CAM service requested. Command: %08X\n", command); + case CAMCommands::SetContrast: setContrast(messagePointer); break; + case CAMCommands::SetFrameRate: setFrameRate(messagePointer); break; + case CAMCommands::SetTransferLines: setTransferLines(messagePointer); break; + default: + Helpers::panic("Unimplemented CAM service requested. Command: %08X\n", command); + break; } } @@ -28,6 +36,38 @@ void CAMService::driverInitialize(u32 messagePointer) { mem.write32(messagePointer + 4, Result::Success); } +void CAMService::setContrast(u32 messagePointer) { + const u32 cameraSelect = mem.read32(messagePointer + 4); + const u32 contrast = mem.read32(messagePointer + 8); + + log("CAM::SetPhotoMode (camera select = %d, contrast = %d)\n", cameraSelect, contrast); + + mem.write32(messagePointer, IPC::responseHeader(0x23, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + +void CAMService::setTransferLines(u32 messagePointer) { + const u32 port = mem.read32(messagePointer + 4); + const s16 lines = mem.read16(messagePointer + 8); + const s16 width = mem.read16(messagePointer + 12); + const s16 height = mem.read16(messagePointer + 16); + + log("CAM::SetTransferLines (port = %d, lines = %d, width = %d, height = %d)\n", port, lines, width, height); + + mem.write32(messagePointer, IPC::responseHeader(0x9, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + +void CAMService::setFrameRate(u32 messagePointer) { + const u32 cameraSelect = mem.read32(messagePointer + 4); + const u32 framerate = mem.read32(messagePointer + 8); + + log("CAM::SetPhotoMode (camera select = %d, framerate = %d)\n", cameraSelect, framerate); + + mem.write32(messagePointer, IPC::responseHeader(0x20, 1, 0)); + mem.write32(messagePointer + 4, Result::Success); +} + // Algorithm taken from Citra // https://github.com/citra-emu/citra/blob/master/src/core/hle/service/cam/cam.cpp#L465 void CAMService::getMaxLines(u32 messagePointer) {