From 196933a6b30954a83d4082a4ebec632a21af9e75 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Tue, 12 May 2026 17:00:46 -0400 Subject: [PATCH] hocclk: read voltage from i2c instead of rgltr --- Source/hoc-clk/sysmodule/src/board/board.cpp | 5 -- .../sysmodule/src/board/board_misc.cpp | 1 - .../sysmodule/src/board/board_volt.cpp | 49 ++++---------- Source/hoc-clk/sysmodule/src/hos/rgltr.h | 38 ----------- .../sysmodule/src/hos/rgltr_services.cpp | 66 ------------------- .../sysmodule/src/hos/rgltr_services.h | 32 --------- Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp | 20 ++++++ Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h | 8 ++- 8 files changed, 39 insertions(+), 180 deletions(-) delete mode 100644 Source/hoc-clk/sysmodule/src/hos/rgltr.h delete mode 100644 Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp delete mode 100644 Source/hoc-clk/sysmodule/src/hos/rgltr_services.h diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index ab7b9768..8d611419 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -37,7 +37,6 @@ #include #include #include "../display/display_refresh_rate.hpp" -#include #include #include "board.hpp" @@ -135,9 +134,6 @@ namespace board { rc = tmp451Initialize(); ASSERT_RESULT_OK(rc, "tmp451Initialize"); - rc = rgltrInitialize(); - ASSERT_RESULT_OK(rc, "rgltrInitialize"); - rc = pmdmntInitialize(); ASSERT_RESULT_OK(rc, "pmdmntInitialize"); @@ -220,7 +216,6 @@ namespace board { pwmChannelSessionClose(&iCon); pwmExit(); - rgltrExit(); batteryInfoExit(); pmdmntExit(); nvExit(); diff --git a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp index 51ce8c46..d7402d9a 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_misc.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_misc.cpp @@ -27,7 +27,6 @@ #include #include #include -#include namespace board { diff --git a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp index c7a51fe1..c8d34166 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_volt.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_volt.cpp @@ -22,13 +22,12 @@ #include #include #include -#include #include #include "board.hpp" #include "board_freq.hpp" #include "board_volt.hpp" #include "../file/file_utils.hpp" - +#include "../i2c/i2cDrv.h" namespace board { GpuVoltData voltData = {}; @@ -215,59 +214,39 @@ namespace board { } PowerDomainId; */ u32 GetVoltage(HocClkVoltage voltage) { - RgltrSession session; - Result rc = 0; u32 out = 0; BatteryChargeInfo info; switch (voltage) { case HocClkVoltage_SOC: - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77620_Sd0); - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); + out = I2c_BuckConverter_GetUvOut(&I2c_SOC); break; case HocClkVoltage_EMCVDD2: - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77620_Sd1); - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); + out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); break; case HocClkVoltage_CPU: - if (GetSocType() == HocClkSocType_Mariko) { - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77621_Cpu); + if(GetSocType() == HocClkSocType_Mariko) { + out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_CPU); } else { - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77812_Cpu); + out = I2c_BuckConverter_GetUvOut(&I2c_Erista_CPU); } - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); break; case HocClkVoltage_GPU: - if (GetSocType() == HocClkSocType_Mariko) { - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77621_Gpu); + if(GetSocType() == HocClkSocType_Mariko) { + out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_GPU); } else { - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77812_Gpu); - } - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); + out = I2c_BuckConverter_GetUvOut(&I2c_Erista_GPU); + } break; case HocClkVoltage_EMCVDDQ: - if (GetSocType() == HocClkSocType_Mariko) { - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77812_Dram); - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); + if(GetSocType() == HocClkSocType_Mariko) { + out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_DRAM_VDDQ); } else { - out = GetVoltage(HocClkVoltage_EMCVDD2); // VDD2 and VDDQ are always connected to the same rail on Erista + out = I2c_BuckConverter_GetUvOut(&I2c_VDD2); } break; case HocClkVoltage_Display: - rc = rgltrOpenSession(&session, PcvPowerDomainId_Max77620_Ldo0); - ASSERT_RESULT_OK(rc, "rgltrOpenSession") - rgltrGetVoltage(&session, &out); - rgltrCloseSession(&session); + out = I2c_BuckConverter_GetUvOut(&I2c_Display); break; case HocClkVoltage_Battery: batteryInfoGetChargeInfo(&info); diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr.h b/Source/hoc-clk/sysmodule/src/hos/rgltr.h deleted file mode 100644 index 33268b8a..00000000 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) ppkantorski (bord2death) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once -#include -#include "pcv_types.h" - -typedef struct { - Service s; -} RgltrSession; - -Result rgltrInitialize(void); - -void rgltrExit(void); - -Service* rgltrGetServiceSession(void); - -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); -void rgltrCloseSession(RgltrSession* session); -Result rgltrGetVoltage(RgltrSession* session, u32 *out_volt); -Result rgltrGetPowerModuleNumLimit(u32 *out); -Result rgltrGetVoltageEnabled(RgltrSession* session, u32 *out); -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt); -Result rgltrCancelVoltageRequest(RgltrSession* session); \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp deleted file mode 100644 index 6365e2ed..00000000 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) ppkantorski (bord2death) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include "rgltr.h" -#include "rgltr_services.h" // for extern Service g_rgltrSrv, etc. - -// Global service handle -Service g_rgltrSrv; - -Result rgltrInitialize(void) { - if (hosversionBefore(8, 0, 0)) { - return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); - } - return smGetService(&g_rgltrSrv, "rgltr"); -} - -void rgltrExit(void) { - serviceClose(&g_rgltrSrv); -} - -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id) { - const u32 in = (u32)module_id; - return serviceDispatchIn( - &g_rgltrSrv, - 0, - in, - .out_num_objects = 1, - .out_objects = &session_out->s - ); -} - -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt) { - u32 temp = 0; - Result rc = serviceDispatchOut(&session->s, 4, temp); - if (R_SUCCEEDED(rc)) { - *out_volt = temp; - } - return rc; -} - -Result rgltrRequestVoltage(RgltrSession* session, u32 microvolt) { - return serviceDispatchIn(&session->s, 5, microvolt); -} - -Result rgltrCancelVoltageRequest(RgltrSession* session) { - return serviceDispatch(&session->s, 6); -} - -void rgltrCloseSession(RgltrSession* session) { - serviceClose(&session->s); -} diff --git a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h b/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h deleted file mode 100644 index 2010cc33..00000000 --- a/Source/hoc-clk/sysmodule/src/hos/rgltr_services.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) ppkantorski (bord2death) - * - * This program is free software; you can redistribute it and/or modify it - * under the terms and conditions of the GNU General Public License, - * version 2, as published by the Free Software Foundation. - * - * This program is distributed in the hope it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#pragma once - -#include // for Service, Result, hosversionBefore(), smGetService(), serviceClose(), etc. -#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. - -extern Service g_rgltrSrv; - -Result rgltrInitialize(void); -void rgltrExit(void); - -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); - -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt); - -void rgltrCloseSession(RgltrSession* session); diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp index 70bbc287..1b72ad99 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.cpp @@ -103,6 +103,10 @@ u32 I2c_BuckConverter_MultiplierToMvOut(const I2c_BuckConverter_Domain* domain, return (domain->uv_min + domain->uv_step * multiplier) / 1000; } +u32 I2c_BuckConverter_MultiplierToUvOut(const I2c_BuckConverter_Domain* domain, u8 multiplier) { + return domain->uv_min + domain->uv_step * multiplier; +} + u8 I2c_BuckConverter_MvOutToMultiplier(const I2c_BuckConverter_Domain* domain, u32 mvolt) { u32 uvolt = mvolt * 1000; if (uvolt < domain->uv_min) @@ -129,6 +133,22 @@ u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain) { return I2c_BuckConverter_MultiplierToMvOut(domain, val & domain->volt_mask); } +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain) { + u8 val; + // Retry 5 times if received POR value + for (int i = 0; i < 5; i++) { + if (R_FAILED(I2cRead_OutU8(domain->device, domain->reg, &val))) + return 0u; + + // Wait 1us + svcSleepThread(1E3); + + if (!domain->por_val || val != domain->por_val) + break; + } + return I2c_BuckConverter_MultiplierToUvOut(domain, val & domain->volt_mask); +} + Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt) { u8 val; Result res = I2cRead_OutU8(domain->device, domain->reg, &val); diff --git a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h index ad53b472..161306fe 100644 --- a/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h +++ b/Source/hoc-clk/sysmodule/src/i2c/i2cDrv.h @@ -21,6 +21,7 @@ const u8 MAX17050_CURRENT_REG = 0x0A; // Buck Converter typedef enum I2c_BuckConverter_Reg { + I2c_Max77620_SD0VOLT_REG = 0x16, I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 I2c_Max77620_LDO0VOLT_REG = 0x23, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 I2c_Max77621_VOLT_REG = 0x00, @@ -39,16 +40,17 @@ typedef struct I2c_BuckConverter_Domain { u8 por_val; } I2c_BuckConverter_Domain; +const I2c_BuckConverter_Domain I2c_SOC = { I2cDevice_Max77620Pmic, I2c_Max77620_SD0VOLT_REG, 0x7F, 12500, 600000, 1400000, }; +const I2c_BuckConverter_Domain I2c_VDD2 = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1350000, }; +const I2c_BuckConverter_Domain I2c_Display = { I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x3F, 25000, 800000, 1325000, }; const I2c_BuckConverter_Domain I2c_Erista_CPU = { I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; const I2c_BuckConverter_Domain I2c_Erista_GPU = { I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; -const I2c_BuckConverter_Domain I2c_Erista_DRAM = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x3F, 12500, 600000, 1250000, }; -const I2c_BuckConverter_Domain I2c_Display = { I2cDevice_Max77620Pmic, I2c_Max77620_LDO0VOLT_REG, 0x7F, 25000, 800000, 1325000, }; const I2c_BuckConverter_Domain I2c_Mariko_CPU = { I2cDevice_Max77812_2, I2c_Max77812_CPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; const I2c_BuckConverter_Domain I2c_Mariko_GPU = { I2cDevice_Max77812_2, I2c_Max77812_GPUVOLT_REG, 0xFF, 5000, 250000, 1525000, 0x78 }; const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 }; -const I2c_BuckConverter_Domain I2c_Mariko_DRAM_VDD2 = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1250000, }; u32 I2c_BuckConverter_GetMvOut(const I2c_BuckConverter_Domain* domain); +u32 I2c_BuckConverter_GetUvOut(const I2c_BuckConverter_Domain* domain); Result I2c_BuckConverter_SetMvOut(const I2c_BuckConverter_Domain* domain, u32 mvolt); // Bq24193 Battery management