[HID] Implement events

This commit is contained in:
wheremyfoodat 2023-04-29 02:45:21 +03:00
parent 5465eb31c1
commit 6419098851
7 changed files with 34 additions and 15 deletions

View file

@ -41,12 +41,6 @@ namespace KernelHandles {
MinSharedMemHandle = GSPSharedMemHandle, MinSharedMemHandle = GSPSharedMemHandle,
MaxSharedMemHandle = HIDSharedMemHandle, MaxSharedMemHandle = HIDSharedMemHandle,
HIDEvent0,
HIDEvent1,
HIDEvent2,
HIDEvent3,
HIDEvent4
}; };
// Returns whether "handle" belongs to one of the OS services // Returns whether "handle" belongs to one of the OS services

View file

@ -198,4 +198,5 @@ public:
void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); } void sendGPUInterrupt(GPUInterrupt type) { serviceManager.requestGPUInterrupt(type); }
void signalDSPEvents() { serviceManager.signalDSPEvents(); } void signalDSPEvents() { serviceManager.signalDSPEvents(); }
void updateInputs() { serviceManager.updateInputs(); }
}; };

View file

@ -1,17 +1,26 @@
#pragma once #pragma once
#include <array>
#include <optional>
#include "helpers.hpp" #include "helpers.hpp"
#include "kernel_types.hpp" #include "kernel_types.hpp"
#include "logger.hpp" #include "logger.hpp"
#include "memory.hpp" #include "memory.hpp"
// Circular dependency because we need HID to spawn events
class Kernel;
class HIDService { class HIDService {
Handle handle = KernelHandles::HID; Handle handle = KernelHandles::HID;
Memory& mem; Memory& mem;
Kernel& kernel;
u8* sharedMem = nullptr; // Pointer to HID shared memory u8* sharedMem = nullptr; // Pointer to HID shared memory
bool accelerometerEnabled; bool accelerometerEnabled;
bool eventsInitialized;
bool gyroEnabled; bool gyroEnabled;
std::array<std::optional<Handle>, 5> events;
MAKE_LOG_FUNCTION(log, hidLogger) MAKE_LOG_FUNCTION(log, hidLogger)
// Service commands // Service commands
@ -22,9 +31,10 @@ class HIDService {
void getIPCHandles(u32 messagePointer); void getIPCHandles(u32 messagePointer);
public: public:
HIDService(Memory& mem) : mem(mem) {} HIDService(Memory& mem, Kernel& kernel) : mem(mem), kernel(kernel) {}
void reset(); void reset();
void handleSyncRequest(u32 messagePointer); void handleSyncRequest(u32 messagePointer);
void updateInputs();
void setSharedMem(u8* ptr) { void setSharedMem(u8* ptr) {
sharedMem = ptr; sharedMem = ptr;

View file

@ -82,4 +82,5 @@ public:
void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); } void setHIDSharedMem(u8* ptr) { hid.setSharedMem(ptr); }
void signalDSPEvents() { dsp.signalEvents(); } void signalDSPEvents() { dsp.signalEvents(); }
void updateInputs() { hid.updateInputs(); }
}; };

View file

@ -1,5 +1,6 @@
#include "services/hid.hpp" #include "services/hid.hpp"
#include "ipc.hpp" #include "ipc.hpp"
#include "kernel.hpp"
#include <bit> #include <bit>
namespace HIDCommands { namespace HIDCommands {
@ -80,15 +81,23 @@ void HIDService::getGyroscopeCoefficient(u32 messagePointer) {
void HIDService::getIPCHandles(u32 messagePointer) { void HIDService::getIPCHandles(u32 messagePointer) {
log("HID::GetIPCHandles\n"); log("HID::GetIPCHandles\n");
// Initialize HID events
if (!eventsInitialized) {
eventsInitialized = true;
for (auto& e : events) {
e = kernel.makeEvent(ResetType::OneShot);
}
}
mem.write32(messagePointer, IPC::responseHeader(0xA, 1, 7)); mem.write32(messagePointer, IPC::responseHeader(0xA, 1, 7));
mem.write32(messagePointer + 4, Result::Success); // Result code mem.write32(messagePointer + 4, Result::Success); // Result code
mem.write32(messagePointer + 8, 0x14000000); // Translation descriptor mem.write32(messagePointer + 8, 0x14000000); // Translation descriptor
mem.write32(messagePointer + 12, KernelHandles::HIDSharedMemHandle); // Shared memory handle mem.write32(messagePointer + 12, KernelHandles::HIDSharedMemHandle); // Shared memory handle
// HID event handles // Write HID event handles
mem.write32(messagePointer + 16, KernelHandles::HIDEvent0); for (int i = 0; i < events.size(); i++) {
mem.write32(messagePointer + 20, KernelHandles::HIDEvent1); mem.write32(messagePointer + 16 + sizeof(Handle) * i, events[i].value());
mem.write32(messagePointer + 24, KernelHandles::HIDEvent2); }
mem.write32(messagePointer + 28, KernelHandles::HIDEvent3);
mem.write32(messagePointer + 32, KernelHandles::HIDEvent4);
} }

View file

@ -5,8 +5,9 @@
ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel) ServiceManager::ServiceManager(std::array<u32, 16>& regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel)
: regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem), : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem),
cecd(mem, kernel), cfg(mem), dsp(mem, kernel), hid(mem), frd(mem), fs(mem, kernel), gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), cecd(mem, kernel), cfg(mem), dsp(mem, kernel), hid(mem, kernel), frd(mem), fs(mem, kernel),
ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem), ptm(mem), y2r(mem, kernel) {} gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem),
ptm(mem), y2r(mem, kernel) {}
static constexpr int MAX_NOTIFICATION_COUNT = 16; static constexpr int MAX_NOTIFICATION_COUNT = 16;

View file

@ -31,6 +31,9 @@ void Emulator::run() {
kernel.sendGPUInterrupt(GPUInterrupt::VBlank0); kernel.sendGPUInterrupt(GPUInterrupt::VBlank0);
kernel.sendGPUInterrupt(GPUInterrupt::VBlank1); kernel.sendGPUInterrupt(GPUInterrupt::VBlank1);
// Update inputs in the HID module
kernel.updateInputs();
SDL_Event event; SDL_Event event;
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) { if (event.type == SDL_QUIT) {