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) {