Misc gui in sys-clk overlay updated, HOS 15.0.0 test passed

Extracting nca...
79c6b910fe436a85496d3b822f23b8b9.nca (ptm) -> /Volumes/RAMDISK/ptm/
e11685a3958d1f25a8f44f54126b10ff.nca (pcv) -> /Volumes/RAMDISK/pcv/

Converting nca to elf...

Building...

Patching...
Patching pcv for Erista...
CpuClkOSLimit   Count: 1
CpuVoltLimit*   Count: 14
MemClkOSLimit   Count: 32
MemVoltHOS      Count: 2
MemClkPllmLimit Count: 2
	in void ams::ldr::oc::pcv::Erista::Patch(uintptr_t, size_t)
Saving to "/Volumes/RAMDISK/pcv/main.elf.erista"...
Patching pcv for Mariko...
CpuClkOSLimit   Count: 1
CpuClkOfficial  Count: 1
GpuClkOfficial  Count: 1
CpuVoltOfficial Count: 13
MemClkOSLimit   Count: 32
GpuClkPllLimit  Count: 1
MemClkPllmLimit Count: 2
GpuAsmPattern   Count: 2
	in void ams::ldr::oc::pcv::Mariko::Patch(uintptr_t, size_t)
Saving to "/Volumes/RAMDISK/pcv/main.elf.mariko"...
Passed!

Patching ptm (Mariko Only)...
cpuPtmBoost Count: 2
memPtmMax   Count: 9
memPtmAlt   Count: 7
	in void ams::ldr::oc::ptm::Patch(uintptr_t, size_t)
Saving to "/Volumes/RAMDISK/ptm/main.elf.mariko"...
Passed!
This commit is contained in:
KazushiM
2022-10-11 15:24:46 +08:00
parent 1063022b65
commit c8587ce441
5 changed files with 92 additions and 88 deletions

View File

@@ -2,7 +2,7 @@
[![License: GPL v2](https://img.shields.io/badge/License-GPL_v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![Join the chat at https://gitter.im/Switch-OC-Suite/community](https://badges.gitter.im/Switch-OC-Suite/community.svg)](https://gitter.im/Switch-OC-Suite/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![License: GPL v2](https://img.shields.io/badge/License-GPL_v2-blue.svg)](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) [![Join the chat at https://gitter.im/Switch-OC-Suite/community](https://badges.gitter.im/Switch-OC-Suite/community.svg)](https://gitter.im/Switch-OC-Suite/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
Overclocking suite for Nintendo Switch™ Horizon OS (HOS) running on Atmosphere CFW. Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW.
This project will not be actively maintained or regularly updated along with Atmosphere CFW. This project will not be actively maintained or regularly updated along with Atmosphere CFW.

View File

@@ -163,7 +163,7 @@ int main(int argc, char** argv) {
void* mariko_buf = malloc(file_size); void* mariko_buf = malloc(file_size);
std::memcpy(mariko_buf, file_buffer, file_size); std::memcpy(mariko_buf, file_buffer, file_size);
printf("Patching %s (Mariko Only)...", ptm_opt); printf("Patching %s (Mariko Only)...\n", ptm_opt);
ams::ldr::oc::ptm::Patch(reinterpret_cast<uintptr_t>(mariko_buf), file_size); ams::ldr::oc::ptm::Patch(reinterpret_cast<uintptr_t>(mariko_buf), file_size);
if (save_patched) { if (save_patched) {
char* exec_path_mariko = reinterpret_cast<char *>(malloc(exec_path_patched_len)); char* exec_path_mariko = reinterpret_cast<char *>(malloc(exec_path_patched_len));

View File

@@ -90,10 +90,11 @@ void MiscGui::listUI()
}); });
this->listElement->addItem(this->backlightToggle); this->listElement->addItem(this->backlightToggle);
this->listElement->addItem(new tsl::elm::CategoryHeader("Battery & Charging 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) {
renderer->drawString(this->infoOutput, false, x, y + 20, SMALL_TEXT_SIZE, DESC_COLOR); renderer->drawString(this->infoNames, false, x, y + 20, SMALL_TEXT_SIZE, DESC_COLOR);
}), SMALL_TEXT_SIZE * 13 + 20); renderer->drawString(this->infoVals, false, x + 120, y + 20, SMALL_TEXT_SIZE, VALUE_COLOR);
}), SMALL_TEXT_SIZE * 12 + 20);
} }
void MiscGui::refresh() { void MiscGui::refresh() {
@@ -119,6 +120,6 @@ void MiscGui::refresh() {
this->backlightToggle->setState(lblstatus); this->backlightToggle->setState(lblstatus);
I2cGetInfo(this->i2cInfo); I2cGetInfo(this->i2cInfo);
PrintInfo(this->infoOutput, sizeof(this->infoOutput)); UpdateInfo(this->infoVals, sizeof(this->infoVals));
} }
} }

View File

@@ -108,20 +108,6 @@ class MiscGui : public BaseMenuGui
ChargeInfoFlags Flags; //Unknown flags ChargeInfoFlags Flags; //Unknown flags
} ChargeInfo; } ChargeInfo;
typedef enum
{
Max17050Reg_Current = 0x0A,
Max17050Reg_AvgCurrent = 0x0B,
Max17050Reg_Cycle = 0x17,
} Max17050Reg;
typedef enum
{
Max77812Reg_CPUVolt = 0x26,
Max77812Reg_GPUVolt = 0x23,
Max77812Reg_DRAMVolt = 0x25,
} Max77812Reg;
typedef struct { typedef struct {
float batCurrent; float batCurrent;
u32 cpuVolt = 620; u32 cpuVolt = 620;
@@ -141,7 +127,6 @@ class MiscGui : public BaseMenuGui
} }
serviceDispatchOut(psmGetServiceSession(), 17, *(this->chargeInfo)); serviceDispatchOut(psmGetServiceSession(), 17, *(this->chargeInfo));
psmIsEnoughPowerSupplied(&(this->isEnoughPowerSupplied));
psmExit(); psmExit();
smExit(); smExit();
@@ -157,12 +142,7 @@ class MiscGui : public BaseMenuGui
return PsmIsChargerConnected() && ((this->chargeInfo->unk_x14 >> 8) & 1); return PsmIsChargerConnected() && ((this->chargeInfo->unk_x14 >> 8) & 1);
} }
bool PsmIsEnoughPowerSupplied() Result I2cRead_OutU16(u8 reg, I2cDevice dev, u16 *out)
{
return this->isEnoughPowerSupplied;
}
Result I2cReadRegHandler(u8 reg, I2cDevice dev, u16 *out)
{ {
// ams::fatal::srv::StopSoundTask::StopSound() // ams::fatal::srv::StopSoundTask::StopSound()
// I2C Bus Communication Reference: https://www.ti.com/lit/an/slva704/slva704.pdf // I2C Bus Communication Reference: https://www.ti.com/lit/an/slva704/slva704.pdf
@@ -195,53 +175,83 @@ class MiscGui : public BaseMenuGui
return 0; 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) void I2cGetInfo(I2cInfo* i2cInfo)
{ {
smInitialize(); smInitialize();
i2cInitialize(); i2cInitialize();
u16 data = 0;
// Read max17050 furl gauge regs. Sense resistor and CGain are from Hekate, too lazy to query configuration from reg // 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));
auto I2cRead_Max77812_M_VOUT = [this](u8 reg)
{ {
constexpr float SenseResistor = 5.; // in uOhm constexpr u32 MIN_MV = 250;
constexpr float CGain = 1.99993; constexpr u32 MV_STEP = 5;
constexpr u8 RESET_VAL = 0x78;
if (R_SUCCEEDED(I2cReadRegHandler(Max17050Reg_Current, I2cDevice_Max17050, &data))) u8 tmp = RESET_VAL;
i2cInfo->batCurrent = (s16)data * (1.5625 / (SenseResistor * CGain)); // 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);
}
// Read max77812 volt regs return tmp * MV_STEP + MIN_MV;
{ };
auto ConvertToMVolt = [](u32 *out, u16 data)
{
constexpr u32 MinMVolt = 250;
constexpr u32 StepMVolt = 5;
constexpr u32 VoltMask = 0xFF;
u32 mvolt = (data & VoltMask) * StepMVolt + MinMVolt; constexpr u8 Max77812Reg_CPUVolt = 0x26;
constexpr u8 Max77812Reg_GPUVolt = 0x23;
// Ignore 850 mV as it is questionable constexpr u8 Max77812Reg_DRAMVolt = 0x25;
if (mvolt == 850) i2cInfo->cpuVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_CPUVolt);
return; i2cInfo->gpuVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_GPUVolt);
i2cInfo->dramVolt = I2cRead_Max77812_M_VOUT(Max77812Reg_DRAMVolt);
*out = mvolt;
};
if (R_SUCCEEDED(I2cReadRegHandler(Max77812Reg_CPUVolt, I2cDevice_Max77812_2, &data)))
ConvertToMVolt(&(i2cInfo->cpuVolt), data);
if (R_SUCCEEDED(I2cReadRegHandler(Max77812Reg_GPUVolt, I2cDevice_Max77812_2, &data)))
ConvertToMVolt(&(i2cInfo->gpuVolt), data);
if (R_SUCCEEDED(I2cReadRegHandler(Max77812Reg_DRAMVolt, I2cDevice_Max77812_2, &data)))
ConvertToMVolt(&(i2cInfo->dramVolt), data);
}
i2cExit(); i2cExit();
smExit(); smExit();
} }
void PrintInfo(char* out, size_t outsize) void UpdateInfo(char* out, size_t outsize)
{ {
float chargerVoltLimit = (float)chargeInfo->ChargerVoltageLimit / 1000; float chargerVoltLimit = (float)chargeInfo->ChargerVoltageLimit / 1000;
float chargerCurrLimit = (float)chargeInfo->ChargerCurrentLimit / 1000; float chargerCurrLimit = (float)chargeInfo->ChargerCurrentLimit / 1000;
@@ -263,20 +273,18 @@ class MiscGui : public BaseMenuGui
i2cInfo->batCurrent, i2cInfo->batCurrent * (float)chargeInfo->VoltageAvg / 1000'000); i2cInfo->batCurrent, i2cInfo->batCurrent * (float)chargeInfo->VoltageAvg / 1000'000);
snprintf(out, outsize, snprintf(out, outsize,
"%s" "%s%s\n"
"\nCharger: %s%s" "%.3fV %.2f\u00B0C\n"
"\nBattery: %.3fV %.2f\u00B0C" "+%umA, -%umA\n"
"\nCurrent Limit: +%umA, -%umA" "+%umA%s\n"
"\nCharging Limit: +%umA%s" "%.2f%%\n"
"\nRaw Charge: %.2f%%" "%.2f%%\n"
"\nBattery Age: %.2f%%" "%s\n"
"\nPower Role: %s" "%s\n\n"
"\nCurrent Flow: %s\n" "%dmV\n"
"\nCPU Volt: %dmV" "%dmV\n"
"\nGPU Volt: %dmV" "%dmV\n"
"\nDRAM Volt: %dmV"
, ,
PsmIsEnoughPowerSupplied() ? "Enough Power Supplied" : "",
ChargeInfoChargerTypeToStr(chargeInfo->ChargerType), chargWattsInfo, ChargeInfoChargerTypeToStr(chargeInfo->ChargerType), chargWattsInfo,
(float)chargeInfo->VoltageAvg / 1000, (float)chargeInfo->VoltageAvg / 1000,
(float)chargeInfo->BatteryTemperature / 1000, (float)chargeInfo->BatteryTemperature / 1000,
@@ -311,20 +319,14 @@ class MiscGui : public BaseMenuGui
lblInitialize(); lblInitialize();
lblGetBacklightSwitchStatus(&lblstatus); lblGetBacklightSwitchStatus(&lblstatus);
if (shouldSwitch) if (shouldSwitch)
{ lblstatus ? lblSwitchBacklightOff(0) : lblSwitchBacklightOn(0);
if (lblstatus) {
lblSwitchBacklightOff(0);
} else {
lblSwitchBacklightOn(0);
}
}
lblExit(); lblExit();
smExit(); smExit();
} }
typedef enum { typedef enum {
Discharging, Discharging,
NotCharging, ChargingPaused,
SlowCharging, SlowCharging,
FastCharging FastCharging
} BatteryState; } BatteryState;
@@ -334,7 +336,7 @@ class MiscGui : public BaseMenuGui
return Discharging; return Discharging;
if (!PsmIsCharging()) if (!PsmIsCharging())
return NotCharging; return ChargingPaused;
return chargeInfo->ChargeCurrentLimit > 768 ? FastCharging : SlowCharging; return chargeInfo->ChargeCurrentLimit > 768 ? FastCharging : SlowCharging;
} }
@@ -342,7 +344,7 @@ class MiscGui : public BaseMenuGui
const char* getBatteryStateIcon() { const char* getBatteryStateIcon() {
switch (getBatteryState()) { switch (getBatteryState()) {
case Discharging: return "\u25c0"; // ◀ case Discharging: return "\u25c0"; // ◀
case NotCharging: return "\u2016"; // ‖ case ChargingPaused: return "| |";
case SlowCharging: return "\u25b6"; // ▶ case SlowCharging: return "\u25b6"; // ▶
case FastCharging: return "\u25b6\u25b6"; // ▶▶ case FastCharging: return "\u25b6\u25b6"; // ▶▶
default: return "?"; default: return "?";
@@ -361,8 +363,9 @@ class MiscGui : public BaseMenuGui
ChargeInfo* chargeInfo; ChargeInfo* chargeInfo;
I2cInfo* i2cInfo; I2cInfo* i2cInfo;
LblBacklightSwitchStatus lblstatus = LblBacklightSwitchStatus_Disabled; LblBacklightSwitchStatus lblstatus = LblBacklightSwitchStatus_Disabled;
bool isEnoughPowerSupplied = false;
char infoOutput[800] = ""; 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[30] = "";
u8 frameCounter = 60; u8 frameCounter = 60;
}; };

View File

@@ -1,8 +1,8 @@
#!/bin/bash #!/bin/bash
fw_dir="/Volumes/RAM/NX-14.0.0/" fw_dir="/Volumes/RAMDISK/NX-15.0.0/"
tmp_dir="/Volumes/RAM/" tmp_dir="/Volumes/RAMDISK/"
repack_out_dir="/Volumes/RAM/out/" repack_out_dir="/Volumes/RAMDISK/out/"
oc_test_dir="$HOME/Source/Switch-OC-Suite/Source/Atmosphere/stratosphere/loader/source/oc" oc_test_dir="$HOME/Source/Switch-OC-Suite/Source/Atmosphere/stratosphere/loader/source/oc"
prodkeys="$HOME/.switch/prod.keys" prodkeys="$HOME/.switch/prod.keys"
hactool_exe="$HOME/Source/hactool/hactool" hactool_exe="$HOME/Source/hactool/hactool"