15 Commits
1.2.0 ... 1.2.1

Author SHA1 Message Date
Lightos1
24eb3b1208 recover alignment improvement commit changes 2026-04-07 19:32:37 +02:00
Lightos1
9a6282af9c bump version 2026-04-07 19:20:52 +02:00
Lightos1
5de030c4e9 rename globals 2026-04-06 23:23:04 +02:00
souldbminersmwc
dc63dfdca2 hocclk: add support for FW <10.0.0 2026-04-06 16:52:18 -04:00
souldbminersmwc
803a838b35 Update Utils.hpp 2026-04-06 16:10:02 -04:00
souldbminersmwc
5b284db5ae hocmon: lower default font size 2026-04-06 16:09:59 -04:00
souldbminersmwc
861ee85289 Merge branch 'main' of https://github.com/Horizon-OC/Horizon-OC 2026-04-06 15:57:12 -04:00
souldbminersmwc
521e3c22dd hocclk: reduce ram usage and add display undervolt 2026-04-06 15:57:10 -04:00
Lightos1
78798a1cce actually fix cpu max 2026-04-06 12:58:54 +02:00
Lightos1
44d417fb89 fix cpu max clock, remove below 1963 caps on mariko 2026-04-06 12:56:06 +02:00
Lightos1
8faaaa58d9 mini: fix garbage temp reading 2026-04-04 12:15:09 +02:00
Lightos1
df0969ba6f update readme 2026-04-04 11:59:10 +02:00
Lightos1
646f8b8d69 update readme 2026-04-04 11:58:44 +02:00
Lightos1
456684152a more accurate Italian translation by miki 2026-04-04 11:56:10 +02:00
souldbminersmwc
a606a878ee hocclk: fix lightos z 2026-04-03 20:02:36 -04:00
27 changed files with 290 additions and 213 deletions

View File

@@ -114,7 +114,7 @@ Refer to COMPILATION.md
* 816 * 816
* 714 * 714
* 612 → sleep mode * 612 → sleep mode
### GPU clocks ### GPU clocks
* 1536 → absolute max clock on mariko. very dangerous * 1536 → absolute max clock on mariko. very dangerous
* 1459 * 1459
@@ -158,7 +158,7 @@ Refer to COMPILATION.md
* **CTCaer** - L4T, Hekate, proper RAM timings * **CTCaer** - L4T, Hekate, proper RAM timings
* **KazushiMe** - Switch OC Suite * **KazushiMe** - Switch OC Suite
* **Hanai3bi (Meha)** - Switch OC Suite, EOS, sys-clk-eos * **Hanai3bi (Meha)** - Switch OC Suite, EOS, sys-clk-eos
* **NaGaa95** - L4T-OC kernel, Status Monitor fork * **NaGaa95** - L4T-OC kernel, Status Monitor fork
* **B3711 (halop)** - EOS * **B3711 (halop)** - EOS
* **sys-clk team (m4xw, p-sam, natinusala)** - sys-clk * **sys-clk team (m4xw, p-sam, natinusala)** - sys-clk
* **Dominatorul** - Soctherm driver, guides, general help * **Dominatorul** - Soctherm driver, guides, general help
@@ -166,5 +166,7 @@ Refer to COMPILATION.md
* **MasaGratoR and ZachyCatGames** - General help * **MasaGratoR and ZachyCatGames** - General help
* **MasaGratoR** - Status Monitor & Display Refresh Rate driver * **MasaGratoR** - Status Monitor & Display Refresh Rate driver
* **Dominatorul, Samybigio, Arcdelta, Miki, Happy, Flopsider, Winnerboi77, Blaise, Alvise, TDRR, agjeococh, frost, letum00, and Xenshen** - Testing * **Dominatorul, Samybigio, Arcdelta, Miki, Happy, Flopsider, Winnerboi77, Blaise, Alvise, TDRR, agjeococh, frost, letum00, and Xenshen** - Testing
* **Samybigio2011** - Italian translations * **Samybigio2011, Miki** - Italian translations
* **angelblaster** - Korean translations
* **q1332348216-glitch** - Chinese translations
* **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T * **Nvidia** - [Tegra X1 Technical Reference Manual](https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual), soctherm driver, L4T

View File

@@ -86,17 +86,17 @@ volatile CustomizeTable C = {
/* 1120mV is NVIDIA rating */ /* 1120mV is NVIDIA rating */
.marikoCpuMaxVolt = 1120, .marikoCpuMaxVolt = 1120,
/* Supported values: 1963000, 2091000, 2193000, 2295000, 2397000, 2499000, 2601000, 2703000. */ /* Supported values: 1963500, 2091000, 2193000, 2295000, 2397000, 2499000, 2601000, 2703000. */
/* 1963000 is official rating of T214/Mariko, fully safe. */ /* 1963500 is official rating of T214/Mariko, fully safe. */
/* 2091000-2295000 is a slight OC which should work on all units, but no guarantees. */ /* 2091000-2295000 is a slight OC which should work on all units, but no guarantees. */
/* 2397000 is the max safe OC for most average units with tuned undervolt. */ /* 2397000 is the max safe OC for most average units with tuned undervolt. */
/* 2499000 should be used with caution. */ /* 2499000 should be used with caution. */
/* 2601000 exceeds pmic limit on most consoles. */ /* 2601000 exceeds pmic limit on most consoles. */
/* 2703000 is potentially dangerous and not advised. */ /* 2703000 is potentially dangerous and not advised. */
.marikoCpuMaxClock = 1963000, .marikoCpuMaxClock = 1963500,
.eristaCpuBoostClock = 1785000, // Default boost clock .eristaCpuBoostClock = 1785000, // Default boost clock
.marikoCpuBoostClock = 1963000, // Default boost clock .marikoCpuBoostClock = 1963500, // Default boost clock
.eristaGpuUV = 0, .eristaGpuUV = 0,
.eristaGpuVmin = 810, .eristaGpuVmin = 810,
@@ -220,7 +220,7 @@ volatile CustomizeTable C = {
{ 1683000, { 1168000, }, { 5100873, -279186, 4747, } }, { 1683000, { 1168000, }, { 5100873, -279186, 4747, } },
{ 1785000, { 1225000, }, { 5100873, -279186, 4747, } }, { 1785000, { 1225000, }, { 5100873, -279186, 4747, } },
{ 1887000, { 1225000, }, { 5100873, -279186, 4747, } }, { 1887000, { 1225000, }, { 5100873, -279186, 4747, } },
{ 1963500, { 1227500, }, { 5100873, -279186, 4747, } }, { 1989000, { 1227500, }, { 5100873, -279186, 4747, } },
{ 2091000, { 1227500, }, { 5100873, -279186, 4747, } }, { 2091000, { 1227500, }, { 5100873, -279186, 4747, } },
{ 2193000, { 1227500, }, { 5100873, -279186, 4747, } }, { 2193000, { 1227500, }, { 5100873, -279186, 4747, } },
{ 2295000, { 1256250, }, { 5100873, -279186, 4747, } }, { 2295000, { 1256250, }, { 5100873, -279186, 4747, } },

View File

@@ -58,7 +58,7 @@ namespace ams::ldr::hoc::pcv {
static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 }; static const u32 cpuVoltThermalData[] = { 620, 1120, 20000, 620, 1120, 70000, 950, 1132, 0, 950, 1227, 0 };
static const u32 allowedCpuMaxFrequencies[] = { 1'963'000, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, }; static const u32 allowedCpuMaxFrequencies[] = { 1'963'500, 2'091'000, 2'193'000, 2'295'000, 2'397'000, 2'499'000, 2'601'000, 2'703'000, };
constexpr cvb_entry_t GpuCvbTableDefault[] = { constexpr cvb_entry_t GpuCvbTableDefault[] = {
// GPUB01_NA_CVB_TABLE // GPUB01_NA_CVB_TABLE

View File

@@ -1718,8 +1718,8 @@ ALWAYS_INLINE void GetConfigSettings(MicroSettings* settings) {
settings->useDTCSymbol = true; settings->useDTCSymbol = true;
settings->dtcFormat = "%H:%M:%S";//"%Y-%m-%d %I:%M:%S %p"; settings->dtcFormat = "%H:%M:%S";//"%Y-%m-%d %I:%M:%S %p";
settings->invertBatteryDisplay = false; settings->invertBatteryDisplay = false;
settings->handheldFontSize = 15; settings->handheldFontSize = 14;
settings->dockedFontSize = 15; settings->dockedFontSize = 14;
settings->alignTo = 1; // CENTER settings->alignTo = 1; // CENTER
convertStrToRGBA4444("#0009", &(settings->backgroundColor)); convertStrToRGBA4444("#0009", &(settings->backgroundColor));
convertStrToRGBA4444("#888F", &(settings->separatorColor)); convertStrToRGBA4444("#888F", &(settings->separatorColor));

View File

@@ -39,6 +39,10 @@ private:
std::atomic<bool> touchPollRunning{false}; std::atomic<bool> touchPollRunning{false};
public: public:
MiniOverlay() { MiniOverlay() {
CPU_temp_c[0] = '\0';
GPU_temp_c[0] = '\0';
RAM_temp_c[0] = '\0';
tsl::hlp::requestForeground(false); tsl::hlp::requestForeground(false);
disableJumpTo = true; disableJumpTo = true;
//tsl::initializeUltrahandSettings(); //tsl::initializeUltrahandSettings();
@@ -1070,7 +1074,7 @@ public:
} }
} }
if (settings.realTemps && realCPU_Temp != 0) { if (settings.realTemps && realCPU_Temp != 0 && CPU_temp_c[0] != '\0') {
char temp_buffer[48]; char temp_buffer[48];
snprintf(temp_buffer, sizeof(temp_buffer), " %s", CPU_temp_c); snprintf(temp_buffer, sizeof(temp_buffer), " %s", CPU_temp_c);
strncat(MINI_CPU_compressed_c, temp_buffer, sizeof(MINI_CPU_compressed_c) - strlen(MINI_CPU_compressed_c) - 1); strncat(MINI_CPU_compressed_c, temp_buffer, sizeof(MINI_CPU_compressed_c) - strlen(MINI_CPU_compressed_c) - 1);
@@ -1110,11 +1114,11 @@ public:
} }
} }
if (settings.realTemps && realGPU_Temp != 0) { if (settings.realTemps && realGPU_Temp != 0 && GPU_temp_c[0] != '\0') {
char temp_buffer[48]; char temp_buffer[48];
snprintf(temp_buffer, sizeof(temp_buffer), " %s", GPU_temp_c); snprintf(temp_buffer, sizeof(temp_buffer), " %s", GPU_temp_c);
strncat(MINI_GPU_Load_c, temp_buffer, sizeof(MINI_GPU_Load_c) - strlen(MINI_GPU_Load_c) - 1); strncat(MINI_GPU_Load_c, temp_buffer, sizeof(MINI_GPU_Load_c) - strlen(MINI_GPU_Load_c) - 1);
} }
// Only process RAM if needed // Only process RAM if needed
if (isActive("RAM")) { if (isActive("RAM")) {
@@ -1218,11 +1222,12 @@ public:
} }
} }
} }
if (settings.realTemps && realRAM_Temp != 0) {
char temp_buffer[48]; if (settings.realTemps && realRAM_Temp != 0 && RAM_temp_c[0] != '\0') {
snprintf(temp_buffer, sizeof(temp_buffer), " %s", RAM_temp_c); char temp_buffer[48];
strncat(MINI_RAM_var_compressed_c, temp_buffer, sizeof(MINI_RAM_var_compressed_c) - strlen(MINI_RAM_var_compressed_c) - 1); snprintf(temp_buffer, sizeof(temp_buffer), " %s", RAM_temp_c);
} strncat(MINI_RAM_var_compressed_c, temp_buffer, sizeof(MINI_RAM_var_compressed_c) - strlen(MINI_RAM_var_compressed_c) - 1);
}
// Only process MEM if needed // Only process MEM if needed
if (isActive("MEM")) { if (isActive("MEM")) {

View File

@@ -66,6 +66,7 @@ typedef enum {
HocClkConfigValue_RAMVoltDisplayMode, HocClkConfigValue_RAMVoltDisplayMode,
HocClkConfigValue_CpuGovernorMinimumFreq, HocClkConfigValue_CpuGovernorMinimumFreq,
HocClkConfigValue_DisplayVoltage,
KipConfigValue_custRev, KipConfigValue_custRev,
// KipConfigValue_mtcConf, // KipConfigValue_mtcConf,
@@ -252,6 +253,10 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
return pretty ? "RAM Voltage / Usage Display Mode" : "ram_volt_usage_display_mode"; return pretty ? "RAM Voltage / Usage Display Mode" : "ram_volt_usage_display_mode";
case HocClkConfigValue_CpuGovernorMinimumFreq: case HocClkConfigValue_CpuGovernorMinimumFreq:
return pretty ? "CPU Governor Minimum Frequency" : "cpu_gov_min_freq"; return pretty ? "CPU Governor Minimum Frequency" : "cpu_gov_min_freq";
case HocClkConfigValue_DisplayVoltage:
return pretty ? "Display Voltage" : "display_voltage";
// KIP config values // KIP config values
case KipConfigValue_custRev: case KipConfigValue_custRev:
return pretty ? "Custom Revision" : "kip_cust_rev"; return pretty ? "Custom Revision" : "kip_cust_rev";
@@ -453,6 +458,8 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val)
return 612000000ULL; // 612MHz return 612000000ULL; // 612MHz
case HocClkConfigValue_MaxDisplayClockH: case HocClkConfigValue_MaxDisplayClockH:
return 60ULL; return 60ULL;
case HocClkConfigValue_DisplayVoltage:
return 1200ULL; // Auto
default: default:
return 0ULL; return 0ULL;
} }
@@ -588,6 +595,9 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
return true; return true;
case HocClkConfigValue_BatteryChargeCurrent: case HocClkConfigValue_BatteryChargeCurrent:
return ((input >= 1024) && (input <= 3072)) || !input; return ((input >= 1024) && (input <= 3072)) || !input;
case HocClkConfigValue_DisplayVoltage:
return ((input >= 900) && (input <= 1325));
default: default:
return false; return false;
} }

View File

@@ -22,6 +22,7 @@ const u8 MAX17050_CURRENT_REG = 0x0A;
// Buck Converter // Buck Converter
typedef enum I2c_BuckConverter_Reg { typedef enum I2c_BuckConverter_Reg {
I2c_Max77620_SD1VOLT_REG = 0x17, // Used for Erista DDR VDDQ+VDD2 / Mariko VDD2 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, I2c_Max77621_VOLT_REG = 0x00,
I2c_Max77812_CPUVOLT_REG = 0x26, I2c_Max77812_CPUVOLT_REG = 0x26,
I2c_Max77812_GPUVOLT_REG = 0x23, I2c_Max77812_GPUVOLT_REG = 0x23,
@@ -40,7 +41,8 @@ typedef struct I2c_BuckConverter_Domain {
const I2c_BuckConverter_Domain I2c_Erista_CPU = { I2cDevice_Max77621Cpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, }; 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_GPU = { I2cDevice_Max77621Gpu, I2c_Max77621_VOLT_REG, 0x7F, 6250, 606250, 1400000, };
const I2c_BuckConverter_Domain I2c_Erista_DRAM = { I2cDevice_Max77620Pmic, I2c_Max77620_SD1VOLT_REG, 0x7F, 12500, 600000, 1250000, }; 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_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_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_VDDQ = { I2cDevice_Max77812_2, I2c_Max77812_MEMVOLT_REG, 0xFF, 5000, 250000, 700000, 0x78 };

View File

@@ -39,7 +39,7 @@ include ${TOPDIR}/lib/libultrahand/ultrahand.mk
# version control constants # version control constants
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------
#TARGET_VERSION := $(shell git describe --dirty --always --tags) #TARGET_VERSION := $(shell git describe --dirty --always --tags)
APP_VERSION := 1.2.0 APP_VERSION := 1.2.1
TARGET_VERSION := $(APP_VERSION) TARGET_VERSION := $(APP_VERSION)
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------

View File

@@ -2,140 +2,140 @@
"Information": "Informazioni", "Information": "Informazioni",
"IDDQ:": "IDDQ:", "IDDQ:": "IDDQ:",
"Module: ": "Modulo:", "Module: ": "Modulo:",
"sys-dock status:": "stato del dock di sistema:", "sys-dock status:": "stato di sys-dock",
"SaltyNX status:": "Stato di SaltyNX:", "SaltyNX status:": "Stato di SaltyNX:",
"RR Display status:": "Stato di visualizzazione RR:", "RR Display status:": "Stato del RR:",
"Wafer Position:": "Posizione del wafer:", "Wafer Position:": "Posizione nel Wafer:",
"Credits": "Crediti", "Credits": "Crediti",
"Developers": "Sviluppatori", "Developers": "Sviluppatori",
"Contributors": "Collaboratori", "Contributors": "Collaboratori",
"Testers": "Tester", "Testers": "Tester",
"Special Thanks": "Un ringraziamento speciale", "Special Thanks": "Un Ringraziamento Speciale",
"Unknown": "Sconosciuto", "Unknown": "Sconosciuto",
"Installed": "Installato", "Installed": "Installato",
"Not Installed": "Non installato", "Not Installed": "Non installato",
"X: %u Y: %u": "X: %u Y: %u", "X: %u Y: %u": "X: %u Y: %u",
"THE BEER-WARE LICENSE": "LA LICENZA PER GLI ARTICOLI DI BIRRA", "THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE",
"Default": "Predefinito", "Default": "Predefinito",
"Do Not Override": "Non sovrascrivere", "Do Not Override": "Non Sovrascrivere",
"Disabled": "Disabilitato", "Disabled": "Disabilitato",
"Enabled": "Abilitato", "Enabled": "Abilitato",
" \\ue0e3 Reset": "\\ue0e3 Ripristina", " \\ue0e3 Reset": "\\ue0e3 Ripristina",
"Display": "Visualizzazione", "Display": "Schermo",
"Application changed\\n\\n": "Applicazione modificata\\n\\n", "Application changed\\n\\n": "Applicazione modificata\\n\\n",
"The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n", "The running application changed\\n\\n": "L'applicazione in esecuzione è cambiata\\n\\n",
"while editing was going on.": "mentre era in corso la modifica.", "while editing was going on.": "mentre era in corso la modifica.",
"Board": "Consiglio", "Board": "Scheda",
"%u.%u%u mV": "%u.%u%u mV", "%u.%u%u mV": "%u.%u%u mV",
"Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al modulo di sistema hoc-clk.\\n\\n", "Could not connect to hoc-clk sysmodule.\\n\\n": "Impossibile connettersi al sysmodule hoc-clk.\\n\\n",
"Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n", "Please make sure everything is\\n\\n": "Assicurati che tutto sia\\n\\n",
"correctly installed and enabled.": "correttamente installato e abilitato.", "correctly installed and enabled.": "correttamente installato e abilitato.",
"Fatal error": "Errore fatale", "Fatal error": "Errore fatale",
"Temporary Overrides ": "Sostituzioni temporanee", "Temporary Overrides ": "Sostituzioni Temporanee",
"Sleep Mode": "Modalità di sospensione", "Sleep Mode": "Modalità di Sospensione",
"Stock": "Magazzino", "Stock": "Originale",
"Dev OC": "OC di sviluppo", "Dev OC": "OC dev",
"Boost Mode": "Modalità potenziamento", "Boost Mode": "Modalità Boost",
"Safe Max": "Sicuro massimo", "Safe Max": "Massimo Sicuro",
"Unsafe Max": "Non sicuro Max", "Unsafe Max": "Massimo Non Sicuro",
"Absolute Max": "Massimo assoluto", "Absolute Max": "Massimo Assoluto",
"Handheld Safe Max": "Cassaforte portatile max", "Handheld Safe Max": "Massimo Sicuro Modalità Portatile",
"Enable": "Abilita", "Enable": "Abilita",
"Edit App Profile": "Modifica profilo dell'app", "Edit App Profile": "Modifica Profilo Dell'App",
"Edit Global Profile": "Modifica profilo globale", "Edit Global Profile": "Modifica Profilo Globale",
"Temporary Overrides": "Sostituzioni temporanee", "Temporary Overrides": "Sostituzioni Temporanee",
"Settings": "Impostazioni", "Settings": "Impostazioni",
"About": "Circa", "About": "A Riguardo Di",
"Compiling with minimal features": "Compilazione con funzionalità minime", "Compiling with minimal features": "Compilazione con funzionalità minime",
"General Settings": "Impostazioni generali", "General Settings": "Impostazioni Generali",
"Governor Settings": "Impostazioni del governatore", "Governor Settings": "Impostazioni Del Governor",
"Safety Settings": "Impostazioni di sicurezza", "Safety Settings": "Impostazioni Di Sicurezza",
"Save KIP Settings": "Salva le impostazioni KIP", "Save KIP Settings": "Salva le impostazioni del KIP",
"RAM Settings": "Impostazioni della RAM", "RAM Settings": "Impostazioni della RAM",
"CPU Settings": "Impostazioni della CPU", "CPU Settings": "Impostazioni della CPU",
"GPU Settings": "Impostazioni della GPU", "GPU Settings": "Impostazioni della GPU",
"Display Settings": "Impostazioni di visualizzazione", "Display Settings": "Impostazioni dello Schermo",
"Experimental": "Sperimentale", "Experimental": "Sperimentale",
"GPU Scheduling Override Method": "Metodo di override della pianificazione GPU", "GPU Scheduling Override Method": "Metodo di override dello scheduling GPU",
"can be dangerous and may cause": "può essere pericoloso e può causare", "can be dangerous and may cause": "può essere pericoloso e può causare",
"damage to your battery or charger!": "danni alla batteria o al caricabatterie!", "damage to your battery or charger!": "danni alla batteria o al caricabatterie!",
"Charge Current Override": "Override della corrente di carica", "Charge Current Override": "Override della Corrente di Carica",
"RAM Voltage Display Mode": "Modalità di visualizzazione della tensione RAM", "RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM",
"Polling Interval": "Intervallo di polling", "Polling Interval": "Intervallo di polling",
"CPU Governor Minimum Frequency": "Frequenza minima del governatore della CPU", "CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU",
"refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress", "refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress",
"or damage to your display! ": "o danni al display!", "or damage to your display! ": "o danni al display!",
"Proceed at your own risk!": "Procedi a tuo rischio e pericolo!", "Proceed at your own risk!": "Procedi a tuo rischio e pericolo!",
"Max Handheld Display": "Display portatile massimo", "Max Handheld Display": "Display Massimo in Modalità Portatile",
"Display Clock": "Visualizza orologio", "Display Clock": "Frequenza del Display",
"Official Rating": "Valutazione ufficiale", "Official Rating": "Rating Ufficiale",
"TDP Threshold": "Soglia TDP", "TDP Threshold": "Soglia TDP",
"Power": "Potenza", "Power": "Potenza",
"Thermal Throttle Limit": "Limite della valvola termica", "Thermal Throttle Limit": "Limite Termico",
"HP Mode": "Modalità HP", "HP Mode": "Modalità HP",
"Default (Mariko)": "Predefinito (Mariko)", "Default (Mariko)": "Predefinito (Mariko)",
"Default (Erista)": "Predefinito (Erista)", "Default (Erista)": "Predefinito (Erista)",
"Rating": "Valutazione", "Rating": "Valutazione",
"Safe Max (Mariko)": "Safe Max (Mariko)", "Safe Max (Mariko)": "Massimo Sicuro (Mariko)",
"Safe Max (Erista)": "Safe Max (Erista)", "Safe Max (Erista)": "Massimo Sicuro (Erista)",
"RAM VDD2 Voltage": "Tensione RAM VDD2", "RAM VDD2 Voltage": "Tensione RAM VDD2",
"Voltage": "Voltaggio", "Voltage": "Voltaggio",
"RAM VDDQ Voltage": "Voltaggio VDDQ della RAM", "RAM VDDQ Voltage": "Voltaggio VDDQ della RAM",
"RAM Frequency Editor": "Editor della frequenza RAM", "RAM Frequency Editor": "Editor della frequenza RAM",
"JEDEC.": "JEDEC.", "JEDEC.": "JEDEC.",
"High speedo needed!": "È necessaria l'alta velocità!", "High speedo needed!": "Alto Valore Speedo Necessario!",
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL estremo)", "3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)",
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL estremo)", "3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)",
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL estremo)", "3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)",
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (è necessario un ridicolo Speedo/PLL)", "3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)",
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (è necessario un ridicolo Speedo/PLL)", "3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)",
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (è necessario un ridicolo Speedo/PLL)", "3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)",
"Ram Max Clock": "Orologio Ram Max", "Ram Max Clock": "Frequenza Massima Ram",
"RAM Latency Editor": "Editor della latenza RAM", "RAM Latency Editor": "Editor della Latenza RAM",
"RAM Timing Reductions": "Riduzioni della temporizzazione della RAM", "RAM Timing Reductions": "Riduzioni dei Timing della RAM",
"Memory Timings": "Tempi di memoria", "Memory Timings": "Timing di Memoria",
"Advanced": "Avanzato", "Advanced": "Avanzato",
"t6 tRTW Fine Tune": "t6 tRTW Sintonia fine", "t6 tRTW Fine Tune": "Regolazione Fine t6 tRTW",
"tRTW Fine Tune": "tRTW Sintonia fine", "tRTW Fine Tune": "Regolazione Fine tRTW",
"t7 tWTR Fine Tune": "t7 tWTR Sintonia fine", "t7 tWTR Fine Tune": "Regolazione Fine t7 tWTR",
"tWTR Fine Tune": "tWTR Sintonia fine", "tWTR Fine Tune": "Regolazione Fine tWTR",
"Memory Latencies": "Latenza della memoria", "Memory Latencies": "Latenza della Memoria",
"Read Latency": "Leggi latenza", "Read Latency": "Latenza di Lettura",
"Write Latency": "Scrivi latenza", "Write Latency": "Latenza di Scrittura",
"CPU Boost Clock": "Orologio di potenziamento della CPU", "CPU Boost Clock": "Frequenza CPU in Boost",
"CPU UV": "UV della CPU", "CPU UV": "Undervolt CPU",
"CPU Unlock": "Sblocco della CPU", "CPU Unlock": "Sblocco della CPU",
"CPU VMIN": "CPUVMIN", "CPU VMIN": "CPU VMIN",
"CPU Max Voltage": "Voltaggio massimo della CPU", "CPU Max Voltage": "Voltaggio massimo della CPU",
"CPU Max Clock": "Orologio massimo della CPU", "CPU Max Clock": "Frequenza massima della CPU",
"Extreme UV Table": "Tavolo UV estremo", "Extreme UV Table": "Tabella UV estremo",
"CPU UV Table": "Tabella UV della CPU", "CPU UV Table": "Tabella UV della CPU",
"CPU Low UV": "CPU con raggi UV bassi", "CPU Low UV": "CPU UV Bassa Frequenza",
"CPU High UV": "UV elevato della CPU", "CPU High UV": "CPU UV Alta Frequenza",
"CPU Low VMIN": "VMIN CPU basso", "CPU Low VMIN": "CPU VMIN Bassa Frequenza",
"CPU High VMIN": "CPU alta VMIN", "CPU High VMIN": "CPU VMIN Alta Frequenza",
"No Undervolt": "Nessuna sottotensione", "No Undervolt": "Nessun Undervolt",
"SLT Table": "Tabella SLT", "SLT Table": "Tabella SLT",
"HiOPT Table": "Tabella HiOPT", "HiOPT Table": "Tabella HiOPT",
"GPU Undervolt Table": "Tabella di sottotensione GPU", "GPU Undervolt Table": "Tabella di Undervolt GPU",
"GPU Minimum Voltage": "Voltaggio minimo della GPU", "GPU Minimum Voltage": "Voltaggio Minimo della GPU",
"Calculate GPU Vmin": "Calcola GPU Vmin", "Calculate GPU Vmin": "Calcola GPU Vmin",
"GPU VMIN": "GPUVMIN", "GPU VMIN": "GPU VMIN",
"GPU Maximum Voltage": "Voltaggio massimo della GPU", "GPU Maximum Voltage": "Voltaggio massimo della GPU",
"GPU Voltage Offset": "Offset di tensione della GPU", "GPU Voltage Offset": "Offset di Voltaggio della GPU",
"Do not override": "Non sovrascrivere", "Do not override": "Non sovrascrivere",
"Enabled (Default)": "Abilitato (impostazione predefinita)", "Enabled (Default)": "Abilitato (impostazione predefinita)",
"96.6% limit": "Limite del 96,6%.", "96.6% limit": "Limite del 96,6%.",
"99.7% limit": "Limite del 99,7%.", "99.7% limit": "Limite del 99,7%.",
"GPU Scheduling Override": "Override della pianificazione GPU", "GPU Scheduling Override": "Override dello Scheduling GPU",
"Official Service": "Servizio ufficiale", "Official Service": "Servizio ufficiale",
"GPU DVFS Mode": "Modalità DVFS GPU", "GPU DVFS Mode": "Modalità DVFS GPU",
"GPU DVFS Offset": "Offset DVFS della GPU", "GPU DVFS Offset": "Offset DVFS della GPU",
"GPU Voltage Table": "Tabella delle tensioni della GPU", "GPU Voltage Table": "Tabella delle Tensioni della GPU",
"GPU Custom Table (mV)": "Tabella personalizzata GPU (mV)", "GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)",
"1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT", "1075MHz without UV, 1152MHz on SLT": "1075 MHz senza UV, 1152 MHz su SLT",
"or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare", "or 1228MHz on HiOPT can cause ": "o 1228 MHz su HiOPT possono causare",
"permanent damage to your Switch!": "danni permanenti al tuo Switch!", "permanent damage to your Switch!": "danni permanenti alla tua Switch!",
"921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz attivi", "921MHz without UV and 960MHz on": "921 MHz senza UV e 960 MHz su",
"SLT or HiOPT can cause ": "SLT o HiOPT possono causare" "SLT or HiOPT can cause ": "SLT o HiOPT possono causare"
} }

View File

@@ -31,6 +31,7 @@ tsl::elm::ListItem* RETROStatusItem = NULL;
tsl::elm::ListItem* waferCordsItem = NULL; tsl::elm::ListItem* waferCordsItem = NULL;
tsl::elm::ListItem* ramVoltItem = NULL; tsl::elm::ListItem* ramVoltItem = NULL;
tsl::elm::ListItem* eristaPLLXItem = NULL; tsl::elm::ListItem* eristaPLLXItem = NULL;
tsl::elm::ListItem* dispVoltItem = NULL;
ImageElement* CatImage = NULL; ImageElement* CatImage = NULL;
HideableCategoryHeader* CatHeader = NULL; HideableCategoryHeader* CatHeader = NULL;
@@ -56,6 +57,10 @@ void AboutGui::listUI()
new tsl::elm::ListItem("RAM Voltage:"); new tsl::elm::ListItem("RAM Voltage:");
this->listElement->addItem(ramVoltItem); this->listElement->addItem(ramVoltItem);
dispVoltItem =
new tsl::elm::ListItem("Display Voltage:");
this->listElement->addItem(dispVoltItem);
eristaPLLXItem = eristaPLLXItem =
new tsl::elm::ListItem("PLLX Temp:"); new tsl::elm::ListItem("PLLX Temp:");
if(IsErista()) { if(IsErista()) {
@@ -327,5 +332,8 @@ void AboutGui::refresh()
sprintf(strings[4], "%u.%u / %u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U, context->voltages[HocClkVoltage_EMCVDDQ] / 1000); sprintf(strings[4], "%u.%u / %u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U, context->voltages[HocClkVoltage_EMCVDDQ] / 1000);
ramVoltItem->setValue(strings[4]); ramVoltItem->setValue(strings[4]);
sprintf(strings[5], "%u.%u mV", context->voltages[HocClkVoltage_Display] / 1000U, (context->voltages[HocClkVoltage_Display] % 1000U) / 100U);
dispVoltItem->setValue(strings[5]);
} }

View File

@@ -121,7 +121,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
// === VOLTAGES === // === VOLTAGES ===
renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage renderer->drawString(displayStrings[8], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU voltage
renderer->drawString(displayStrings[9], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage renderer->drawString(displayStrings[9], false, dataPositions[1] + 9, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU voltage
renderer->drawStringWithColoredSections(displayStrings[10], false, {""}, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, tsl::separatorColor); renderer->drawStringWithColoredSections(displayStrings[10], false, {""}, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor, tsl::separatorColor);
@@ -134,17 +134,17 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
// === TEMPERATURE SECTION === // === TEMPERATURE SECTION ===
// Labels // Labels
renderer->drawString(labels[5], false, positions[5], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[5], false, positions[5], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
renderer->drawString(labels[6], false, positions[6]-1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[6], false, positions[6], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
renderer->drawString(labels[7], false, positions[7], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[7], false, positions[7], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
// Temperatures with color - use pre-computed colors // Temperatures with color - use pre-computed colors
renderer->drawString(displayStrings[11], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_SOC]); // SOC renderer->drawString(displayStrings[11], false, dataPositions[0] - 1, y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_SOC]); // SOC
renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB renderer->drawString(displayStrings[12], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB
renderer->drawString(displayStrings[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin renderer->drawString(displayStrings[13], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin
y += 20; // Direct assignment (191 + 20) y += 20; // Direct assignment (191 + 20)
renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage
// Power labels and values // Power labels and values
renderer->drawString(labels[8], false, positions[8]-1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); renderer->drawString(labels[8], false, positions[8]-1, y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
@@ -159,13 +159,13 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
renderer->drawString(displayStrings[20], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Battery]); // Battery renderer->drawString(displayStrings[20], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Battery]); // Battery
renderer->drawString(labels[13], false, positions[4], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label
renderer->drawString(displayStrings[25], false, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq
renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label renderer->drawString(labels[12], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // fan label
renderer->drawString(displayStrings[24], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed renderer->drawString(displayStrings[24], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // fan speed
renderer->drawString(labels[13], false, positions[4] + 4, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // disp label
renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq
y+=20; y+=20;
@@ -174,11 +174,11 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
if(this->context->isSaltyNXInstalled) { if(this->context->isSaltyNXInstalled) {
renderer->drawString(labels[15], false, positions[3], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label
renderer->drawString(displayStrings[27], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES
renderer->drawString(labels[14], false, positions[4], y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label
renderer->drawString(displayStrings[26], false, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS
} }
@@ -201,7 +201,6 @@ void BaseMenuGui::refresh()
this->context = new HocClkContext; this->context = new HocClkContext;
} }
// === HOCCLK CONTEXT UPDATE ===
Result rc = hocclkIpcGetCurrentContext(this->context); Result rc = hocclkIpcGetCurrentContext(this->context);
if (R_FAILED(rc)) [[unlikely]] { if (R_FAILED(rc)) [[unlikely]] {
FatalGui::openWithResultCode("hocclkIpcGetCurrentContext", rc); FatalGui::openWithResultCode("hocclkIpcGetCurrentContext", rc);

View File

@@ -621,6 +621,8 @@ public:
protected: protected:
void listUI() override { void listUI() override {
ValueThresholds thresholdsDisabled(0, 0);
BaseMenuGui::refresh(); // get latest context BaseMenuGui::refresh(); // get latest context
if(!this->context) if(!this->context)
return; return;
@@ -649,6 +651,16 @@ protected:
false false
); );
} }
addConfigButton(
HocClkConfigValue_DisplayVoltage,
"Display Voltage",
ValueRange(900, 1200, 25, " mV", 1),
"Display Voltage",
&thresholdsDisabled,
{},
{},
false
);
} }
}; };
@@ -1053,7 +1065,7 @@ protected:
std::vector<NamedValue> maxClkOptions = { std::vector<NamedValue> maxClkOptions = {
NamedValue("1785 MHz", 1785), NamedValue("1785 MHz", 1785),
NamedValue("1887 MHz", 1887), NamedValue("1887 MHz", 1887),
NamedValue("1963 MHz", 1963), NamedValue("1989 MHz", 1989),
NamedValue("2091 MHz", 2091), NamedValue("2091 MHz", 2091),
NamedValue("2193 MHz", 2193), NamedValue("2193 MHz", 2193),
NamedValue("2295 MHz", 2295), NamedValue("2295 MHz", 2295),
@@ -1111,9 +1123,7 @@ protected:
); );
std::vector<NamedValue> maxClkOptions = { std::vector<NamedValue> maxClkOptions = {
NamedValue("1785 MHz", 1785000), NamedValue("1963 MHz", 1963500),
NamedValue("1887 MHz", 1887000),
NamedValue("1963 MHz", 1963000),
NamedValue("2091 MHz", 2091000), NamedValue("2091 MHz", 2091000),
NamedValue("2193 MHz", 2193000), NamedValue("2193 MHz", 2193000),
NamedValue("2295 MHz", 2295000), NamedValue("2295 MHz", 2295000),
@@ -1349,7 +1359,7 @@ protected:
false false
); );
} }
std::vector<NamedValue> gpuOffset = { std::vector<NamedValue> gpuOffset = {
NamedValue("-50 mV", 50), NamedValue("-50 mV", 50),
NamedValue("-45 mV", 45), NamedValue("-45 mV", 45),

View File

@@ -41,7 +41,7 @@ DEFINES := -DDISABLE_IPC -DTARGET="\"$(TARGET)\"" -DTARGET_VERSION="\"$(TARGET_V
ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE ARCH := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
CFLAGS := -g -Wall -Os -ffunction-sections \ CFLAGS := -g -Wall -Os -ffunction-sections \
$(ARCH) $(DEFINES) $(ARCH) $(DEFINES) -ffast-math
CFLAGS += $(INCLUDE) -D__SWITCH__ CFLAGS += $(INCLUDE) -D__SWITCH__

View File

@@ -3,13 +3,14 @@
"title_id": "0x00FF0000636C6BFF", "title_id": "0x00FF0000636C6BFF",
"title_id_range_min": "0x00FF0000636C6BFF", "title_id_range_min": "0x00FF0000636C6BFF",
"title_id_range_max": "0x00FF0000636C6BFF", "title_id_range_max": "0x00FF0000636C6BFF",
"main_thread_stack_size": "0x0000C000", "main_thread_stack_size": "0x0000D000",
"main_thread_priority": 16, "main_thread_priority": 16,
"default_cpu_id": 3, "default_cpu_id": 3,
"process_category": 1, "process_category": 1,
"is_retail": true, "is_retail": true,
"pool_partition": 2, "pool_partition": 2,
"is_64_bit": true, "is_64_bit": true,
"optimize_memory_allocation": true,
"address_space_type": 3, "address_space_type": 3,
"filesystem_access": { "filesystem_access": {
"permissions": "0xFFFFFFFFFFFFFFFF" "permissions": "0xFFFFFFFFFFFFFFFF"

View File

@@ -145,13 +145,13 @@ namespace board {
StartMiscThread(pwmCheck, &iCon); StartMiscThread(pwmCheck, &iCon);
u64 clkVirtAddr, dsiVirtAddr, outsize; u64 clkVirtAddr, dsiVirtAddr;
rc = svcQueryMemoryMapping(&clkVirtAddr, &outsize, 0x60006000, 0x1000); rc = QueryMemoryMapping(&clkVirtAddr, 0x60006000, 0x1000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (clk)"); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (clk)");
rc = svcQueryMemoryMapping(&dsiVirtAddr, &outsize, 0x54300000, 0x40000); rc = QueryMemoryMapping(&dsiVirtAddr, 0x54300000, 0x40000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (dsi)"); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (dsi)");
display::DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), .isRetroSUPER = integrations::GetRETROSuperStatus()}; display::DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr, .isLite = (GetConsoleType() == HocClkConsoleType_Hoag), .isRetroSUPER = integrations::GetRETROSuperStatus()};
display::Initialize(&cfg); display::Initialize(&cfg);

View File

@@ -35,7 +35,7 @@
#include "board_sensor.hpp" #include "board_sensor.hpp"
#include "board_volt.hpp" #include "board_volt.hpp"
#include "board_profile.hpp" #include "board_profile.hpp"
#include "../mem_map.hpp"
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0)) #define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0))
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0)) #define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))

View File

@@ -22,7 +22,7 @@
namespace board { namespace board {
void SetGpuBracket(u8 speedo, u8 &gpuBracket) { void SetGpuBracket(u16 speedo, u8 &gpuBracket) {
if (speedo <= 1624) { if (speedo <= 1624) {
gpuBracket = 0; gpuBracket = 0;
return; return;

View File

@@ -35,6 +35,6 @@ namespace board {
}; };
void ReadFuses(FuseData &speedo); void ReadFuses(FuseData &speedo);
void SetGpuBracket(u8 gpuSpeedo, u8 &gpuBracket); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket);
} }

View File

@@ -87,9 +87,8 @@ namespace board {
} }
void CacheDfllData() { void CacheDfllData() {
u64 temp; Result rc = QueryMemoryMapping(&cldvfs, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE);
Result rc = svcQueryMemoryMapping(&cldvfs, &temp, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE); ASSERT_RESULT_OK(rc, "QueryMemoryMapping (cldvfs)");
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (cldvfs)");
if (GetSocType() == HocClkSocType_Erista) { if (GetSocType() == HocClkSocType_Erista) {
cachedTune.tune0Low = *reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0); cachedTune.tune0Low = *reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);

View File

@@ -217,8 +217,13 @@ namespace clockManager {
void HandleMiscFeatures() void HandleMiscFeatures()
{ {
if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) { static u32 tick = 0;
I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)); if(++tick > 10) {
if (config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent)) {
I2c_Bq24193_SetFastChargeCurrentLimit(config::GetConfigValue(HocClkConfigValue_BatteryChargeCurrent));
}
tick = 0;
I2c_BuckConverter_SetMvOut(&I2c_Display, config::GetConfigValue(HocClkConfigValue_DisplayVoltage));
} }
} }
@@ -560,12 +565,12 @@ namespace clockManager {
board::FuseData *fuse = board::GetFuseData(); board::FuseData *fuse = board::GetFuseData();
gContext.speedos[0] = fuse->cpuSpeedo; gContext.speedos[HocClkSpeedo_CPU] = fuse->cpuSpeedo;
gContext.speedos[1] = fuse->gpuSpeedo; gContext.speedos[HocClkSpeedo_GPU] = fuse->gpuSpeedo;
gContext.speedos[2] = fuse->socSpeedo; gContext.speedos[HocClkSpeedo_SOC] = fuse->socSpeedo;
gContext.iddq[0] = fuse->cpuIDDQ; gContext.iddq[HocClkSpeedo_CPU] = fuse->cpuIDDQ;
gContext.iddq[1] = fuse->gpuIDDQ; gContext.iddq[HocClkSpeedo_GPU] = fuse->gpuIDDQ;
gContext.iddq[2] = fuse->socIDDQ; gContext.iddq[HocClkSpeedo_SOC] = fuse->socIDDQ;
gContext.waferX = fuse->waferX; gContext.waferX = fuse->waferX;
gContext.waferY = fuse->waferY; gContext.waferY = fuse->waferY;
@@ -625,9 +630,9 @@ namespace clockManager {
bool isBoost = apmExtIsBoostMode(mode); bool isBoost = apmExtIsBoostMode(mode);
HandleSafetyFeatures(); HandleSafetyFeatures();
HandleMiscFeatures();
if (RefreshContext() || config::Refresh()) { if (RefreshContext() || config::Refresh()) {
HandleMiscFeatures();
SetClocks(isBoost); SetClocks(isBoost);
} }
} }

View File

@@ -30,28 +30,12 @@
#include <cstring> #include <cstring>
namespace errors { namespace errors {
namespace {
const char* FormatMessage(const char* format, va_list args) {
size_t len = vsnprintf(NULL, 0, format, args) * sizeof(char);
char* buf = (char*)malloc(len + 1);
if (buf == NULL) {
return format;
}
vsnprintf(buf, len + 1, format, args);
return buf;
}
}
void ThrowException(const char* format, ...) { void ThrowException(const char* format, ...) {
va_list args; va_list args;
va_start(args, format); va_start(args, format);
const char* msg = FormatMessage(format, args);
va_end(args);
fileUtils::LogLine(format, args); fileUtils::LogLine(format, args);
throw std::runtime_error(msg); va_end(args);
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen));
// throw std::runtime_error(msg);
} }
} }

View File

@@ -84,9 +84,8 @@ namespace fileUtils {
if (file) { if (file) {
struct timespec now; struct timespec now;
clock_gettime(CLOCK_REALTIME, &now); clock_gettime(CLOCK_REALTIME, &now);
struct tm* nowTm = localtime(&now.tv_sec);
fprintf(file, "[%04d-%02d-%02d %02d:%02d:%02d.%03ld] ", nowTm->tm_year+1900, nowTm->tm_mon+1, nowTm->tm_mday, nowTm->tm_hour, nowTm->tm_min, nowTm->tm_sec, now.tv_nsec / 1000000UL); fprintf(file, "[%lu] ", armGetSystemTick());
vfprintf(file, format, args); vfprintf(file, format, args);
fprintf(file, "\n"); fprintf(file, "\n");
fclose(file); fclose(file);

View File

@@ -38,7 +38,5 @@ namespace governor {
void startThreads(); void startThreads();
void exitThreads(); void exitThreads();
void HandleGovernor(uint32_t targetHz); void HandleGovernor(uint32_t targetHz);
void CpuGovernorThread(void* arg);
void GovernorThread(void* arg); void GovernorThread(void* arg);
void VRRThread(void* arg);
} }

View File

@@ -37,8 +37,8 @@
#include "clock_manager.hpp" #include "clock_manager.hpp"
#include "ipc_service.hpp" #include "ipc_service.hpp"
#include "config.hpp" #include "config.hpp"
#define INNER_HEAP_SIZE 0x45000
#define INNER_HEAP_SIZE 0x45000
extern "C" extern "C"
{ {
@@ -54,6 +54,23 @@ extern "C"
char nx_inner_heap[INNER_HEAP_SIZE]; char nx_inner_heap[INNER_HEAP_SIZE];
NvServiceType __nx_nv_service_type = NvServiceType_Factory; NvServiceType __nx_nv_service_type = NvServiceType_Factory;
// Ty to MasaGratoR for this!
//This is done to save some space as they have no practical use in our case
void* __real___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *));
void* __real__Unwind_Resume();
void* __real___gxx_personality_v0();
void __wrap___cxa_throw(void *thrown_exception, void *pvar, void (*dest)(void *)) {
abort();
}
void __wrap__Unwind_Resume() {
return;
}
void __wrap___gxx_personality_v0() {
return;
}
void __libnx_initheap(void) void __libnx_initheap(void)
{ {
@@ -94,20 +111,19 @@ extern "C"
rc = i2cInitialize(); rc = i2cInitialize();
if (R_FAILED(rc)) if (R_FAILED(rc))
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen)); diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen));
rc = appletInitialize();
if (R_FAILED(rc)) }
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen));
}
void __appExit(void) void __appExit(void)
{ {
// CloseFanControllerThread(); // CloseFanControllerThread();
// fanExit(); // fanExit();
i2cExit(); i2cExit();
fsExit(); setsysExit();
fsdevUnmountAll(); fsdevUnmountAll();
appletExit(); fsExit();
} smExit();
}
} }
int main(int argc, char** argv) int main(int argc, char** argv)
@@ -119,48 +135,36 @@ int main(int argc, char** argv)
return 1; return 1;
} }
try board::Initialize();
processManagement::Initialize();
processManagement::WaitForQLaunch();
clockManager::Initialize();
ipcService::Initialize();
fileUtils::LogLine("Ready");
clockManager::SetRunning(true);
config::SetEnabled(true);
ipcService::SetRunning(true);
// TemperaturePoint *table;
// ReadConfigFile(&table);
// InitFanController(table);
// StartFanControllerThread();
while (clockManager::Running())
{ {
board::Initialize(); clockManager::Tick();
processManagement::Initialize(); clockManager::WaitForNextTick();
processManagement::WaitForQLaunch();
clockManager::Initialize();
ipcService::Initialize();
fileUtils::LogLine("Ready");
clockManager::SetRunning(true);
config::SetEnabled(true);
ipcService::SetRunning(true);
// TemperaturePoint *table;
// ReadConfigFile(&table);
// InitFanController(table);
// StartFanControllerThread();
while (clockManager::Running())
{
clockManager::Tick();
clockManager::WaitForNextTick();
}
ipcService::SetRunning(false);
ipcService::Exit();
clockManager::Exit();
processManagement::Exit();
board::Exit();
}
catch (const std::exception &ex)
{
fileUtils::LogLine("[!] %s", ex.what());
}
catch (...)
{
std::exception_ptr p = std::current_exception();
fileUtils::LogLine("[!?] %s", p ? p.__cxa_exception_type()->name() : "...");
} }
ipcService::SetRunning(false);
ipcService::Exit();
clockManager::Exit();
processManagement::Exit();
board::Exit();
fileUtils::LogLine("Exit"); fileUtils::LogLine("Exit");
svcSleepThread(1000000ULL); svcSleepThread(1000000ULL);
fileUtils::Exit(); fileUtils::Exit();

View File

@@ -0,0 +1,30 @@
/*
* Copyright (c) Souldbminer and Horizon OC Contributors
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#include <switch.h>
Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size) {
if(hosversionAtLeast(10,0,0))
{
u64 out_size;
return svcQueryMemoryMapping(virtaddr, &out_size, physaddr, size);
}
else
{
return svcLegacyQueryIoMapping(virtaddr, physaddr, size);
}
}

View File

@@ -0,0 +1,21 @@
/*
* Copyright (c) Souldbminer and Horizon OC Contributors
*
* 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 <http://www.gnu.org/licenses/>.
*
*/
#pragma once
#include <switch.h>
Result QueryMemoryMapping(u64* virtaddr, u64 physaddr, u64 size);

View File

@@ -25,6 +25,7 @@
#include "soctherm.hpp" #include "soctherm.hpp"
#include "board/board.hpp" #include "board/board.hpp"
#include "file_utils.hpp" #include "file_utils.hpp"
#include "mem_map.hpp"
namespace soctherm { namespace soctherm {
@@ -440,8 +441,7 @@ namespace soctherm {
} }
Result MapAddress(u64 &va, const u64 &physAddr, const char *name) { Result MapAddress(u64 &va, const u64 &physAddr, const char *name) {
u64 outSize; Result mapResult = QueryMemoryMapping(&va, physAddr, 0x1000);
Result mapResult = svcQueryMemoryMapping(&va, &outSize, physAddr, 0x1000);
if (R_FAILED(mapResult)) { if (R_FAILED(mapResult)) {
fileUtils::LogLine("[Soctherm] Failed to map %s! %u", name, R_DESCRIPTION(mapResult)); fileUtils::LogLine("[Soctherm] Failed to map %s! %u", name, R_DESCRIPTION(mapResult));
} }