- sys-clk-OC: force disable charging, a temporary toggle that will be reset once power state changes (#57)

This commit is contained in:
KazushiM
2023-01-04 14:25:33 +08:00
parent 277f8d48e5
commit 012cd40a68
13 changed files with 95 additions and 14 deletions

View File

@@ -33,6 +33,8 @@ Result sysclkIpcSetConfigValues(SysClkConfigValueList* configValues);
Result sysclkIpcSetReverseNXRTMode(ReverseNXMode mode); Result sysclkIpcSetReverseNXRTMode(ReverseNXMode mode);
Result sysclkIpcGetFrequencyTable(SysClkModule module, SysClkProfile profile, SysClkFrequencyTable* out_table); Result sysclkIpcGetFrequencyTable(SysClkModule module, SysClkProfile profile, SysClkFrequencyTable* out_table);
Result sysclkIpcGetIsMariko(bool* out_is_mariko); Result sysclkIpcGetIsMariko(bool* out_is_mariko);
Result sysclkIpcGetBatteryChargingDisabledOverride(bool* out_is_true);
Result sysclkIpcSetBatteryChargingDisabledOverride(bool toggle_true);
static inline Result sysclkIpcRemoveOverride(SysClkModule module) static inline Result sysclkIpcRemoveOverride(SysClkModule module)
{ {

View File

@@ -62,7 +62,7 @@ typedef enum
typedef struct typedef struct
{ {
bool systemCoreBoostCPU; bool systemCoreBoostCPU;
bool allowUnsafeFreq; bool batteryChargingDisabledOverride;
bool governor; bool governor;
SysClkProfile realProfile; SysClkProfile realProfile;
} SysClkOcExtra; } SysClkOcExtra;

View File

@@ -32,6 +32,8 @@ enum SysClkIpcCmd
SysClkIpcCmd_SetReverseNXRTMode = 11, SysClkIpcCmd_SetReverseNXRTMode = 11,
SysClkIpcCmd_GetFrequencyTable = 12, SysClkIpcCmd_GetFrequencyTable = 12,
SysClkIpcCmd_GetIsMariko = 13, SysClkIpcCmd_GetIsMariko = 13,
SysClkIpcCmd_GetBatteryChargingDisabledOverride = 14,
SysClkIpcCmd_SetBatteryChargingDisabledOverride = 15,
}; };
typedef struct typedef struct

View File

@@ -133,3 +133,13 @@ Result sysclkIpcGetIsMariko(bool* out_is_mariko)
{ {
return serviceDispatchOut(&g_sysclkSrv, SysClkIpcCmd_GetIsMariko, *out_is_mariko); return serviceDispatchOut(&g_sysclkSrv, SysClkIpcCmd_GetIsMariko, *out_is_mariko);
} }
Result sysclkIpcGetBatteryChargingDisabledOverride(bool* out_is_true)
{
return serviceDispatchOut(&g_sysclkSrv, SysClkIpcCmd_GetBatteryChargingDisabledOverride, *out_is_true);
}
Result sysclkIpcSetBatteryChargingDisabledOverride(bool toggle_true)
{
return serviceDispatchIn(&g_sysclkSrv, SysClkIpcCmd_SetBatteryChargingDisabledOverride, toggle_true);
}

View File

@@ -56,7 +56,7 @@ void FreqChoiceGui::listUI()
size_t idx = 0; size_t idx = 0;
uint32_t freq; uint32_t freq;
while(idx < 20 && (freq = this->hzTable->values[idx])) while(idx < MAX_ENTRIES && (freq = this->hzTable->values[idx]))
{ {
uint32_t mhz = freq / 1000'000; uint32_t mhz = freq / 1000'000;
this->listElement->addItem(this->createFreqListItem(mhz, mhz == this->selectedMHz)); this->listElement->addItem(this->createFreqListItem(mhz, mhz == this->selectedMHz));

View File

@@ -57,6 +57,7 @@ void MiscGui::updateConfigToggles() {
void MiscGui::listUI() void MiscGui::listUI()
{ {
// Config list
sysclkIpcGetConfigValues(this->configList); sysclkIpcGetConfigValues(this->configList);
this->listElement->addItem(new tsl::elm::CategoryHeader("Config")); this->listElement->addItem(new tsl::elm::CategoryHeader("Config"));
@@ -68,6 +69,7 @@ void MiscGui::listUI()
addConfigToggle(SysClkConfigValue_SyncReverseNXMode); addConfigToggle(SysClkConfigValue_SyncReverseNXMode);
addConfigToggle(SysClkConfigValue_GovernorExperimental); addConfigToggle(SysClkConfigValue_GovernorExperimental);
// Charging Current
this->chargingCurrentHeader = new tsl::elm::CategoryHeader(""); this->chargingCurrentHeader = new tsl::elm::CategoryHeader("");
this->listElement->addItem(this->chargingCurrentHeader); this->listElement->addItem(this->chargingCurrentHeader);
this->chargingCurrentBar = new StepTrackBarIcon("", 2000 / 100 + 1); this->chargingCurrentBar = new StepTrackBarIcon("", 2000 / 100 + 1);
@@ -95,6 +97,7 @@ void MiscGui::listUI()
}); });
this->listElement->addItem(this->chargingCurrentBar); this->listElement->addItem(this->chargingCurrentBar);
// Charging Limit
this->chargingLimitHeader = new tsl::elm::CategoryHeader(""); this->chargingLimitHeader = new tsl::elm::CategoryHeader("");
this->listElement->addItem(this->chargingLimitHeader); this->listElement->addItem(this->chargingLimitHeader);
this->chargingLimitBar = new StepTrackBarIcon("", 100 + 1); this->chargingLimitBar = new StepTrackBarIcon("", 100 + 1);
@@ -121,13 +124,26 @@ void MiscGui::listUI()
renderer->drawString("\uE016 Long-term use may render the battery gauge \ninaccurate!", false, x, y + 20, SMALL_TEXT_SIZE, DESC_COLOR); renderer->drawString("\uE016 Long-term use may render the battery gauge \ninaccurate!", false, x, y + 20, SMALL_TEXT_SIZE, DESC_COLOR);
}), SMALL_TEXT_SIZE * 2 + 20); }), SMALL_TEXT_SIZE * 2 + 20);
// Temporary toggles
this->listElement->addItem(new tsl::elm::CategoryHeader("Temporary toggles")); this->listElement->addItem(new tsl::elm::CategoryHeader("Temporary toggles"));
this->chargingDisabledOverrideToggle = new tsl::elm::ToggleListItem("Force Disable Charging", false);
chargingDisabledOverrideToggle->setStateChangedListener([this](bool state) {
Result rc = sysclkIpcSetBatteryChargingDisabledOverride(state);
if (R_FAILED(rc))
FatalGui::openWithResultCode("sysclkIpcSetBatteryChargingDisabledOverride", rc);
this->lastContextUpdate = armGetSystemTick();
});
this->listElement->addItem(this->chargingDisabledOverrideToggle);
this->backlightToggle = new tsl::elm::ToggleListItem("Screen Backlight", false); this->backlightToggle = new tsl::elm::ToggleListItem("Screen Backlight", false);
backlightToggle->setStateChangedListener([this](bool state) { backlightToggle->setStateChangedListener([this](bool state) {
LblUpdate(true); LblUpdate(true);
}); });
this->listElement->addItem(this->backlightToggle); this->listElement->addItem(this->backlightToggle);
// Info
if (this->isMariko) { if (this->isMariko) {
this->listElement->addItem(new tsl::elm::CategoryHeader("Info")); this->listElement->addItem(new tsl::elm::CategoryHeader("Info"));
this->listElement->addItem(new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) { this->listElement->addItem(new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, s32 x, s32 y, s32 w, s32 h) {
@@ -149,6 +165,12 @@ void MiscGui::refresh() {
PsmUpdate(); PsmUpdate();
this->chargingLimitBar->setIcon(PsmGetBatteryStateIcon(this->chargeInfo)); this->chargingLimitBar->setIcon(PsmGetBatteryStateIcon(this->chargeInfo));
bool chargingDisabledOverride;
Result rc = sysclkIpcGetBatteryChargingDisabledOverride(&chargingDisabledOverride);
if (R_FAILED(rc))
FatalGui::openWithResultCode("sysclkIpcGetBatteryChargingDisabledOverride", rc);
this->chargingDisabledOverrideToggle->setState(chargingDisabledOverride);
LblUpdate(); LblUpdate();
this->backlightToggle->setState(lblstatus); this->backlightToggle->setState(lblstatus);

View File

@@ -146,7 +146,7 @@ class MiscGui : public BaseMenuGui
void addConfigToggle(SysClkConfigValue); void addConfigToggle(SysClkConfigValue);
void updateConfigToggles(); void updateConfigToggles();
tsl::elm::ToggleListItem* backlightToggle; tsl::elm::ToggleListItem *chargingDisabledOverrideToggle, *backlightToggle;
tsl::elm::CategoryHeader *chargingCurrentHeader, *chargingLimitHeader; tsl::elm::CategoryHeader *chargingCurrentHeader, *chargingLimitHeader;
StepTrackBarIcon *chargingCurrentBar, *chargingLimitBar; StepTrackBarIcon *chargingCurrentBar, *chargingLimitBar;

View File

@@ -58,6 +58,7 @@ ClockManager::ClockManager()
this->oc = new SysClkOcExtra; this->oc = new SysClkOcExtra;
this->oc->systemCoreBoostCPU = false; this->oc->systemCoreBoostCPU = false;
this->oc->batteryChargingDisabledOverride = false;
this->oc->governor = false; this->oc->governor = false;
this->oc->realProfile = SysClkProfile_Handheld; this->oc->realProfile = SysClkProfile_Handheld;
@@ -209,9 +210,7 @@ void ClockManager::WaitForNextTick()
bool ClockManager::RefreshContext() bool ClockManager::RefreshContext()
{ {
uint32_t chargingCurrent = this->GetConfig()->GetConfigValue(SysClkConfigValue_ChargingCurrentLimit); PsmExt::ChargingHandler(this->GetInstance());
uint32_t chargingLimit = this->GetConfig()->GetConfigValue(SysClkConfigValue_ChargingLimitPercentage);
PsmExt::ChargingHandler(chargingCurrent, chargingLimit);
bool hasChanged = this->config->Refresh(); bool hasChanged = this->config->Refresh();
if (hasChanged) { if (hasChanged) {
@@ -259,11 +258,13 @@ bool ClockManager::RefreshContext()
this->governor->Stop(); this->governor->Stop();
} }
SysClkProfile profile = Clocks::GetCurrentProfile(); SysClkProfile realProfile = Clocks::GetCurrentProfile();
if (profile != this->oc->realProfile) if (realProfile != this->oc->realProfile)
{ {
FileUtils::LogLine("[mgr] Profile change: %s", Clocks::GetProfileName(profile, true)); FileUtils::LogLine("[mgr] Profile change: %s", Clocks::GetProfileName(realProfile, true));
this->oc->realProfile = profile; this->oc->realProfile = realProfile;
// Signal that power state has been changed, reset the override
this->SetBatteryChargingDisabledOverride(false);
hasChanged = true; hasChanged = true;
} }
@@ -371,3 +372,12 @@ Config* ClockManager::GetConfig()
{ {
return this->config; return this->config;
} }
bool ClockManager::GetBatteryChargingDisabledOverride() {
return this->oc->batteryChargingDisabledOverride;
}
Result ClockManager::SetBatteryChargingDisabledOverride(bool toggle_true) {
this->oc->batteryChargingDisabledOverride = toggle_true;
return 0;
}

View File

@@ -19,6 +19,10 @@
#include "oc_extra.h" #include "oc_extra.h"
// Forward declaration
class ReverseNXSync;
class Governor;
class ClockManager class ClockManager
{ {
public: public:
@@ -33,6 +37,8 @@ class ClockManager
void SetRNXRTMode(ReverseNXMode mode); void SetRNXRTMode(ReverseNXMode mode);
SysClkContext GetCurrentContext(); SysClkContext GetCurrentContext();
Config* GetConfig(); Config* GetConfig();
bool GetBatteryChargingDisabledOverride();
Result SetBatteryChargingDisabledOverride(bool toggle_true);
protected: protected:
ClockManager(); ClockManager();

View File

@@ -171,6 +171,15 @@ Result IpcService::ServiceHandlerFunc(void* arg, const IpcServerRequest* r, u8*
case SysClkIpcCmd_GetIsMariko: case SysClkIpcCmd_GetIsMariko:
*out_dataSize = sizeof(bool); *out_dataSize = sizeof(bool);
return ipcSrv->GetIsMariko((bool*)out_data); return ipcSrv->GetIsMariko((bool*)out_data);
case SysClkIpcCmd_GetBatteryChargingDisabledOverride:
*out_dataSize = sizeof(bool);
return ipcSrv->GetBatteryChargingDisabledOverride((bool*)out_data);
case SysClkIpcCmd_SetBatteryChargingDisabledOverride:
if (r->data.size >= sizeof(bool)) {
bool toggle_true = *((bool*)(r->data.ptr));
return ipcSrv->SetBatteryChargingDisabledOverride(toggle_true);
}
break;
} }
return SYSCLK_ERROR(Generic); return SYSCLK_ERROR(Generic);
@@ -321,3 +330,14 @@ Result IpcService::GetIsMariko(bool* out_is_mariko) {
*out_is_mariko = Clocks::GetIsMariko(); *out_is_mariko = Clocks::GetIsMariko();
return 0; return 0;
} }
Result IpcService::GetBatteryChargingDisabledOverride(bool* out_is_true) {
*out_is_true = ClockManager::GetInstance()->GetBatteryChargingDisabledOverride();
return 0;
}
Result IpcService::SetBatteryChargingDisabledOverride(bool toggle_true) {
return ClockManager::GetInstance()->SetBatteryChargingDisabledOverride(toggle_true);
}

View File

@@ -39,6 +39,8 @@ class IpcService
Result SetReverseNXRTMode(ReverseNXMode mode); Result SetReverseNXRTMode(ReverseNXMode mode);
Result GetFrequencyTable(SysClkIpc_GetFrequencyTable_Args* args, SysClkFrequencyTable* out_table); Result GetFrequencyTable(SysClkIpc_GetFrequencyTable_Args* args, SysClkFrequencyTable* out_table);
Result GetIsMariko(bool* out_is_mariko); Result GetIsMariko(bool* out_is_mariko);
Result GetBatteryChargingDisabledOverride(bool* out_is_true);
Result SetBatteryChargingDisabledOverride(bool toggle_true);
bool running; bool running;
Thread thread; Thread thread;

View File

@@ -105,11 +105,12 @@ ReverseNXMode ReverseNXSync::RecheckToolMode() {
} }
void PsmExt::ChargingHandler(uint32_t chargingCurrent, uint32_t chargingLimit) { void PsmExt::ChargingHandler(ClockManager* instance) {
u32 current; u32 current;
Result res = I2c_Bq24193_GetFastChargeCurrentLimit(&current); Result res = I2c_Bq24193_GetFastChargeCurrentLimit(&current);
if (R_SUCCEEDED(res)) { if (R_SUCCEEDED(res)) {
current -= current % 100; current -= current % 100;
u32 chargingCurrent = instance->GetConfig()->GetConfigValue(SysClkConfigValue_ChargingCurrentLimit);
if (current != chargingCurrent) if (current != chargingCurrent)
I2c_Bq24193_SetFastChargeCurrentLimit(chargingCurrent); I2c_Bq24193_SetFastChargeCurrentLimit(chargingCurrent);
} }
@@ -122,7 +123,9 @@ void PsmExt::ChargingHandler(uint32_t chargingCurrent, uint32_t chargingLimit) {
u32 chargeNow = 0; u32 chargeNow = 0;
if (R_SUCCEEDED(psmGetBatteryChargePercentage(&chargeNow))) { if (R_SUCCEEDED(psmGetBatteryChargePercentage(&chargeNow))) {
bool isCharging = PsmIsCharging(info); bool isCharging = PsmIsCharging(info);
if (isCharging && chargingLimit < chargeNow) u32 chargingLimit = instance->GetConfig()->GetConfigValue(SysClkConfigValue_ChargingLimitPercentage);
bool forceDisabled = instance->GetBatteryChargingDisabledOverride();
if (isCharging && (forceDisabled || chargingLimit <= chargeNow))
serviceDispatch(session, Psm_DisableBatteryCharging); serviceDispatch(session, Psm_DisableBatteryCharging);
if (!isCharging && chargingLimit > chargeNow) if (!isCharging && chargingLimit > chargeNow)
serviceDispatch(session, Psm_EnableBatteryCharging); serviceDispatch(session, Psm_EnableBatteryCharging);

View File

@@ -10,6 +10,10 @@
#include "file_utils.h" #include "file_utils.h"
#include "clocks.h" #include "clocks.h"
// Forward declaration
class ClockManager;
#include "clock_manager.h"
class CpuCoreUtil { class CpuCoreUtil {
public: public:
CpuCoreUtil (int coreid, uint64_t ns); CpuCoreUtil (int coreid, uint64_t ns);
@@ -58,8 +62,8 @@ protected:
}; };
namespace PsmExt { namespace PsmExt {
void ChargingHandler(uint32_t chargingCurrent, uint32_t chargingLimit); void ChargingHandler(ClockManager* instance);
}; }
class Governor { class Governor {
public: public: