- sys-clk-OC: Charging current limit

This commit is contained in:
KazushiM
2023-01-02 16:12:13 +08:00
parent 139c7dfcad
commit 277f8d48e5
14 changed files with 270 additions and 135 deletions

View File

@@ -14,6 +14,8 @@
MiscGui::MiscGui()
{
smInitialize();
this->configList = new SysClkConfigValueList {};
this->chargeInfo = new PsmChargeInfo {};
this->i2cInfo = new I2cInfo {};
@@ -27,6 +29,8 @@ MiscGui::~MiscGui()
delete this->chargeInfo;
delete this->i2cInfo;
this->configToggles.clear();
smExit();
}
void MiscGui::addConfigToggle(SysClkConfigValue configVal) {
@@ -62,9 +66,35 @@ void MiscGui::listUI()
addConfigToggle(SysClkConfigValue_AllowUnsafeFrequencies);
addConfigToggle(SysClkConfigValue_SyncReverseNXMode);
addConfigToggle(SysClkConfigValue_DisableFastCharging);
addConfigToggle(SysClkConfigValue_GovernorExperimental);
this->chargingCurrentHeader = new tsl::elm::CategoryHeader("");
this->listElement->addItem(this->chargingCurrentHeader);
this->chargingCurrentBar = new StepTrackBarIcon("", 2000 / 100 + 1);
this->chargingCurrentBar->setProgress(this->configList->values[SysClkConfigValue_ChargingCurrentLimit]);
this->chargingCurrentBar->setValueChangedListener([this](u8 val) {
if (val < 1) {
val = 1;
this->chargingCurrentBar->setProgress(val);
}
if (val > 20) {
val = 20;
this->chargingCurrentBar->setProgress(val);
}
uint32_t current_ma = val * 100;
this->configList->values[SysClkConfigValue_ChargingCurrentLimit] = current_ma;
snprintf(chargingCurrentBarDesc, sizeof(chargingCurrentBarDesc), "Battery Charging Current: %lu mA", this->configList->values[SysClkConfigValue_ChargingCurrentLimit]);
this->chargingCurrentHeader->setText(chargingCurrentBarDesc);
Result rc = sysclkIpcSetConfigValues(this->configList);
if (R_FAILED(rc))
FatalGui::openWithResultCode("sysclkIpcSetConfigValues", rc);
this->lastContextUpdate = armGetSystemTick();
});
this->listElement->addItem(this->chargingCurrentBar);
this->chargingLimitHeader = new tsl::elm::CategoryHeader("");
this->listElement->addItem(this->chargingLimitHeader);
this->chargingLimitBar = new StepTrackBarIcon("", 100 + 1);
@@ -76,7 +106,7 @@ void MiscGui::listUI()
}
this->configList->values[SysClkConfigValue_ChargingLimitPercentage] = val;
snprintf(chargingLimitBarDesc, 30, "Battery Charging Limit: %lu%%", this->configList->values[SysClkConfigValue_ChargingLimitPercentage]);
snprintf(chargingLimitBarDesc, sizeof(chargingLimitBarDesc), "Battery Charging Limit: %lu%% (%u%%)", this->configList->values[SysClkConfigValue_ChargingLimitPercentage], this->batteryChargePerc);
this->chargingLimitHeader->setText(chargingLimitBarDesc);
this->chargingLimitBar->setIcon(PsmGetBatteryStateIcon(this->chargeInfo));
@@ -116,16 +146,20 @@ void MiscGui::refresh() {
sysclkIpcGetConfigValues(this->configList);
updateConfigToggles();
this->chargingLimitBar->setProgress(this->configList->values[SysClkConfigValue_ChargingLimitPercentage]);
snprintf(chargingLimitBarDesc, 30, "Battery Charging Limit: %lu%%", this->configList->values[SysClkConfigValue_ChargingLimitPercentage]);
this->chargingLimitHeader->setText(chargingLimitBarDesc);
PsmUpdate();
this->chargingLimitBar->setIcon(PsmGetBatteryStateIcon(this->chargeInfo));
LblUpdate();
this->backlightToggle->setState(lblstatus);
this->chargingCurrentBar->setProgress(this->configList->values[SysClkConfigValue_ChargingCurrentLimit] / 100);
snprintf(chargingCurrentBarDesc, sizeof(chargingCurrentBarDesc), "Battery Charging Current: %lu mA", this->configList->values[SysClkConfigValue_ChargingCurrentLimit]);
this->chargingCurrentHeader->setText(chargingCurrentBarDesc);
this->chargingLimitBar->setProgress(this->configList->values[SysClkConfigValue_ChargingLimitPercentage]);
snprintf(chargingLimitBarDesc, sizeof(chargingLimitBarDesc), "Battery Charging Limit: %lu%% (%u%%)", this->configList->values[SysClkConfigValue_ChargingLimitPercentage], this->batteryChargePerc);
this->chargingLimitHeader->setText(chargingLimitBarDesc);
if (this->isMariko) {
I2cGetInfo(this->i2cInfo);
UpdateInfo(this->infoVals, sizeof(this->infoVals));

View File

@@ -39,7 +39,6 @@ class MiscGui : public BaseMenuGui
void PsmUpdate(uint32_t dispatchId = 0)
{
smInitialize();
psmInitialize();
if (dispatchId)
@@ -49,113 +48,24 @@ class MiscGui : public BaseMenuGui
}
serviceDispatchOut(psmGetServiceSession(), 17, *(this->chargeInfo));
psmGetBatteryChargePercentage(&(this->batteryChargePerc));
psmExit();
smExit();
}
Result I2cRead_OutU16(u8 reg, I2cDevice dev, u16 *out)
{
// ams::fatal::srv::StopSoundTask::StopSound()
// I2C Bus Communication Reference: https://www.ti.com/lit/an/slva704/slva704.pdf
struct { u8 reg; } __attribute__((packed)) cmd;
struct { u16 val; } __attribute__((packed)) rec;
I2cSession _session;
Result res = i2cOpenSession(&_session, dev);
if (res)
return res;
cmd.reg = reg;
res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All);
if (res) {
i2csessionClose(&_session);
return res;
}
res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All);
if (res) {
i2csessionClose(&_session);
return res;
}
*out = rec.val;
i2csessionClose(&_session);
return 0;
}
Result I2cRead_OutU8(u8 reg, I2cDevice dev, u8 *out)
{
struct { u8 reg; } __attribute__((packed)) cmd;
struct { u8 val; } __attribute__((packed)) rec;
I2cSession _session;
Result res = i2cOpenSession(&_session, dev);
if (res)
return res;
cmd.reg = reg;
res = i2csessionSendAuto(&_session, &cmd, sizeof(cmd), I2cTransactionOption_All);
if (res) {
i2csessionClose(&_session);
return res;
}
res = i2csessionReceiveAuto(&_session, &rec, sizeof(rec), I2cTransactionOption_All);
if (res) {
i2csessionClose(&_session);
return res;
}
*out = rec.val;
i2csessionClose(&_session);
return 0;
}
void I2cGetInfo(I2cInfo* i2cInfo)
{
smInitialize();
i2cInitialize();
// Max17050 fuel gauge regs. Sense resistor and CGain are from Hekate, too lazy to query configuration from reg
constexpr float SenseResistor = 5.; // in uOhm
constexpr float CGain = 1.99993;
constexpr u8 Max17050Reg_Current = 0x0A;
// constexpr u8 Max17050Reg_AvgCurrent = 0x0B;
// constexpr u8 Max17050Reg_Cycle = 0x17;
u16 tmp = 0;
if (R_SUCCEEDED(I2cRead_OutU16(Max17050Reg_Current, I2cDevice_Max17050, &tmp)))
i2cInfo->batCurrent = (s16)tmp * (1.5625 / (SenseResistor * CGain));
i2cInfo->batCurrent = I2c_Max17050_GetBatteryCurrent();
auto I2cRead_Max77812_M_VOUT = [this](u8 reg) {
constexpr u32 MIN_MV = 250;
constexpr u32 MV_STEP = 5;
constexpr u8 RESET_VAL = 0x78;
i2cInfo->cpuVolt = I2c_Max77812_GetMVOUT(I2c_Max77812_CPUVOLT_REG);
i2cInfo->gpuVolt = I2c_Max77812_GetMVOUT(I2c_Max77812_GPUVOLT_REG);
i2cInfo->dramVolt = I2c_Max77812_GetMVOUT(I2c_Max77812_MEMVOLT_REG);
u8 tmp = RESET_VAL;
// Retry 3 times if received RESET_VAL
for (int i = 0; i < 3; i++) {
if (R_FAILED(I2cRead_OutU8(reg, I2cDevice_Max77812_2, &tmp)))
return 0u;
if (tmp != RESET_VAL)
break;
usleep(10);
}
return tmp * MV_STEP + MIN_MV;
};
constexpr u8 Max77812Reg_CPUVolt = 0x26;
constexpr u8 Max77812Reg_GPUVolt = 0x23;
constexpr u8 Max77812Reg_DRAMVolt = 0x25;
i2cInfo->cpuVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_CPUVolt);
i2cInfo->gpuVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_GPUVolt);
i2cInfo->dramVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_DRAMVolt);
I2c_Bq24193_GetFastChargeCurrentLimit(reinterpret_cast<u32 *>(&(chargeInfo->ChargeCurrentLimit)));
i2cExit();
smExit();
}
void UpdateInfo(char* out, size_t outsize)
@@ -193,8 +103,7 @@ class MiscGui : public BaseMenuGui
"%dmV\n"
,
PsmInfoChargerTypeToStr(chargeInfo->ChargerType), chargWattsInfo,
(float)chargeInfo->VoltageAvg / 1000,
(float)chargeInfo->BatteryTemperature / 1000,
(float)chargeInfo->VoltageAvg / 1000, (float)chargeInfo->BatteryTemperature / 1000,
chargeInfo->InputCurrentLimit, chargeInfo->VBUSCurrentLimit,
chargeInfo->ChargeCurrentLimit, chargeVoltLimit,
(float)chargeInfo->RawBatteryCharge / 1000,
@@ -222,7 +131,6 @@ class MiscGui : public BaseMenuGui
void LblUpdate(bool shouldSwitch = false)
{
smInitialize();
lblInitialize();
lblGetBacklightSwitchStatus(&lblstatus);
@@ -230,7 +138,6 @@ class MiscGui : public BaseMenuGui
lblstatus ? lblSwitchBacklightOff(0) : lblSwitchBacklightOn(0);
lblExit();
smExit();
}
bool isMariko = false;
@@ -240,8 +147,8 @@ class MiscGui : public BaseMenuGui
void updateConfigToggles();
tsl::elm::ToggleListItem* backlightToggle;
tsl::elm::CategoryHeader* chargingLimitHeader;
StepTrackBarIcon* chargingLimitBar;
tsl::elm::CategoryHeader *chargingCurrentHeader, *chargingLimitHeader;
StepTrackBarIcon *chargingCurrentBar, *chargingLimitBar;
SysClkConfigValueList* configList;
PsmChargeInfo* chargeInfo;
@@ -250,6 +157,8 @@ class MiscGui : public BaseMenuGui
const char* infoNames = "Charger:\nBattery:\nCurrent Limit:\nCharging Limit:\nRaw Charge:\nBattery Age:\nPower Role:\nCurrent Flow:\n\nCPU Volt:\nGPU Volt:\nDRAM Volt:";
char infoVals[300] = "";
char chargingLimitBarDesc[30] = "";
char chargingLimitBarDesc[40] = "";
char chargingCurrentBarDesc[45] = "";
u32 batteryChargePerc = 0;
u8 frameCounter = 60;
};