mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-04-12 09:09:47 +12:00
[Y2R] Add more service calls
This commit is contained in:
parent
ef6cc56182
commit
ba8a610e7b
2 changed files with 61 additions and 0 deletions
|
@ -17,11 +17,29 @@ class Y2RService {
|
||||||
std::optional<Handle> transferEndEvent;
|
std::optional<Handle> transferEndEvent;
|
||||||
bool transferEndInterruptEnabled;
|
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
|
// Service commands
|
||||||
void driverInitialize(u32 messagePointer);
|
void driverInitialize(u32 messagePointer);
|
||||||
|
void isBusyConversion(u32 messagePointer);
|
||||||
void pingProcess(u32 messagePointer);
|
void pingProcess(u32 messagePointer);
|
||||||
void setTransferEndInterrupt(u32 messagePointer);
|
void setTransferEndInterrupt(u32 messagePointer);
|
||||||
void getTransferEndEvent(u32 messagePointer);
|
void getTransferEndEvent(u32 messagePointer);
|
||||||
|
void setInputFormat(u32 messagePointer);
|
||||||
|
void stopConversion(u32 messagePointer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Y2RService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
Y2RService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
||||||
|
|
|
@ -4,8 +4,11 @@
|
||||||
|
|
||||||
namespace Y2RCommands {
|
namespace Y2RCommands {
|
||||||
enum : u32 {
|
enum : u32 {
|
||||||
|
SetInputFormat = 0x00010040,
|
||||||
SetTransferEndInterrupt = 0x000D0040,
|
SetTransferEndInterrupt = 0x000D0040,
|
||||||
GetTransferEndEvent = 0x000F0000,
|
GetTransferEndEvent = 0x000F0000,
|
||||||
|
StopConversion = 0x00270000,
|
||||||
|
IsBusyConversion = 0x00280000,
|
||||||
PingProcess = 0x002A0000,
|
PingProcess = 0x002A0000,
|
||||||
DriverInitialize = 0x002B0000
|
DriverInitialize = 0x002B0000
|
||||||
};
|
};
|
||||||
|
@ -20,6 +23,8 @@ namespace Result {
|
||||||
void Y2RService::reset() {
|
void Y2RService::reset() {
|
||||||
transferEndInterruptEnabled = false;
|
transferEndInterruptEnabled = false;
|
||||||
transferEndEvent = std::nullopt;
|
transferEndEvent = std::nullopt;
|
||||||
|
|
||||||
|
inputFmt = InputFormat::YUV422_Individual8;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Y2RService::handleSyncRequest(u32 messagePointer) {
|
void Y2RService::handleSyncRequest(u32 messagePointer) {
|
||||||
|
@ -27,8 +32,11 @@ void Y2RService::handleSyncRequest(u32 messagePointer) {
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case Y2RCommands::DriverInitialize: driverInitialize(messagePointer); break;
|
case Y2RCommands::DriverInitialize: driverInitialize(messagePointer); break;
|
||||||
case Y2RCommands::GetTransferEndEvent: getTransferEndEvent(messagePointer); break;
|
case Y2RCommands::GetTransferEndEvent: getTransferEndEvent(messagePointer); break;
|
||||||
|
case Y2RCommands::IsBusyConversion: isBusyConversion(messagePointer); break;
|
||||||
case Y2RCommands::PingProcess: pingProcess(messagePointer); break;
|
case Y2RCommands::PingProcess: pingProcess(messagePointer); break;
|
||||||
|
case Y2RCommands::SetInputFormat: setInputFormat(messagePointer); break;
|
||||||
case Y2RCommands::SetTransferEndInterrupt: setTransferEndInterrupt(messagePointer); break;
|
case Y2RCommands::SetTransferEndInterrupt: setTransferEndInterrupt(messagePointer); break;
|
||||||
|
case Y2RCommands::StopConversion: stopConversion(messagePointer); break;
|
||||||
default: Helpers::panic("Y2R service requested. Command: %08X\n", command);
|
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, IPC::responseHeader(0xD, 1, 0));
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
transferEndInterruptEnabled = enable;
|
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<u32>(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<InputFormat>(format);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x1, 1, 0));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
}
|
}
|
Loading…
Add table
Reference in a new issue