diff --git a/CMakeLists.txt b/CMakeLists.txt index 4231ff53..447f19da 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,7 +136,7 @@ set(SERVICE_SOURCE_FILES src/core/services/service_manager.cpp src/core/services src/core/services/y2r.cpp src/core/services/cam.cpp src/core/services/ldr_ro.cpp src/core/services/act.cpp src/core/services/nfc.cpp src/core/services/dlp_srvr.cpp src/core/services/ir_user.cpp src/core/services/http.cpp src/core/services/soc.cpp - src/core/services/ssl.cpp + src/core/services/ssl.cpp src/core/services/mcu/mcu_hwc.cpp ) set(PICA_SOURCE_FILES src/core/PICA/gpu.cpp src/core/PICA/regs.cpp src/core/PICA/shader_unit.cpp src/core/PICA/shader_interpreter.cpp src/core/PICA/dynapica/shader_rec.cpp @@ -177,7 +177,7 @@ set(HEADER_FILES include/emulator.hpp include/helpers.hpp include/termcolor.hpp include/config.hpp include/services/ir_user.hpp include/http_server.hpp include/cheats.hpp include/action_replay.hpp include/renderer_sw/renderer_sw.hpp include/compiler_builtins.hpp include/fs/romfs.hpp include/fs/ivfc.hpp include/discord_rpc.hpp include/services/http.hpp include/result/result_cfg.hpp - include/math_util.hpp include/services/soc.hpp include/services/ssl.hpp + include/math_util.hpp include/services/soc.hpp include/services/ssl.hpp include/services/mcu/mcu_hwc.hpp ) set(THIRD_PARTY_SOURCE_FILES third_party/imgui/imgui.cpp diff --git a/include/kernel/handles.hpp b/include/kernel/handles.hpp index 79524324..3e222260 100644 --- a/include/kernel/handles.hpp +++ b/include/kernel/handles.hpp @@ -19,24 +19,25 @@ namespace KernelHandles { CECD, // More Streetpass stuff? CFG_U, // CFG service (Console & region info) CFG_I, - DLP_SRVR, // Download Play: Server. Used for network play. - DSP, // DSP service (Used for audio decoding and output) - HID, // HID service (Handles input-related things including gyro. Does NOT handle New3DS controls or CirclePadPro) - HTTP, // HTTP service (Handles HTTP requests) - IR_USER, // One of 3 infrared communication services - FRD, // Friend service (Miiverse friend service) - FS, // Filesystem service - GPU, // GPU service - LCD, // LCD service (Used for configuring the displays) - LDR_RO, // Loader service. Used for loading CROs. - MIC, // MIC service (Controls the microphone) - NFC, // NFC (Duh), used for Amiibo - NIM, // Updates, DLC, etc - NDM, // ????? - PTM, // PTM service (Used for accessing various console info, such as battery, shell and pedometer state) - SOC, // Socket service - SSL, // SSL service (Totally didn't expect that) - Y2R, // Also does camera stuff + DLP_SRVR, // Download Play: Server. Used for network play. + DSP, // DSP service (Used for audio decoding and output) + HID, // HID service (Handles input-related things including gyro. Does NOT handle New3DS controls or CirclePadPro) + HTTP, // HTTP service (Handles HTTP requests) + IR_USER, // One of 3 infrared communication services + FRD, // Friend service (Miiverse friend service) + FS, // Filesystem service + GPU, // GPU service + LCD, // LCD service (Used for configuring the displays) + LDR_RO, // Loader service. Used for loading CROs. + MCU_HWC, // Used for various MCU hardware-related things like battery control + MIC, // MIC service (Controls the microphone) + NFC, // NFC (Duh), used for Amiibo + NIM, // Updates, DLC, etc + NDM, // ????? + PTM, // PTM service (Used for accessing various console info, such as battery, shell and pedometer state) + SOC, // Socket service + SSL, // SSL service (Totally didn't expect that) + Y2R, // Also does camera stuff MinServiceHandle = AC, MaxServiceHandle = Y2R, @@ -81,6 +82,7 @@ namespace KernelHandles { case GPU: return "GSP::GPU"; case LCD: return "GSP::LCD"; case LDR_RO: return "LDR:RO"; + case MCU_HWC: return "MCU::HWC"; case MIC: return "MIC"; case NDM: return "NDM"; case NFC: return "NFC"; diff --git a/include/logger.hpp b/include/logger.hpp index 4048619f..09e8266b 100644 --- a/include/logger.hpp +++ b/include/logger.hpp @@ -48,6 +48,7 @@ namespace Log { static Logger gspGPULogger; static Logger gspLCDLogger; static Logger ldrLogger; + static Logger mcuLogger; static Logger micLogger; static Logger nfcLogger; static Logger nimLogger; diff --git a/include/services/mcu/mcu_hwc.hpp b/include/services/mcu/mcu_hwc.hpp new file mode 100644 index 00000000..d082952c --- /dev/null +++ b/include/services/mcu/mcu_hwc.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "helpers.hpp" +#include "kernel_types.hpp" +#include "logger.hpp" +#include "memory.hpp" + +namespace MCU { + class HWCService { + Handle handle = KernelHandles::MCU_HWC; + Memory& mem; + MAKE_LOG_FUNCTION(log, mcuLogger) + + // Service commands + void getBatteryLevel(u32 messagePointer); + + public: + HWCService(Memory& mem) : mem(mem) {} + void reset(); + void handleSyncRequest(u32 messagePointer); + }; +} // namespace MCU \ No newline at end of file diff --git a/include/services/service_manager.hpp b/include/services/service_manager.hpp index 823ad5fa..e7030956 100644 --- a/include/services/service_manager.hpp +++ b/include/services/service_manager.hpp @@ -24,6 +24,7 @@ #include "services/http.hpp" #include "services/ir_user.hpp" #include "services/ldr_ro.hpp" +#include "services/mcu/mcu_hwc.hpp" #include "services/mic.hpp" #include "services/ndm.hpp" #include "services/nfc.hpp" @@ -73,6 +74,8 @@ class ServiceManager { SSLService ssl; Y2RService y2r; + MCU::HWCService mcu_hwc; + // "srv:" commands void enableNotification(u32 messagePointer); void getServiceHandle(u32 messagePointer); diff --git a/src/core/services/mcu/mcu_hwc.cpp b/src/core/services/mcu/mcu_hwc.cpp new file mode 100644 index 00000000..cc91d3a2 --- /dev/null +++ b/src/core/services/mcu/mcu_hwc.cpp @@ -0,0 +1,17 @@ +#include "ipc.hpp" +#include "result/result.hpp" +#include "services/mcu/mcu_hwc.hpp" + +namespace MCU::HWCCommands { + enum : u32 { + }; +} + +void MCU::HWCService::reset() {} + +void MCU::HWCService::handleSyncRequest(u32 messagePointer) { + const u32 command = mem.read32(messagePointer); + switch (command) { + default: Helpers::panic("MCU::HWC service requested. Command: %08X\n", command); + } +} \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 042d5124..97b70b21 100644 --- a/src/core/services/service_manager.cpp +++ b/src/core/services/service_manager.cpp @@ -8,8 +8,8 @@ ServiceManager::ServiceManager(std::span regs, Memory& mem, GPU& gpu, u32& currentPID, Kernel& kernel, const EmulatorConfig& config) : regs(regs), mem(mem), kernel(kernel), ac(mem), am(mem), boss(mem), act(mem), apt(mem, kernel), cam(mem, kernel), cecd(mem, kernel), cfg(mem), dlp_srvr(mem), dsp(mem, kernel), hid(mem, kernel), http(mem), ir_user(mem, kernel), frd(mem), fs(mem, kernel), - gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem), ptm(mem, config), soc(mem), - ssl(mem), y2r(mem, kernel) {} + gsp_gpu(mem, gpu, kernel, currentPID), gsp_lcd(mem), ldr(mem), mcu_hwc(mem), mic(mem), nfc(mem, kernel), nim(mem), ndm(mem), ptm(mem, config), + soc(mem), ssl(mem), y2r(mem, kernel) {} static constexpr int MAX_NOTIFICATION_COUNT = 16; @@ -33,6 +33,7 @@ void ServiceManager::reset() { gsp_gpu.reset(); gsp_lcd.reset(); ldr.reset(); + mcu_hwc.reset(); mic.reset(); nim.reset(); ndm.reset(); @@ -110,6 +111,7 @@ static std::map serviceMap = { { "gsp::Gpu", KernelHandles::GPU }, { "gsp::Lcd", KernelHandles::LCD }, { "ldr:ro", KernelHandles::LDR_RO }, + { "mcu::HWC", KernelHandles::MCU_HWC }, { "mic:u", KernelHandles::MIC }, { "ndm:u", KernelHandles::NDM }, { "nfc:u", KernelHandles::NFC }, @@ -181,10 +183,10 @@ void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) { case KernelHandles::APT: [[likely]] apt.handleSyncRequest(messagePointer); break; case KernelHandles::DSP: [[likely]] dsp.handleSyncRequest(messagePointer); break; - case KernelHandles::AC: ac.handleSyncRequest(messagePointer); break; + case KernelHandles::AC: ac.handleSyncRequest(messagePointer); break; case KernelHandles::ACT: act.handleSyncRequest(messagePointer); break; - case KernelHandles::AM: am.handleSyncRequest(messagePointer); break; - case KernelHandles::BOSS: boss.handleSyncRequest(messagePointer); break; + case KernelHandles::AM: am.handleSyncRequest(messagePointer); break; + case KernelHandles::BOSS: boss.handleSyncRequest(messagePointer); break; case KernelHandles::CAM: cam.handleSyncRequest(messagePointer); break; case KernelHandles::CECD: cecd.handleSyncRequest(messagePointer); break; case KernelHandles::CFG_U: cfg.handleSyncRequest(messagePointer); break; @@ -192,12 +194,13 @@ void ServiceManager::sendCommandToService(u32 messagePointer, Handle handle) { case KernelHandles::HID: hid.handleSyncRequest(messagePointer); break; case KernelHandles::HTTP: http.handleSyncRequest(messagePointer); break; case KernelHandles::IR_USER: ir_user.handleSyncRequest(messagePointer); break; - case KernelHandles::FRD: frd.handleSyncRequest(messagePointer); break; + case KernelHandles::FRD: frd.handleSyncRequest(messagePointer); break; case KernelHandles::LCD: gsp_lcd.handleSyncRequest(messagePointer); break; - case KernelHandles::LDR_RO: ldr.handleSyncRequest(messagePointer); break; + case KernelHandles::LDR_RO: ldr.handleSyncRequest(messagePointer); break; + case KernelHandles::MCU_HWC: mcu_hwc.handleSyncRequest(messagePointer); break; case KernelHandles::MIC: mic.handleSyncRequest(messagePointer); break; case KernelHandles::NFC: nfc.handleSyncRequest(messagePointer); break; - case KernelHandles::NIM: nim.handleSyncRequest(messagePointer); break; + case KernelHandles::NIM: nim.handleSyncRequest(messagePointer); break; case KernelHandles::NDM: ndm.handleSyncRequest(messagePointer); break; case KernelHandles::PTM: ptm.handleSyncRequest(messagePointer); break; case KernelHandles::SOC: soc.handleSyncRequest(messagePointer); break;