mirror of
https://github.com/wheremyfoodat/Panda3DS.git
synced 2025-07-10 00:58:41 +12:00
CECD: Stub GetChangeStateEventHandle (#776)
* CECD: Stub GetChangeStateEventHandle * More CECD
This commit is contained in:
parent
94d78edb49
commit
8ba3b1ceca
2 changed files with 39 additions and 3 deletions
|
@ -18,10 +18,13 @@ class CECDService {
|
||||||
MAKE_LOG_FUNCTION(log, cecdLogger)
|
MAKE_LOG_FUNCTION(log, cecdLogger)
|
||||||
|
|
||||||
std::optional<Handle> infoEvent;
|
std::optional<Handle> infoEvent;
|
||||||
|
std::optional<Handle> changeStateEvent;
|
||||||
|
|
||||||
// Service commands
|
// Service commands
|
||||||
|
void getChangeStateEventHandle(u32 messagePointer);
|
||||||
void getInfoEventHandle(u32 messagePointer);
|
void getInfoEventHandle(u32 messagePointer);
|
||||||
void openAndRead(u32 messagePointer);
|
void openAndRead(u32 messagePointer);
|
||||||
|
void stop(u32 messagePointer);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CECDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
CECDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
|
||||||
|
|
|
@ -5,18 +5,27 @@
|
||||||
|
|
||||||
namespace CECDCommands {
|
namespace CECDCommands {
|
||||||
enum : u32 {
|
enum : u32 {
|
||||||
|
Stop = 0x000C0040,
|
||||||
GetInfoEventHandle = 0x000F0000,
|
GetInfoEventHandle = 0x000F0000,
|
||||||
|
GetChangeStateEventHandle = 0x00100000,
|
||||||
OpenAndRead = 0x00120104,
|
OpenAndRead = 0x00120104,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void CECDService::reset() { infoEvent = std::nullopt; }
|
void CECDService::reset() {
|
||||||
|
changeStateEvent = std::nullopt;
|
||||||
|
infoEvent = std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
void CECDService::handleSyncRequest(u32 messagePointer) {
|
void CECDService::handleSyncRequest(u32 messagePointer) {
|
||||||
const u32 command = mem.read32(messagePointer);
|
const u32 command = mem.read32(messagePointer);
|
||||||
|
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case CECDCommands::GetInfoEventHandle: getInfoEventHandle(messagePointer); break;
|
case CECDCommands::GetInfoEventHandle: getInfoEventHandle(messagePointer); break;
|
||||||
|
case CECDCommands::GetChangeStateEventHandle: getChangeStateEventHandle(messagePointer); break;
|
||||||
case CECDCommands::OpenAndRead: openAndRead(messagePointer); break;
|
case CECDCommands::OpenAndRead: openAndRead(messagePointer); break;
|
||||||
|
case CECDCommands::Stop: stop(messagePointer); break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
Helpers::panicDev("CECD service requested. Command: %08X\n", command);
|
Helpers::panicDev("CECD service requested. Command: %08X\n", command);
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
@ -34,7 +43,20 @@ void CECDService::getInfoEventHandle(u32 messagePointer) {
|
||||||
mem.write32(messagePointer, IPC::responseHeader(0xF, 1, 2));
|
mem.write32(messagePointer, IPC::responseHeader(0xF, 1, 2));
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
// TODO: Translation descriptor here?
|
// TODO: Translation descriptor here?
|
||||||
mem.write32(messagePointer + 12, infoEvent.value());
|
mem.write32(messagePointer + 12, *infoEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CECDService::getChangeStateEventHandle(u32 messagePointer) {
|
||||||
|
log("CECD::GetChangeStateEventHandle (stubbed)\n");
|
||||||
|
|
||||||
|
if (!changeStateEvent.has_value()) {
|
||||||
|
changeStateEvent = kernel.makeEvent(ResetType::OneShot);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x10, 1, 2));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
// TODO: Translation descriptor here?
|
||||||
|
mem.write32(messagePointer + 12, *changeStateEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CECDService::openAndRead(u32 messagePointer) {
|
void CECDService::openAndRead(u32 messagePointer) {
|
||||||
|
@ -49,3 +71,14 @@ void CECDService::openAndRead(u32 messagePointer) {
|
||||||
mem.write32(messagePointer + 4, Result::Success);
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
mem.write32(messagePointer + 8, 0); // Bytes read
|
mem.write32(messagePointer + 8, 0); // Bytes read
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CECDService::stop(u32 messagePointer) {
|
||||||
|
log("CECD::Stop (stubbed)\n");
|
||||||
|
|
||||||
|
if (changeStateEvent.has_value()) {
|
||||||
|
kernel.signalEvent(*changeStateEvent);
|
||||||
|
}
|
||||||
|
|
||||||
|
mem.write32(messagePointer, IPC::responseHeader(0x0C, 1, 0));
|
||||||
|
mem.write32(messagePointer + 4, Result::Success);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue