diff --git a/include/services/mcu/mcu_hwc.hpp b/include/services/mcu/mcu_hwc.hpp index d082952c..354a0c20 100644 --- a/include/services/mcu/mcu_hwc.hpp +++ b/include/services/mcu/mcu_hwc.hpp @@ -1,4 +1,5 @@ #pragma once +#include "config.hpp" #include "helpers.hpp" #include "kernel_types.hpp" #include "logger.hpp" @@ -10,11 +11,13 @@ namespace MCU { Memory& mem; MAKE_LOG_FUNCTION(log, mcuLogger) + const EmulatorConfig& config; + // Service commands void getBatteryLevel(u32 messagePointer); public: - HWCService(Memory& mem) : mem(mem) {} + HWCService(Memory& mem, const EmulatorConfig& config) : mem(mem), config(config) {} void reset(); void handleSyncRequest(u32 messagePointer); }; diff --git a/src/core/services/mcu/mcu_hwc.cpp b/src/core/services/mcu/mcu_hwc.cpp index cc91d3a2..2873adf5 100644 --- a/src/core/services/mcu/mcu_hwc.cpp +++ b/src/core/services/mcu/mcu_hwc.cpp @@ -4,6 +4,7 @@ namespace MCU::HWCCommands { enum : u32 { + GetBatteryLevel = 0x00050000, }; } @@ -12,6 +13,15 @@ void MCU::HWCService::reset() {} void MCU::HWCService::handleSyncRequest(u32 messagePointer) { const u32 command = mem.read32(messagePointer); switch (command) { + case HWCCommands::GetBatteryLevel: getBatteryLevel(messagePointer); break; default: Helpers::panic("MCU::HWC service requested. Command: %08X\n", command); } +} + +void MCU::HWCService::getBatteryLevel(u32 messagePointer) { + log("MCU::HWC::GetBatteryLevel\n"); + + mem.write32(messagePointer, IPC::responseHeader(0x5, 2, 0)); + mem.write32(messagePointer + 4, Result::Success); + mem.write8(messagePointer + 8, config.batteryPercentage); } \ No newline at end of file diff --git a/src/core/services/service_manager.cpp b/src/core/services/service_manager.cpp index 97b70b21..4a728545 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), mcu_hwc(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, config), 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;