diff --git a/Source/sys-clk/README.md b/Source/sys-clk/README.md index 353730ae..d112d973 100644 --- a/Source/sys-clk/README.md +++ b/Source/sys-clk/README.md @@ -1,163 +1,4 @@ -# sys-clk +# hoc-clk Switch sysmodule allowing you to set cpu/gpu/mem clocks according to the running application and docked state. - -## Installation - -The following instructions assumes you have a Nintendo Switch running Atmosphère, updated to at least the latest stable version. -Copy the `atmosphere`, and `switch` folders at the root of your sdcard, overwriting files if prompted. Also copy the `config` folder if you're not updating, to include default settings. - -**Note:** sys-clk-overlay requires to have [Tesla](https://gbatemp.net/threads/tesla-the-nintendo-switch-overlay-menu.557362/) installed and running - -## Relevant files - -* Config file allows one to set custom clocks per docked state and title id, described below - - `/config/sys-clk/config.ini` - -* Log file where the logs are written if enabled - - `/config/sys-clk/log.txt` - -* Log flag file enables log writing if file exists - - `/config/sys-clk/log.flag` - -* CSV file where the title id, profile, clocks and temperatures are written if enabled - - `/config/sys-clk/context.csv` - -* sys-clk manager app (accessible from the hbmenu) - - `/switch/sys-clk-manager.nro` - -* sys-clk overlay (accessible from anywhere by invoking the [Tesla menu](https://gbatemp.net/threads/tesla-the-nintendo-switch-overlay-menu.557362/)) - - `/switch/.overlays/sys-clk-overlay.ovl` - -* sys-clk core sysmodule - - `/atmosphere/contents/00FF0000636C6BFF/exefs.nsp` - `/atmosphere/contents/00FF0000636C6BFF/flags/boot2.flag` - -## Config - -Presets can be customized by adding them to the ini config file located at `/config/sys-clk/config.ini`, using the following template for each app - -``` -[Application Title ID] -docked_cpu= -docked_gpu= -docked_mem= -handheld_charging_cpu= -handheld_charging_gpu= -handheld_charging_mem= -handheld_charging_usb_cpu= -handheld_charging_usb_gpu= -handheld_charging_usb_mem= -handheld_charging_official_cpu= -handheld_charging_official_gpu= -handheld_charging_official_mem= -handheld_cpu= -handheld_gpu= -handheld_mem= -``` - -* Replace `Application Title ID` with the title id of the game/application you're interested in customizing. -A list of games title id can be found in the [Switchbrew wiki](https://switchbrew.org/wiki/Title_list/Games). -* Frequencies are expressed in mhz, and will be scaled to the nearest possible values, described in the clock table below. -* If any key is omitted, value is empty or set to 0, it will be ignored, and stock clocks will apply. -* If charging, sys-clk will look for the frequencies in that order, picking the first found - 1. Charger specific config (USB or Official) `handheld_charging_usb_X` or `handheld_charging_official_X` - 2. Non specific charging config `handheld_charging_X` - 3. Handheld config `handheld_X` - -### Example 1: Zelda BOTW - -* Overclock CPU when docked or charging -* Overclock MEM to docked clocks when handheld - -Leads to a smoother framerate overall (ex: in the korok forest) - -``` -[01007EF00011E000] -docked_cpu=1224 -handheld_charging_cpu=1224 -handheld_mem=1600 -``` - -### Example 2: Picross - -* Underclocks on handheld to save battery - -``` -[0100BA0003EEA000] -handheld_cpu=816 -handheld_gpu=153 -handheld_mem=800 -``` - -### Advanced - -The `[values]` section allows you to alter timings in sys-clk, you should not need to edit any of these unless you know what you are doing. Possible values are: - -| Key | Desc | Default | -|:-----------------------:|-------------------------------------------------------------------------------|:-------:| -|**temp_log_interval_ms** | Defines how often sys-clk logs temperatures, in milliseconds (`0` to disable) | 0 ms | -|**freq_log_interval_ms** | Defines how often sys-clk logs real freqs, in milliseconds (`0` to disable) | 0 ms | -|**power_log_interval_ms**| Defines how often sys-clk logs power usage, in milliseconds (`0` to disable) | 0 ms | -|**csv_write_interval_ms**| Defines how often sys-clk writes to the CSV, in milliseconds (`0` to disable) | 0 ms | -|**poll_interval_ms** | Defines how fast sys-clk checks and applies profiles, in milliseconds | 300 ms | - - -## Capping - -To protect the battery from excessive strain, clocks requested from config may be capped before applying, depending on your current profile: - -| | Handheld | Charging (USB) | Charging (Official) | Docked | -|:-----:|:--------:|:--------------:|:-------------------:|:------:| -|**MEM**| - | - | - | - | -|**CPU**| - | - | - | - | -|**GPU**| 460 MHz* | 768 MHz | - | - | -*\* GPU handheld max for Mariko is increased to 614 MHz* - -## Clock table (MHz) - -### MEM clocks -* 1600 → official docked, boost mode, max clock -* 1331 → official handheld -* 1065 -* 800 -* 665 - -### CPU clocks -* 1785 → max clock, boost mode -* 1683 -* 1581 -* 1428 -* 1326 -* 1224 → sdev oc -* 1122 -* 1020 → official docked & handheld -* 918 -* 816 -* 714 -* 612 - -### GPU clocks -* 921 → max clock -* 844 -* 768 → official docked -* 691 -* 614 -* 537 -* 460 → max handheld -* 384 → official handheld -* 307 → official handheld -* 230 -* 153 -* 76 → boost mode - -**Notes:** -1. GPU overclock is capped at 460MHz in handheld and capped at 768MHz if charging, unless you're using the PD Charger. -2. Clocks higher than 768MHz need the PD Charger is plugged in. +Modified for Horizon OC \ No newline at end of file diff --git a/Source/sys-clk/sysmodule/src/batLib.h b/Source/sys-clk/common/include/battery.h similarity index 100% rename from Source/sys-clk/sysmodule/src/batLib.h rename to Source/sys-clk/common/include/battery.h diff --git a/Source/sys-clk/sysmodule/src/i2c_reg.h b/Source/sys-clk/common/include/i2c.h similarity index 100% rename from Source/sys-clk/sysmodule/src/i2c_reg.h rename to Source/sys-clk/common/include/i2c.h diff --git a/Source/sys-clk/sysmodule/src/notification.h b/Source/sys-clk/common/include/notification.h similarity index 100% rename from Source/sys-clk/sysmodule/src/notification.h rename to Source/sys-clk/common/include/notification.h diff --git a/Source/sys-clk/sysmodule/src/pcv_types.h b/Source/sys-clk/common/include/pcv_types.h similarity index 100% rename from Source/sys-clk/sysmodule/src/pcv_types.h rename to Source/sys-clk/common/include/pcv_types.h diff --git a/Source/sys-clk/common/include/pwm.h b/Source/sys-clk/common/include/pwm.h new file mode 100644 index 00000000..aa443e7d --- /dev/null +++ b/Source/sys-clk/common/include/pwm.h @@ -0,0 +1,22 @@ +#pragma once + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + Service s; +} PwmChannelSession; + +Result pwmInitialize(void); +void pwmExit(void); +Service* pwmGetServiceSession(void); +Result pwmOpenSession2(PwmChannelSession *out, u32 device_code); +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out); +void pwmChannelSessionClose(PwmChannelSession *c); + +#ifdef __cplusplus +} // extern "C" +#endif \ No newline at end of file diff --git a/Source/sys-clk/overlay/src/rgltr.h b/Source/sys-clk/common/include/rgltr.h similarity index 100% rename from Source/sys-clk/overlay/src/rgltr.h rename to Source/sys-clk/common/include/rgltr.h diff --git a/Source/sys-clk/sysmodule/src/rgltr_services.h b/Source/sys-clk/common/include/rgltr_services.h similarity index 100% rename from Source/sys-clk/sysmodule/src/rgltr_services.h rename to Source/sys-clk/common/include/rgltr_services.h diff --git a/Source/sys-clk/common/include/service_guard.h b/Source/sys-clk/common/include/service_guard.h new file mode 100644 index 00000000..d7ce9a7a --- /dev/null +++ b/Source/sys-clk/common/include/service_guard.h @@ -0,0 +1,65 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include + +typedef struct ServiceGuard { + Mutex mutex; + u32 refCount; +} ServiceGuard; + +NX_INLINE bool serviceGuardBeginInit(ServiceGuard* g) +{ + mutexLock(&g->mutex); + return (g->refCount++) == 0; +} + +NX_INLINE Result serviceGuardEndInit(ServiceGuard* g, Result rc, void (*cleanupFunc)(void)) +{ + if (R_FAILED(rc)) { + cleanupFunc(); + --g->refCount; + } + mutexUnlock(&g->mutex); + return rc; +} + +NX_INLINE void serviceGuardExit(ServiceGuard* g, void (*cleanupFunc)(void)) +{ + mutexLock(&g->mutex); + if (g->refCount && (--g->refCount) == 0) + cleanupFunc(); + mutexUnlock(&g->mutex); +} + +#define NX_GENERATE_SERVICE_GUARD_PARAMS(name, _paramdecl, _parampass) \ +\ +static ServiceGuard g_##name##Guard; \ +NX_INLINE Result _##name##Initialize _paramdecl; \ +static void _##name##Cleanup(void); \ +\ +Result name##Initialize _paramdecl \ +{ \ + Result rc = 0; \ + if (serviceGuardBeginInit(&g_##name##Guard)) \ + rc = _##name##Initialize _parampass; \ + return serviceGuardEndInit(&g_##name##Guard, rc, _##name##Cleanup); \ +} \ +\ +void name##Exit(void) \ +{ \ + serviceGuardExit(&g_##name##Guard, _##name##Cleanup); \ +} + +#define NX_GENERATE_SERVICE_GUARD(name) NX_GENERATE_SERVICE_GUARD_PARAMS(name, (void), ()) + +#ifdef __cplusplus +} +#endif diff --git a/Source/sys-clk/common/include/sysclk/board.h b/Source/sys-clk/common/include/sysclk/board.h index ac91de4f..8462993f 100644 --- a/Source/sys-clk/common/include/sysclk/board.h +++ b/Source/sys-clk/common/include/sysclk/board.h @@ -103,6 +103,7 @@ typedef enum HocClkPartLoad_GPU, HocClkPartLoad_CPUAvg, HocClkPartLoad_BAT, + HocClkPartLoad_FAN, SysClkPartLoad_EnumMax } SysClkPartLoad; diff --git a/Source/sys-clk/sysmodule/src/i2c_reg.cpp b/Source/sys-clk/common/src/i2c.cpp similarity index 99% rename from Source/sys-clk/sysmodule/src/i2c_reg.cpp rename to Source/sys-clk/common/src/i2c.cpp index 8ed9f4db..07425514 100644 --- a/Source/sys-clk/sysmodule/src/i2c_reg.cpp +++ b/Source/sys-clk/common/src/i2c.cpp @@ -1,4 +1,4 @@ -#include "i2c_reg.h" +#include "i2c.h" Result I2cSet_U8(I2cDevice dev, u8 reg, u8 val) { // ams::fatal::srv::StopSoundTask::StopSound() diff --git a/Source/sys-clk/common/src/pwm.c b/Source/sys-clk/common/src/pwm.c new file mode 100644 index 00000000..cae9c6f5 --- /dev/null +++ b/Source/sys-clk/common/src/pwm.c @@ -0,0 +1,35 @@ +#define NX_SERVICE_ASSUME_NON_DOMAIN +#include +#include "service_guard.h" +#include "pwm.h" + +static Service g_pwmSrv; + +NX_GENERATE_SERVICE_GUARD(pwm); + +Result _pwmInitialize(void) { + return smGetService(&g_pwmSrv, "pwm"); +} + +void _pwmCleanup(void) { + serviceClose(&g_pwmSrv); +} + +Service* pwmGetServiceSession(void) { + return &g_pwmSrv; +} + +Result pwmOpenSession2(PwmChannelSession *out, u32 device_code) { + return serviceDispatchIn(&g_pwmSrv, 2, device_code, + .out_num_objects = 1, + .out_objects = &out->s, + ); +} + +Result pwmChannelSessionGetDutyCycle(PwmChannelSession *c, double* out) { + return serviceDispatchOut(&c->s, 7, *out); +} + +void pwmChannelSessionClose(PwmChannelSession *controller) { + serviceClose(&controller->s); +} \ No newline at end of file diff --git a/Source/sys-clk/sysmodule/src/rgltr_services.cpp b/Source/sys-clk/common/src/rgltr_services.cpp similarity index 100% rename from Source/sys-clk/sysmodule/src/rgltr_services.cpp rename to Source/sys-clk/common/src/rgltr_services.cpp diff --git a/Source/sys-clk/overlay/src/pcv_types.h b/Source/sys-clk/overlay/src/pcv_types.h deleted file mode 100644 index 50d3e3ea..00000000 --- a/Source/sys-clk/overlay/src/pcv_types.h +++ /dev/null @@ -1,41 +0,0 @@ -typedef enum { - PcvPowerDomain_Max77620_Sd0 = 0, - PcvPowerDomain_Max77620_Sd1 = 1, - PcvPowerDomain_Max77620_Sd2 = 2, - PcvPowerDomain_Max77620_Sd3 = 3, - PcvPowerDomain_Max77620_Ldo0 = 4, - PcvPowerDomain_Max77620_Ldo1 = 5, - PcvPowerDomain_Max77620_Ldo2 = 6, - PcvPowerDomain_Max77620_Ldo3 = 7, - PcvPowerDomain_Max77620_Ldo4 = 8, - PcvPowerDomain_Max77620_Ldo5 = 9, - PcvPowerDomain_Max77620_Ldo6 = 10, - PcvPowerDomain_Max77620_Ldo7 = 11, - PcvPowerDomain_Max77620_Ldo8 = 12, - PcvPowerDomain_Max77621_Cpu = 13, - PcvPowerDomain_Max77621_Gpu = 14, - PcvPowerDomain_Max77812_Cpu = 15, - PcvPowerDomain_Max77812_Gpu = 16, - PcvPowerDomain_Max77812_Dram = 17, -} PowerDomain; - -typedef enum { - PcvPowerDomainId_Max77620_Sd0 = 0x3A000080, - PcvPowerDomainId_Max77620_Sd1 = 0x3A000081, - PcvPowerDomainId_Max77620_Sd2 = 0x3A000082, - PcvPowerDomainId_Max77620_Sd3 = 0x3A000083, - PcvPowerDomainId_Max77620_Ldo0 = 0x3A0000A0, - PcvPowerDomainId_Max77620_Ldo1 = 0x3A0000A1, - PcvPowerDomainId_Max77620_Ldo2 = 0x3A0000A2, - PcvPowerDomainId_Max77620_Ldo3 = 0x3A0000A3, - PcvPowerDomainId_Max77620_Ldo4 = 0x3A0000A4, - PcvPowerDomainId_Max77620_Ldo5 = 0x3A0000A5, - PcvPowerDomainId_Max77620_Ldo6 = 0x3A0000A6, - PcvPowerDomainId_Max77620_Ldo7 = 0x3A0000A7, - PcvPowerDomainId_Max77620_Ldo8 = 0x3A0000A8, - PcvPowerDomainId_Max77621_Cpu = 0x3A000003, - PcvPowerDomainId_Max77621_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Cpu = 0x3A000003, - PcvPowerDomainId_Max77812_Gpu = 0x3A000004, - PcvPowerDomainId_Max77812_Dram = 0x3A000005, -} PowerDomainId; \ No newline at end of file diff --git a/Source/sys-clk/overlay/src/rgltr_services.cpp b/Source/sys-clk/overlay/src/rgltr_services.cpp deleted file mode 100644 index 5f2160db..00000000 --- a/Source/sys-clk/overlay/src/rgltr_services.cpp +++ /dev/null @@ -1,43 +0,0 @@ -// rgltr_services.cpp (no changes needed here—just compile it once) -#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) { - // Service returns µV (microvolts) in a local u32: - u32 temp = 0; - Result rc = serviceDispatchOut(&session->s, 4, temp); - if (R_SUCCEEDED(rc)) { - *out_volt = temp; - } - return rc; -} - -void rgltrCloseSession(RgltrSession* session) { - serviceClose(&session->s); -} diff --git a/Source/sys-clk/overlay/src/rgltr_services.h b/Source/sys-clk/overlay/src/rgltr_services.h deleted file mode 100644 index 32becbf8..00000000 --- a/Source/sys-clk/overlay/src/rgltr_services.h +++ /dev/null @@ -1,29 +0,0 @@ -// rgltr_services.h -// ======== -// Minimal header declarations for rgltr‐related functionality. -// Any file that wants to call rgltrOpenSession(), rgltrGetVoltage(), etc. should -// simply do `#include "infonx.h"` (NOT infonx.cpp). - -#pragma once - -#include // for Service, Result, hosversionBefore(), smGetService(), serviceClose(), etc. -#include "rgltr.h" // for RgltrSession, PowerDomainId, etc. - -// Global service handle for "rgltr". Defined in infonx.cpp. -extern Service g_rgltrSrv; - -// Open/close the "rgltr" service. You must call rgltrInitialize() (once) before using -// rgltrOpenSession() & friends. Call rgltrExit() when your app is shutting down. -Result rgltrInitialize(void); -void rgltrExit(void); - -// Open a regulator session for the given PowerDomainId (e.g. CPU, GPU, DRAM). -// On success, (*session_out).s will contain a valid Service handle. -Result rgltrOpenSession(RgltrSession* session_out, PowerDomainId module_id); - -// Query the current voltage (in microvolts, µV) from a previously opened session. -// Writes the result into *out_volt. -Result rgltrGetVoltage(RgltrSession* session, u32* out_volt); - -// Close a previously opened regulator session. -void rgltrCloseSession(RgltrSession* session); diff --git a/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.cpp b/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.cpp index 5c00ad27..0fc63dcb 100644 --- a/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.cpp +++ b/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.cpp @@ -56,7 +56,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { // All constants pre-calculated and cached static constexpr const char* const labels[] = { - "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", "Skin", "Now", "Avg", "BAT", "PMIC" + "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", "Skin", "Now", "Avg", "BAT", "PMIC", "FAN" }; static constexpr u32 dataPositions[6] = {63-3+3, 200-1, 344-1-3, 200-1, 342-1, 321-1}; @@ -159,6 +159,10 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) { renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage renderer->drawString(displayStrings[23], false, positions[2] - 2, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat Age + renderer->drawString(labels[12], false, positions[6], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label + + renderer->drawString(displayStrings[24], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed + } // Optimized refresh - now does all the string formatting once per second @@ -262,6 +266,8 @@ void BaseMenuGui::refresh() sprintf(displayStrings[23], "%u%%", context->PartLoad[HocClkPartLoad_BAT] / 1000); + sprintf(displayStrings[24], "%u%%", context->PartLoad[HocClkPartLoad_FAN]); + } tsl::elm::Element* BaseMenuGui::baseUI() diff --git a/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.h b/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.h index cb84bdf4..34cf0442 100644 --- a/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.h +++ b/Source/sys-clk/overlay/src/ui/gui/base_menu_gui.h @@ -27,7 +27,6 @@ #pragma once -#include "../../rgltr_services.h" #include "../../ipc.h" #include "base_gui.h" diff --git a/Source/sys-clk/sysmodule/src/board.cpp b/Source/sys-clk/sysmodule/src/board.cpp index b7e180d2..987443e7 100644 --- a/Source/sys-clk/sysmodule/src/board.cpp +++ b/Source/sys-clk/sysmodule/src/board.cpp @@ -33,7 +33,8 @@ #include // for std::clamp #include #include -#include "batLib.h" +#include +#include #define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0)) #define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0)) @@ -42,7 +43,6 @@ #define systemtickfrequency 19200000 #define systemtickfrequencyF 19200000.0f #define CPU_TICK_WAIT (1'000'000'000 / 60) -float fanTemp = 0; Result nvCheck = 1; Thread gpuLThread; @@ -50,9 +50,14 @@ Thread cpuCore0Thread; Thread cpuCore1Thread; Thread cpuCore2Thread; Thread cpuCore3Thread; +Thread miscThread; +double temp = 0; -FanController fanController; -Result fanCheck = 1; +PwmChannelSession g_ICon; +Result pwmCheck = 1; +Result pwmDutyCycleCheck = 1; +double Rotation_Duty = 0; +u8 fanLevel; uint32_t GPU_Load_u = 0, fd = 0; BatteryChargeInfo info; @@ -142,6 +147,21 @@ void gpuLoadThread(void*) { } while(true); } +void miscThreadFunc(void*) { + for(;;) { + if (R_SUCCEEDED(pwmCheck)) { + if (R_SUCCEEDED(pwmChannelSessionGetDutyCycle(&g_ICon, &temp))) { + temp *= 10; + temp = trunc(temp); + temp /= 10; + Rotation_Duty = 100.0 - temp; + } + } + fanLevel = (u8)Rotation_Duty; + svcSleepThread(300'000'000); + } +} + void Board::Initialize() { @@ -181,10 +201,10 @@ void Board::Initialize() rc = rgltrInitialize(); ASSERT_RESULT_OK(rc, "rgltrInitialize"); - if (R_SUCCEEDED(fanInitialize())) { - if (hosversionAtLeast(7,0,0)) fanCheck = fanOpenController(&fanController, 0x3D000001); - else fanCheck = fanOpenController(&fanController, 1); - } + // if (R_SUCCEEDED(fanInitialize())) { + // if (hosversionAtLeast(7,0,0)) fanCheck = fanOpenController(&fanController, 0x3D000001); + // else fanCheck = fanOpenController(&fanController, 1); + // } threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2); @@ -194,12 +214,19 @@ void Board::Initialize() threadCreate(&cpuCore1Thread, CheckCore, &idletick1, NULL, 0x1000, 0x10, 1); threadCreate(&cpuCore2Thread, CheckCore, &idletick2, NULL, 0x1000, 0x10, 2); threadCreate(&cpuCore3Thread, CheckCore, &idletick3, NULL, 0x1000, 0x10, 3); + threadCreate(&miscThread, miscThreadFunc, NULL, NULL, 0x1000, 0x3F, 3); threadStart(&cpuCore0Thread); threadStart(&cpuCore1Thread); threadStart(&cpuCore2Thread); threadStart(&cpuCore3Thread); + threadStart(&miscThread); batteryInfoInitialize(); + + if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) { + pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001); + } + FetchHardwareInfos(); } @@ -230,8 +257,10 @@ void Board::Exit() threadClose(&cpuCore1Thread); threadClose(&cpuCore2Thread); threadClose(&cpuCore3Thread); + threadClose(&miscThread); - fanExit(); + pwmChannelSessionClose(&g_ICon); + pwmExit(); rgltrExit(); batteryInfoExit(); } @@ -578,6 +607,8 @@ std::uint32_t Board::GetPartLoad(SysClkPartLoad loadSource) case HocClkPartLoad_BAT: batteryInfoGetChargeInfo(&info); return info.RawBatteryCharge; + case HocClkPartLoad_FAN: + return GetFanRotationLevel(); default: ASSERT_ENUM_VALID(SysClkPartLoad, loadSource); } @@ -726,6 +757,6 @@ std::uint32_t Board::GetVoltage(HocClkVoltage voltage) } u8 Board::GetFanRotationLevel() { - fanControllerGetRotationSpeedLevel(&fanController, &fanTemp); - return (u8)fanTemp; + return fanLevel; } + diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index dad62042..b0964785 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -33,7 +33,7 @@ #include "errors.h" #include "ipc_service.h" #include "kip.h" -#include "i2c_reg.h" +#include #include "notification.h" #define HOSPPC_HAS_BOOST (hosversionAtLeast(7,0,0)) @@ -587,8 +587,6 @@ bool ClockManager::RefreshContext() FileUtils::WriteContextToCsv(this->context); } - this->context->fanLevel = Board::GetFanRotationLevel(); - return hasChanged; } diff --git a/Source/sys-clk/sysmodule/src/rgltr.h b/Source/sys-clk/sysmodule/src/rgltr.h deleted file mode 100644 index dd57f4c5..00000000 --- a/Source/sys-clk/sysmodule/src/rgltr.h +++ /dev/null @@ -1,19 +0,0 @@ -#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);