Merge tag 2.4.0 from upstream Horizon-OC
Some checks failed
Build Horizon OC Zeus / build (push) Failing after 6s
Some checks failed
Build Horizon OC Zeus / build (push) Failing after 6s
Bring main up to the 2.4.0 release while keeping German sysmodule notifications and upstream kip.cpp fixes from the release.
This commit is contained in:
@@ -7,28 +7,41 @@ BasedOnStyle: LLVM
|
||||
IndentWidth: 4
|
||||
UseTab: Never
|
||||
|
||||
BreakBeforeBraces: Linux
|
||||
# === Struct/Union/Class member indentation ===
|
||||
# These options control indentation of struct members to ensure consistent
|
||||
# 4-space indentation for all struct/union/class members
|
||||
IndentAccessModifiers: false
|
||||
AccessModifierOffset: 0
|
||||
NamespaceIndentation: All
|
||||
IndentPPDirectives: BeforeHash
|
||||
|
||||
BreakBeforeBraces: Attach
|
||||
BraceWrapping:
|
||||
AfterControlStatement: false
|
||||
AfterFunction: true
|
||||
AfterFunction: false
|
||||
AfterClass: false
|
||||
AfterStruct: false
|
||||
# AfterStruct: false keeps struct opening brace on same line (K&R style)
|
||||
# Struct members will still be indented with IndentWidth: 4
|
||||
AfterUnion: false
|
||||
AfterNamespace: false
|
||||
AfterEnum: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
# IndentBraces: false ensures braces themselves are not indented,
|
||||
# but content inside braces respects IndentWidth setting
|
||||
|
||||
ContinuationIndentWidth: 0
|
||||
AlignAfterOpenBracket: false
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AllowShortBlocksOnASingleLine: Always
|
||||
IndentCaseLabels: false
|
||||
SpaceAfterCStyleCast: true
|
||||
# AllowShortFunctionsOnASingleLine: None enforces function bodies
|
||||
# to always be on separate lines, following K&R convention
|
||||
AllowShortFunctionsOnASingleLine: None
|
||||
ColumnLimit: 80
|
||||
|
||||
IndentCaseLabels: true
|
||||
SpaceAfterCStyleCast: false
|
||||
ColumnLimit: 150
|
||||
MaxEmptyLinesToKeep: 1
|
||||
Cpp11BracedListStyle: false
|
||||
AlignTrailingComments: true
|
||||
@@ -39,7 +52,9 @@ IncludeBlocks: Regroup
|
||||
IncludeCategories:
|
||||
- Regex: '<[[:alnum:].]+>'
|
||||
Priority: 1
|
||||
# System headers (angle brackets) have highest priority
|
||||
- Regex: '.*'
|
||||
Priority: 2
|
||||
# Project headers (quotes) have lower priority
|
||||
SortIncludes: CaseSensitive
|
||||
AlignEscapedNewlines: Left
|
||||
12
COMPILING.md
12
COMPILING.md
@@ -2,10 +2,8 @@ Horizon OC Compilation Instructions
|
||||
|
||||
1. Install devkitpro (https://devkitpro.org/wiki/Getting_Started) with switch-dev
|
||||
2. Set up a development enviorment for compiling Atmosphere (https://github.com/Atmosphere-NX/Atmosphere/blob/master/docs/building.md)
|
||||
3. Install GNU make and ENSURE THAT YOUR ENVIORMENT HAS A PYTHON3 COMMAND AVAILABLE!
|
||||
4. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git)
|
||||
5. Clone the Horizon OC develop branch (git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules)
|
||||
6. Create a new folder named "build" in the horizon oc repo
|
||||
7. Copy atmosphere files into that build folder
|
||||
8. Copy Source/Atmosphere/stratosphere/loader/source/ldr_process_creation.cpp to build/stratosphere/loader/source/ldr_process_creation.cpp, replacing any files if prompted
|
||||
9. Run ./build.sh in the root directory
|
||||
3. Git clone atmosphere (git clone https://github.com/Atmosphere-NX/Atmosphere.git)
|
||||
4. Clone the Horizon OC develop branch (``git clone https://github.com/Horizon-OC/Horizon-OC.git --recurse-submodules``)
|
||||
5. Create a new folder named ``build`` in the horizon oc repo
|
||||
6. Copy atmosphere files into that build folder
|
||||
7. Run ./build.sh in the root directory
|
||||
|
||||
@@ -35,10 +35,8 @@ volatile CustomizeTable C = {
|
||||
/* Disables RAM powerdown */
|
||||
.hpMode = DISABLED,
|
||||
|
||||
.commonEmcMemVolt = 1175000, /* LPDDR4(X) JEDEC Specification */
|
||||
.eristaEmcMaxClock = 1600000, /* Maximum HB-MGCH ram rating */
|
||||
.eristaEmcMaxClock1 = 1600000,
|
||||
.eristaEmcMaxClock2 = 1600000,
|
||||
.commonEmcMemVolt = 1175000, /* LPDDR4(X) JEDEC Specification */
|
||||
.eristaEmcMaxClock = 1600000, /* Maximum HB-MGCH ram rating */
|
||||
|
||||
/* Available: 66MHz step rate, 100MHz step rate, 133MHz step rate and jedec. */
|
||||
/* Jedec freqs are 1333MHz, 1600MHz, 1866MHz, 2133MHz, 2400MHz, 2666MHz, 2933MHz, 3200MHz. */
|
||||
@@ -84,24 +82,6 @@ volatile CustomizeTable C = {
|
||||
/* 2133 */ 0,
|
||||
},
|
||||
|
||||
/* You can mix and match different latencies if needed */
|
||||
/*
|
||||
* Read:
|
||||
* 2133RL = 40
|
||||
* 1866RL = 36
|
||||
* 1600RL = 32
|
||||
* 1331RL = 28
|
||||
* Write:
|
||||
* 2133WL = 18
|
||||
* 1866WL = 16
|
||||
* 1600WL = 14
|
||||
* 1331WL = 12
|
||||
*/
|
||||
|
||||
/* Erista only. */
|
||||
.mem_burst_read_latency = RL_1600,
|
||||
.mem_burst_write_latency = WL_1600,
|
||||
|
||||
.eristaCpuUV = 0,
|
||||
.eristaCpuVmin = 800,
|
||||
.eristaCpuMaxVolt = 1200,
|
||||
@@ -133,7 +113,7 @@ volatile CustomizeTable C = {
|
||||
.eristaGpuUV = 0,
|
||||
.eristaGpuVmin = 810,
|
||||
|
||||
.marikoGpuUV = 0,
|
||||
.marikoGpuUV = 2,
|
||||
/* Vmin past 795mV won't work due boot voltage being 800mV (can be adjusted though). */
|
||||
.marikoGpuVmin = 610,
|
||||
.marikoGpuBootVolt = 800, /* Used during boot and when temp is <20°C */
|
||||
@@ -141,9 +121,6 @@ volatile CustomizeTable C = {
|
||||
|
||||
.commonGpuVoltOffset = 0,
|
||||
|
||||
/* Speedo is automatically set by hoc-clk on first boot */
|
||||
.gpuSpeedo = 1450,
|
||||
|
||||
/* Setting DEACTIVATED_GPU_FREQ on any freq will disable it and all freqs greater than it. (the latter is a bug :/) */
|
||||
/* AUTO: Voltage is optimally chosen; with commonGpuVoltOffset applied. */
|
||||
/* AUTO only works up to 1305 GPU on Mariko and 998 GPU on Erista (it is reccomended to manually set your 998MHz voltage though) */
|
||||
@@ -480,6 +457,47 @@ volatile CustomizeTable C = {
|
||||
},
|
||||
|
||||
.marikoGpuDvfsTable = {
|
||||
{ 76800, {}, { 610000, } },
|
||||
{ 153600, {}, { 610000, } },
|
||||
{ 230400, {}, { 610000, } },
|
||||
{ 307200, {}, { 610000, } },
|
||||
{ 384000, {}, { 610000, } },
|
||||
{ 460800, {}, { 610000, } },
|
||||
{ 537600, {}, { 801688, -10900, -163, 298, -10599, 162 } },
|
||||
{ 614400, {}, { 824214, -5743, -452, 238, -6325, 81 } },
|
||||
{ 691200, {}, { 848830, -3903, -552, 119, -4030, -2 } },
|
||||
{ 768000, {}, { 891575, -4409, -584, 0, -2849, 39 } },
|
||||
{ 844800, {}, { 940071, -5367, -602, -60, -63, -93 } },
|
||||
{ 921600, {}, { 986765, -6637, -614, -179, 1905, -13 } },
|
||||
{ 998400, {}, { 1098475, -13529, -497, -179, 3626, 9 } },
|
||||
// { 1075200, {}, { 1163644, -12688, -648, 0, 1077, 40 } },
|
||||
// { 1152000, {}, { 1204812, -9908, -830, 0, 1469, 110 } },
|
||||
// { 1228800, {}, { 1277303, -11675, -859, 0, 3722, 313 } },
|
||||
// { 1267200, {}, { 1335531, -12567, -867, 0, 3681, 559 } },
|
||||
// { 1305600, {}, { 1374130, -13725, -859, 0, 4442, 576 } },
|
||||
},
|
||||
|
||||
.marikoGpuDvfsTableSLT = {
|
||||
{ 76800, {}, { 590000, } },
|
||||
{ 153600, {}, { 590000, } },
|
||||
{ 230400, {}, { 590000, } },
|
||||
{ 307200, {}, { 590000, } },
|
||||
{ 384000, {}, { 590000, } },
|
||||
{ 460800, {}, { 795089, -11096, -163, 298, -10421, 162 } },
|
||||
{ 537600, {}, { 795089, -11096, -163, 298, -10421, 162 } },
|
||||
{ 614400, {}, { 820606, -6285, -452, 238, -6182, 81 } },
|
||||
{ 691200, {}, { 846289, -4565, -552, 119, -3958, -2 } },
|
||||
{ 768000, {}, { 888720, -5110, -584, 0, -2849, 39 } },
|
||||
{ 844800, {}, { 936634, -6089, -602, -60, -99, -93 } },
|
||||
{ 921600, {}, { 982562, -7373, -614, -179, 1797, -13 } },
|
||||
{ 998400, {}, { 1090179, -14125, -497, -179, 3518, 9 } },
|
||||
{ 1075200, {}, { 1155798, -13465, -648, 0, 1077, 40 } },
|
||||
// { 1152000, {}, { 1198568, -10904, -830, 0, 1469, 110 } },
|
||||
// { 1228800, {}, { 1269988, -12707, -859, 0, 3722, 313 } },
|
||||
// { 1267200, {}, { 1308155, -13694, -867, 0, 3681, 559 } },
|
||||
},
|
||||
|
||||
.marikoGpuDvfsTableHiOPT = {
|
||||
{ 76800, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 153600, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 230400, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
@@ -494,12 +512,12 @@ volatile CustomizeTable C = {
|
||||
{ 921600, { }, { 970060,-10108, -614,-179, 1508, -13 } },
|
||||
{ 998400, { }, { 1065665,-16075, -497,-179, 3213, 9 } },
|
||||
{ 1075200, { }, { 1132576,-16093, -648, 0, 1077, 40 } },
|
||||
// { 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } },
|
||||
{ 1152000, { }, { 1180029,-14534, -830, 0, 1469, 110 } },
|
||||
// { 1228800, { }, { 1248293,-16383, -859, 0, 3722, 313 } },
|
||||
// { 1267200, { }, { 1286399,-17475, -867, 0, 3681, 559 } },
|
||||
},
|
||||
|
||||
.marikoGpuDvfsTableSLT = {
|
||||
.marikoGpuDvfsTableHiOPT15 = {
|
||||
{ 76800, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 153600, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 230400, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
@@ -515,11 +533,11 @@ volatile CustomizeTable C = {
|
||||
{ 998400, { }, { 1065665, -16075, -497, -179, 3213, 9 } },
|
||||
{ 1075200, { }, { 1132576, -16093, -648, 0, 1077, 40 } },
|
||||
{ 1152000, { }, { 1180029, -14534, -830, 0, 1469, 110 } },
|
||||
{ 1228800, { }, { 1238293, -16383, -859, 0, 3722, 313 } },
|
||||
// { 1228800, { }, { 1238293, -16383, -859, 0, 3722, 313 } },
|
||||
// { 1267200, { }, { 1276399, -17475, -867, 0, 3681, 559 } },
|
||||
},
|
||||
|
||||
.marikoGpuDvfsTableHiOPT = {
|
||||
.marikoGpuDvfsTableHighUV = {
|
||||
{ 76800, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 153600, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
{ 230400, { }, { GPU_MIN_MIN_VOLT, } },
|
||||
|
||||
@@ -70,8 +70,6 @@ struct CustomizeTable {
|
||||
|
||||
u32 commonEmcMemVolt;
|
||||
u32 eristaEmcMaxClock;
|
||||
u32 eristaEmcMaxClock1;
|
||||
u32 eristaEmcMaxClock2;
|
||||
|
||||
StepMode stepMode;
|
||||
u32 marikoEmcMaxClock;
|
||||
@@ -97,9 +95,6 @@ struct CustomizeTable {
|
||||
u32 readLatency[4];
|
||||
u32 writeLatency[4];
|
||||
|
||||
u32 mem_burst_read_latency;
|
||||
u32 mem_burst_write_latency;
|
||||
|
||||
u32 eristaCpuUV;
|
||||
u32 eristaCpuVmin;
|
||||
u32 eristaCpuMaxVolt;
|
||||
@@ -124,9 +119,7 @@ struct CustomizeTable {
|
||||
u32 marikoGpuBootVolt;
|
||||
u32 marikoGpuVmax;
|
||||
|
||||
u32 commonGpuVoltOffset;
|
||||
|
||||
u32 gpuSpeedo;
|
||||
s32 commonGpuVoltOffset;
|
||||
|
||||
u32 eristaGpuVoltArray[27];
|
||||
u32 marikoGpuVoltArray[24];
|
||||
@@ -152,6 +145,8 @@ struct CustomizeTable {
|
||||
CustomizeGpuDvfsTable marikoGpuDvfsTable;
|
||||
CustomizeGpuDvfsTable marikoGpuDvfsTableSLT;
|
||||
CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT;
|
||||
CustomizeGpuDvfsTable marikoGpuDvfsTableHiOPT15;
|
||||
CustomizeGpuDvfsTable marikoGpuDvfsTableHighUV;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -18,11 +18,122 @@
|
||||
|
||||
namespace ams::ldr::hoc::pcv::erista {
|
||||
|
||||
void CalculateTimings(double tCK_avg) {
|
||||
tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW;
|
||||
void SwitchLatency(volatile u32 &latency, u32 index, u32 latencyStep) {
|
||||
latency += index * latencyStep;
|
||||
}
|
||||
|
||||
static s32 GetMaxLatencyIndex(volatile u32 *latencyArray, u32 latencySize) {
|
||||
s32 maxIndex = -1;
|
||||
for (u32 i = 0; i < latencySize; ++i) {
|
||||
if (latencyArray[i]) {
|
||||
maxIndex = i;
|
||||
}
|
||||
}
|
||||
|
||||
return maxIndex;
|
||||
}
|
||||
|
||||
void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) {
|
||||
if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */
|
||||
latency += latencyStep * 2;
|
||||
} else { /* 2133tRWL */
|
||||
latency += latencyStep * 3;
|
||||
}
|
||||
}
|
||||
|
||||
void HandleLatency(u32 freq, volatile u32 &latency, volatile u32 *latencyArray, u32 indexMax, u32 latencyStep) {
|
||||
for (u32 i = 0; i <= indexMax; ++i) {
|
||||
if (latencyArray[i] != 0 && freq <= latencyArray[i]) {
|
||||
SwitchLatency(latency, i, latencyStep);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
SwitchLatency(latency, indexMax, latencyStep);
|
||||
}
|
||||
|
||||
void HandleLatency(u32 freq) {
|
||||
static s32 rlIndexMax = GetMaxLatencyIndex(C.readLatency, std::size(C.readLatency));
|
||||
static s32 wlIndexMax = GetMaxLatencyIndex(C.writeLatency, std::size(C.writeLatency));
|
||||
constexpr u32 ReadLatencyStep = 4;
|
||||
constexpr u32 WriteLatencyStep = 2;
|
||||
bool autoLatencyRead = false, autoLatencyWrite = false;
|
||||
|
||||
if (rlIndexMax == -1) {
|
||||
AutoLatency(RL, freq, ReadLatencyStep);
|
||||
autoLatencyRead = true;
|
||||
}
|
||||
|
||||
if (wlIndexMax == -1) {
|
||||
AutoLatency(WL, freq, WriteLatencyStep);
|
||||
autoLatencyWrite = true;
|
||||
}
|
||||
|
||||
if (autoLatencyRead && autoLatencyWrite) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!autoLatencyRead) {
|
||||
HandleLatency(freq, RL, C.readLatency, rlIndexMax, ReadLatencyStep);
|
||||
}
|
||||
|
||||
if (!autoLatencyWrite) {
|
||||
HandleLatency(freq, WL, C.writeLatency, wlIndexMax, WriteLatencyStep);
|
||||
}
|
||||
}
|
||||
|
||||
void CalculateMrw2() {
|
||||
static const u8 rlMapDBI[8] = {
|
||||
6, 12, 16, 22, 28, 32, 36, 40
|
||||
};
|
||||
|
||||
static const u8 wlMapSetA[8] = {
|
||||
4, 6, 8, 10, 12, 14, 16, 18
|
||||
};
|
||||
|
||||
u32 rlIndex = 0;
|
||||
u32 wlIndex = 0;
|
||||
|
||||
for (u32 i = 0; i < std::size(rlMapDBI); ++i) {
|
||||
if (rlMapDBI[i] == 32) {
|
||||
rlIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
for (u32 i = 0; i < std::size(wlMapSetA); ++i) {
|
||||
if (wlMapSetA[i] == WL) {
|
||||
wlIndex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* DBI is always enabled. */
|
||||
mrw2 = static_cast<u8>(((rlIndex & 0x7) | ((wlIndex & 0x7) << 3) | ((0 & 0x1) << 6)));
|
||||
}
|
||||
|
||||
void CalculateTimings(double tCK_avg, u32 freq) {
|
||||
RL = RL_1331;
|
||||
WL = WL_1331;
|
||||
|
||||
HandleLatency(freq);
|
||||
CalculateMrw2();
|
||||
|
||||
tR2P = CEIL((RL * 0.426) - 2.0);
|
||||
tR2W = FLOOR(FLOOR((5.0 / tCK_avg) + ((FLOOR(48.0 / WL) - 0.478) * 3.0)) / 1.501) + RL - (C.t6_tRTW * 3) + finetRTW;
|
||||
|
||||
tW2P = (CEIL(WL * 1.7303) * 2) - 5;
|
||||
tWTPDEN = CEIL(((1.803 / tCK_avg) + MAX(RL + (2.694 / tCK_avg), static_cast<double>(tW2P))) + (BL / 2));
|
||||
tW2R = FLOOR(MAX((5.020 / tCK_avg) + 1.130, WL - MAX(-CEIL(0.258 * (WL - RL)), 1.964)) * 1.964) + WL - CEIL(tWTR / tCK_avg) + finetWTR;
|
||||
|
||||
wdv = WL;
|
||||
wsv = WL - 2;
|
||||
wev = 0xA + (WL - 14);
|
||||
|
||||
u32 obdlyHigh = 3 / FLOOR(MIN(static_cast<double>(2), tCK_avg * (WL - 7)));
|
||||
u32 obdlyLow = MAX(WL - FLOOR((126.0 / CEIL(tCK_avg + 8.601))), 0.0);
|
||||
obdly = PACK_U32_NIBBLE_HIGH_BYTE_LOW(obdlyHigh, obdlyLow);
|
||||
|
||||
pdex2rw = CEIL((CEIL(12.335 - tCK_avg) + (7.430 / tCK_avg) - CEIL(tCK_avg * 11.361)));
|
||||
tCLKSTOP = FLOOR(MIN(8.488 / tCK_avg, 23.0)) + 8.0;
|
||||
|
||||
|
||||
@@ -18,6 +18,6 @@
|
||||
|
||||
namespace ams::ldr::hoc::pcv::erista {
|
||||
|
||||
void CalculateTimings(double tCK_avg);
|
||||
void CalculateTimings(double tCK_avg, u32 freq);
|
||||
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
}
|
||||
|
||||
void AutoLatency(volatile u32 &latency, u32 freq, u32 latencyStep) {
|
||||
if (freq > 1600'000 && freq <= 1866'000) { /* 1866tRWL */
|
||||
if (freq > 1600'000 && freq <= 1862'400) { /* 1866tRWL */
|
||||
latency += latencyStep * 2;
|
||||
} else { /* 2133tRWL */
|
||||
latency += latencyStep * 3;
|
||||
|
||||
@@ -33,10 +33,6 @@ namespace ams::ldr::hoc {
|
||||
/* Burst latency, not to be confused with base latency (tWRL). */
|
||||
const u32 BL = 16;
|
||||
|
||||
/* Base latency for read and write (tWRL). */
|
||||
const u32 RL = C.mem_burst_read_latency;
|
||||
const u32 WL = C.mem_burst_write_latency;
|
||||
|
||||
/* Precharge to Precharge Delay. (tCK) */
|
||||
const u32 tPPD = 4;
|
||||
|
||||
@@ -87,19 +83,30 @@ namespace ams::ldr::hoc {
|
||||
const u32 tFAW = static_cast<u32>(tRRD * 4.0);
|
||||
const double tRPab = tRPpb + 3;
|
||||
|
||||
const u32 tR2P = CEIL((RL * 0.426) - 2.0);
|
||||
inline u32 RL;
|
||||
inline u32 WL;
|
||||
|
||||
inline u32 tR2P;
|
||||
inline u32 tR2W;
|
||||
inline u32 rext;
|
||||
|
||||
const u32 tW2P = (CEIL(WL * 1.7303) * 2) - 5;
|
||||
inline u32 tW2P;
|
||||
inline u32 tWTPDEN;
|
||||
inline u32 tW2R;
|
||||
|
||||
inline u32 wdv;
|
||||
inline u32 wsv;
|
||||
inline u32 wev;
|
||||
|
||||
inline u32 obdly;
|
||||
|
||||
inline u32 pdex2rw;
|
||||
|
||||
inline u32 tCLKSTOP;
|
||||
|
||||
inline double pdex2mrr;
|
||||
|
||||
inline u8 mrw2;
|
||||
}
|
||||
|
||||
namespace pcv::mariko {
|
||||
|
||||
@@ -134,8 +134,14 @@ namespace ams::ldr::hoc::pcv {
|
||||
case 2:
|
||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq);
|
||||
break;
|
||||
case 3:
|
||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT15)->freq);
|
||||
break;
|
||||
case 4:
|
||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHighUV)->freq);
|
||||
break;
|
||||
default:
|
||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -147,7 +153,7 @@ namespace ams::ldr::hoc::pcv {
|
||||
{ eristaCpuDvfsMaxFreq, 1785'000, 2397'000, panic::Cpu, },
|
||||
{ marikoCpuDvfsMaxFreq, 1785'000, 2703'000, panic::Cpu, },
|
||||
{ C.commonEmcMemVolt, 912'500, 1350'000, panic::Emc, }, /* Official vmax for the RAMs is 1400-1500mV */
|
||||
{ GET_MAX_OF_ARR(erista::maxEmcClocks), 1600'000, 2600'000, panic::Emc, },
|
||||
{ C.eristaEmcMaxClock, 1600'000, 2600'000, panic::Emc, },
|
||||
{ C.marikoEmcMaxClock, 1600'000, 3500'000, panic::Emc, },
|
||||
{ C.marikoEmcVddqVolt, 400'000, 750'000, panic::Emc, },
|
||||
{ C.marikoSocVmax, 1000, 1200, panic::Emc, },
|
||||
|
||||
@@ -127,8 +127,14 @@ namespace ams::ldr::hoc::pcv {
|
||||
case 2:
|
||||
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableHiOPT);
|
||||
break;
|
||||
case 3:
|
||||
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableHiOPT15);
|
||||
break;
|
||||
case 4:
|
||||
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableHighUV);
|
||||
break;
|
||||
default:
|
||||
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTable);
|
||||
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableHiOPT);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
@@ -169,14 +175,14 @@ namespace ams::ldr::hoc::pcv {
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (C.marikoGpuVoltArray[i] * 1000));
|
||||
ClearCvbPllEntry(entry);
|
||||
} else {
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000));
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000));
|
||||
}
|
||||
} else {
|
||||
if (C.eristaGpuVoltArray[i] != 0) {
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (C.eristaGpuVoltArray[i] * 1000));
|
||||
ClearCvbPllEntry(entry);
|
||||
} else {
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000));
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000));
|
||||
}
|
||||
}
|
||||
++entry;
|
||||
@@ -184,7 +190,7 @@ namespace ams::ldr::hoc::pcv {
|
||||
if (C.commonGpuVoltOffset && !(isMariko ? C.marikoGpuUV : C.eristaGpuUV)) {
|
||||
cvb_entry_t *entry = static_cast<cvb_entry_t *>(gpu_cvb_table_head);
|
||||
for (size_t i = 0; i < customize_entry_count; ++i) {
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (entry->cvb_pll_param.c0 - C.commonGpuVoltOffset * 1000));
|
||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), (u32)((s32)entry->cvb_pll_param.c0 + C.commonGpuVoltOffset * 1000));
|
||||
++entry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
namespace ams::ldr::hoc::pcv {
|
||||
|
||||
constexpr u32 NopIns = 0x1f2003d5;
|
||||
constexpr u32 NopIns = 0xD503201F;
|
||||
|
||||
template <typename Compare>
|
||||
u32 *ScanAssembly(u32 *ptr, u32 scanLimit, u32 pattern, Compare comp) {
|
||||
@@ -76,6 +76,30 @@ namespace ams::ldr::hoc::pcv {
|
||||
SF | Op | S | | RM | Cond | 0 | 0 | Rn | Rd
|
||||
31 | 30 | 29 | 28 27 26 25 24 23 | 20 19 18 17 16 | 15 14 13 12 | 11 | 10 | 9 8 7 6 5 | 4 3 2 1 0
|
||||
*/
|
||||
inline auto AsmCbzCompareOpcodeOnly = [](u32 ins1, u32 ins2) {
|
||||
return ((ins1 ^ ins2) >> 24) == 0;
|
||||
};
|
||||
|
||||
inline auto AsmBlCompareOpcodeOnly = [](u32 ins1, u32 ins2) {
|
||||
return ((ins1 ^ ins2) >> 26) == 0;
|
||||
};
|
||||
inline bool AsmComparePrologue(u32 ins1, u32 ins2, u32 ins3, u32 cmp1, u32 cmp2, u32 cmp3) {
|
||||
constexpr u32 StpImmMask = ~((((1u << 7) - 1u) << 15));
|
||||
|
||||
bool firstMatch = (ins1 & StpImmMask) == (cmp1 & StpImmMask);
|
||||
|
||||
constexpr u32 StpRegsImmMask = ~(((1u << 5) - 1u) |(((1u << 5) - 1u) << 10) | (((1u << 7) - 1u) << 15));
|
||||
|
||||
bool secondMatch = (ins2 & StpRegsImmMask) == (cmp2 & StpRegsImmMask);
|
||||
|
||||
|
||||
constexpr u32 MovMask = ~((1u << 5) - 1u);
|
||||
|
||||
bool thirdMatch = (ins3 & MovMask) == (cmp3 & MovMask);
|
||||
|
||||
return firstMatch && secondMatch && thirdMatch;
|
||||
}
|
||||
|
||||
inline auto AsmCompareCselNoReg = [](u32 ins1, u32 ins2) {
|
||||
constexpr u32 ClearReg = ~(((1 << 10) - 1) | (((1 << 5) - 1) << 16));
|
||||
return ((ins1 & ClearReg) ^ (ins2 & ClearReg)) == 0;
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
*
|
||||
* Copyright (c) 2023 hanai3Bi
|
||||
*
|
||||
* Copyright (c) B3711
|
||||
*
|
||||
* Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -18,6 +20,7 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <vector>
|
||||
#include "pcv.hpp"
|
||||
#include "../mtc_timing_value.hpp"
|
||||
#include "../erista/calculate_timings_erista.hpp"
|
||||
@@ -215,7 +218,7 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
|
||||
const u32 dyn_self_ref_control = (static_cast<u32>(7605.0 / tCK_avg) + 260) | (table->burst_regs.emc_dyn_self_ref_control & 0xffff0000);
|
||||
|
||||
CalculateTimings(tCK_avg);
|
||||
CalculateTimings(tCK_avg, table->rate_khz);
|
||||
|
||||
WRITE_PARAM_ALL_REG(table, emc_rd_rcd, GET_CYCLE_CEIL(tRCD));
|
||||
WRITE_PARAM_ALL_REG(table, emc_wr_rcd, GET_CYCLE_CEIL(tRCD));
|
||||
@@ -254,16 +257,17 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
WRITE_PARAM_ALL_REG(table, emc_rw2pden, tWTPDEN);
|
||||
|
||||
/* Accept imperfection or prepare for suffering. */
|
||||
// #if defined(AMS_BUILD_FOR_AUDITING) || defined(AMS_BUILD_FOR_DEBUGGING)
|
||||
// WRITE_PARAM_ALL_REG(table, emc_einput, einput);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_einput_duration, einput_duration);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_obdly, obdly);
|
||||
WRITE_PARAM_ALL_REG(table, emc_obdly, obdly);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_ibdly, ibdly);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_wdv_mask, wdv);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_quse_width, quse_width);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_quse, quse);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_wdv, wdv);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_wsv, wsv);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_wev, wev);
|
||||
WRITE_PARAM_ALL_REG(table, emc_wdv, wdv);
|
||||
WRITE_PARAM_ALL_REG(table, emc_wsv, wsv);
|
||||
WRITE_PARAM_ALL_REG(table, emc_wev, wev);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_qrst, qrst);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_tr_qrst, qrst);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_qsafe, qsafe);
|
||||
@@ -276,8 +280,9 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
// WRITE_PARAM_ALL_REG(table, emc_rdv_early_mask, rdv);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_rdv_mask, rdv + 2);
|
||||
// WRITE_PARAM_ALL_REG(table, emc_tr_rdv, rdv);
|
||||
// table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast<u32>(mrw2);
|
||||
table->emc_mrw2 = (table->emc_mrw2 & ~0xFFu) | static_cast<u32>(mrw2);
|
||||
// table->dram_timings.rl = RL;
|
||||
// #endif
|
||||
|
||||
constexpr double MC_ARB_DIV = 4.0;
|
||||
constexpr u32 MC_ARB_SFA = 2;
|
||||
@@ -360,65 +365,176 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
table->min_volt = std::clamp(900 + (C.emcDvbShift * 25), 900, 1050);
|
||||
}
|
||||
|
||||
/* Probably more intuitive to point to 40800 rather than 1600000, but oh well. */
|
||||
Result MemFreqMtcTable(u32 *ptr) {
|
||||
u32 khz_list[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000 };
|
||||
std::sort(maxEmcClocks, maxEmcClocks + std::size(maxEmcClocks));
|
||||
u32 khz_list_size = std::size(khz_list);
|
||||
namespace {
|
||||
std::vector<u32> newEmcList;
|
||||
u32 *nsoStart;
|
||||
}
|
||||
|
||||
// Generate list for mtc table pointers
|
||||
EristaMtcTable *table_list[khz_list_size];
|
||||
for (u32 i = 0; i < khz_list_size; i++) {
|
||||
u32 mtcIndex = khz_list_size - 1 - i;
|
||||
u8 *table = reinterpret_cast<u8 *>(ptr) - offsetof(EristaMtcTable, rate_khz) - i * sizeof(EristaMtcTable);
|
||||
table_list[mtcIndex] = reinterpret_cast<EristaMtcTable *>(table);
|
||||
R_UNLESS(table_list[mtcIndex]->rate_khz == khz_list[mtcIndex], ldr::ResultInvalidMtcTable());
|
||||
R_UNLESS(table_list[mtcIndex]->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable());
|
||||
/* The silicon instructs; the children obey... */
|
||||
void MtcGenerateFreqTables() {
|
||||
newEmcList.clear();
|
||||
newEmcList.reserve(DvfsTableEntryCount);
|
||||
newEmcList.insert(newEmcList.end(), std::begin(EmcListDefault), std::end(EmcListDefault));
|
||||
|
||||
if (C.eristaEmcMaxClock <= EmcClkOSLimit) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) {
|
||||
/* This is scuffed, but Eristas step rate is... weird? */
|
||||
/* 1766MHz seems to cause crashes with other freqs near it... why is anyones guess... */
|
||||
u32 freqsLow[] = { 1633000, 1666000, 1700000, 1733000, 1800000, 1833000, 1862400, };
|
||||
constexpr size_t freqsLowSize = std::size(freqsLow);
|
||||
|
||||
for (size_t i = 0; i < freqsLowSize; ++i) {
|
||||
if (freqsLow[i] <= C.eristaEmcMaxClock) {
|
||||
newEmcList.push_back(freqsLow[i]);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (C.eristaEmcMaxClock <= freqsLow[freqsLowSize - 1]) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* High range. */
|
||||
constexpr u32 StepRate = 38400;
|
||||
while (newEmcList.back() + StepRate < C.eristaEmcMaxClock) {
|
||||
newEmcList.push_back(newEmcList.back() + StepRate);
|
||||
}
|
||||
|
||||
if (newEmcList.back() != C.eristaEmcMaxClock) {
|
||||
newEmcList.push_back(static_cast<u32>(C.eristaEmcMaxClock));
|
||||
}
|
||||
|
||||
constexpr u32 PllmToggleFrequency = 19200;
|
||||
|
||||
/* A step of 19.2khz will cause hangs, crashes and other weirdness. */
|
||||
/* Why? ¯\_(ツ)_/¯ */
|
||||
if (C.eristaEmcMaxClock - newEmcList[newEmcList.size() - 2] <= PllmToggleFrequency) {
|
||||
newEmcList.erase(newEmcList.begin() + newEmcList.size() - 2);
|
||||
}
|
||||
|
||||
newEmcList.resize(std::min(newEmcList.size(), DvfsTableEntryLimit));
|
||||
}
|
||||
|
||||
/* TODO: Template this */
|
||||
Result VerifyMtcTable(EristaMtcTable *tableStart, u32 expectedFreq) {
|
||||
R_UNLESS(tableStart->rate_khz == expectedFreq, ldr::ResultInvalidMtcTable());
|
||||
R_UNLESS(tableStart->rev == MTC_TABLE_REV, ldr::ResultInvalidMtcTable());
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
/* TODO: Template this */
|
||||
Result MtcValidateAllTables(EristaMtcTable *tableStart, const u32 *validationList, u32 tableCount) {
|
||||
for (u32 i = 0; i < tableCount; ++i) {
|
||||
R_TRY(VerifyMtcTable(&tableStart[i], validationList[i]));
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
/* TODO: Put this into common. */
|
||||
DramId GetDramId() {
|
||||
u64 id64;
|
||||
splGetConfig(SplConfigItem_DramId, &id64);
|
||||
return static_cast<DramId>(id64);
|
||||
}
|
||||
|
||||
MtcTableIndex GetMtcDramIndex(DramId dramId) {
|
||||
for (u32 i = 0; i < std::size(mtcIndexTable); ++i) {
|
||||
if (mtcIndexTable[i].dramId == dramId) {
|
||||
return mtcIndexTable[i].index;
|
||||
}
|
||||
}
|
||||
|
||||
return MtcTableIndex_Invalid;
|
||||
}
|
||||
|
||||
NORETURN void AbortInvalidMtc(const char *crashMsg) {
|
||||
panic::SmcError(panic::Emc);
|
||||
CRASH(crashMsg);
|
||||
}
|
||||
|
||||
u32 GetMtcOffset(MtcTableIndex index) {
|
||||
if (index < T210SdevEmcDvfsTableS6gb01) {
|
||||
return index * erista::MtcFullTableSize;
|
||||
}
|
||||
|
||||
/* Account for the weird in between mariko table. */
|
||||
return index * erista::MtcFullTableSize + mariko::MtcFullTableSize;
|
||||
}
|
||||
|
||||
void PrepareMtcMemoryRegion(u8 *firstTable, EristaMtcTable *usedTable) {
|
||||
memmove(firstTable, usedTable, erista::MtcFullTableSize);
|
||||
|
||||
/* Clear all other tables. */
|
||||
/* The used table is excluded. */
|
||||
constexpr size_t RemainingRegionSize = (mariko::MtcFullTableSize) * (mariko::MtcFullTableCount) + (erista::MtcFullTableSize * (erista::MtcFullTableCount - 1));
|
||||
memset(firstTable + erista::MtcFullTableSize, 0, RemainingRegionSize);
|
||||
}
|
||||
|
||||
void MtcExtendTables(EristaMtcTable *table) {
|
||||
for (u32 i = erista::MtcTableCountDefault; i < newEmcList.size(); ++i) {
|
||||
std::memcpy(&table[i], &table[i - 1], sizeof(EristaMtcTable));
|
||||
table[i].rate_khz = newEmcList[i];
|
||||
}
|
||||
}
|
||||
|
||||
Result MemFreqMtcTable(u32 *ptr) {
|
||||
static const DramId dramId = [] {
|
||||
DramId id = GetDramId();
|
||||
return id;
|
||||
}();
|
||||
|
||||
static const MtcTableIndex mtcIndex = [] {
|
||||
MtcTableIndex idx = GetMtcDramIndex(dramId);
|
||||
/* If for some reason this happens, there is no chance of recovering this. */
|
||||
if (idx == MtcTableIndex_Invalid) {
|
||||
AbortInvalidMtc("Invalid dramId");
|
||||
}
|
||||
return idx;
|
||||
}();
|
||||
|
||||
static const u32 mtcOffset = GetMtcOffset(mtcIndex);
|
||||
|
||||
constexpr u32 StartAdjustment = offsetof(EristaMtcTable, rate_khz) + sizeof(EristaMtcTable) * (erista::MtcTableCountDefault - 1);
|
||||
u8 *startPtr = reinterpret_cast<u8 *>(ptr) - StartAdjustment;
|
||||
|
||||
EristaMtcTable *table = reinterpret_cast<EristaMtcTable *>(startPtr + mtcOffset);
|
||||
R_TRY(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault));
|
||||
|
||||
PrepareMtcMemoryRegion(startPtr, table);
|
||||
table = reinterpret_cast<EristaMtcTable *>(startPtr);
|
||||
|
||||
if (R_FAILED(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault))) {
|
||||
AbortInvalidMtc("Failed mtc validation");
|
||||
}
|
||||
|
||||
if (C.eristaEmcMaxClock <= EmcClkOSLimit) {
|
||||
R_SKIP();
|
||||
}
|
||||
|
||||
/* If we oc ram at all, tables are always shifted by at least 1. */
|
||||
u32 tableShifts = 1;
|
||||
for (u32 i = 0; i < std::size(maxEmcClocks) - 1; ++i) {
|
||||
/* Duplicated mtc tables may cause pcv to not select frequencies properly, causing issues. */
|
||||
if (maxEmcClocks[i] != maxEmcClocks[i + 1] && maxEmcClocks[i] > EmcClkOSLimit) {
|
||||
++tableShifts;
|
||||
} else {
|
||||
maxEmcClocks[i] = 0;
|
||||
}
|
||||
MtcExtendTables(table);
|
||||
|
||||
if (R_FAILED(MtcValidateAllTables(table, newEmcList.data(), newEmcList.size()))) {
|
||||
AbortInvalidMtc("Failed mtc validation");
|
||||
}
|
||||
|
||||
/* Erista has extra, useless mtc tables, such as 40.8 Mhz, overwrite them to make room for oc freqs. */
|
||||
/* More than 3 tables can be overwritten, but 3 is plenty. */
|
||||
std::memmove(table_list[0], table_list[tableShifts], sizeof(EristaMtcTable) * (khz_list_size - tableShifts));
|
||||
|
||||
/* Since we're not scaling r/w latency properly on Erista, we first overwrite the tables with the 1600 MHz table before scaling it. */
|
||||
for (u32 i = 0; i < tableShifts; ++i) {
|
||||
std::memcpy(table_list[khz_list_size - i - 1], table_list[khz_list_size - tableShifts - 1], sizeof(EristaMtcTable));
|
||||
}
|
||||
|
||||
for (u32 i = tableShifts, j = 0; i > 0 && j < std::size(maxEmcClocks); ++j) {
|
||||
if (!maxEmcClocks[j]) {
|
||||
continue;
|
||||
}
|
||||
|
||||
table_list[khz_list_size - i]->rate_khz = maxEmcClocks[j];
|
||||
MemMtcTableAutoAdjust(table_list[khz_list_size - i]);
|
||||
--i;
|
||||
for (u32 i = erista::MtcTableCountDefault; i < newEmcList.size(); ++i) {
|
||||
MemMtcTableAutoAdjust(&table[i]);
|
||||
}
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
Result MemFreqMax(u32 *ptr) {
|
||||
if (GET_MAX_OF_ARR(maxEmcClocks) <= EmcClkOSLimit) {
|
||||
if (C.eristaEmcMaxClock <= EmcClkOSLimit) {
|
||||
R_SKIP();
|
||||
}
|
||||
|
||||
PATCH_OFFSET(ptr, GET_MAX_OF_ARR(maxEmcClocks));
|
||||
PATCH_OFFSET(ptr, C.eristaEmcMaxClock);
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
@@ -450,7 +566,58 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
// R_SUCCEED();
|
||||
// }
|
||||
|
||||
|
||||
Result MemMtcTableAsm(u32 *ptr) {
|
||||
/* This is a mess but the compiler made this painful to patch so we must do it this way */
|
||||
constexpr s32 GoodAdrpOffset = -1;
|
||||
constexpr s32 GoodMovOffset = -7;
|
||||
constexpr s32 GoodBlOffset = 1;
|
||||
constexpr u32 MtcGoodBlOpcode = 0x97fe6cfc;
|
||||
|
||||
constexpr u32 MtcBadBlOpcode0 = 0x97ffae64; // bl nn::pcv::GetHardwareType
|
||||
constexpr u32 MtcBadBlOpcode1 = 0x940036d5; // bl nn::pcv::GetHardwareType
|
||||
constexpr u32 MtcBadAdrpAsm = 0xd00000a1; // adrp x1, s_ModuleResetStatus_
|
||||
|
||||
constexpr s32 MtcBadBlOffset0 = 2;
|
||||
constexpr s32 MtcBadBlOffset1 = -1;
|
||||
constexpr s32 MtcBadAdrpOffset = 1;
|
||||
|
||||
/* Ensure we don't dereference memory before nso start. */
|
||||
R_UNLESS(ptr + GoodMovOffset >= nsoStart, ldr::ResultInvalidMtcTablePattern());
|
||||
|
||||
/* Check for GetHardwareType asm and skip if it is found */
|
||||
/* The pattern will match on the first time, but the location is bad, so it must be skipped */
|
||||
if(AsmCompareAdrpNoImm(*(ptr + MtcBadAdrpOffset), MtcBadAdrpAsm) && AsmBlCompareOpcodeOnly(*(ptr + MtcBadBlOffset0), MtcBadBlOpcode0) && AsmBlCompareOpcodeOnly(*(ptr + MtcBadBlOffset1), MtcBadBlOpcode1)) {
|
||||
R_SKIP();
|
||||
}
|
||||
|
||||
/* We don't check for matching register because both registers must be x0 in order to pass the previous checks. */
|
||||
/* The correct instructions will always be x0 since the mtcTable pointer is returned. */
|
||||
u32 adrp = *(ptr + GoodAdrpOffset);
|
||||
R_UNLESS(AsmCompareAdrpNoImm(adrp, MtcAdrpAsm), ldr::ResultInvalidMtcTablePattern());
|
||||
|
||||
|
||||
/* Check for the branch instruction above the cbz to ensure we are patching the right location*/
|
||||
u32 bl = *(ptr + GoodBlOffset);
|
||||
R_UNLESS(AsmBlCompareOpcodeOnly(bl, MtcGoodBlOpcode), ldr::ResultInvalidMtcTablePattern());
|
||||
|
||||
|
||||
/* Check for the mov that actually sets the mtc table count. */
|
||||
u32 mov = *(ptr + GoodMovOffset);
|
||||
R_UNLESS(asm_compare_no_rd(mov, MtcMovAsm), ldr::ResultInvalidMtcTablePattern());
|
||||
|
||||
/* Patch out the count of the mov to our custom mtc table amount*/
|
||||
u32 movCountPatch = asm_set_rd(asm_set_imm16(MtcMovAsm, newEmcList.size()), asm_get_rd(mov));
|
||||
|
||||
PATCH_OFFSET(ptr + GoodMovOffset, movCountPatch);
|
||||
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
void Patch(uintptr_t mapped_nso, size_t nso_size) {
|
||||
nsoStart = reinterpret_cast<u32 *>(mapped_nso);
|
||||
MtcGenerateFreqTables();
|
||||
|
||||
u32 CpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(CpuCvbTableDefault)->freq);
|
||||
u32 GpuCvbDefaultMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(GpuCvbTableDefault)->freq);
|
||||
|
||||
@@ -465,10 +632,11 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
{"GPU Freq Asm", &GpuFreqMaxAsm, 2, &GpuMaxClockPatternFn },
|
||||
{"GPU PLL Max", & GpuFreqPllMax, 1, nullptr, GpuClkPllMax },
|
||||
// {"GPU PLL Limit", &GpuFreqPllLimit, 4, nullptr, GpuClkPllLimit },
|
||||
{"MEM Freq Mtc", &MemFreqMtcTable, 0, nullptr, EmcClkOSLimit },
|
||||
{"MEM Freq Mtc", &MemFreqMtcTable, 1, nullptr, EmcClkOSLimit },
|
||||
{"MEM Freq Max", &MemFreqMax, 0, nullptr, EmcClkOSLimit },
|
||||
{"MEM Freq PLLM", &MemFreqPllmLimit, 2, nullptr, EmcClkPllmLimit },
|
||||
{"MEM Volt", &MemVoltHandler, 2, nullptr, MemVoltHOS },
|
||||
{"MEM Table Asm", &MemMtcTableAsm, 4, &MemMtcGetGetTablePatternFn },
|
||||
};
|
||||
|
||||
for (uintptr_t ptr = mapped_nso; ptr <= mapped_nso + nso_size - sizeof(EristaMtcTable); ptr += sizeof(u32)) {
|
||||
@@ -480,9 +648,12 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
}
|
||||
}
|
||||
|
||||
// ViewLog();
|
||||
|
||||
for (auto &entry : patches) {
|
||||
LOGGING("%s Count: %zu", entry.description, entry.patched_count);
|
||||
LOGGING("%s Count: %zu\n", entry.description, entry.patched_count);
|
||||
if (R_FAILED(entry.CheckResult())) {
|
||||
// ViewLog();
|
||||
panic::SmcError(panic::Patch);
|
||||
|
||||
CRASH(entry.description);
|
||||
|
||||
@@ -26,9 +26,6 @@
|
||||
|
||||
namespace ams::ldr::hoc::pcv::erista {
|
||||
|
||||
static u32 maxEmcClocks[] = { C.eristaEmcMaxClock2, C.eristaEmcMaxClock1, C.eristaEmcMaxClock, };
|
||||
#define GET_MAX_OF_ARR(ARR) (*std::max_element(ARR, ARR + std::size(ARR)))
|
||||
|
||||
constexpr cvb_entry_t CpuCvbTableDefault[] = {
|
||||
// CPU_PLL_CVB_TABLE_ODN
|
||||
{ 204000, {721094}, { } },
|
||||
@@ -109,8 +106,11 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
{ },
|
||||
};
|
||||
|
||||
constexpr u32 EmcListDefault[] = { 40800, 68000, 102000, 204000, 408000, 665600, 800000, 1065600, 1331200, 1600000, };
|
||||
constexpr u32 EmcListSizeDefault = std::size(EmcListDefault);
|
||||
constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1;
|
||||
|
||||
constexpr u32 MemVoltHOS = 1125'000;
|
||||
constexpr u32 EmcClkMinFreq = 40800; /* 40.8 MHz table only exists on erista. */
|
||||
constexpr u32 EmcClkPllmLimit = 1866'000'000;
|
||||
|
||||
constexpr u32 MTC_TABLE_REV = 7;
|
||||
@@ -147,6 +147,17 @@ namespace ams::ldr::hoc::pcv::erista {
|
||||
{ ICOSA_4GB_HYNIX_H9HCNNNBPUMLHR_NLE, T210SdevEmcDvfsTableH4gb01, },
|
||||
};
|
||||
|
||||
constexpr u32 MtcBrAsm = 0xD61F0140;
|
||||
constexpr u32 MtcMovAsm = 0x52800148;
|
||||
constexpr u32 MtcAdrpAsm = 0xD0000081;
|
||||
constexpr u32 MtcBlIns = 0x97ffae64;
|
||||
constexpr u32 MtcAddAsm = 0x91131821;
|
||||
|
||||
ALWAYS_INLINE bool MemMtcGetGetTablePatternFn(u32 *ptr) {
|
||||
/* This builds an address that gets returned, so the register must be x0 by convention. */
|
||||
return AsmCompareAddNoImm12(*ptr, MtcAddAsm);
|
||||
}
|
||||
|
||||
void Patch(uintptr_t mapped_nso, size_t nso_size);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,8 @@
|
||||
*
|
||||
* Copyright (c) 2023 hanai3Bi
|
||||
*
|
||||
* Copyright (c) B3711
|
||||
*
|
||||
* Copyright (c) Souldbminer and Horizon OC Contributors
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
@@ -50,11 +52,10 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
R_THROW(ldr::ResultInvalidGpuDvfs());
|
||||
}
|
||||
|
||||
|
||||
if(C.marikoGpuBootVolt) {
|
||||
PATCH_OFFSET(ptr - 3, C.marikoGpuBootVolt);
|
||||
if (C.marikoGpuBootVolt) {
|
||||
PATCH_OFFSET(ptr - 3, C.marikoGpuBootVolt);
|
||||
}
|
||||
|
||||
|
||||
if (C.marikoGpuVmin) {
|
||||
PATCH_OFFSET(ptr, C.marikoGpuVmin);
|
||||
PATCH_OFFSET(ptr + 3, C.marikoGpuVmin);
|
||||
@@ -300,8 +301,14 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
case 2:
|
||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq;
|
||||
break;
|
||||
case 3:
|
||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT15)->freq;
|
||||
break;
|
||||
case 4:
|
||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHighUV)->freq;
|
||||
break;
|
||||
default:
|
||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -638,14 +645,14 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
}
|
||||
|
||||
void MtcGenerateFreqTables() {
|
||||
if (C.marikoEmcMaxClock <= EmcClkOSLimit) {
|
||||
return;
|
||||
}
|
||||
|
||||
newEmcList.clear();
|
||||
newEmcList.reserve(DvfsTableEntryCount);
|
||||
newEmcList.insert(newEmcList.end(), std::begin(EmcListDefault), std::end(EmcListDefault));
|
||||
|
||||
if (C.marikoEmcMaxClock <= EmcClkOSLimit) {
|
||||
return;
|
||||
}
|
||||
|
||||
u32 stepRate = 0;
|
||||
switch (C.stepMode) {
|
||||
case StepMode_66MHz:
|
||||
@@ -767,10 +774,6 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
MarikoMtcTable *table = reinterpret_cast<MarikoMtcTable *>(startPtr + mtcOffset);
|
||||
R_TRY(MtcValidateAllTables(table, EmcListDefault, EmcListSizeDefault));
|
||||
|
||||
if (C.marikoEmcMaxClock <= EmcClkOSLimit) {
|
||||
R_SKIP();
|
||||
}
|
||||
|
||||
PrepareMtcMemoryRegion(startPtr, table);
|
||||
table = reinterpret_cast<MarikoMtcTable *>(startPtr);
|
||||
|
||||
@@ -778,6 +781,10 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
AbortInvalidMtc("Failed mtc validation");
|
||||
}
|
||||
|
||||
if (C.marikoEmcMaxClock <= EmcClkOSLimit) {
|
||||
R_SKIP();
|
||||
}
|
||||
|
||||
MtcExtendTables(table);
|
||||
|
||||
if (R_FAILED(MtcValidateAllTables(table, newEmcList.data(), newEmcList.size()))) {
|
||||
@@ -837,33 +844,33 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
DvbEntry emcDvbOcTableBrackets[] = {
|
||||
{ 204000, { 637, 637, 637, }, },
|
||||
{ 1331200, { 650, 637, 637, }, },
|
||||
{ 1600000, { 675, 650, 637, }, },
|
||||
{ 1866000, { DVB(DvbVolt( 700, 675, 650)) }, },
|
||||
{ 2133000, { DVB(DvbVolt( 725, 700, 675)) }, },
|
||||
{ 2246000, { DVB(DvbVolt( 750, 725, 700)) }, },
|
||||
{ 2400000, { DVB(DvbVolt( 775, 750, 725)) }, },
|
||||
{ 2466000, { DVB(DvbVolt( 800, 775, 750)) }, },
|
||||
{ 2533000, { DVB(DvbVolt( 810, 785, 760)) }, },
|
||||
{ 2566000, { DVB(DvbVolt( 820, 795, 770)) }, },
|
||||
{ 2600000, { DVB(DvbVolt( 830, 805, 780)) }, },
|
||||
{ 2633000, { DVB(DvbVolt( 840, 815, 790)) }, },
|
||||
{ 2666000, { DVB(DvbVolt( 850, 825, 800)) }, },
|
||||
{ 2700000, { DVB(DvbVolt( 860, 835, 810)) }, },
|
||||
{ 2733000, { DVB(DvbVolt( 870, 845, 820)) }, },
|
||||
{ 2766000, { DVB(DvbVolt( 880, 855, 830)) }, },
|
||||
{ 2800000, { DVB(DvbVolt( 895, 865, 840)) }, },
|
||||
{ 2833000, { DVB(DvbVolt( 900, 875, 850)) }, },
|
||||
{ 2866000, { DVB(DvbVolt( 910, 885, 860)) }, },
|
||||
{ 2900000, { DVB(DvbVolt( 920, 895, 870)) }, },
|
||||
{ 2933000, { DVB(DvbVolt( 950, 905, 880)) }, },
|
||||
{ 2966000, { DVB(DvbVolt( 960, 915, 890)) }, },
|
||||
{ 3000000, { DVB(DvbVolt( 970, 925, 900)) }, },
|
||||
{ 3033000, { DVB(DvbVolt( 980, 940, 910)) }, },
|
||||
{ 3066000, { DVB(DvbVolt(1000, 955, 920)) }, },
|
||||
{ 3100000, { DVB(DvbVolt(1010, 990, 930)) }, },
|
||||
{ 3133000, { DVB(DvbVolt(1025, 1005, 940)) }, },
|
||||
{ 3166000, { DVB(DvbVolt(1035, 1015, 950)) }, },
|
||||
{ 3200000, { DVB(DvbVolt(1050, 1025, 960)) }, },
|
||||
{ 1600000, { 675, 650, 637, }, },
|
||||
{ 1866000, { DVB(DvbVolt( 700, 675, 650)) }, },
|
||||
{ 2000000, { DVB(DvbVolt( 712, 687, 662)) }, },
|
||||
{ 2133000, { DVB(DvbVolt( 725, 700, 675)) }, },
|
||||
{ 2200000, { DVB(DvbVolt( 737, 712, 687)) }, },
|
||||
{ 2266000, { DVB(DvbVolt( 750, 725, 700)) }, },
|
||||
{ 2333000, { DVB(DvbVolt( 762, 737, 712)) }, },
|
||||
{ 2400000, { DVB(DvbVolt( 775, 750, 725)) }, },
|
||||
{ 2433000, { DVB(DvbVolt( 787, 762, 737)) }, },
|
||||
{ 2466000, { DVB(DvbVolt( 800, 775, 750)) }, },
|
||||
{ 2533000, { DVB(DvbVolt( 812, 787, 762)) }, },
|
||||
{ 2566000, { DVB(DvbVolt( 825, 800, 775)) }, },
|
||||
{ 2600000, { DVB(DvbVolt( 837, 812, 787)) }, },
|
||||
{ 2666000, { DVB(DvbVolt( 850, 825, 800)) }, },
|
||||
{ 2700000, { DVB(DvbVolt( 875, 850, 825)) }, },
|
||||
{ 2733000, { DVB(DvbVolt( 887, 862, 837)) }, },
|
||||
{ 2766000, { DVB(DvbVolt( 912, 887, 862)) }, },
|
||||
{ 2800000, { DVB(DvbVolt( 925, 900, 875)) }, },
|
||||
{ 2833000, { DVB(DvbVolt( 937, 912, 887)) }, },
|
||||
{ 2900000, { DVB(DvbVolt( 950, 925, 900)) }, },
|
||||
{ 2933000, { DVB(DvbVolt( 962, 937, 912)) }, },
|
||||
{ 3000000, { DVB(DvbVolt( 975, 950, 925)) }, },
|
||||
{ 3033000, { DVB(DvbVolt( 987, 962, 937)) }, },
|
||||
{ 3100000, { DVB(DvbVolt(1000, 975, 950)) }, },
|
||||
{ 3133000, { DVB(DvbVolt(1025, 1000, 975)) }, },
|
||||
{ 3166000, { DVB(DvbVolt(1037, 1012, 987)) }, },
|
||||
{ 3200000, { DVB(DvbVolt(1050, 1025, 1000)) }, },
|
||||
{ ~0u, { }, },
|
||||
};
|
||||
#undef DVB
|
||||
|
||||
@@ -148,8 +148,6 @@ namespace ams::ldr::hoc::pcv::mariko {
|
||||
constexpr u32 EmcListDefault[] = { 204000, 1331200, 1600000, };
|
||||
constexpr u32 EmcListSizeDefault = std::size(EmcListDefault);
|
||||
constexpr u32 EmcListEndDefault = EmcListSizeDefault - 1;
|
||||
constexpr u32 EmcRateStep = 33'000;
|
||||
constexpr u32 EmcRateStepScale = 33'200;
|
||||
|
||||
constexpr u32 EmcClkOSAlt = 1331'200;
|
||||
constexpr u32 EmcClkPllmLimit = 2133'000'000;
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace ams::ldr::hoc::ptm {
|
||||
|
||||
switch (entry->cpu_freq_1) {
|
||||
case cpuPtmBoost:
|
||||
cpuPtmBoostPatch.Apply(entry);
|
||||
R_DISCARD(cpuPtmBoostPatch.Apply(entry));
|
||||
break;
|
||||
case cpuPtmDefault:
|
||||
case cpuPtmDevOC:
|
||||
@@ -99,7 +99,7 @@ namespace ams::ldr::hoc::ptm {
|
||||
case memPtmAlt:
|
||||
case memPtmClamp:
|
||||
if (isMariko) {
|
||||
memPtmPatch.Apply(entry);
|
||||
R_DISCARD(memPtmPatch.Apply(entry));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -109,13 +109,15 @@ namespace ams::ldr::hoc::ptm {
|
||||
}
|
||||
|
||||
LOGGING("%s Count: %zu", cpuPtmBoostPatch.description, cpuPtmBoostPatch.patched_count);
|
||||
if (R_FAILED(cpuPtmBoostPatch.CheckResult()))
|
||||
if (R_FAILED(cpuPtmBoostPatch.CheckResult())) {
|
||||
CRASH(cpuPtmBoostPatch.description);
|
||||
}
|
||||
|
||||
if (isMariko) {
|
||||
LOGGING("%s Count: %zu", memPtmPatch.description, memPtmPatch.patched_count);
|
||||
if (R_FAILED(memPtmPatch.CheckResult()))
|
||||
if (R_FAILED(memPtmPatch.CheckResult())) {
|
||||
CRASH(memPtmPatch.description);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
@@ -125,7 +125,9 @@ typedef enum {
|
||||
} HocClkSpeedo;
|
||||
|
||||
typedef enum {
|
||||
GPUUVLevel_HiOPT = 0,
|
||||
GPUUVLevel_NoUV = 0,
|
||||
GPUUVLevel_SLT,
|
||||
GPUUVLevel_HiOPT,
|
||||
GPUUVLevel_HiOPT15,
|
||||
GPUUVLevel_HighUV,
|
||||
GPUUVLevel_EnumMax,
|
||||
|
||||
@@ -46,12 +46,8 @@ typedef enum {
|
||||
HocClkConfigValue_ThermalThrottle,
|
||||
HocClkConfigValue_ThermalThrottleThreshold,
|
||||
|
||||
HocClkConfigValue_HandheldTDP,
|
||||
HocClkConfigValue_HandheldTDPLimit,
|
||||
|
||||
HocClkConfigValue_LiteTDPLimit,
|
||||
|
||||
HocClkConfigValue_BatteryChargeCurrent,
|
||||
HocClkConfigValue_InputCurrentLimit,
|
||||
|
||||
HocClkConfigValue_OverwriteRefreshRate,
|
||||
HocClkConfigValue_MaxDisplayClockH,
|
||||
@@ -74,6 +70,10 @@ typedef enum {
|
||||
|
||||
HocClkConfigValue_AulaDisplayColorPreset,
|
||||
HocClkConfigValue_MarikoMiddleFreqs,
|
||||
|
||||
HocClkConfigValue_AutoRAMCPUOverclock,
|
||||
HocClkConfigValue_AutoRamCpuCpuOCFreq,
|
||||
HocClkConfigValue_AutoRamCpuRamOCThreshold,
|
||||
|
||||
KipConfigValue_custRev,
|
||||
KipConfigValue_KipVersion,
|
||||
@@ -82,8 +82,6 @@ typedef enum {
|
||||
|
||||
KipConfigValue_commonEmcMemVolt,
|
||||
KipConfigValue_eristaEmcMaxClock,
|
||||
KipConfigValue_eristaEmcMaxClock1,
|
||||
KipConfigValue_eristaEmcMaxClock2,
|
||||
|
||||
KipConfigValue_stepMode,
|
||||
KipConfigValue_marikoEmcMaxClock,
|
||||
@@ -116,9 +114,6 @@ typedef enum {
|
||||
KipConfigValue_write_latency_1866,
|
||||
KipConfigValue_write_latency_2133,
|
||||
|
||||
KipConfigValue_mem_burst_read_latency,
|
||||
KipConfigValue_mem_burst_write_latency,
|
||||
|
||||
KipConfigValue_eristaCpuUV,
|
||||
KipConfigValue_eristaCpuVmin,
|
||||
KipConfigValue_eristaCpuMaxVolt,
|
||||
@@ -143,7 +138,6 @@ typedef enum {
|
||||
KipConfigValue_marikoGpuVmax,
|
||||
|
||||
KipConfigValue_commonGpuVoltOffset,
|
||||
KipConfigValue_gpuSpeedo,
|
||||
|
||||
KipConfigValue_g_volt_76800,
|
||||
KipConfigValue_g_volt_153600,
|
||||
@@ -241,17 +235,11 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
|
||||
case HocClkConfigValue_ThermalThrottleThreshold:
|
||||
return pretty ? "Thermal Throttle Threshold" : "thermal_throttle_threshold";
|
||||
|
||||
case HocClkConfigValue_HandheldTDP:
|
||||
return pretty ? "Handheld TDP" : "handheld_tdp";
|
||||
|
||||
case HocClkConfigValue_HandheldTDPLimit:
|
||||
return pretty ? "Handheld TDP Limit" : "tdp_limit";
|
||||
|
||||
case HocClkConfigValue_LiteTDPLimit:
|
||||
return pretty ? "Handheld TDP Limit" : "tdp_limit_l";
|
||||
|
||||
case HocClkConfigValue_BatteryChargeCurrent:
|
||||
return pretty ? "Battery Charge Current" : "bat_charge_current";
|
||||
|
||||
case HocClkConfigValue_InputCurrentLimit:
|
||||
return pretty ? "Input Current Limit" : "in_curr_limit";
|
||||
|
||||
case HocClkConfigValue_OverwriteRefreshRate:
|
||||
return pretty ? "Display Refresh Rate Changing" : "drr_changing";
|
||||
@@ -294,6 +282,14 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
|
||||
return pretty ? "Aula Display Color Preset" : "aula_color_preset";
|
||||
case HocClkConfigValue_MarikoMiddleFreqs:
|
||||
return pretty ? "Mariko Middle Clocks" : "mariko_middle_freqs";
|
||||
|
||||
case HocClkConfigValue_AutoRAMCPUOverclock:
|
||||
return pretty ? "Auto High RAM CPU OC" : "auto_high_ram_cpu_oc";
|
||||
case HocClkConfigValue_AutoRamCpuCpuOCFreq:
|
||||
return pretty ? "Auto High RAM CPU OC Freq" : "auto_ram_cpu_cpu_oc_freq";
|
||||
case HocClkConfigValue_AutoRamCpuRamOCThreshold:
|
||||
return pretty ? "Auto High RAM CPU OC RAM Threshold" : "auto_ram_cpu_ram_oc_threshold";
|
||||
|
||||
// KIP config values
|
||||
case KipConfigValue_custRev:
|
||||
return pretty ? "Custom Revision" : "kip_cust_rev";
|
||||
@@ -308,11 +304,7 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
|
||||
case KipConfigValue_commonEmcMemVolt:
|
||||
return pretty ? "Common EMC/MEM Voltage" : "common_emc_mem_volt";
|
||||
case KipConfigValue_eristaEmcMaxClock:
|
||||
return pretty ? "Erista EMC Max Clock 1" : "erista_emc_max_clock";
|
||||
case KipConfigValue_eristaEmcMaxClock1:
|
||||
return pretty ? "Erista EMC Max Clock 2" : "erista_emc_max_clock1";
|
||||
case KipConfigValue_eristaEmcMaxClock2:
|
||||
return pretty ? "Erista EMC Max Clock 3" : "erista_emc_max_clock2";
|
||||
return pretty ? "Erista EMC Max Clock" : "erista_emc_max_clock2";
|
||||
case KipConfigValue_stepMode:
|
||||
return pretty ? "Step Mode:" : "step_mode";
|
||||
case KipConfigValue_marikoEmcMaxClock:
|
||||
@@ -369,11 +361,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
|
||||
case KipConfigValue_write_latency_2133:
|
||||
return pretty ? "2133 Write Latency" : "write_latency_2133";
|
||||
|
||||
case KipConfigValue_mem_burst_read_latency:
|
||||
return pretty ? "Memory Burst Read Latency" : "mem_burst_read_latency";
|
||||
case KipConfigValue_mem_burst_write_latency:
|
||||
return pretty ? "Memory Burst Write Latency" : "mem_burst_write_latency";
|
||||
|
||||
// CPU – Erista
|
||||
case KipConfigValue_eristaCpuUV:
|
||||
return pretty ? "Erista CPU Undervolt" : "erista_cpu_uv";
|
||||
@@ -424,8 +411,6 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr
|
||||
|
||||
case KipConfigValue_commonGpuVoltOffset:
|
||||
return pretty ? "Common GPU Voltage Offset" : "common_gpu_volt_offset";
|
||||
case KipConfigValue_gpuSpeedo:
|
||||
return pretty ? "GPU Speedo" : "gpu_speedo";
|
||||
|
||||
// Mariko GPU voltages (24)
|
||||
case KipConfigValue_g_volt_76800: return pretty ? "Mariko GPU Volt 76 MHz" : "g_volt_76800";
|
||||
@@ -505,6 +490,7 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val)
|
||||
case HocClkConfigValue_UncappedClocks:
|
||||
case HocClkConfigValue_OverwriteBoostMode:
|
||||
case HocClkConfigValue_BatteryChargeCurrent:
|
||||
case HocClkConfigValue_InputCurrentLimit:
|
||||
case HocClkConfigValue_OverwriteRefreshRate:
|
||||
case HocClkConfigValue_GPUScheduling:
|
||||
case HocClkConfigValue_LiveCpuUv:
|
||||
@@ -521,16 +507,16 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val)
|
||||
return 1963ULL;
|
||||
|
||||
case HocClkConfigValue_ThermalThrottle:
|
||||
case HocClkConfigValue_HandheldTDP:
|
||||
case HocClkConfigValue_IsFirstLoad:
|
||||
case HocClkConfigValue_DVFSMode:
|
||||
case HocClkConfigValue_AutoRAMCPUOverclock:
|
||||
return 1ULL;
|
||||
case HocClkConfigValue_AutoRamCpuCpuOCFreq:
|
||||
return 1683000ULL;
|
||||
case HocClkConfigValue_AutoRamCpuRamOCThreshold:
|
||||
return 2666000ULL;
|
||||
case HocClkConfigValue_ThermalThrottleThreshold:
|
||||
return 70ULL;
|
||||
case HocClkConfigValue_HandheldTDPLimit:
|
||||
return 9600ULL; // 8600mW will trigger on erista stock, so raise it a bit
|
||||
case HocClkConfigValue_LiteTDPLimit:
|
||||
return 6400ULL; // 0.5C
|
||||
case HocClkConfigValue_CpuGovernorMinimumFreq:
|
||||
return 612000000ULL; // 612MHz
|
||||
case HocClkConfigValue_MaxDisplayClockH:
|
||||
@@ -551,8 +537,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
|
||||
case HocClkConfigValue_EristaMaxCpuClock:
|
||||
case HocClkConfigValue_MarikoMaxCpuClock:
|
||||
case HocClkConfigValue_ThermalThrottleThreshold:
|
||||
case HocClkConfigValue_HandheldTDPLimit:
|
||||
case HocClkConfigValue_LiteTDPLimit:
|
||||
case HocClkConfigValue_PollingIntervalMs:
|
||||
case HocClkConfigValue_MaxDisplayClockH:
|
||||
return input > 0;
|
||||
@@ -564,22 +548,21 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
|
||||
case HocClkConfigValue_UncappedClocks:
|
||||
case HocClkConfigValue_OverwriteBoostMode:
|
||||
case HocClkConfigValue_ThermalThrottle:
|
||||
case HocClkConfigValue_HandheldTDP:
|
||||
case HocClkConfigValue_OverwriteRefreshRate:
|
||||
case HocClkConfigValue_IsFirstLoad:
|
||||
case HocClkConfigValue_EnableExperimentalSettings:
|
||||
case HocClkConfigValue_LiveCpuUv:
|
||||
case HocClkConfigValue_GPUSchedulingMethod:
|
||||
case HocClkConfigValue_MarikoMiddleFreqs:
|
||||
case HocClkConfigValue_AutoRAMCPUOverclock:
|
||||
return (input & 0x1) == input;
|
||||
|
||||
case KipConfigValue_KipVersion:
|
||||
case KipConfigValue_custRev:
|
||||
// case KipConfigValue_mtcConf:
|
||||
case KipConfigValue_hpMode:
|
||||
case KipConfigValue_commonEmcMemVolt:
|
||||
case KipConfigValue_eristaEmcMaxClock:
|
||||
case KipConfigValue_eristaEmcMaxClock1:
|
||||
case KipConfigValue_eristaEmcMaxClock2:
|
||||
case KipConfigValue_stepMode:
|
||||
case KipConfigValue_marikoEmcMaxClock:
|
||||
case KipConfigValue_marikoEmcVddqVolt:
|
||||
@@ -605,8 +588,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
|
||||
case KipConfigValue_write_latency_1600:
|
||||
case KipConfigValue_write_latency_1866:
|
||||
case KipConfigValue_write_latency_2133:
|
||||
case KipConfigValue_mem_burst_read_latency:
|
||||
case KipConfigValue_mem_burst_write_latency:
|
||||
case KipConfigValue_eristaCpuUV:
|
||||
case KipConfigValue_eristaCpuMaxVolt:
|
||||
case KipConfigValue_marikoCpuUVLow:
|
||||
@@ -625,7 +606,6 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
|
||||
case KipConfigValue_marikoGpuBootVolt:
|
||||
case KipConfigValue_marikoGpuVmax:
|
||||
case KipConfigValue_commonGpuVoltOffset:
|
||||
case KipConfigValue_gpuSpeedo:
|
||||
case KipConfigValue_g_volt_76800:
|
||||
case KipConfigValue_g_volt_153600:
|
||||
case KipConfigValue_g_volt_230400:
|
||||
@@ -690,13 +670,19 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in
|
||||
case HocClkConfigValue_MemoryFrequencyMeasurementMode:
|
||||
case HocClkConfigValue_RamDisplayUnit:
|
||||
case HocClkConfigValue_AulaDisplayColorPreset:
|
||||
case HocClkConfigValue_AutoRamCpuCpuOCFreq:
|
||||
case HocClkConfigValue_AutoRamCpuRamOCThreshold:
|
||||
return true;
|
||||
case HocClkConfigValue_BatteryChargeCurrent:
|
||||
return ((input >= 1024) && (input <= 3072)) || !input;
|
||||
|
||||
case HocClkConfigValue_InputCurrentLimit:
|
||||
return ((input >= 100) && (input <= 3000)) || !input;
|
||||
|
||||
case HocClkConfigValue_DisplayVoltage:
|
||||
return ((input >= 800) && (input <= 1325));
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,12 +22,12 @@ BUILD := build
|
||||
OUTDIR := out
|
||||
RESOURCES := res
|
||||
SOURCES := src src/ui/gui src/ui/elements ../common/src ../common/src/client
|
||||
DATA := data
|
||||
DATA := data ../assets
|
||||
INCLUDES := ../common/include
|
||||
EXEFS_SRC := exefs_src
|
||||
IS_MINIMAL := 0
|
||||
|
||||
APP_TITLE := Horizon OC Gaea
|
||||
APP_TITLE := Horizon OC
|
||||
NO_ICON := 1
|
||||
|
||||
|
||||
@@ -166,6 +166,11 @@ $(OUTPUT).elf: $(OFILES)
|
||||
@echo $(notdir $<)
|
||||
@$(bin2o)
|
||||
|
||||
%.rgba.o : %.rgba
|
||||
#---------------------------------------------------------------------------------
|
||||
@echo $(notdir $<)
|
||||
@$(bin2o)
|
||||
|
||||
-include $(DEPENDS)
|
||||
|
||||
#---------------------------------------------------------------------------------------
|
||||
|
||||
Binary file not shown.
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "Informationen",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Modul:",
|
||||
"sys-dock status:": "Sys-Dock-Status:",
|
||||
"SaltyNX status:": "SaltyNX-Status:",
|
||||
"RR Display status:": "RR Anzeigestatus:",
|
||||
"Wafer Position:": "Waferposition:",
|
||||
"Credits": "Credits",
|
||||
"Developers": "Entwickler",
|
||||
"Contributors": "Mitwirkende",
|
||||
"Testers": "Tester",
|
||||
"Special Thanks": "Besonderer Dank",
|
||||
"Unknown": "Unbekannt",
|
||||
"Installed": "Installiert",
|
||||
"Not Installed": "Nicht installiert",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ",
|
||||
"Default": "Standard",
|
||||
"Do Not Override": "Nicht überschreiben",
|
||||
"Do not override": "Nicht überschreiben",
|
||||
"Disabled": "Deaktiviert",
|
||||
"Enabled": "Aktiviert",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Zurücksetzen",
|
||||
"Display": "Anzeige",
|
||||
"Application changed\\n\\n": "Anwendung geändert\\n\\n",
|
||||
"The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n",
|
||||
"while editing was going on.": "während die Bearbeitung im Gange war.",
|
||||
"Board": "Vorstand",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Aktiviert (Standard)",
|
||||
"Enable": "Aktivieren",
|
||||
"Fatal error": "Fataler Fehler",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Es konnte keine Verbindung zum hoc-clk-Systemmodul hergestellt werden.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Bitte stellen Sie sicher, dass alles in Ordnung ist\\n\\n",
|
||||
"correctly installed and enabled.": "korrekt installiert und aktiviert.",
|
||||
"Fatal error": "Fataler Fehler",
|
||||
|
||||
"Edit App Profile": "App-Profil bearbeiten",
|
||||
"Edit Global Profile": "Globales Profil bearbeiten",
|
||||
"Temporary Overrides": "Temporäre Überschreibungen",
|
||||
"Temporary Overrides ": "Temporäre Überschreibungen",
|
||||
" Reset": " Zurücksetzen",
|
||||
"Settings": "Einstellungen",
|
||||
"About": "Über",
|
||||
"Credits": "Credits",
|
||||
|
||||
"Application changed\\n\\n": "Anwendung geändert\\n\\n",
|
||||
"The running application changed\\n\\n": "Die laufende Anwendung hat sich geändert\\n\\n",
|
||||
"while editing was going on.": "während die Bearbeitung im Gange war.",
|
||||
|
||||
"Sleep Mode": "Schlafmodus",
|
||||
"Stock": "Lager",
|
||||
"Dev OC": "Entwickler OC",
|
||||
@@ -40,57 +36,74 @@
|
||||
"Unsafe Max": "Unsicher max",
|
||||
"Absolute Max": "Absolutes Maximum",
|
||||
"Handheld Safe Max": "Handsafe max",
|
||||
"Enable": "Aktivieren",
|
||||
"Edit App Profile": "App-Profil bearbeiten",
|
||||
"Edit Global Profile": "Globales Profil bearbeiten",
|
||||
"Temporary Overrides": "Temporäre Überschreibungen",
|
||||
"Settings": "Einstellungen",
|
||||
"About": "Über",
|
||||
"Compiling with minimal features": "Kompilieren mit minimalen Funktionen",
|
||||
|
||||
"General Settings": "Allgemeine Einstellungen",
|
||||
"Governor Settings": "Gouverneurseinstellungen",
|
||||
"Governor Settings": "Regler-Einstellungen",
|
||||
"Safety Settings": "Sicherheitseinstellungen",
|
||||
"Save KIP Settings": "Speichern Sie die KIP-Einstellungen",
|
||||
"Save KIP Settings": "KIP-Einstellungen speichern",
|
||||
"RAM Settings": "RAM-Einstellungen",
|
||||
"CPU Settings": "CPU-Einstellungen",
|
||||
"GPU Settings": "GPU-Einstellungen",
|
||||
"Display Settings": "Anzeigeeinstellungen",
|
||||
"Experimental Settings": "Experimentelle Einstellungen",
|
||||
"Experimental": "Experimentell",
|
||||
|
||||
" Settings marked in blue": "Blau markierte Einstellungen",
|
||||
"don't require a reboot to apply!": "erfordern keinen Neustart zum Aktivieren!",
|
||||
"You can also press to show": "Drücken Sie auch zum Anzeigen",
|
||||
"information about each setting.": "von Informationen zu jeder Einstellung.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Experimentelle Einstellungen unvollständig",
|
||||
"and may not work correctly or at all!": "und funktionieren möglicherweise gar nicht!",
|
||||
"Here be dragons!": "Hier gibt es Drachen!",
|
||||
|
||||
"RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus",
|
||||
"RAM Display Unit": "RAM-Anzeigeeinheit",
|
||||
"Polling Interval": "Abfrageintervall",
|
||||
|
||||
"GPU Scheduling Override Method": "GPU-Planungsüberschreibungsmethode",
|
||||
"GPU Scheduling Override": "GPU-Planungsüberschreibung",
|
||||
"GPU Boot Volt": "GPU Boot-Spannung",
|
||||
"GPU Boot Voltage": "GPU Boot-Spannung",
|
||||
"Memory Frequency Measurement Mode": "RAM-Frequenz-Messmodus",
|
||||
" Overriding the charge current": "Überschreiben des Ladestroms",
|
||||
"can be dangerous and may cause": "kann gefährlich sein und verursachen",
|
||||
"damage to your battery or charger!": "Schäden an Ihrem Akku oder Ladegerät!",
|
||||
"Charge Current Override": "Ladestrom-Überbrückung",
|
||||
"RAM Voltage Display Mode": "RAM-Spannungsanzeigemodus",
|
||||
"Polling Interval": "Abfrageintervall",
|
||||
"Display Color Preset": "Farbprofil",
|
||||
"Basic": "Standard",
|
||||
"Saturated": "Gesättigt",
|
||||
"Washed": "Verblasst",
|
||||
"Natural": "Natürlich",
|
||||
"Vivid": "Lebendig",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Mindestfrequenz des CPU-Reglers",
|
||||
" Usage of unsafe display": "Verwendung unsicherer Bildschirmfrequenzen",
|
||||
"refresh rates may cause stress": "Bildwiederholraten können Stress verursachen",
|
||||
"or damage to your display! ": "oder Schäden an Ihrem Display!",
|
||||
"Proceed at your own risk!": "Das Vorgehen erfolgt auf eigene Gefahr!",
|
||||
"Max Handheld Display": "Max Handheld-Display",
|
||||
"Max Handheld Display Hz": "Max. Handheld-Hz",
|
||||
"Display Clock": "Uhr anzeigen",
|
||||
" Adjust the display voltage": "Display-Spannung anpassen",
|
||||
"with caution to avoid damage": "mit Vorsicht, um Schäden zu vermeiden",
|
||||
"to your display panel! ": "am Display-Panel!",
|
||||
"Display Voltage": "Display-Spannung",
|
||||
|
||||
"Thermal Throttle Limit": "Thermische Drosselgrenze",
|
||||
"Official Rating": "Offizielle Bewertung",
|
||||
"TDP Threshold": "TDP-Schwellenwert",
|
||||
"Power": "Macht",
|
||||
"Thermal Throttle Limit": "Thermische Drosselgrenze",
|
||||
"HP Mode": "HP-Modus",
|
||||
"Default (Mariko)": "Standard (Mariko)",
|
||||
"Default (Erista)": "Standard (Erista)",
|
||||
"Rating": "Bewertung",
|
||||
"Safe Max (Mariko)": "Safe Max (Mariko)",
|
||||
"Safe Max (Erista)": "Safe Max (Erista)",
|
||||
|
||||
"DVB Shift": "DVB-Versatz",
|
||||
"SoC Max Volt": "SoC Max-Spannung",
|
||||
"Step Mode": "Schritt-Modus",
|
||||
"RAM VDD2 Voltage": "RAM VDD2 Spannung",
|
||||
"Voltage": "Spannung",
|
||||
"RAM VDDQ Voltage": "RAM-VDDQ-Spannung",
|
||||
"Voltage": "Spannung",
|
||||
"RAM Frequency Editor": "RAM-Frequenzeditor",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Hoher Tacho erforderlich!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Tacho/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Tacho/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Tacho/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Tacho/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Tacho/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Tacho/PLL)",
|
||||
"Ram Max Clock": "Ram Max Uhr",
|
||||
"Ram Max Clock": "Ram Max Takt",
|
||||
"RAM Latency Editor": "RAM-Latenz-Editor",
|
||||
"RAM Timing Reductions": "Reduzierung des RAM-Timings",
|
||||
"Memory Timings": "Speicherzeiten",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Speicherlatenzen",
|
||||
"Read Latency": "Leselatenz",
|
||||
"Write Latency": "Schreiblatenz",
|
||||
"High speedo needed!": "Hoher Speedo-Wert erforderlich!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (Benötigt extremen Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (Benötigt extremen Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (Benötigt extremen Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (Benötigt lächerlichen Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (Benötigt lächerlichen Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (Benötigt lächerlichen Speedo/PLL)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "CPU-Boost-Takt",
|
||||
"CPU UV": "CPU-UV",
|
||||
"CPU Unlock": "CPU-Entsperrung",
|
||||
@@ -110,32 +132,84 @@
|
||||
"CPU Max Clock": "Maximaler CPU-Takt",
|
||||
"Extreme UV Table": "Extremer UV-Tisch",
|
||||
"CPU UV Table": "CPU-UV-Tisch",
|
||||
"CPU Low UV": "CPU-niedrige UV-Strahlung",
|
||||
"CPU High UV": "CPU Hohe UV-Strahlung",
|
||||
"CPU Low UV": "CPU niedrige UV",
|
||||
"CPU High UV": "CPU hohe UV",
|
||||
"CPU Low VMIN": "CPU niedrig VMIN",
|
||||
"CPU High VMIN": "CPU hoch VMIN",
|
||||
|
||||
"No Undervolt": "Kein Undervolt",
|
||||
"SLT Table": "SLT-Tisch",
|
||||
"SLT Table": "SLT-Tabelle",
|
||||
"HiOPT Table": "HiOPT-Tabelle",
|
||||
"GPU Undervolt Table": "GPU-Unterspannungstabelle",
|
||||
"GPU Minimum Voltage": "GPU-Mindestspannung",
|
||||
"Calculate GPU Vmin": "Berechnen Sie die GPU-Vmin",
|
||||
"Calculate GPU Vmin": "GPU-Vmin berechnen",
|
||||
"GPU VMIN": "GPU-VMIN",
|
||||
"GPU Maximum Voltage": "Maximale GPU-Spannung",
|
||||
"GPU Voltage Offset": "GPU-Spannungsoffset",
|
||||
"Do not override": "Nicht überschreiben",
|
||||
"Enabled (Default)": "Aktiviert (Standard)",
|
||||
"96.6% limit": "96,6 %-Grenze",
|
||||
"99.7% limit": "99,7 %-Grenze",
|
||||
"GPU Scheduling Override": "GPU-Planungsüberschreibung",
|
||||
"Official Service": "Offizieller Dienst",
|
||||
"GPU DVFS Mode": "GPU-DVFS-Modus",
|
||||
"GPU DVFS Offset": "GPU-DVFS-Offset",
|
||||
"GPU Voltage Table": "GPU-Spannungstabelle",
|
||||
"GPU Custom Table (mV)": "Benutzerdefinierte GPU-Tabelle (mV)",
|
||||
"Official Service": "Offizieller Dienst",
|
||||
"96.6% limit": "96,6 %-Grenze",
|
||||
"99.7% limit": "99,7 %-Grenze",
|
||||
" Setting GPU Clocks past": "GPU-Takt überschreiten",
|
||||
"1228MHz without a proper undervolt": "1228 MHz ohne korrekten Undervolt",
|
||||
"can cause degradation or damage": "kann Degradierung oder Schäden verursachen",
|
||||
"to your console!": "an Ihrer Konsole!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 MHz ohne UV, 1152 MHz auf SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "oder 1228 MHz auf HiOPT kann dazu führen",
|
||||
"permanent damage to your Switch!": "Dauerhafter Schaden an Ihrem Switch!",
|
||||
"permanent damage to your Switch!": "dauerhafter Schaden an Ihrem Switch!",
|
||||
"921MHz without UV and 960MHz on": "921 MHz ohne UV und 960 MHz eingeschaltet",
|
||||
"SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen"
|
||||
"SLT or HiOPT can cause ": "SLT oder HiOPT können dazu führen",
|
||||
|
||||
"Default (Mariko)": "Standard (Mariko)",
|
||||
"Default (Erista)": "Standard (Erista)",
|
||||
"Rating": "Bewertung",
|
||||
"Safe Max (Mariko)": "Safe Max (Mariko)",
|
||||
"Safe Max (Erista)": "Safe Max (Erista)",
|
||||
|
||||
"Voltages": "Spannungen",
|
||||
"RAM Voltage:": "RAM-Spannung:",
|
||||
"Display Voltage:": "Display-Spannung:",
|
||||
"Temperatures": "Temperaturen",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normal",
|
||||
"Warm": "Warm",
|
||||
"Hot": "Heiß",
|
||||
"Overheat": "Überhitzung",
|
||||
"Not Patched": "Nicht gepatcht",
|
||||
"Invalid": "Ungültig",
|
||||
"RAM Bandwidth": "RAM-Bandbreite",
|
||||
"RAM BW (Peak):": "RAM-BW (Max.):",
|
||||
"RAM BW (All):": "RAM-BW (Ges.):",
|
||||
"RAM BW (CPU):": "RAM-BW (CPU):",
|
||||
"RAM BW (GPU):": "RAM-BW (GPU):",
|
||||
"Hardware Info": "Hardware-Info",
|
||||
"Console Type:": "Konsolentyp:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAM-Modul: ",
|
||||
"Software Info": "Software-Info",
|
||||
"KIP version:": "KIP-Version:",
|
||||
"sys-dock status:": "Sys-Dock-Status:",
|
||||
"SaltyNX status:": "SaltyNX-Status:",
|
||||
"RR Display status:": "RR Anzeigestatus:",
|
||||
"Wafer Position:": "Waferposition:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Modul:",
|
||||
"Board": "Vorstand",
|
||||
"Display": "Anzeige",
|
||||
|
||||
"Developers": "Entwickler",
|
||||
"Contributors": "Mitwirkende",
|
||||
"Testers": "Tester",
|
||||
"Translators": "Übersetzer",
|
||||
"Special Thanks": "Besonderer Dank",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Kompilieren mit minimalen Funktionen",
|
||||
"THE BEER-WARE LICENSE": "DIE BIERWAREN-LIZENZ"
|
||||
}
|
||||
|
||||
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "Información",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Módulo:",
|
||||
"sys-dock status:": "Estado de sys-dock:",
|
||||
"SaltyNX status:": "Estado de SaltyNX:",
|
||||
"RR Display status:": "Estado de pantalla RR:",
|
||||
"Wafer Position:": "Posición del wafer:",
|
||||
"Credits": "Créditos",
|
||||
"Developers": "Desarrolladores",
|
||||
"Contributors": "Colaboradores",
|
||||
"Testers": "Testers",
|
||||
"Special Thanks": "Agradecimientos especiales",
|
||||
"Unknown": "Desconocido",
|
||||
"Installed": "Instalado",
|
||||
"Not Installed": "No instalado",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "LICENCIA BEER-WARE",
|
||||
"Default": "Predeterminado",
|
||||
"Do Not Override": "No sobrescribir",
|
||||
"Do not override": "No sobrescribir",
|
||||
"Disabled": "Desactivado",
|
||||
"Enabled": "Activado",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Restablecer",
|
||||
"Display": "Pantalla",
|
||||
"Application changed\\n\\n": "Aplicación cambiada\\n\\n",
|
||||
"The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n",
|
||||
"while editing was going on.": "mientras se estaba editando.",
|
||||
"Board": "Placa",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Activado (predeterminado)",
|
||||
"Enable": "Activar",
|
||||
"Fatal error": "Error fatal",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "No se pudo conectar al sysmodule hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Asegúrate de que todo esté\\n\\n",
|
||||
"correctly installed and enabled.": "correctamente instalado y activado.",
|
||||
"Fatal error": "Error fatal",
|
||||
|
||||
"Edit App Profile": "Editar perfil de aplicación",
|
||||
"Edit Global Profile": "Editar perfil global",
|
||||
"Temporary Overrides": "Ajustes temporales",
|
||||
"Temporary Overrides ": "Ajustes temporales",
|
||||
" Reset": " Restablecer",
|
||||
"Settings": "Configuración",
|
||||
"About": "Acerca de",
|
||||
"Credits": "Créditos",
|
||||
|
||||
"Application changed\\n\\n": "Aplicación cambiada\\n\\n",
|
||||
"The running application changed\\n\\n": "La aplicación en ejecución ha cambiado\\n\\n",
|
||||
"while editing was going on.": "mientras se estaba editando.",
|
||||
|
||||
"Sleep Mode": "Modo reposo",
|
||||
"Stock": "Valores de fábrica",
|
||||
"Dev OC": "OC de desarrollo",
|
||||
@@ -40,13 +36,7 @@
|
||||
"Unsafe Max": "Máximo no seguro",
|
||||
"Absolute Max": "Máximo absoluto",
|
||||
"Handheld Safe Max": "Máximo seguro en portátil",
|
||||
"Enable": "Activar",
|
||||
"Edit App Profile": "Editar perfil de aplicación",
|
||||
"Edit Global Profile": "Editar perfil global",
|
||||
"Temporary Overrides": "Ajustes temporales",
|
||||
"Settings": "Configuración",
|
||||
"About": "Acerca de",
|
||||
"Compiling with minimal features": "Compilado con funciones mínimas",
|
||||
|
||||
"General Settings": "Configuración general",
|
||||
"Governor Settings": "Configuración del governor",
|
||||
"Safety Settings": "Configuración de seguridad",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "Configuración de CPU",
|
||||
"GPU Settings": "Configuración de GPU",
|
||||
"Display Settings": "Configuración de pantalla",
|
||||
"Experimental Settings": "Configuración experimental",
|
||||
"Experimental": "Experimental",
|
||||
|
||||
" Settings marked in blue": "La configuración en azul",
|
||||
"don't require a reboot to apply!": "no requiere reinicio para aplicarse.",
|
||||
"You can also press to show": "Pulsa para mostrar",
|
||||
"information about each setting.": "información sobre cada ajuste.",
|
||||
|
||||
" Experimental Settings are incomplete ": "La configuración experimental está incompleta",
|
||||
"and may not work correctly or at all!": "y puede que no funcione correctamente.",
|
||||
"Here be dragons!": "¡Aquí hay dragones!",
|
||||
|
||||
"RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM",
|
||||
"RAM Display Unit": "Unidad de visualización RAM",
|
||||
"Polling Interval": "Intervalo de sondeo",
|
||||
|
||||
"GPU Scheduling Override Method": "Método de sobrescritura del scheduling de GPU",
|
||||
"GPU Scheduling Override": "Sobrescritura de scheduling de GPU",
|
||||
"GPU Boot Volt": "Voltaje de arranque GPU",
|
||||
"GPU Boot Voltage": "Voltaje de arranque GPU",
|
||||
"Memory Frequency Measurement Mode": "Modo de medición de frecuencia de memoria",
|
||||
" Overriding the charge current": "Sobrescribir la corriente de carga",
|
||||
"can be dangerous and may cause": "puede ser peligroso y causar",
|
||||
"damage to your battery or charger!": "daños a la batería o al cargador.",
|
||||
"Charge Current Override": "Sobrescritura de corriente de carga",
|
||||
"RAM Voltage Display Mode": "Modo de visualización de voltaje de RAM",
|
||||
"Polling Interval": "Intervalo de sondeo",
|
||||
"Display Color Preset": "Preajuste de color",
|
||||
"Basic": "Básico",
|
||||
"Saturated": "Saturado",
|
||||
"Washed": "Lavado",
|
||||
"Natural": "Natural",
|
||||
"Vivid": "Vívido",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Frecuencia mínima del governor de CPU",
|
||||
" Usage of unsafe display": "El uso de frecuencias de pantalla",
|
||||
"refresh rates may cause stress": "las tasas de refresco pueden causar estrés",
|
||||
"or damage to your display! ": "o dañar la pantalla.",
|
||||
"Proceed at your own risk!": "¡Úsalo bajo tu propio riesgo!",
|
||||
"Max Handheld Display": "Frecuencia máxima de pantalla en portátil",
|
||||
"Max Handheld Display Hz": "Hz máximo en modo portátil",
|
||||
"Display Clock": "Frecuencia de pantalla",
|
||||
" Adjust the display voltage": "Ajusta el voltaje de pantalla",
|
||||
"with caution to avoid damage": "con cuidado para evitar daños",
|
||||
"to your display panel! ": "al panel de pantalla.",
|
||||
"Display Voltage": "Voltaje de pantalla",
|
||||
|
||||
"Thermal Throttle Limit": "Límite de thermal throttling",
|
||||
"Official Rating": "Valor oficial",
|
||||
"TDP Threshold": "Umbral de TDP",
|
||||
"Power": "Potencia",
|
||||
"Thermal Throttle Limit": "Límite de thermal throttling",
|
||||
"HP Mode": "Modo alto rendimiento",
|
||||
"Default (Mariko)": "Predeterminado (Mariko)",
|
||||
"Default (Erista)": "Predeterminado (Erista)",
|
||||
"Rating": "Valor",
|
||||
"Safe Max (Mariko)": "Máximo seguro (Mariko)",
|
||||
"Safe Max (Erista)": "Máximo seguro (Erista)",
|
||||
|
||||
"DVB Shift": "Desplazamiento DVB",
|
||||
"SoC Max Volt": "Voltaje máximo del SoC",
|
||||
"Step Mode": "Modo de paso",
|
||||
"RAM VDD2 Voltage": "Voltaje VDD2 de RAM",
|
||||
"Voltage": "Voltaje",
|
||||
"RAM VDDQ Voltage": "Voltaje VDDQ de RAM",
|
||||
"Voltage": "Voltaje",
|
||||
"RAM Frequency Editor": "Editor de frecuencia de RAM",
|
||||
"JEDEC.": "JEDEC",
|
||||
"High speedo needed!": "¡Se necesita alto speedo!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)",
|
||||
"Ram Max Clock": "Frecuencia máxima de RAM",
|
||||
"RAM Latency Editor": "Editor de latencias de RAM",
|
||||
"RAM Timing Reductions": "Reducción de timings de RAM",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Latencias de memoria",
|
||||
"Read Latency": "Latencia de lectura",
|
||||
"Write Latency": "Latencia de escritura",
|
||||
"High speedo needed!": "¡Se necesita alto speedo!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (requiere Speedo/PLL extremo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (requiere Speedo/PLL extremo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (requiere Speedo/PLL extremo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (requiere Speedo/PLL muy alto)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (requiere Speedo/PLL muy alto)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (requiere Speedo/PLL muy alto)",
|
||||
"JEDEC.": "JEDEC",
|
||||
|
||||
"CPU Boost Clock": "Frecuencia boost de CPU",
|
||||
"CPU UV": "Undervolt de CPU",
|
||||
"CPU Unlock": "Desbloqueo de CPU",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "Undervolt alto de CPU",
|
||||
"CPU Low VMIN": "VMIN bajo de CPU",
|
||||
"CPU High VMIN": "VMIN alto de CPU",
|
||||
|
||||
"No Undervolt": "Sin undervolt",
|
||||
"SLT Table": "Tabla SLT",
|
||||
"HiOPT Table": "Tabla HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "VMIN de GPU",
|
||||
"GPU Maximum Voltage": "Voltaje máximo de GPU",
|
||||
"GPU Voltage Offset": "Offset de voltaje de GPU",
|
||||
"Do not override": "No sobrescribir",
|
||||
"Enabled (Default)": "Activado (predeterminado)",
|
||||
"96.6% limit": "Límite 96,6%",
|
||||
"99.7% limit": "Límite 99,7%",
|
||||
"GPU Scheduling Override": "Sobrescritura de scheduling de GPU",
|
||||
"Official Service": "Servicio oficial",
|
||||
"GPU DVFS Mode": "Modo DVFS de GPU",
|
||||
"GPU DVFS Offset": "Offset DVFS de GPU",
|
||||
"GPU Voltage Table": "Tabla de voltaje de GPU",
|
||||
"GPU Custom Table (mV)": "Tabla personalizada de GPU (mV)",
|
||||
"Official Service": "Servicio oficial",
|
||||
"96.6% limit": "Límite 96,6%",
|
||||
"99.7% limit": "Límite 99,7%",
|
||||
" Setting GPU Clocks past": "Ajustar frecuencias de GPU más allá",
|
||||
"1228MHz without a proper undervolt": "1228MHz sin undervolt adecuado",
|
||||
"can cause degradation or damage": "puede causar degradación o daños",
|
||||
"to your console!": "a tu consola.",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075MHz sin undervolt, 1152MHz en SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "o 1228MHz en HiOPT pueden causar ",
|
||||
"permanent damage to your Switch!": "¡daño permanente a tu Switch!",
|
||||
"921MHz without UV and 960MHz on": "921MHz sin undervolt y 960MHz en",
|
||||
"SLT or HiOPT can cause ": "SLT o HiOPT pueden causar "
|
||||
}
|
||||
"SLT or HiOPT can cause ": "SLT o HiOPT pueden causar ",
|
||||
|
||||
"Default (Mariko)": "Predeterminado (Mariko)",
|
||||
"Default (Erista)": "Predeterminado (Erista)",
|
||||
"Rating": "Valor",
|
||||
"Safe Max (Mariko)": "Máximo seguro (Mariko)",
|
||||
"Safe Max (Erista)": "Máximo seguro (Erista)",
|
||||
|
||||
"Voltages": "Voltajes",
|
||||
"RAM Voltage:": "Voltaje RAM:",
|
||||
"Display Voltage:": "Voltaje de pantalla:",
|
||||
"Temperatures": "Temperaturas",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normal",
|
||||
"Warm": "Cálido",
|
||||
"Hot": "Caliente",
|
||||
"Overheat": "Sobrecalentamiento",
|
||||
"Not Patched": "Sin parche",
|
||||
"Invalid": "Inválido",
|
||||
"RAM Bandwidth": "Ancho de banda RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Pico):",
|
||||
"RAM BW (All):": "BW RAM (Todo):",
|
||||
"RAM BW (CPU):": "BW RAM (CPU):",
|
||||
"RAM BW (GPU):": "BW RAM (GPU):",
|
||||
"Hardware Info": "Info de hardware",
|
||||
"Console Type:": "Tipo de consola:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Módulo DRAM: ",
|
||||
"Software Info": "Info de software",
|
||||
"KIP version:": "Versión KIP:",
|
||||
"sys-dock status:": "Estado de sys-dock:",
|
||||
"SaltyNX status:": "Estado de SaltyNX:",
|
||||
"RR Display status:": "Estado de pantalla RR:",
|
||||
"Wafer Position:": "Posición del wafer:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Módulo:",
|
||||
"Board": "Placa",
|
||||
"Display": "Pantalla",
|
||||
|
||||
"Developers": "Desarrolladores",
|
||||
"Contributors": "Colaboradores",
|
||||
"Testers": "Testers",
|
||||
"Translators": "Traductores",
|
||||
"Special Thanks": "Agradecimientos especiales",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Compilado con funciones mínimas",
|
||||
"THE BEER-WARE LICENSE": "LICENCIA BEER-WARE"
|
||||
}
|
||||
|
||||
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "Informations",
|
||||
"IDDQ:": "IDDQ :",
|
||||
"Module: ": "Module :",
|
||||
"sys-dock status:": "Statut de sys-dock :",
|
||||
"SaltyNX status:": "Statut de SaltyNX :",
|
||||
"RR Display status:": "Statut de l'affichage RR :",
|
||||
"Wafer Position:": "Position du wafer :",
|
||||
"Credits": "Crédits",
|
||||
"Developers": "Développeurs",
|
||||
"Contributors": "Contributeurs",
|
||||
"Testers": "Testeurs",
|
||||
"Special Thanks": "Remerciements spéciaux",
|
||||
"Unknown": "Inconnu",
|
||||
"Installed": "Installé",
|
||||
"Not Installed": "Non installé",
|
||||
"X: %u Y: %u": "X : %u Y : %u",
|
||||
"THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE",
|
||||
"Default": "Par défaut",
|
||||
"Do Not Override": "Ne pas remplacer",
|
||||
"Do not override": "Ne pas remplacer",
|
||||
"Disabled": "Désactivé",
|
||||
"Enabled": "Activé",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Réinitialiser",
|
||||
"Display": "Écran",
|
||||
"Application changed\\n\\n": "Application modifiée\\n\\n",
|
||||
"The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n",
|
||||
"while editing was going on.": "pendant la modification.",
|
||||
"Board": "Carte",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Activé (par défaut)",
|
||||
"Enable": "Activer",
|
||||
"Fatal error": "Erreur fatale",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Impossible de se connecter au sysmodule hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Veuillez vous assurer que tout est\\n\\n",
|
||||
"correctly installed and enabled.": "correctement installé et activé.",
|
||||
"Fatal error": "Erreur fatale",
|
||||
|
||||
"Edit App Profile": "Modifier le profil de l'app",
|
||||
"Edit Global Profile": "Modifier le profil global",
|
||||
"Temporary Overrides": "Forçages temporaires",
|
||||
"Temporary Overrides ": "Forçages temporaires ",
|
||||
" Reset": " Réinitialiser",
|
||||
"Settings": "Paramètres",
|
||||
"About": "À propos",
|
||||
"Credits": "Crédits",
|
||||
|
||||
"Application changed\\n\\n": "Application modifiée\\n\\n",
|
||||
"The running application changed\\n\\n": "L'application en cours d'exécution a changé\\n\\n",
|
||||
"while editing was going on.": "pendant la modification.",
|
||||
|
||||
"Sleep Mode": "Mode veille",
|
||||
"Stock": "D'origine",
|
||||
"Dev OC": "OC Développeur",
|
||||
@@ -40,13 +36,7 @@
|
||||
"Unsafe Max": "Max non sûr",
|
||||
"Absolute Max": "Max absolu",
|
||||
"Handheld Safe Max": "Max sûr (mode portable)",
|
||||
"Enable": "Activer",
|
||||
"Edit App Profile": "Modifier le profil de l'app",
|
||||
"Edit Global Profile": "Modifier le profil global",
|
||||
"Temporary Overrides": "Forçages temporaires",
|
||||
"Settings": "Paramètres",
|
||||
"About": "À propos",
|
||||
"Compiling with minimal features": "Compilation avec fonctionnalités minimales",
|
||||
|
||||
"General Settings": "Paramètres généraux",
|
||||
"Governor Settings": "Paramètres du gouverneur",
|
||||
"Safety Settings": "Paramètres de sécurité",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "Paramètres CPU",
|
||||
"GPU Settings": "Paramètres GPU",
|
||||
"Display Settings": "Paramètres d'affichage",
|
||||
"Experimental Settings": "Paramètres expérimentaux",
|
||||
"Experimental": "Expérimental",
|
||||
|
||||
" Settings marked in blue": "Les paramètres en bleu",
|
||||
"don't require a reboot to apply!": "ne nécessitent pas de redémarrage !",
|
||||
"You can also press to show": "Appuyez aussi sur pour afficher",
|
||||
"information about each setting.": "les informations sur chaque paramètre.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Les paramètres expérimentaux sont incomplets",
|
||||
"and may not work correctly or at all!": "et peuvent ne pas fonctionner du tout !",
|
||||
"Here be dragons!": "Ici, il y a des dragons !",
|
||||
|
||||
"RAM Voltage Display Mode": "Mode d'affichage de la tension RAM",
|
||||
"RAM Display Unit": "Unité d'affichage RAM",
|
||||
"Polling Interval": "Intervalle d'interrogation",
|
||||
|
||||
"GPU Scheduling Override Method": "Méthode de Forçage de l'ordonnancement GPU",
|
||||
"GPU Scheduling Override": "Forçage de l'ordonnancement GPU",
|
||||
"GPU Boot Volt": "Tension d'amorçage GPU",
|
||||
"GPU Boot Voltage": "Tension d'amorçage GPU",
|
||||
"Memory Frequency Measurement Mode": "Mode de mesure de fréquence mémoire",
|
||||
" Overriding the charge current": "Le forçage du courant de charge",
|
||||
"can be dangerous and may cause": "peut être dangereux et causer des",
|
||||
"damage to your battery or charger!": "dommages à votre batterie ou chargeur !",
|
||||
"Charge Current Override": "Forçage du courant de charge",
|
||||
"RAM Voltage Display Mode": "Mode d'affichage de la tension RAM",
|
||||
"Polling Interval": "Intervalle d'interrogation",
|
||||
"Display Color Preset": "Préréglage de couleur",
|
||||
"Basic": "Basique",
|
||||
"Saturated": "Saturé",
|
||||
"Washed": "Délavé",
|
||||
"Natural": "Naturel",
|
||||
"Vivid": "Vif",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Fréquence minimale du gouverneur CPU",
|
||||
" Usage of unsafe display": "L'utilisation de taux de rafraîchissement",
|
||||
"refresh rates may cause stress": "les taux de rafraîchissement peuvent stresser",
|
||||
"or damage to your display! ": "ou endommager votre écran !",
|
||||
"Proceed at your own risk!": "À utiliser à vos propres risques !",
|
||||
"Max Handheld Display": "Affichage portable max",
|
||||
"Max Handheld Display Hz": "Hz max en mode portable",
|
||||
"Display Clock": "Fréquence d'affichage",
|
||||
" Adjust the display voltage": "Réglez la tension d'affichage",
|
||||
"with caution to avoid damage": "avec précaution pour éviter des dommages",
|
||||
"to your display panel! ": "à votre dalle d'affichage !",
|
||||
"Display Voltage": "Tension d'affichage",
|
||||
|
||||
"Thermal Throttle Limit": "Limite d'étranglement thermique",
|
||||
"Official Rating": "Classement officiel",
|
||||
"TDP Threshold": "Seuil TDP",
|
||||
"Power": "Alimentation",
|
||||
"Thermal Throttle Limit": "Limite d'étranglement thermique",
|
||||
"HP Mode": "Mode HP",
|
||||
"Default (Mariko)": "Par défaut (Mariko)",
|
||||
"Default (Erista)": "Par défaut (Erista)",
|
||||
"Rating": "Évaluation",
|
||||
"Safe Max (Mariko)": "Max sûr (Mariko)",
|
||||
"Safe Max (Erista)": "Max sûr (Erista)",
|
||||
|
||||
"DVB Shift": "Décalage DVB",
|
||||
"SoC Max Volt": "Tension max SoC",
|
||||
"Step Mode": "Mode pas à pas",
|
||||
"RAM VDD2 Voltage": "Tension RAM VDD2",
|
||||
"Voltage": "Tension",
|
||||
"RAM VDDQ Voltage": "Tension RAM VDDQ",
|
||||
"Voltage": "Tension",
|
||||
"RAM Frequency Editor": "Éditeur de fréquence RAM",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Speedo élevé requis !",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"Ram Max Clock": "Fréquence RAM max",
|
||||
"RAM Latency Editor": "Éditeur de latence RAM",
|
||||
"RAM Timing Reductions": "Réductions des timings RAM",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Latences mémoire",
|
||||
"Read Latency": "Latence de lecture",
|
||||
"Write Latency": "Latence d'écriture",
|
||||
"High speedo needed!": "Speedo élevé requis !",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (nécessite Speedo/PLL extrême)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (nécessite Speedo/PLL ridicule)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "Fréquence Boost CPU",
|
||||
"CPU UV": "UV CPU",
|
||||
"CPU Unlock": "Déverrouillage CPU",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "UV CPU élevé",
|
||||
"CPU Low VMIN": "VMIN CPU faible",
|
||||
"CPU High VMIN": "VMIN CPU élevé",
|
||||
|
||||
"No Undervolt": "Aucun Undervolt",
|
||||
"SLT Table": "Table SLT",
|
||||
"HiOPT Table": "Table HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "Tension GPU maximale",
|
||||
"GPU Voltage Offset": "Offset de tension GPU",
|
||||
"Do not override": "Ne pas remplacer",
|
||||
"Enabled (Default)": "Activé (par défaut)",
|
||||
"96.6% limit": "Limite de 96,6 %",
|
||||
"99.7% limit": "Limite de 99,7 %",
|
||||
"GPU Scheduling Override": "Forçage de l'ordonnancement GPU",
|
||||
"Official Service": "Service officiel",
|
||||
"GPU DVFS Mode": "Mode GPU DVFS",
|
||||
"GPU DVFS Offset": "Offset GPU DVFS",
|
||||
"GPU Voltage Table": "Table de tension GPU",
|
||||
"GPU Custom Table (mV)": "Table de GPU personnalisée (mV)",
|
||||
"Official Service": "Service officiel",
|
||||
"96.6% limit": "Limite de 96,6 %",
|
||||
"99.7% limit": "Limite de 99,7 %",
|
||||
" Setting GPU Clocks past": "Régler les fréquences GPU au-delà",
|
||||
"1228MHz without a proper undervolt": "1228 MHz sans undervolt approprié",
|
||||
"can cause degradation or damage": "peut causer une dégradation ou des dommages",
|
||||
"to your console!": "à votre console !",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 MHz sans UV, 1152 MHz sur SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "ou 1228 MHz sur HiOPT peut causer des",
|
||||
"permanent damage to your Switch!": "dommages permanents à votre Switch !",
|
||||
"921MHz without UV and 960MHz on": "921 MHz sans UV et 960 MHz sur",
|
||||
"SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des"
|
||||
"SLT or HiOPT can cause ": "SLT ou HiOPT peuvent causer des",
|
||||
|
||||
"Default (Mariko)": "Par défaut (Mariko)",
|
||||
"Default (Erista)": "Par défaut (Erista)",
|
||||
"Rating": "Évaluation",
|
||||
"Safe Max (Mariko)": "Max sûr (Mariko)",
|
||||
"Safe Max (Erista)": "Max sûr (Erista)",
|
||||
|
||||
"Voltages": "Tensions",
|
||||
"RAM Voltage:": "Tension RAM :",
|
||||
"Display Voltage:": "Tension d'affichage :",
|
||||
"Temperatures": "Températures",
|
||||
"PLLX Temp:": "PLLX Temp :",
|
||||
"AOTAG Temp:": "AOTAG Temp :",
|
||||
"BQ24193 Temp:": "BQ24193 Temp :",
|
||||
"Normal": "Normal",
|
||||
"Warm": "Chaud",
|
||||
"Hot": "Très chaud",
|
||||
"Overheat": "Surchauffe",
|
||||
"Not Patched": "Non patché",
|
||||
"Invalid": "Invalide",
|
||||
"RAM Bandwidth": "Bande passante RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Pic) :",
|
||||
"RAM BW (All):": "BW RAM (Tout) :",
|
||||
"RAM BW (CPU):": "BW RAM (CPU) :",
|
||||
"RAM BW (GPU):": "BW RAM (GPU) :",
|
||||
"Hardware Info": "Infos matériel",
|
||||
"Console Type:": "Type de console :",
|
||||
"Speedo:": "Speedo :",
|
||||
"DRAM Module: ": "Module DRAM : ",
|
||||
"Software Info": "Infos logiciel",
|
||||
"KIP version:": "Version KIP :",
|
||||
"sys-dock status:": "Statut de sys-dock :",
|
||||
"SaltyNX status:": "Statut de SaltyNX :",
|
||||
"RR Display status:": "Statut de l'affichage RR :",
|
||||
"Wafer Position:": "Position du wafer :",
|
||||
"IDDQ:": "IDDQ :",
|
||||
"Module: ": "Module :",
|
||||
"Board": "Carte",
|
||||
"Display": "Écran",
|
||||
|
||||
"Developers": "Développeurs",
|
||||
"Contributors": "Contributeurs",
|
||||
"Testers": "Testeurs",
|
||||
"Translators": "Traducteurs",
|
||||
"Special Thanks": "Remerciements spéciaux",
|
||||
|
||||
"X: %u Y: %u": "X : %u Y : %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Compilation avec fonctionnalités minimales",
|
||||
"THE BEER-WARE LICENSE": "LA LICENCE BEER-WARE"
|
||||
}
|
||||
|
||||
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "Informazioni",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Modulo:",
|
||||
"sys-dock status:": "stato di sys-dock",
|
||||
"SaltyNX status:": "Stato di SaltyNX:",
|
||||
"RR Display status:": "Stato del RR:",
|
||||
"Wafer Position:": "Posizione nel Wafer:",
|
||||
"Credits": "Crediti",
|
||||
"Developers": "Sviluppatori",
|
||||
"Contributors": "Collaboratori",
|
||||
"Testers": "Tester",
|
||||
"Special Thanks": "Un Ringraziamento Speciale",
|
||||
"Unknown": "Sconosciuto",
|
||||
"Installed": "Installato",
|
||||
"Not Installed": "Non installato",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE",
|
||||
"Default": "Predefinito",
|
||||
"Do Not Override": "Non Sovrascrivere",
|
||||
"Do not override": "Non sovrascrivere",
|
||||
"Disabled": "Disabilitato",
|
||||
"Enabled": "Abilitato",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Ripristina",
|
||||
"Display": "Schermo",
|
||||
"Application changed\\n\\n": "Applicazione modificata\\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.",
|
||||
"Board": "Scheda",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Abilitato (impostazione predefinita)",
|
||||
"Enable": "Abilita",
|
||||
"Fatal error": "Errore fatale",
|
||||
"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",
|
||||
"correctly installed and enabled.": "correttamente installato e abilitato.",
|
||||
"Fatal error": "Errore fatale",
|
||||
|
||||
"Edit App Profile": "Modifica Profilo Dell'App",
|
||||
"Edit Global Profile": "Modifica Profilo Globale",
|
||||
"Temporary Overrides": "Sostituzioni Temporanee",
|
||||
"Temporary Overrides ": "Sostituzioni Temporanee",
|
||||
" Reset": " Ripristina",
|
||||
"Settings": "Impostazioni",
|
||||
"About": "A Riguardo Di",
|
||||
"Credits": "Crediti",
|
||||
|
||||
"Application changed\\n\\n": "Applicazione modificata\\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.",
|
||||
|
||||
"Sleep Mode": "Modalità di Sospensione",
|
||||
"Stock": "Originale",
|
||||
"Dev OC": "OC dev",
|
||||
@@ -40,13 +36,7 @@
|
||||
"Unsafe Max": "Massimo Non Sicuro",
|
||||
"Absolute Max": "Massimo Assoluto",
|
||||
"Handheld Safe Max": "Massimo Sicuro Modalità Portatile",
|
||||
"Enable": "Abilita",
|
||||
"Edit App Profile": "Modifica Profilo Dell'App",
|
||||
"Edit Global Profile": "Modifica Profilo Globale",
|
||||
"Temporary Overrides": "Sostituzioni Temporanee",
|
||||
"Settings": "Impostazioni",
|
||||
"About": "A Riguardo Di",
|
||||
"Compiling with minimal features": "Compilazione con funzionalità minime",
|
||||
|
||||
"General Settings": "Impostazioni Generali",
|
||||
"Governor Settings": "Impostazioni Del Governor",
|
||||
"Safety Settings": "Impostazioni Di Sicurezza",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "Impostazioni della CPU",
|
||||
"GPU Settings": "Impostazioni della GPU",
|
||||
"Display Settings": "Impostazioni dello Schermo",
|
||||
"Experimental Settings": "Impostazioni sperimentali",
|
||||
"Experimental": "Sperimentale",
|
||||
|
||||
" Settings marked in blue": "Le impostazioni in blu",
|
||||
"don't require a reboot to apply!": "non richiedono un riavvio per applicarsi!",
|
||||
"You can also press to show": "Premi anche per mostrare",
|
||||
"information about each setting.": "informazioni su ogni impostazione.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Le impostazioni sperimentali sono incomplete",
|
||||
"and may not work correctly or at all!": "e potrebbero non funzionare correttamente!",
|
||||
"Here be dragons!": "Qui ci sono draghi!",
|
||||
|
||||
"RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM",
|
||||
"RAM Display Unit": "Unità di visualizzazione RAM",
|
||||
"Polling Interval": "Intervallo di polling",
|
||||
|
||||
"GPU Scheduling Override Method": "Metodo di override dello scheduling GPU",
|
||||
"GPU Scheduling Override": "Override dello Scheduling GPU",
|
||||
"GPU Boot Volt": "Tensione di avvio GPU",
|
||||
"GPU Boot Voltage": "Tensione di avvio GPU",
|
||||
"Memory Frequency Measurement Mode": "Modalità di misurazione della frequenza della memoria",
|
||||
" Overriding the charge current": "L'override della corrente di carica",
|
||||
"can be dangerous and may cause": "può essere pericoloso e può causare",
|
||||
"damage to your battery or charger!": "danni alla batteria o al caricabatterie!",
|
||||
"Charge Current Override": "Override della Corrente di Carica",
|
||||
"RAM Voltage Display Mode": "Modalità di Visualizzazione della Tensione RAM",
|
||||
"Polling Interval": "Intervallo di polling",
|
||||
"Display Color Preset": "Preimpostazione colore",
|
||||
"Basic": "Base",
|
||||
"Saturated": "Saturo",
|
||||
"Washed": "Sbiadito",
|
||||
"Natural": "Naturale",
|
||||
"Vivid": "Vivace",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Frequenza minima del Governor della CPU",
|
||||
" Usage of unsafe display": "L'uso di frequenze di aggiornamento",
|
||||
"refresh rates may cause stress": "le frequenze di aggiornamento possono causare stress",
|
||||
"or damage to your display! ": "o danni al display!",
|
||||
"Proceed at your own risk!": "Procedi a tuo rischio e pericolo!",
|
||||
"Max Handheld Display": "Display Massimo in Modalità Portatile",
|
||||
"Max Handheld Display Hz": "Hz max in modalità portatile",
|
||||
"Display Clock": "Frequenza del Display",
|
||||
" Adjust the display voltage": "Regola la tensione del display",
|
||||
"with caution to avoid damage": "con cautela per evitare danni",
|
||||
"to your display panel! ": "al pannello del display!",
|
||||
"Display Voltage": "Tensione display",
|
||||
|
||||
"Thermal Throttle Limit": "Limite Termico",
|
||||
"Official Rating": "Rating Ufficiale",
|
||||
"TDP Threshold": "Soglia TDP",
|
||||
"Power": "Potenza",
|
||||
"Thermal Throttle Limit": "Limite Termico",
|
||||
"HP Mode": "Modalità HP",
|
||||
"Default (Mariko)": "Predefinito (Mariko)",
|
||||
"Default (Erista)": "Predefinito (Erista)",
|
||||
"Rating": "Valutazione",
|
||||
"Safe Max (Mariko)": "Massimo Sicuro (Mariko)",
|
||||
"Safe Max (Erista)": "Massimo Sicuro (Erista)",
|
||||
|
||||
"DVB Shift": "Offset DVB",
|
||||
"SoC Max Volt": "Tensione massima SoC",
|
||||
"Step Mode": "Modalità passo",
|
||||
"RAM VDD2 Voltage": "Tensione RAM VDD2",
|
||||
"Voltage": "Voltaggio",
|
||||
"RAM VDDQ Voltage": "Voltaggio VDDQ della RAM",
|
||||
"Voltage": "Voltaggio",
|
||||
"RAM Frequency Editor": "Editor della frequenza RAM",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Alto Valore Speedo Necessario!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)",
|
||||
"Ram Max Clock": "Frequenza Massima Ram",
|
||||
"RAM Latency Editor": "Editor della Latenza RAM",
|
||||
"RAM Timing Reductions": "Riduzioni dei Timing della RAM",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Latenza della Memoria",
|
||||
"Read Latency": "Latenza di Lettura",
|
||||
"Write Latency": "Latenza di Scrittura",
|
||||
"High speedo needed!": "Alto Valore Speedo Necessario!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (richiede Speedo/PLL altissimo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (richiede Speedo/PLL estremo)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (richiede Speedo/PLL estremo)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (richiede Speedo/PLL estremo)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "Frequenza CPU in Boost",
|
||||
"CPU UV": "Undervolt CPU",
|
||||
"CPU Unlock": "Sblocco della CPU",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "CPU UV Alta Frequenza",
|
||||
"CPU Low VMIN": "CPU VMIN Bassa Frequenza",
|
||||
"CPU High VMIN": "CPU VMIN Alta Frequenza",
|
||||
|
||||
"No Undervolt": "Nessun Undervolt",
|
||||
"SLT Table": "Tabella SLT",
|
||||
"HiOPT Table": "Tabella HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "Voltaggio massimo della GPU",
|
||||
"GPU Voltage Offset": "Offset di Voltaggio della GPU",
|
||||
"Do not override": "Non sovrascrivere",
|
||||
"Enabled (Default)": "Abilitato (impostazione predefinita)",
|
||||
"96.6% limit": "Limite del 96,6%.",
|
||||
"99.7% limit": "Limite del 99,7%.",
|
||||
"GPU Scheduling Override": "Override dello Scheduling GPU",
|
||||
"Official Service": "Servizio ufficiale",
|
||||
"GPU DVFS Mode": "Modalità DVFS GPU",
|
||||
"GPU DVFS Offset": "Offset DVFS della GPU",
|
||||
"GPU Voltage Table": "Tabella delle Tensioni della GPU",
|
||||
"GPU Custom Table (mV)": "Tabella GPU Personalizzata (mV)",
|
||||
"Official Service": "Servizio ufficiale",
|
||||
"96.6% limit": "Limite del 96,6%",
|
||||
"99.7% limit": "Limite del 99,7%",
|
||||
" Setting GPU Clocks past": "Impostare le frequenze GPU oltre",
|
||||
"1228MHz without a proper undervolt": "1228 MHz senza undervolt appropriato",
|
||||
"can cause degradation or damage": "può causare degrado o danni",
|
||||
"to your console!": "alla tua console!",
|
||||
"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",
|
||||
"permanent damage to your Switch!": "danni permanenti alla tua Switch!",
|
||||
"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",
|
||||
|
||||
"Default (Mariko)": "Predefinito (Mariko)",
|
||||
"Default (Erista)": "Predefinito (Erista)",
|
||||
"Rating": "Valutazione",
|
||||
"Safe Max (Mariko)": "Massimo Sicuro (Mariko)",
|
||||
"Safe Max (Erista)": "Massimo Sicuro (Erista)",
|
||||
|
||||
"Voltages": "Tensioni",
|
||||
"RAM Voltage:": "Tensione RAM:",
|
||||
"Display Voltage:": "Tensione display:",
|
||||
"Temperatures": "Temperature",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normale",
|
||||
"Warm": "Caldo",
|
||||
"Hot": "Molto caldo",
|
||||
"Overheat": "Surriscaldamento",
|
||||
"Not Patched": "Non patchato",
|
||||
"Invalid": "Non valido",
|
||||
"RAM Bandwidth": "Banda RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Picco):",
|
||||
"RAM BW (All):": "BW RAM (Tutto):",
|
||||
"RAM BW (CPU):": "BW RAM (CPU):",
|
||||
"RAM BW (GPU):": "BW RAM (GPU):",
|
||||
"Hardware Info": "Info hardware",
|
||||
"Console Type:": "Tipo di console:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Modulo DRAM: ",
|
||||
"Software Info": "Info software",
|
||||
"KIP version:": "Versione KIP:",
|
||||
"sys-dock status:": "stato di sys-dock",
|
||||
"SaltyNX status:": "Stato di SaltyNX:",
|
||||
"RR Display status:": "Stato del RR:",
|
||||
"Wafer Position:": "Posizione nel Wafer:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Modulo:",
|
||||
"Board": "Scheda",
|
||||
"Display": "Schermo",
|
||||
|
||||
"Developers": "Sviluppatori",
|
||||
"Contributors": "Collaboratori",
|
||||
"Testers": "Tester",
|
||||
"Translators": "Traduttori",
|
||||
"Special Thanks": "Un Ringraziamento Speciale",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Compilazione con funzionalità minime",
|
||||
"THE BEER-WARE LICENSE": "THE BEER-WARE LICENSE"
|
||||
}
|
||||
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "情報",
|
||||
"IDDQ:": "IDQ:",
|
||||
"Module: ": "モジュール:",
|
||||
"sys-dock status:": "システムドックのステータス:",
|
||||
"SaltyNX status:": "SaltyNX ステータス:",
|
||||
"RR Display status:": "RR 表示ステータス:",
|
||||
"Wafer Position:": "ウェーハの位置:",
|
||||
"Credits": "クレジット",
|
||||
"Developers": "開発者",
|
||||
"Contributors": "貢献者",
|
||||
"Testers": "テスター",
|
||||
"Special Thanks": "特別な感謝の気持ち",
|
||||
"Unknown": "不明",
|
||||
"Installed": "インストール済み",
|
||||
"Not Installed": "インストールされていません",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "ビール製品ライセンス",
|
||||
"Default": "デフォルト",
|
||||
"Do Not Override": "上書きしないでください",
|
||||
"Disabled": "障害者",
|
||||
"Do not override": "上書きしないでください",
|
||||
"Disabled": "無効",
|
||||
"Enabled": "有効",
|
||||
" \\ue0e3 Reset": "\\ue0e3 リセット",
|
||||
"Display": "ディスプレイ",
|
||||
"Application changed\\n\\n": "アプリケーションが変更されました\\n\\n",
|
||||
"The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n",
|
||||
"while editing was going on.": "編集を進めている最中でした。",
|
||||
"Board": "理事会",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "有効 (デフォルト)",
|
||||
"Enable": "有効にする",
|
||||
"Fatal error": "致命的なエラー",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk sysmodule に接続できませんでした。\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "すべてが正しいことを確認してください\\n\\n",
|
||||
"correctly installed and enabled.": "正しくインストールされ、有効になっています。",
|
||||
"Fatal error": "致命的なエラー",
|
||||
|
||||
"Edit App Profile": "アプリプロファイルの編集",
|
||||
"Edit Global Profile": "グローバルプロファイルの編集",
|
||||
"Temporary Overrides": "一時的なオーバーライド",
|
||||
"Temporary Overrides ": "一時的なオーバーライド",
|
||||
" Reset": " リセット",
|
||||
"Settings": "設定",
|
||||
"About": "について",
|
||||
"Credits": "クレジット",
|
||||
|
||||
"Application changed\\n\\n": "アプリケーションが変更されました\\n\\n",
|
||||
"The running application changed\\n\\n": "実行中のアプリケーションが変更されました\\n\\n",
|
||||
"while editing was going on.": "編集を進めている最中でした。",
|
||||
|
||||
"Sleep Mode": "スリープモード",
|
||||
"Stock": "在庫",
|
||||
"Stock": "標準",
|
||||
"Dev OC": "開発OC",
|
||||
"Boost Mode": "ブーストモード",
|
||||
"Safe Max": "セーフマックス",
|
||||
"Unsafe Max": "危険なマックス",
|
||||
"Absolute Max": "絶対最大値",
|
||||
"Handheld Safe Max": "手持ち金庫マックス",
|
||||
"Enable": "有効にする",
|
||||
"Edit App Profile": "アプリプロファイルの編集",
|
||||
"Edit Global Profile": "グローバルプロファイルの編集",
|
||||
"Temporary Overrides": "一時的なオーバーライド",
|
||||
"Settings": "設定",
|
||||
"About": "について",
|
||||
"Compiling with minimal features": "最小限の機能でコンパイルする",
|
||||
"Handheld Safe Max": "手持ち安全マックス",
|
||||
|
||||
"General Settings": "一般設定",
|
||||
"Governor Settings": "ガバナーの設定",
|
||||
"Safety Settings": "安全設定",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "CPUの設定",
|
||||
"GPU Settings": "GPU設定",
|
||||
"Display Settings": "表示設定",
|
||||
"Experimental Settings": "実験的設定",
|
||||
"Experimental": "実験的",
|
||||
|
||||
" Settings marked in blue": "青色でマークされた設定",
|
||||
"don't require a reboot to apply!": "再起動なしで適用できます!",
|
||||
"You can also press to show": " を押して表示することもできます",
|
||||
"information about each setting.": "各設定の情報を。",
|
||||
|
||||
" Experimental Settings are incomplete ": "実験的設定は未完成です",
|
||||
"and may not work correctly or at all!": "正しく動作しない場合があります!",
|
||||
"Here be dragons!": "ここにドラゴンあり!",
|
||||
|
||||
"RAM Voltage Display Mode": "RAM電圧表示モード",
|
||||
"RAM Display Unit": "RAM表示単位",
|
||||
"Polling Interval": "ポーリング間隔",
|
||||
|
||||
"GPU Scheduling Override Method": "GPU スケジューリング オーバーライド メソッド",
|
||||
"GPU Scheduling Override": "GPU スケジュールのオーバーライド",
|
||||
"GPU Boot Volt": "GPU起動電圧",
|
||||
"GPU Boot Voltage": "GPU起動電圧",
|
||||
"Memory Frequency Measurement Mode": "メモリ周波数測定モード",
|
||||
" Overriding the charge current": "充電電流のオーバーライド",
|
||||
"can be dangerous and may cause": "危険であり、原因となる可能性があります",
|
||||
"damage to your battery or charger!": "バッテリーまたは充電器が損傷します。",
|
||||
"Charge Current Override": "充電電流オーバーライド",
|
||||
"RAM Voltage Display Mode": "RAM電圧表示モード",
|
||||
"Polling Interval": "ポーリング間隔",
|
||||
"Display Color Preset": "ディスプレイカラープリセット",
|
||||
"Basic": "ベーシック",
|
||||
"Saturated": "鮮やか",
|
||||
"Washed": "色あせ",
|
||||
"Natural": "ナチュラル",
|
||||
"Vivid": "ビビッド",
|
||||
|
||||
"CPU Governor Minimum Frequency": "CPU ガバナの最小周波数",
|
||||
" Usage of unsafe display": "危険なリフレッシュレートの使用",
|
||||
"refresh rates may cause stress": "リフレッシュレートがストレスを引き起こす可能性がある",
|
||||
"or damage to your display! ": "ディスプレイに損傷を与えてしまいます。",
|
||||
"Proceed at your own risk!": "自己責任で進めてください!",
|
||||
"Max Handheld Display": "最大ハンドヘルドディスプレイ",
|
||||
"Max Handheld Display Hz": "最大ハンドヘルドHz",
|
||||
"Display Clock": "時計の表示",
|
||||
" Adjust the display voltage": "ディスプレイ電圧を調整",
|
||||
"with caution to avoid damage": "損傷を避けるため注意して",
|
||||
"to your display panel! ": "ディスプレイパネルに!",
|
||||
"Display Voltage": "ディスプレイ電圧",
|
||||
|
||||
"Thermal Throttle Limit": "サーマルスロットル制限",
|
||||
"Official Rating": "公式評価",
|
||||
"TDP Threshold": "TDP しきい値",
|
||||
"Power": "パワー",
|
||||
"Thermal Throttle Limit": "サーマルスロットル制限",
|
||||
"HP Mode": "HPモード",
|
||||
"Default (Mariko)": "デフォルト(マリコ)",
|
||||
"Default (Erista)": "デフォルト(エリスタ)",
|
||||
"Rating": "評価",
|
||||
"Safe Max (Mariko)": "セーフマックス(マリコ)",
|
||||
"Safe Max (Erista)": "セーフマックス(エリスタ)",
|
||||
|
||||
"DVB Shift": "DVBシフト",
|
||||
"SoC Max Volt": "SoC最大電圧",
|
||||
"Step Mode": "ステップモード",
|
||||
"RAM VDD2 Voltage": "RAM VDD2 電圧",
|
||||
"Voltage": "電圧",
|
||||
"RAM VDDQ Voltage": "RAM VDDQ 電圧",
|
||||
"Voltage": "電圧",
|
||||
"RAM Frequency Editor": "RAM周波数エディター",
|
||||
"JEDEC.": "JEDEC。",
|
||||
"High speedo needed!": "ハイスピードが必要です!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)",
|
||||
"Ram Max Clock": "ラムマックスクロック",
|
||||
"RAM Latency Editor": "RAM レイテンシ エディター",
|
||||
"RAM Timing Reductions": "RAM タイミングの削減",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "メモリレイテンシ",
|
||||
"Read Latency": "読み取りレイテンシー",
|
||||
"Write Latency": "書き込みレイテンシ",
|
||||
"High speedo needed!": "ハイスピードが必要です!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (エクストリーム Speedo/PLL が必要)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (とんでもない Speedo/PLL が必要)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (とんでもない Speedo/PLL が必要)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (とんでもない Speedo/PLL が必要)",
|
||||
"JEDEC.": "JEDEC。",
|
||||
|
||||
"CPU Boost Clock": "CPUブーストクロック",
|
||||
"CPU UV": "CPU UV",
|
||||
"CPU Unlock": "CPUロック解除",
|
||||
@@ -111,10 +133,11 @@
|
||||
"Extreme UV Table": "エクストリーム UV テーブル",
|
||||
"CPU UV Table": "CPU UV テーブル",
|
||||
"CPU Low UV": "CPU 低 UV",
|
||||
"CPU High UV": "CPU 高紫外線",
|
||||
"CPU High UV": "CPU 高 UV",
|
||||
"CPU Low VMIN": "CPU 低 VMIN",
|
||||
"CPU High VMIN": "CPU の高い VMIN",
|
||||
"No Undervolt": "不足電圧なし",
|
||||
"CPU High VMIN": "CPU 高 VMIN",
|
||||
|
||||
"No Undervolt": "アンダーボルトなし",
|
||||
"SLT Table": "SLTテーブル",
|
||||
"HiOPT Table": "HiOPT テーブル",
|
||||
"GPU Undervolt Table": "GPUアンダーボルトテーブル",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "GPU最大電圧",
|
||||
"GPU Voltage Offset": "GPU電圧オフセット",
|
||||
"Do not override": "上書きしないでください",
|
||||
"Enabled (Default)": "有効 (デフォルト)",
|
||||
"96.6% limit": "96.6%制限",
|
||||
"99.7% limit": "99.7%制限",
|
||||
"GPU Scheduling Override": "GPU スケジュールのオーバーライド",
|
||||
"Official Service": "正式サービス",
|
||||
"GPU DVFS Mode": "GPU DVFS モード",
|
||||
"GPU DVFS Offset": "GPU DVFS オフセット",
|
||||
"GPU Voltage Table": "GPU電圧テーブル",
|
||||
"GPU Custom Table (mV)": "GPUカスタムテーブル(mV)",
|
||||
"Official Service": "正式サービス",
|
||||
"96.6% limit": "96.6%制限",
|
||||
"99.7% limit": "99.7%制限",
|
||||
" Setting GPU Clocks past": "GPUクロックを超えて設定",
|
||||
"1228MHz without a proper undervolt": "適切なアンダーボルトなしで1228MHz",
|
||||
"can cause degradation or damage": "劣化や損傷を引き起こす可能性があります",
|
||||
"to your console!": "あなたのコンソールに!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "UVなしで1075MHz、SLTで1152MHz",
|
||||
"or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると、次のような問題が発生する可能性があります。",
|
||||
"or 1228MHz on HiOPT can cause ": "HiOPT で 1228MHz を使用すると問題が発生する可能性があります。",
|
||||
"permanent damage to your Switch!": "Switch に永久的なダメージを与えます!",
|
||||
"921MHz without UV and 960MHz on": "921MHz(UVなし)、960MHz(UVあり)",
|
||||
"SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります"
|
||||
"SLT or HiOPT can cause ": "SLT または HiOPT が原因となる可能性があります",
|
||||
|
||||
"Default (Mariko)": "デフォルト(マリコ)",
|
||||
"Default (Erista)": "デフォルト(エリスタ)",
|
||||
"Rating": "評価",
|
||||
"Safe Max (Mariko)": "セーフマックス(マリコ)",
|
||||
"Safe Max (Erista)": "セーフマックス(エリスタ)",
|
||||
|
||||
"Voltages": "電圧",
|
||||
"RAM Voltage:": "RAM電圧:",
|
||||
"Display Voltage:": "ディスプレイ電圧:",
|
||||
"Temperatures": "温度",
|
||||
"PLLX Temp:": "PLLX 温度:",
|
||||
"AOTAG Temp:": "AOTAG 温度:",
|
||||
"BQ24193 Temp:": "BQ24193 温度:",
|
||||
"Normal": "正常",
|
||||
"Warm": "温かい",
|
||||
"Hot": "熱い",
|
||||
"Overheat": "過熱",
|
||||
"Not Patched": "パッチなし",
|
||||
"Invalid": "無効",
|
||||
"RAM Bandwidth": "RAM帯域幅",
|
||||
"RAM BW (Peak):": "RAM帯域(最大):",
|
||||
"RAM BW (All):": "RAM帯域(全):",
|
||||
"RAM BW (CPU):": "RAM帯域(CPU):",
|
||||
"RAM BW (GPU):": "RAM帯域(GPU):",
|
||||
"Hardware Info": "ハードウェア情報",
|
||||
"Console Type:": "コンソールタイプ:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAMモジュール: ",
|
||||
"Software Info": "ソフトウェア情報",
|
||||
"KIP version:": "KIPバージョン:",
|
||||
"sys-dock status:": "システムドックのステータス:",
|
||||
"SaltyNX status:": "SaltyNX ステータス:",
|
||||
"RR Display status:": "RR 表示ステータス:",
|
||||
"Wafer Position:": "ウェーハの位置:",
|
||||
"IDDQ:": "IDQ:",
|
||||
"Module: ": "モジュール:",
|
||||
"Board": "理事会",
|
||||
"Display": "ディスプレイ",
|
||||
|
||||
"Developers": "開発者",
|
||||
"Contributors": "貢献者",
|
||||
"Testers": "テスター",
|
||||
"Translators": "翻訳者",
|
||||
"Special Thanks": "特別な感謝の気持ち",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "最小限の機能でコンパイルする",
|
||||
"THE BEER-WARE LICENSE": "ビール製品ライセンス"
|
||||
}
|
||||
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "정보",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "모듈:",
|
||||
"sys-dock status:": "sys-dock 상태:",
|
||||
"SaltyNX status:": "SaltyNX 상태:",
|
||||
"RR Display status:": "RR 표시 상태:",
|
||||
"Wafer Position:": "웨이퍼 위치:",
|
||||
"Credits": "크레딧",
|
||||
"Developers": "개발자",
|
||||
"Contributors": "기여자",
|
||||
"Testers": "테스터",
|
||||
"Special Thanks": "특별한 분",
|
||||
"Unknown": "알 수 없음",
|
||||
"Installed": "설치됨",
|
||||
"Not Installed": "설치되지 않음",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "맥주 제품 라이센스",
|
||||
"Default": "기본값",
|
||||
"Do Not Override": "재정의하지 마십시오",
|
||||
"Do not override": "재정의하지 않음",
|
||||
"Disabled": "비활성화",
|
||||
"Enabled": "활성화됨",
|
||||
" \\ue0e3 Reset": "\\ue0e3 재설정",
|
||||
"Display": "디스플레이",
|
||||
"Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n",
|
||||
"The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n",
|
||||
"while editing was going on.": "편집이 진행되는 동안.",
|
||||
"Board": "보드",
|
||||
"%u.%u%u mV": "%u.%u%umV",
|
||||
"Enabled (Default)": "활성화됨(기본값)",
|
||||
"Enable": "활성화",
|
||||
"Fatal error": "치명적인 오류",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "hoc-clk 시스템 모듈에 연결할 수 없습니다.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "모든 것이 올바른지 확인하십시오.\\n\\n",
|
||||
"correctly installed and enabled.": "올바르게 설치되고 활성화되었습니다.",
|
||||
"Fatal error": "치명적인 오류",
|
||||
|
||||
"Edit App Profile": "앱 프로필 편집",
|
||||
"Edit Global Profile": "글로벌 프로필 편집",
|
||||
"Temporary Overrides": "임시 재정의",
|
||||
"Temporary Overrides ": "임시 재정의",
|
||||
" Reset": " 재설정",
|
||||
"Settings": "설정",
|
||||
"About": "소개",
|
||||
"Credits": "크레딧",
|
||||
|
||||
"Application changed\\n\\n": "애플리케이션이 변경되었습니다.\\n\\n",
|
||||
"The running application changed\\n\\n": "실행 중인 애플리케이션이 변경되었습니다.\\n\\n",
|
||||
"while editing was going on.": "편집이 진행되는 동안.",
|
||||
|
||||
"Sleep Mode": "절전 모드",
|
||||
"Stock": "주식",
|
||||
"Stock": "기본 설정",
|
||||
"Dev OC": "개발 OC",
|
||||
"Overwrite Boost Mode": "부스트 모드 덮어쓰기",
|
||||
"Boost Mode": "부스트 모드",
|
||||
"Safe Max": "안전함 최대값",
|
||||
"Unsafe Max": "불안정 최대값",
|
||||
"Absolute Max": "절대 최대값",
|
||||
"Handheld Safe Max": "휴대모드 안전함 최대값",
|
||||
"Enable": "활성화",
|
||||
"Edit App Profile": "앱 프로필 편집",
|
||||
"Edit Global Profile": "글로벌 프로필 편집",
|
||||
"Temporary Overrides": "임시 재정의",
|
||||
"Settings": "설정",
|
||||
"About": "소개",
|
||||
"Compiling with minimal features": "최소한의 기능으로 컴파일하기",
|
||||
|
||||
"General Settings": "일반 설정",
|
||||
"Governor Settings": "거버너 설정",
|
||||
"Safety Settings": "안전 설정",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "CPU 설정",
|
||||
"GPU Settings": "GPU 설정",
|
||||
"Display Settings": "디스플레이 설정",
|
||||
"Experimental Settings": "실험적 설정",
|
||||
"Experimental": "실험적",
|
||||
|
||||
" Settings marked in blue": "파란색으로 표시된 설정은",
|
||||
"don't require a reboot to apply!": "재부팅 없이 적용됩니다!",
|
||||
"You can also press to show": "을 눌러 표시할 수도 있습니다",
|
||||
"information about each setting.": "각 설정에 대한 정보를.",
|
||||
|
||||
" Experimental Settings are incomplete ": "실험적 설정은 미완성입니다",
|
||||
"and may not work correctly or at all!": "올바르게 작동하지 않을 수 있습니다!",
|
||||
"Here be dragons!": "여기에 드래곤이 있습니다!",
|
||||
|
||||
"RAM Voltage Display Mode": "RAM 전압 표시 모드",
|
||||
"RAM Display Unit": "RAM 표시 단위",
|
||||
"Polling Interval": "폴링 간격",
|
||||
|
||||
"GPU Scheduling Override Method": "GPU 스케줄링 재정의 방법",
|
||||
"GPU Scheduling Override": "GPU 스케줄링 재정의",
|
||||
"GPU Boot Volt": "GPU 부팅 전압",
|
||||
"GPU Boot Voltage": "GPU 부팅 전압",
|
||||
"Memory Frequency Measurement Mode": "메모리 주파수 측정 모드",
|
||||
" Overriding the charge current": "충전 전류 오버라이드",
|
||||
"can be dangerous and may cause": "위험할 수 있고 원인이 될 수 있습니다.",
|
||||
"damage to your battery or charger!": "배터리나 충전기가 손상되었습니다!",
|
||||
"Charge Current Override": "충전 전류 오버라이드",
|
||||
"RAM Voltage Display Mode": "RAM 전압 표시 모드",
|
||||
"Polling Interval": "폴링 간격",
|
||||
"Display Color Preset": "디스플레이 색상 프리셋",
|
||||
"Basic": "기본",
|
||||
"Saturated": "채도 높음",
|
||||
"Washed": "연한색",
|
||||
"Natural": "자연스러움",
|
||||
"Vivid": "선명함",
|
||||
|
||||
"CPU Governor Minimum Frequency": "CPU 거버너 최소 주파수",
|
||||
" Usage of unsafe display": "안전하지 않은 주사율 사용",
|
||||
"refresh rates may cause stress": "디스플레이 주사율 빈도 변경은",
|
||||
"or damage to your display! ": "기기에 손상이 발생될 수 있습니다!",
|
||||
"Proceed at your own risk!": "책임하에 주의해서 사용하십시오!",
|
||||
"Max Handheld Display": "최대 휴대용 디스플레이",
|
||||
"Max Handheld Display Hz": "최대 휴대용 Hz",
|
||||
"Display Clock": "디스플레이 클럭",
|
||||
" Adjust the display voltage": "디스플레이 전압 조정",
|
||||
"with caution to avoid damage": "손상을 피하기 위해 주의하여",
|
||||
"to your display panel! ": "디스플레이 패널에!",
|
||||
"Display Voltage": "디스플레이 전압",
|
||||
|
||||
"Thermal Throttle Limit": "열 스로틀 한계",
|
||||
"Official Rating": "공식 등급",
|
||||
"TDP Threshold": "TDP 임계값",
|
||||
"Power": "힘",
|
||||
"Thermal Throttle Limit": "열 스로틀 한계",
|
||||
"HP Mode": "HP 모드",
|
||||
"Default (Mariko)": "기본값(마리코)",
|
||||
"Default (Erista)": "기본값(에리스타)",
|
||||
"Rating": "표준값",
|
||||
"Safe Max (Mariko)": "안전함 최대치(마리코)",
|
||||
"Safe Max (Erista)": "안전함 최대치(에리스타)",
|
||||
|
||||
"DVB Shift": "DVB 시프트",
|
||||
"SoC Max Volt": "SoC 최대 전압",
|
||||
"Step Mode": "스텝 모드",
|
||||
"RAM VDD2 Voltage": "RAM VDD2 전압",
|
||||
"Voltage": "전압",
|
||||
"RAM VDDQ Voltage": "RAM VDDQ 전압",
|
||||
"Voltage": "전압",
|
||||
"RAM Frequency Editor": "RAM 주파수 편집기",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "높은 스피도값이 필요합니다!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (말도 안 되는 Speedo/PLL 필요)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)",
|
||||
"Ram Max Clock": "RAM 최대 클럭",
|
||||
"RAM Latency Editor": "RAM 지연 시간 편집기",
|
||||
"RAM Timing Reductions": "RAM 타이밍 편집기",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "메모리 지연 시간",
|
||||
"Read Latency": "읽기 지연 시간",
|
||||
"Write Latency": "쓰기 지연 시간",
|
||||
"High speedo needed!": "높은 스피도값이 필요합니다!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz(극단적인 Speedo/PLL 필요)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(터무니없는 Speedo/PLL 필요)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(터무니없는 Speedo/PLL 필요)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(터무니없는 Speedo/PLL 필요)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "CPU 부스트 클럭",
|
||||
"CPU UV": "CPU 언더볼트",
|
||||
"CPU Unlock": "CPU 잠금 해제",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "CPU 고주파 언더볼트",
|
||||
"CPU Low VMIN": "CPU 저주파 최소 전압",
|
||||
"CPU High VMIN": "CPU 고주파 최소 전압",
|
||||
|
||||
"No Undervolt": "언더볼트 없음",
|
||||
"SLT Table": "SLT 테이블",
|
||||
"HiOPT Table": "HiOPT 테이블",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "GPU 최대 전압",
|
||||
"GPU Voltage Offset": "GPU 전압 오프셋",
|
||||
"Do not override": "재정의하지 않음",
|
||||
"Enabled (Default)": "활성화됨(기본값)",
|
||||
"96.6% limit": "96.6% 한도",
|
||||
"99.7% limit": "99.7% 한도",
|
||||
"GPU Scheduling Override": "GPU 스케줄링 재정의",
|
||||
"Official Service": "공식 서비스",
|
||||
"GPU DVFS Mode": "GPU DVFS 모드",
|
||||
"GPU DVFS Offset": "GPU DVFS 오프셋",
|
||||
"GPU Voltage Table": "GPU 전압 테이블",
|
||||
"GPU Custom Table (mV)": "GPU 사용자 정의 테이블(mV)",
|
||||
"Official Service": "공식 서비스",
|
||||
"96.6% limit": "96.6% 한도",
|
||||
"99.7% limit": "99.7% 한도",
|
||||
" Setting GPU Clocks past": "GPU 클럭을 초과 설정",
|
||||
"1228MHz without a proper undervolt": "적절한 언더볼트 없이 1228MHz",
|
||||
"can cause degradation or damage": "열화 또는 손상을 유발할 수 있습니다",
|
||||
"to your console!": "콘솔에!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "UV 없이 1075MHz, SLT에서 1152MHz",
|
||||
"or 1228MHz on HiOPT can cause ": "또는 HiOPT에서 1228MHz를 사용하면",
|
||||
"permanent damage to your Switch!": "스위치가 영구적으로 손상될 수 있습니다!",
|
||||
"921MHz without UV and 960MHz on": "UV가 없는 경우 921MHz, 켜진 경우에는 960MHz",
|
||||
"SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다."
|
||||
"SLT or HiOPT can cause ": "SLT 또는 HiOPT는 다음을 유발할 수 있습니다.",
|
||||
|
||||
"Default (Mariko)": "기본값(마리코)",
|
||||
"Default (Erista)": "기본값(에리스타)",
|
||||
"Rating": "표준값",
|
||||
"Safe Max (Mariko)": "안전함 최대치(마리코)",
|
||||
"Safe Max (Erista)": "안전함 최대치(에리스타)",
|
||||
|
||||
"Voltages": "전압",
|
||||
"RAM Voltage:": "RAM 전압:",
|
||||
"Display Voltage:": "디스플레이 전압:",
|
||||
"Temperatures": "온도",
|
||||
"PLLX Temp:": "PLLX 온도:",
|
||||
"AOTAG Temp:": "AOTAG 온도:",
|
||||
"BQ24193 Temp:": "BQ24193 온도:",
|
||||
"Normal": "정상",
|
||||
"Warm": "따뜻함",
|
||||
"Hot": "뜨거움",
|
||||
"Overheat": "과열",
|
||||
"Not Patched": "패치 안 됨",
|
||||
"Invalid": "유효하지 않음",
|
||||
"RAM Bandwidth": "RAM 대역폭",
|
||||
"RAM BW (Peak):": "RAM 대역폭 (최대):",
|
||||
"RAM BW (All):": "RAM 대역폭 (전체):",
|
||||
"RAM BW (CPU):": "RAM 대역폭 (CPU):",
|
||||
"RAM BW (GPU):": "RAM 대역폭 (GPU):",
|
||||
"Hardware Info": "하드웨어 정보",
|
||||
"Console Type:": "콘솔 유형:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAM 모듈: ",
|
||||
"Software Info": "소프트웨어 정보",
|
||||
"KIP version:": "KIP 버전:",
|
||||
"sys-dock status:": "sys-dock 상태:",
|
||||
"SaltyNX status:": "SaltyNX 상태:",
|
||||
"RR Display status:": "RR 표시 상태:",
|
||||
"Wafer Position:": "웨이퍼 위치:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "모듈:",
|
||||
"Board": "보드",
|
||||
"Display": "디스플레이",
|
||||
|
||||
"Developers": "개발자",
|
||||
"Contributors": "기여자",
|
||||
"Testers": "테스터",
|
||||
"Translators": "번역자",
|
||||
"Special Thanks": "특별한 분",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%umV",
|
||||
"Compiling with minimal features": "최소한의 기능으로 컴파일하기",
|
||||
"THE BEER-WARE LICENSE": "맥주 제품 라이센스"
|
||||
}
|
||||
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "Informatie",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "module:",
|
||||
"sys-dock status:": "sys-dock-status:",
|
||||
"SaltyNX status:": "SaltyNX-status:",
|
||||
"RR Display status:": "RR Weergavestatus:",
|
||||
"Wafer Position:": "Waferpositie:",
|
||||
"Credits": "Kredieten",
|
||||
"Developers": "Ontwikkelaars",
|
||||
"Contributors": "Bijdragers",
|
||||
"Testers": "Testers",
|
||||
"Special Thanks": "Speciale dank",
|
||||
"Unknown": "Onbekend",
|
||||
"Installed": "Geïnstalleerd",
|
||||
"Not Installed": "Niet geïnstalleerd",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN",
|
||||
"Default": "Standaard",
|
||||
"Do Not Override": "Niet overschrijven",
|
||||
"Do not override": "Niet overschrijven",
|
||||
"Disabled": "Uitgeschakeld",
|
||||
"Enabled": "Ingeschakeld",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Opnieuw instellen",
|
||||
"Display": "Weergave",
|
||||
"Application changed\\n\\n": "Applicatie gewijzigd\\n\\n",
|
||||
"The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n",
|
||||
"while editing was going on.": "terwijl er werd bewerkt.",
|
||||
"Board": "Bord",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Ingeschakeld (standaard)",
|
||||
"Enable": "Inschakelen",
|
||||
"Fatal error": "Fatale fout",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Kan geen verbinding maken met hoc-clk sysmodule.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Zorg ervoor dat alles in orde is\\n\\n",
|
||||
"correctly installed and enabled.": "correct geïnstalleerd en ingeschakeld.",
|
||||
"Fatal error": "Fatale fout",
|
||||
|
||||
"Edit App Profile": "App-profiel bewerken",
|
||||
"Edit Global Profile": "Globaal profiel bewerken",
|
||||
"Temporary Overrides": "Tijdelijke overschrijvingen",
|
||||
"Temporary Overrides ": "Tijdelijke overschrijvingen",
|
||||
" Reset": " Opnieuw instellen",
|
||||
"Settings": "Instellingen",
|
||||
"About": "Over",
|
||||
"Credits": "Kredieten",
|
||||
|
||||
"Application changed\\n\\n": "Applicatie gewijzigd\\n\\n",
|
||||
"The running application changed\\n\\n": "De actieve applicatie is gewijzigd\\n\\n",
|
||||
"while editing was going on.": "terwijl er werd bewerkt.",
|
||||
|
||||
"Sleep Mode": "Slaapmodus",
|
||||
"Stock": "Voorraad",
|
||||
"Dev OC": "Ontwikkelaar OC",
|
||||
"Boost Mode": "Boost-modus",
|
||||
"Safe Max": "Veilig Max",
|
||||
"Unsafe Max": "OnveiligMax",
|
||||
"Unsafe Max": "Onveilig Max",
|
||||
"Absolute Max": "Absoluut Max",
|
||||
"Handheld Safe Max": "Handkluis Max",
|
||||
"Enable": "Inschakelen",
|
||||
"Edit App Profile": "App-profiel bewerken",
|
||||
"Edit Global Profile": "Globaal profiel bewerken",
|
||||
"Temporary Overrides": "Tijdelijke overschrijvingen",
|
||||
"Settings": "Instellingen",
|
||||
"About": "Over",
|
||||
"Compiling with minimal features": "Compileren met minimale functies",
|
||||
"Handheld Safe Max": "Handheld Veilig Max",
|
||||
|
||||
"General Settings": "Algemene instellingen",
|
||||
"Governor Settings": "Gouverneur instellingen",
|
||||
"Safety Settings": "Veiligheidsinstellingen",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "CPU-instellingen",
|
||||
"GPU Settings": "GPU-instellingen",
|
||||
"Display Settings": "Weergave-instellingen",
|
||||
"Experimental Settings": "Experimentele instellingen",
|
||||
"Experimental": "Experimenteel",
|
||||
|
||||
" Settings marked in blue": "In blauw gemarkeerde instellingen",
|
||||
"don't require a reboot to apply!": "vereisen geen herstart om toe te passen!",
|
||||
"You can also press to show": "Druk ook op om te tonen",
|
||||
"information about each setting.": "informatie over elke instelling.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Experimentele instellingen zijn onvolledig",
|
||||
"and may not work correctly or at all!": "en werken mogelijk helemaal niet!",
|
||||
"Here be dragons!": "Hier zijn draken!",
|
||||
|
||||
"RAM Voltage Display Mode": "Weergavemodus RAM-spanning",
|
||||
"RAM Display Unit": "RAM-weergave-eenheid",
|
||||
"Polling Interval": "Polling-interval",
|
||||
|
||||
"GPU Scheduling Override Method": "Methode voor het overschrijven van GPU-planning",
|
||||
"GPU Scheduling Override": "GPU-planning negeren",
|
||||
"GPU Boot Volt": "GPU opstartspanning",
|
||||
"GPU Boot Voltage": "GPU opstartspanning",
|
||||
"Memory Frequency Measurement Mode": "Geheugenfrequentie-meetmodus",
|
||||
" Overriding the charge current": "Het overschrijven van de laadstroom",
|
||||
"can be dangerous and may cause": "kan gevaarlijk zijn en kan veroorzaken",
|
||||
"damage to your battery or charger!": "schade aan uw accu of lader!",
|
||||
"Charge Current Override": "Laadstroom overschrijven",
|
||||
"RAM Voltage Display Mode": "Weergavemodus RAM-spanning",
|
||||
"Polling Interval": "Polling-interval",
|
||||
"Display Color Preset": "Kleurvoorinstelling",
|
||||
"Basic": "Basis",
|
||||
"Saturated": "Verzadigd",
|
||||
"Washed": "Uitgewassen",
|
||||
"Natural": "Natuurlijk",
|
||||
"Vivid": "Levendig",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Minimale frequentie CPU-regelaar",
|
||||
" Usage of unsafe display": "Het gebruik van onveilige schermfrequenties",
|
||||
"refresh rates may cause stress": "vernieuwingsfrequenties kunnen stress veroorzaken",
|
||||
"or damage to your display! ": "of schade aan uw display!",
|
||||
"Proceed at your own risk!": "Ga verder op eigen risico!",
|
||||
"Max Handheld Display": "Maximaal handheld-display",
|
||||
"Max Handheld Display Hz": "Max handheld Hz",
|
||||
"Display Clock": "Klok weergeven",
|
||||
" Adjust the display voltage": "Pas de displayspanning aan",
|
||||
"with caution to avoid damage": "met voorzichtigheid om schade te vermijden",
|
||||
"to your display panel! ": "van uw beeldschermpaneel!",
|
||||
"Display Voltage": "Displayspanning",
|
||||
|
||||
"Thermal Throttle Limit": "Thermische gaslimiet",
|
||||
"Official Rating": "Officiële beoordeling",
|
||||
"TDP Threshold": "TDP-drempel",
|
||||
"Power": "Macht",
|
||||
"Thermal Throttle Limit": "Thermische gaslimiet",
|
||||
"HP Mode": "HP-modus",
|
||||
"Default (Mariko)": "Standaard (Mariko)",
|
||||
"Default (Erista)": "Standaard (Erista)",
|
||||
"Rating": "Beoordeling",
|
||||
"Safe Max (Mariko)": "Veilig Max (Mariko)",
|
||||
"Safe Max (Erista)": "Veilige Max (Erista)",
|
||||
|
||||
"DVB Shift": "DVB-verschuiving",
|
||||
"SoC Max Volt": "SoC max spanning",
|
||||
"Step Mode": "Stappmodus",
|
||||
"RAM VDD2 Voltage": "RAM VDD2-spanning",
|
||||
"Voltage": "Spanning",
|
||||
"RAM VDDQ Voltage": "RAM VDDQ-spanning",
|
||||
"Voltage": "Spanning",
|
||||
"RAM Frequency Editor": "RAM-frequentie-editor",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Hoge snelheid nodig!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme snelheidsmeter/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme snelheidsmeter/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme snelheidsmeter/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke snelheidsmeter/PLL nodig)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke snelheidsmeter/PLL nodig)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke snelheidsmeter/PLL nodig)",
|
||||
"Ram Max Clock": "Ram Max-klok",
|
||||
"RAM Latency Editor": "RAM-latentie-editor",
|
||||
"RAM Timing Reductions": "RAM-timingreducties",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Geheugenlatenties",
|
||||
"Read Latency": "Lees Latentie",
|
||||
"Write Latency": "Schrijf latentie",
|
||||
"High speedo needed!": "Hoge Speedo-waarde nodig!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (vereist extreme Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (vereist extreme Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (vereist extreme Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (heeft een belachelijke Speedo/PLL nodig)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (heeft een belachelijke Speedo/PLL nodig)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (heeft een belachelijke Speedo/PLL nodig)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "CPU-boostklok",
|
||||
"CPU UV": "CPU-UV",
|
||||
"CPU Unlock": "CPU-ontgrendeling",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "CPU Hoge UV",
|
||||
"CPU Low VMIN": "CPU Lage VMIN",
|
||||
"CPU High VMIN": "CPU Hoge VMIN",
|
||||
|
||||
"No Undervolt": "Geen ondervolt",
|
||||
"SLT Table": "SLT-tabel",
|
||||
"HiOPT Table": "HiOPT-tabel",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU-VMIN",
|
||||
"GPU Maximum Voltage": "GPU maximale spanning",
|
||||
"GPU Voltage Offset": "GPU-spanningsoffset",
|
||||
"Do not override": "Niet overschrijven",
|
||||
"Enabled (Default)": "Ingeschakeld (standaard)",
|
||||
"96.6% limit": "96,6% limiet",
|
||||
"99.7% limit": "99,7% limiet",
|
||||
"GPU Scheduling Override": "GPU-planning negeren",
|
||||
"Official Service": "Officiële dienst",
|
||||
"GPU DVFS Mode": "GPU DVFS-modus",
|
||||
"GPU DVFS Offset": "GPU DVFS-offset",
|
||||
"GPU Voltage Table": "GPU-spanningstabel",
|
||||
"GPU Custom Table (mV)": "Aangepaste GPU-tabel (mV)",
|
||||
"Official Service": "Officiële dienst",
|
||||
"96.6% limit": "96,6% limiet",
|
||||
"99.7% limit": "99,7% limiet",
|
||||
" Setting GPU Clocks past": "GPU-klokken instellen voorbij",
|
||||
"1228MHz without a proper undervolt": "1228MHz zonder goede onderspanning",
|
||||
"can cause degradation or damage": "kan degradatie of schade veroorzaken",
|
||||
"to your console!": "aan uw console!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075MHz zonder UV, 1152MHz op SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "of 1228MHz op HiOPT kan dit veroorzaken",
|
||||
"permanent damage to your Switch!": "blijvende schade aan uw Switch!",
|
||||
"921MHz without UV and 960MHz on": "921MHz zonder UV en 960MHz aan",
|
||||
"SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken"
|
||||
"SLT or HiOPT can cause ": "SLT of HiOPT kunnen dit veroorzaken",
|
||||
|
||||
"Default (Mariko)": "Standaard (Mariko)",
|
||||
"Default (Erista)": "Standaard (Erista)",
|
||||
"Rating": "Beoordeling",
|
||||
"Safe Max (Mariko)": "Veilig Max (Mariko)",
|
||||
"Safe Max (Erista)": "Veilige Max (Erista)",
|
||||
|
||||
"Voltages": "Spanningen",
|
||||
"RAM Voltage:": "RAM-spanning:",
|
||||
"Display Voltage:": "Displayspanning:",
|
||||
"Temperatures": "Temperaturen",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normaal",
|
||||
"Warm": "Warm",
|
||||
"Hot": "Heet",
|
||||
"Overheat": "Oververhitting",
|
||||
"Not Patched": "Niet gepatcht",
|
||||
"Invalid": "Ongeldig",
|
||||
"RAM Bandwidth": "RAM-bandbreedte",
|
||||
"RAM BW (Peak):": "RAM-BW (Piek):",
|
||||
"RAM BW (All):": "RAM-BW (Alle):",
|
||||
"RAM BW (CPU):": "RAM-BW (CPU):",
|
||||
"RAM BW (GPU):": "RAM-BW (GPU):",
|
||||
"Hardware Info": "Hardware-info",
|
||||
"Console Type:": "Consoletype:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAM-module: ",
|
||||
"Software Info": "Software-info",
|
||||
"KIP version:": "KIP-versie:",
|
||||
"sys-dock status:": "sys-dock-status:",
|
||||
"SaltyNX status:": "SaltyNX-status:",
|
||||
"RR Display status:": "RR Weergavestatus:",
|
||||
"Wafer Position:": "Waferpositie:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "module:",
|
||||
"Board": "Bord",
|
||||
"Display": "Weergave",
|
||||
|
||||
"Developers": "Ontwikkelaars",
|
||||
"Contributors": "Bijdragers",
|
||||
"Testers": "Testers",
|
||||
"Translators": "Vertalers",
|
||||
"Special Thanks": "Speciale dank",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Compileren met minimale functies",
|
||||
"THE BEER-WARE LICENSE": "DE LICENTIE VOOR BIERWAREN"
|
||||
}
|
||||
|
||||
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "Informacje",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Moduł:",
|
||||
"sys-dock status:": "stan sys-dock:",
|
||||
"SaltyNX status:": "Stan SaltyNX:",
|
||||
"RR Display status:": "Stan wyświetlacza:",
|
||||
"Wafer Position:": "Pozycja wafla:",
|
||||
"Credits": "Kredyty",
|
||||
"Developers": "Deweloperzy",
|
||||
"Contributors": "Współautorzy",
|
||||
"Testers": "Testery",
|
||||
"Special Thanks": "Specjalne podziękowania",
|
||||
"Unknown": "Nieznany",
|
||||
"Installed": "Zainstalowany",
|
||||
"Not Installed": "Nie zainstalowano",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE",
|
||||
"Default": "Domyślne",
|
||||
"Do Not Override": "Nie zastępuj",
|
||||
"Disabled": "Niepełnosprawny",
|
||||
"Do not override": "Nie zastępuj",
|
||||
"Disabled": "Wyłączony",
|
||||
"Enabled": "Włączone",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Zresetuj",
|
||||
"Display": "Wyświetlacz",
|
||||
"Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n",
|
||||
"The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n",
|
||||
"while editing was going on.": "podczas gdy edycja była w toku.",
|
||||
"Board": "Deska",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Włączone (domyślnie)",
|
||||
"Enable": "Włącz",
|
||||
"Fatal error": "Fatalny błąd",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Nie można połączyć się z modułem sysmodule hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Upewnij się, że wszystko jest\\n\\n",
|
||||
"correctly installed and enabled.": "poprawnie zainstalowany i włączony.",
|
||||
"Fatal error": "Fatalny błąd",
|
||||
|
||||
"Edit App Profile": "Edytuj profil aplikacji",
|
||||
"Edit Global Profile": "Edytuj profil globalny",
|
||||
"Temporary Overrides": "Tymczasowe nadpisania",
|
||||
"Temporary Overrides ": "Tymczasowe nadpisania",
|
||||
" Reset": " Zresetuj",
|
||||
"Settings": "Ustawienia",
|
||||
"About": "O",
|
||||
"Credits": "Kredyty",
|
||||
|
||||
"Application changed\\n\\n": "Aplikacja została zmieniona\\n\\n",
|
||||
"The running application changed\\n\\n": "Działająca aplikacja została zmieniona\\n\\n",
|
||||
"while editing was going on.": "podczas gdy edycja była w toku.",
|
||||
|
||||
"Sleep Mode": "Tryb uśpienia",
|
||||
"Stock": "Zapas",
|
||||
"Dev OC": "Dev OC",
|
||||
@@ -39,14 +35,8 @@
|
||||
"Safe Max": "Bezpieczny maks",
|
||||
"Unsafe Max": "Niebezpieczny maks",
|
||||
"Absolute Max": "Absolutny maks",
|
||||
"Handheld Safe Max": "Sejf ręczny Max",
|
||||
"Enable": "Włącz",
|
||||
"Edit App Profile": "Edytuj profil aplikacji",
|
||||
"Edit Global Profile": "Edytuj profil globalny",
|
||||
"Temporary Overrides": "Tymczasowe nadpisania",
|
||||
"Settings": "Ustawienia",
|
||||
"About": "O",
|
||||
"Compiling with minimal features": "Kompilacja z minimalnymi funkcjami",
|
||||
"Handheld Safe Max": "Przenośny bezpieczny maks",
|
||||
|
||||
"General Settings": "Ustawienia ogólne",
|
||||
"Governor Settings": "Ustawienia gubernatora",
|
||||
"Safety Settings": "Ustawienia bezpieczeństwa",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "Ustawienia procesora",
|
||||
"GPU Settings": "Ustawienia GPU",
|
||||
"Display Settings": "Ustawienia wyświetlania",
|
||||
"Experimental Settings": "Ustawienia eksperymentalne",
|
||||
"Experimental": "Eksperymentalny",
|
||||
|
||||
" Settings marked in blue": "Ustawienia zaznaczone na niebiesko",
|
||||
"don't require a reboot to apply!": "nie wymagają ponownego uruchomienia!",
|
||||
"You can also press to show": "Możesz też wcisnąć aby wyświetlić",
|
||||
"information about each setting.": "informacje o każdym ustawieniu.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Ustawienia eksperymentalne są niekompletne",
|
||||
"and may not work correctly or at all!": "i mogą w ogóle nie działać!",
|
||||
"Here be dragons!": "Tu są smoki!",
|
||||
|
||||
"RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM",
|
||||
"RAM Display Unit": "Jednostka wyświetlania RAM",
|
||||
"Polling Interval": "Interwał odpytywania",
|
||||
|
||||
"GPU Scheduling Override Method": "Metoda obejścia harmonogramu GPU",
|
||||
"GPU Scheduling Override": "Zastąpienie harmonogramu GPU",
|
||||
"GPU Boot Volt": "Napięcie startowe GPU",
|
||||
"GPU Boot Voltage": "Napięcie startowe GPU",
|
||||
"Memory Frequency Measurement Mode": "Tryb pomiaru częstotliwości pamięci",
|
||||
" Overriding the charge current": "Nadpisanie prądu ładowania",
|
||||
"can be dangerous and may cause": "może być niebezpieczne i powodować",
|
||||
"damage to your battery or charger!": "uszkodzenie akumulatora lub ładowarki!",
|
||||
"Charge Current Override": "Obejście prądu ładowania",
|
||||
"RAM Voltage Display Mode": "Tryb wyświetlania napięcia RAM",
|
||||
"Polling Interval": "Interwał odpytywania",
|
||||
"Display Color Preset": "Preset koloru",
|
||||
"Basic": "Podstawowy",
|
||||
"Saturated": "Nasycony",
|
||||
"Washed": "Wyblakły",
|
||||
"Natural": "Naturalny",
|
||||
"Vivid": "Żywy",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Minimalna częstotliwość regulatora procesora",
|
||||
" Usage of unsafe display": "Użycie niebezpiecznych częstotliwości",
|
||||
"refresh rates may cause stress": "częstotliwości odświeżania mogą powodować stres",
|
||||
"or damage to your display! ": "lub uszkodzenie wyświetlacza!",
|
||||
"Proceed at your own risk!": "Postępuj na własne ryzyko!",
|
||||
"Max Handheld Display": "Maksymalny wyświetlacz ręczny",
|
||||
"Max Handheld Display Hz": "Maks. Hz w trybie przenośnym",
|
||||
"Display Clock": "Wyświetl zegar",
|
||||
" Adjust the display voltage": "Dostosuj napięcie wyświetlacza",
|
||||
"with caution to avoid damage": "ostrożnie, aby uniknąć uszkodzeń",
|
||||
"to your display panel! ": "panelu wyświetlacza!",
|
||||
"Display Voltage": "Napięcie wyświetlacza",
|
||||
|
||||
"Thermal Throttle Limit": "Limit przepustnicy termicznej",
|
||||
"Official Rating": "Oficjalna ocena",
|
||||
"TDP Threshold": "Próg TDP",
|
||||
"Power": "Moc",
|
||||
"Thermal Throttle Limit": "Limit przepustnicy termicznej",
|
||||
"HP Mode": "Tryb HP",
|
||||
"Default (Mariko)": "Domyślny (Mariko)",
|
||||
"Default (Erista)": "Domyślny (Erista)",
|
||||
"Rating": "Ocena",
|
||||
"Safe Max (Mariko)": "Bezpieczny Max (Mariko)",
|
||||
"Safe Max (Erista)": "Bezpieczny Max (Erista)",
|
||||
|
||||
"DVB Shift": "Przesunięcie DVB",
|
||||
"SoC Max Volt": "Maks. napięcie SoC",
|
||||
"Step Mode": "Tryb krokowy",
|
||||
"RAM VDD2 Voltage": "Napięcie pamięci RAM VDD2",
|
||||
"Voltage": "Napięcie",
|
||||
"RAM VDDQ Voltage": "Napięcie RAM VDDQ",
|
||||
"Voltage": "Napięcie",
|
||||
"RAM Frequency Editor": "Edytor częstotliwości RAM",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Potrzebna duża prędkość!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"Ram Max Clock": "Zegar Ram Max",
|
||||
"RAM Latency Editor": "Edytor opóźnień pamięci RAM",
|
||||
"RAM Timing Reductions": "Zmniejszenie taktowania pamięci RAM",
|
||||
@@ -100,8 +113,17 @@
|
||||
"t7 tWTR Fine Tune": "t7 tWTR Dostosuj",
|
||||
"tWTR Fine Tune": "tWTR Dostosuj",
|
||||
"Memory Latencies": "Opóźnienia pamięci",
|
||||
"Read Latency": "Przeczytaj Opóźnienie",
|
||||
"Read Latency": "Opóźnienie odczytu",
|
||||
"Write Latency": "Opóźnienie zapisu",
|
||||
"High speedo needed!": "Potrzebna duża wartość Speedo!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (wymaga ekstremalnego Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (potrzebuje śmiesznego Speedo/PLL)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "Zegar wzmocnienia procesora",
|
||||
"CPU UV": "Procesor UV",
|
||||
"CPU Unlock": "Odblokowanie procesora",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "Wysokie promieniowanie UV procesora",
|
||||
"CPU Low VMIN": "Niski poziom VMIN procesora",
|
||||
"CPU High VMIN": "Wysoki poziom VMIN procesora",
|
||||
|
||||
"No Undervolt": "Brak Undervolta",
|
||||
"SLT Table": "Stół SLT",
|
||||
"HiOPT Table": "Stół HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "VMIN GPU",
|
||||
"GPU Maximum Voltage": "Maksymalne napięcie procesora graficznego",
|
||||
"GPU Voltage Offset": "Przesunięcie napięcia GPU",
|
||||
"Do not override": "Nie zastępuj",
|
||||
"Enabled (Default)": "Włączone (domyślnie)",
|
||||
"96.6% limit": "Limit 96,6%.",
|
||||
"99.7% limit": "Limit 99,7%.",
|
||||
"GPU Scheduling Override": "Zastąpienie harmonogramu GPU",
|
||||
"Official Service": "Oficjalny serwis",
|
||||
"GPU DVFS Mode": "Tryb DVFS procesora graficznego",
|
||||
"GPU DVFS Offset": "Przesunięcie DVFS GPU",
|
||||
"GPU Voltage Table": "Tabela napięć GPU",
|
||||
"GPU Custom Table (mV)": "Tabela niestandardowa GPU (mV)",
|
||||
"Official Service": "Oficjalny serwis",
|
||||
"96.6% limit": "Limit 96,6%",
|
||||
"99.7% limit": "Limit 99,7%",
|
||||
" Setting GPU Clocks past": "Ustawianie zegarów GPU powyżej",
|
||||
"1228MHz without a proper undervolt": "1228 MHz bez odpowiedniego undervolta",
|
||||
"can cause degradation or damage": "może powodować degradację lub uszkodzenia",
|
||||
"to your console!": "Twoją konsolę!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 MHz bez UV, 1152 MHz na SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "lub 1228 MHz na HiOPT może powodować",
|
||||
"permanent damage to your Switch!": "trwałe uszkodzenie Switcha!",
|
||||
"921MHz without UV and 960MHz on": "921 MHz bez UV i 960 MHz włączone",
|
||||
"SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT"
|
||||
"SLT or HiOPT can cause ": "Przyczyną mogą być SLT lub HiOPT",
|
||||
|
||||
"Default (Mariko)": "Domyślny (Mariko)",
|
||||
"Default (Erista)": "Domyślny (Erista)",
|
||||
"Rating": "Ocena",
|
||||
"Safe Max (Mariko)": "Bezpieczny Max (Mariko)",
|
||||
"Safe Max (Erista)": "Bezpieczny Max (Erista)",
|
||||
|
||||
"Voltages": "Napięcia",
|
||||
"RAM Voltage:": "Napięcie RAM:",
|
||||
"Display Voltage:": "Napięcie wyświetlacza:",
|
||||
"Temperatures": "Temperatury",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normalny",
|
||||
"Warm": "Ciepły",
|
||||
"Hot": "Gorący",
|
||||
"Overheat": "Przegrzanie",
|
||||
"Not Patched": "Bez patcha",
|
||||
"Invalid": "Nieprawidłowy",
|
||||
"RAM Bandwidth": "Przepustowość RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Maks.):",
|
||||
"RAM BW (All):": "BW RAM (Wszys.):",
|
||||
"RAM BW (CPU):": "BW RAM (CPU):",
|
||||
"RAM BW (GPU):": "BW RAM (GPU):",
|
||||
"Hardware Info": "Info o sprzęcie",
|
||||
"Console Type:": "Typ konsoli:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Moduł DRAM: ",
|
||||
"Software Info": "Info o oprogramowaniu",
|
||||
"KIP version:": "Wersja KIP:",
|
||||
"sys-dock status:": "stan sys-dock:",
|
||||
"SaltyNX status:": "Stan SaltyNX:",
|
||||
"RR Display status:": "Stan wyświetlacza:",
|
||||
"Wafer Position:": "Pozycja wafla:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Moduł:",
|
||||
"Board": "Deska",
|
||||
"Display": "Wyświetlacz",
|
||||
|
||||
"Developers": "Deweloperzy",
|
||||
"Contributors": "Współautorzy",
|
||||
"Testers": "Testery",
|
||||
"Translators": "Tłumacze",
|
||||
"Special Thanks": "Specjalne podziękowania",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Kompilacja z minimalnymi funkcjami",
|
||||
"THE BEER-WARE LICENSE": "LICENCJA NA WYROBY PIWNE"
|
||||
}
|
||||
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "Informação",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Módulo:",
|
||||
"sys-dock status:": "status do dock do sistema:",
|
||||
"SaltyNX status:": "Status do SaltyNX:",
|
||||
"RR Display status:": "Status de exibição do RR:",
|
||||
"Wafer Position:": "Posição da bolacha:",
|
||||
"Credits": "Créditos",
|
||||
"Developers": "Desenvolvedores",
|
||||
"Contributors": "Colaboradores",
|
||||
"Testers": "Testadores",
|
||||
"Special Thanks": "Agradecimentos especiais",
|
||||
"Unknown": "Desconhecido",
|
||||
"Installed": "Instalado",
|
||||
"Not Installed": "Não instalado",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA",
|
||||
"Default": "Padrão",
|
||||
"Do Not Override": "Não substituir",
|
||||
"Do not override": "Não substitua",
|
||||
"Disabled": "Desativado",
|
||||
"Enabled": "Habilitado",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Redefinir",
|
||||
"Display": "Exibição",
|
||||
"Application changed\\n\\n": "Aplicativo alterado\\n\\n",
|
||||
"The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n",
|
||||
"while editing was going on.": "enquanto a edição estava acontecendo.",
|
||||
"Board": "Conselho",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "Habilitado (padrão)",
|
||||
"Enable": "Habilitar",
|
||||
"Fatal error": "Erro fatal",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Não foi possível conectar-se ao sysmodule hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Verifique se tudo está\\n\\n",
|
||||
"correctly installed and enabled.": "corretamente instalado e ativado.",
|
||||
"Fatal error": "Erro fatal",
|
||||
|
||||
"Edit App Profile": "Editar perfil do aplicativo",
|
||||
"Edit Global Profile": "Editar perfil global",
|
||||
"Temporary Overrides": "Substituições temporárias",
|
||||
"Temporary Overrides ": "Substituições temporárias",
|
||||
" Reset": " Redefinir",
|
||||
"Settings": "Configurações",
|
||||
"About": "Sobre",
|
||||
"Credits": "Créditos",
|
||||
|
||||
"Application changed\\n\\n": "Aplicativo alterado\\n\\n",
|
||||
"The running application changed\\n\\n": "O aplicativo em execução foi alterado\\n\\n",
|
||||
"while editing was going on.": "enquanto a edição estava acontecendo.",
|
||||
|
||||
"Sleep Mode": "Modo de suspensão",
|
||||
"Stock": "Estoque",
|
||||
"Stock": "Padrão de fábrica",
|
||||
"Dev OC": "Desenvolvedor OC",
|
||||
"Boost Mode": "Modo de reforço",
|
||||
"Safe Max": "Máx. Seguro",
|
||||
"Unsafe Max": "Máximo inseguro",
|
||||
"Absolute Max": "Máximo absoluto",
|
||||
"Handheld Safe Max": "Portátil Seguro Máx.",
|
||||
"Enable": "Habilitar",
|
||||
"Edit App Profile": "Editar perfil do aplicativo",
|
||||
"Edit Global Profile": "Editar perfil global",
|
||||
"Temporary Overrides": "Substituições temporárias",
|
||||
"Settings": "Configurações",
|
||||
"About": "Sobre",
|
||||
"Compiling with minimal features": "Compilando com recursos mínimos",
|
||||
|
||||
"General Settings": "Configurações Gerais",
|
||||
"Governor Settings": "Configurações do Governador",
|
||||
"Safety Settings": "Configurações de segurança",
|
||||
@@ -55,42 +45,65 @@
|
||||
"CPU Settings": "Configurações de CPU",
|
||||
"GPU Settings": "Configurações de GPU",
|
||||
"Display Settings": "Configurações de exibição",
|
||||
"Experimental Settings": "Configurações experimentais",
|
||||
"Experimental": "Experimental",
|
||||
|
||||
" Settings marked in blue": "Configurações marcadas em azul",
|
||||
"don't require a reboot to apply!": "não requerem reinicialização para aplicar!",
|
||||
"You can also press to show": "Pressione também para mostrar",
|
||||
"information about each setting.": "informações sobre cada configuração.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Configurações experimentais incompletas",
|
||||
"and may not work correctly or at all!": "e podem não funcionar corretamente!",
|
||||
"Here be dragons!": "Aqui há dragões!",
|
||||
|
||||
"RAM Voltage Display Mode": "Modo de exibição de tensão RAM",
|
||||
"RAM Display Unit": "Unidade de exibição de RAM",
|
||||
"Polling Interval": "Intervalo de sondagem",
|
||||
|
||||
"GPU Scheduling Override Method": "Método de substituição de agendamento de GPU",
|
||||
"GPU Scheduling Override": "Substituição de agendamento de GPU",
|
||||
"GPU Boot Volt": "Tensão de inicialização da GPU",
|
||||
"GPU Boot Voltage": "Tensão de inicialização da GPU",
|
||||
"Memory Frequency Measurement Mode": "Modo de medição de frequência de memória",
|
||||
" Overriding the charge current": "Substituir a corrente de carga",
|
||||
"can be dangerous and may cause": "pode ser perigoso e causar",
|
||||
"damage to your battery or charger!": "danos à sua bateria ou carregador!",
|
||||
"Charge Current Override": "Substituição de corrente de carga",
|
||||
"RAM Voltage Display Mode": "Modo de exibição de tensão RAM",
|
||||
"Polling Interval": "Intervalo de votação",
|
||||
"Display Color Preset": "Predefinição de cor",
|
||||
"Basic": "Básico",
|
||||
"Saturated": "Saturado",
|
||||
"Washed": "Desbotado",
|
||||
"Natural": "Natural",
|
||||
"Vivid": "Vívido",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Frequência Mínima do Governador da CPU",
|
||||
" Usage of unsafe display": "O uso de frequências de tela",
|
||||
"refresh rates may cause stress": "taxas de atualização podem causar estresse",
|
||||
"or damage to your display! ": "ou danos ao seu monitor!",
|
||||
"Proceed at your own risk!": "Prossiga por sua conta e risco!",
|
||||
"Max Handheld Display": "Visor portátil máximo",
|
||||
"Max Handheld Display Hz": "Hz máximo em modo portátil",
|
||||
"Display Clock": "Exibir relógio",
|
||||
" Adjust the display voltage": "Ajuste a tensão do display",
|
||||
"with caution to avoid damage": "com cuidado para evitar danos",
|
||||
"to your display panel! ": "ao painel do display!",
|
||||
"Display Voltage": "Tensão do display",
|
||||
|
||||
"Thermal Throttle Limit": "Limite de aceleração térmica",
|
||||
"Official Rating": "Classificação Oficial",
|
||||
"TDP Threshold": "Limite de TDP",
|
||||
"Power": "Poder",
|
||||
"Thermal Throttle Limit": "Limite de aceleração térmica",
|
||||
"Power": "Potência",
|
||||
"HP Mode": "Modo HP",
|
||||
"Default (Mariko)": "Padrão (Mariko)",
|
||||
"Default (Erista)": "Padrão (Erista)",
|
||||
"Rating": "Avaliação",
|
||||
"Safe Max (Mariko)": "Máximo Seguro (Mariko)",
|
||||
"Safe Max (Erista)": "Seguro Max (Erista)",
|
||||
|
||||
"DVB Shift": "Deslocamento DVB",
|
||||
"SoC Max Volt": "Tensão máxima do SoC",
|
||||
"Step Mode": "Modo passo",
|
||||
"RAM VDD2 Voltage": "Tensão RAM VDD2",
|
||||
"Voltage": "Tensão",
|
||||
"RAM VDDQ Voltage": "Tensão RAM VDDQ",
|
||||
"Voltage": "Tensão",
|
||||
"RAM Frequency Editor": "Editor de frequência RAM",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Alta velocidade necessária!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)",
|
||||
"Ram Max Clock": "Relógio máximo de Ram",
|
||||
"Ram Max Clock": "Frequência máxima de Ram",
|
||||
"RAM Latency Editor": "Editor de latência de RAM",
|
||||
"RAM Timing Reductions": "Reduções de tempo de RAM",
|
||||
"Memory Timings": "Tempos de memória",
|
||||
@@ -102,6 +115,15 @@
|
||||
"Memory Latencies": "Latências de memória",
|
||||
"Read Latency": "Latência de leitura",
|
||||
"Write Latency": "Latência de gravação",
|
||||
"High speedo needed!": "Alto valor de Speedo necessário!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (precisa de Speedo/PLL extremo)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (precisa de Speedo/PLL extremo)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 MHz (precisa de Speedo/PLL extremo)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (precisa de Speedo/PLL ridículo)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (precisa de Speedo/PLL ridículo)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (precisa de Speedo/PLL ridículo)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "Relógio de aumento da CPU",
|
||||
"CPU UV": "UV da CPU",
|
||||
"CPU Unlock": "Desbloqueio da CPU",
|
||||
@@ -114,6 +136,7 @@
|
||||
"CPU High UV": "CPU alta UV",
|
||||
"CPU Low VMIN": "CPU baixa VMIN",
|
||||
"CPU High VMIN": "VMIN alto da CPU",
|
||||
|
||||
"No Undervolt": "Sem subtensão",
|
||||
"SLT Table": "Tabela SLT",
|
||||
"HiOPT Table": "Tabela HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "Tensão máxima da GPU",
|
||||
"GPU Voltage Offset": "Compensação de tensão da GPU",
|
||||
"Do not override": "Não substitua",
|
||||
"Enabled (Default)": "Habilitado (padrão)",
|
||||
"96.6% limit": "Limite de 96,6%",
|
||||
"99.7% limit": "Limite de 99,7%",
|
||||
"GPU Scheduling Override": "Substituição de agendamento de GPU",
|
||||
"Official Service": "Serviço Oficial",
|
||||
"GPU DVFS Mode": "Modo GPU DVFS",
|
||||
"GPU DVFS Offset": "Deslocamento DVFS da GPU",
|
||||
"GPU Voltage Table": "Tabela de tensão da GPU",
|
||||
"GPU Custom Table (mV)": "Tabela personalizada de GPU (mV)",
|
||||
"Official Service": "Serviço Oficial",
|
||||
"96.6% limit": "Limite de 96,6%",
|
||||
"99.7% limit": "Limite de 99,7%",
|
||||
" Setting GPU Clocks past": "Definir clocks de GPU além de",
|
||||
"1228MHz without a proper undervolt": "1228MHz sem undervolt adequado",
|
||||
"can cause degradation or damage": "pode causar degradação ou danos",
|
||||
"to your console!": "ao seu console!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 MHz sem UV, 1152 MHz em SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "ou 1228 MHz em HiOPT pode causar",
|
||||
"permanent damage to your Switch!": "danos permanentes ao seu Switch!",
|
||||
"921MHz without UV and 960MHz on": "921 MHz sem UV e 960 MHz ativado",
|
||||
"SLT or HiOPT can cause ": "SLT ou HiOPT podem causar"
|
||||
"SLT or HiOPT can cause ": "SLT ou HiOPT podem causar",
|
||||
|
||||
"Default (Mariko)": "Padrão (Mariko)",
|
||||
"Default (Erista)": "Padrão (Erista)",
|
||||
"Rating": "Avaliação",
|
||||
"Safe Max (Mariko)": "Máximo Seguro (Mariko)",
|
||||
"Safe Max (Erista)": "Seguro Max (Erista)",
|
||||
|
||||
"Voltages": "Tensões",
|
||||
"RAM Voltage:": "Tensão RAM:",
|
||||
"Display Voltage:": "Tensão do display:",
|
||||
"Temperatures": "Temperaturas",
|
||||
"PLLX Temp:": "PLLX Temp:",
|
||||
"AOTAG Temp:": "AOTAG Temp:",
|
||||
"BQ24193 Temp:": "BQ24193 Temp:",
|
||||
"Normal": "Normal",
|
||||
"Warm": "Morno",
|
||||
"Hot": "Quente",
|
||||
"Overheat": "Superaquecimento",
|
||||
"Not Patched": "Não corrigido",
|
||||
"Invalid": "Inválido",
|
||||
"RAM Bandwidth": "Largura de banda RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Pico):",
|
||||
"RAM BW (All):": "BW RAM (Total):",
|
||||
"RAM BW (CPU):": "BW RAM (CPU):",
|
||||
"RAM BW (GPU):": "BW RAM (GPU):",
|
||||
"Hardware Info": "Info de hardware",
|
||||
"Console Type:": "Tipo de console:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Módulo DRAM: ",
|
||||
"Software Info": "Info de software",
|
||||
"KIP version:": "Versão KIP:",
|
||||
"sys-dock status:": "status do dock do sistema:",
|
||||
"SaltyNX status:": "Status do SaltyNX:",
|
||||
"RR Display status:": "Status de exibição do RR:",
|
||||
"Wafer Position:": "Posição do wafer:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Módulo:",
|
||||
"Board": "Placa",
|
||||
"Display": "Exibição",
|
||||
|
||||
"Developers": "Desenvolvedores",
|
||||
"Contributors": "Colaboradores",
|
||||
"Testers": "Testadores",
|
||||
"Translators": "Tradutores",
|
||||
"Special Thanks": "Agradecimentos especiais",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "Compilando com recursos mínimos",
|
||||
"THE BEER-WARE LICENSE": "A LICENÇA DE CERVEJA"
|
||||
}
|
||||
|
||||
@@ -1,38 +1,33 @@
|
||||
{
|
||||
"Information": "Информация",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Module:",
|
||||
"sys-dock status:": "Статус sys-dock:",
|
||||
"SaltyNX status:": "Статус SaltyNX:",
|
||||
"RR Display status:": "Статус RR Display:",
|
||||
"Wafer Position:": "Wafer Position:",
|
||||
"Credits": "Благодарности",
|
||||
"Developers": "Разработчики",
|
||||
"Contributors": "Внесли вклад",
|
||||
"Testers": "Тестеры",
|
||||
"Special Thanks": "Особая благодарность",
|
||||
"Unknown": "Неизвестно",
|
||||
"Installed": "Установлено",
|
||||
"Not Installed": "Не установлено",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "BEER-WARE LICENSE",
|
||||
"Default": "По умолчанию",
|
||||
"Do Not Override": "Не менять",
|
||||
"Do not override": "Не менять",
|
||||
"Disabled": "Отключено",
|
||||
"Enabled": "Включено",
|
||||
"Auto": "Авто",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Сброс",
|
||||
"Display": "Дисплей",
|
||||
"Application changed\\n\\n": "Приложение изменено\\n\\n",
|
||||
"The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n",
|
||||
"while editing was going on.": "пока шло редактирование.",
|
||||
"Board": "Board",
|
||||
"%u.%u%u mV": "%u.%u%u мВ",
|
||||
"Enabled (Default)": "Включено (По умолчанию)",
|
||||
"Enable": "Включено",
|
||||
"Fatal error": "Фатальная ошибка",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Не удалось подключиться к сис-модулю hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Пожалуйста, убедитесь, что все\\n\\n",
|
||||
"correctly installed and enabled.": "правильно установлено и включено.",
|
||||
"Fatal error": "Фатальная ошибка",
|
||||
|
||||
"Edit App Profile": "Профиль приложения",
|
||||
"Edit Global Profile": "Глобальный профиль",
|
||||
"Temporary Overrides": "Временный профиль",
|
||||
"Temporary Overrides ": "Временный профиль",
|
||||
" Reset": " Сброс",
|
||||
"Settings": "Настройки",
|
||||
"About": "Сведения",
|
||||
"Credits": "Благодарности",
|
||||
|
||||
"Application changed\\n\\n": "Приложение изменено\\n\\n",
|
||||
"The running application changed\\n\\n": "Запущенное приложение изменилось\\n\\n",
|
||||
"while editing was going on.": "пока шло редактирование.",
|
||||
|
||||
"Sleep Mode": "Спящий режим",
|
||||
"Stock": "Стандарт",
|
||||
"Dev OC": "Разгон dev-кита",
|
||||
@@ -41,15 +36,7 @@
|
||||
"Unsafe Max": "Опасный макс.",
|
||||
"Absolute Max": "Абсолютный макс.",
|
||||
"Handheld Safe Max": "Портативный безопасный макс.",
|
||||
"Enable": "Включено",
|
||||
"Edit App Profile": "Профиль приложения",
|
||||
"Edit Global Profile": "Глобальный профиль",
|
||||
"Temporary Overrides": "Временный профиль",
|
||||
"Settings": "Настройки",
|
||||
"About": "Сведения",
|
||||
"Compiling with minimal features": "Собрано с урезанием функций",
|
||||
"\uE150 Settings marked in blue": "Настройки помеченные синим",
|
||||
"don't require a reboot to apply!": "Синие настройки применяются сразу!",
|
||||
|
||||
"General Settings": "Основные настройки",
|
||||
"Governor Settings": "Настройки говернора",
|
||||
"Safety Settings": "Настройки безопасности",
|
||||
@@ -58,45 +45,76 @@
|
||||
"CPU Settings": "Настройки CPU",
|
||||
"GPU Settings": "Настройки GPU",
|
||||
"Display Settings": "Настройки дисплея",
|
||||
"Experimental": "Экспериментальный",
|
||||
"Enable Experimental Settings": "Экспериментальные настройки",
|
||||
"\uE150 Experimental Settings are incomplete ": "Экспериментальные настройки не закончены",
|
||||
"and may not work correctly or at all!": "Экспериментальные настройки не",
|
||||
"Here be dragons!": "закончены и могут не работать!",
|
||||
"Experimental Settings": "Экспериментальные",
|
||||
"Live CPU Undervolt": "Мгновенный андервольт CPU",
|
||||
"GPU Scheduling Override Method": "Метод перезаписи планировщика GPU",
|
||||
"Memory Frequency Measurement Mode": "Режим измерения частоты RAM",
|
||||
"\uE150 Overriding the charge current": "Перезапись зарядного тока может",
|
||||
"can be dangerous and may cause": "Перезапись зарядного тока может",
|
||||
"damage to your battery or charger!": "повреждить аккумулятор или зарядку!",
|
||||
"Charge Current Override": "Перезапись зарядного тока",
|
||||
"Experimental": "Экспериментальный",
|
||||
|
||||
" Settings marked in blue": "Настройки помеченные синим",
|
||||
"don't require a reboot to apply!": "Синие настройки применяются сразу!",
|
||||
"You can also press to show": "Нажмите для просмотра",
|
||||
"information about each setting.": "информацию о каждом параметре.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Экспериментальные настройки не закончены",
|
||||
"and may not work correctly or at all!": "Экспериментальные настройки могут не работать!",
|
||||
"Here be dragons!": "Здесь будут драконы!",
|
||||
|
||||
"RAM Voltage Display Mode": "Показ вольтажа RAM",
|
||||
"RAM Display Unit": "Показ единицы измерения RAM",
|
||||
"Polling Interval": "Интервал опроса",
|
||||
|
||||
"GPU Scheduling Override Method": "Метод перезаписи планировщика GPU",
|
||||
"GPU Scheduling Override": "Перезапись планировщика",
|
||||
"GPU Boot Volt": "Напряжение загрузки GPU",
|
||||
"GPU Boot Voltage": "Напряжение загрузки GPU",
|
||||
"Memory Frequency Measurement Mode": "Режим измерения частоты RAM",
|
||||
" Overriding the charge current": "Перезапись зарядного тока может",
|
||||
"can be dangerous and may cause": "Перезапись зарядного тока может",
|
||||
"damage to your battery or charger!": "повреждить аккумулятор или зарядку!",
|
||||
"Charge Current Override": "Перезапись зарядного тока",
|
||||
"Display Color Preset": "Цветовой пресет",
|
||||
"Basic": "Базовый",
|
||||
"Saturated": "Насыщенный",
|
||||
"Washed": "Бледный",
|
||||
"Natural": "Натуральный",
|
||||
"Vivid": "Яркий",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Минимальная частота говернора CPU",
|
||||
"\uE150 Usage of unsafe display": "\uE150 Использование не безопасной",
|
||||
" Usage of unsafe display": "Использование не безопасной",
|
||||
"refresh rates may cause stress": "Не безопасная частота",
|
||||
"or damage to your display! ": "может повредить ваш экран",
|
||||
"Proceed at your own risk!": "Действуйте на свой страх и риск!",
|
||||
"Max Handheld Display": "Макс. дисплей портатива",
|
||||
"Max Handheld Display Hz": "Макс. в портативе",
|
||||
"Display Clock": "Частота экрана",
|
||||
" Adjust the display voltage": "Настройте напряжение экрана",
|
||||
"with caution to avoid damage": "с осторожностью во избежание повреждений",
|
||||
"to your display panel! ": "повреждений экрана!",
|
||||
"Display Voltage": "Напряжение экрана",
|
||||
|
||||
"Thermal Throttle Limit": "Предел троттлинга",
|
||||
"Official Rating": "Официальный рейтинг",
|
||||
"TDP Threshold": "Порог TDP",
|
||||
"Power": "Мощность",
|
||||
"Thermal Throttle Limit": "Предел троттлинга",
|
||||
"HP Mode": "Режим HP",
|
||||
"Default (Mariko)": "По умолчанию (M)",
|
||||
"Default (Erista)": "По умолчанию (E)",
|
||||
"Rating": "Рейтинг",
|
||||
"Safe Max (Mariko)": "Сейф Макс (M)",
|
||||
"Safe Max (Erista)": "Сейф Макс (E)",
|
||||
"RAM VDD2 Voltage": "Вольтаж VDD2",
|
||||
"Voltage": "Вольтаж",
|
||||
"RAM VDDQ Voltage": "Вольтаж VDDQ",
|
||||
|
||||
"DVB Shift": "DVB сдвиг",
|
||||
"SoC Max Volt": "Макс. вольт SoC",
|
||||
"Step Mode": "Частотный шаг",
|
||||
"RAM VDD2 Voltage": "Вольтаж VDD2",
|
||||
"RAM VDDQ Voltage": "Вольтаж VDDQ",
|
||||
"Voltage": "Вольтаж",
|
||||
"RAM Frequency Editor": "Редактор частоты",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"Ram Max Clock": "Макс. частота",
|
||||
"RAM Latency Editor": "Редактор задержек",
|
||||
"RAM Timing Reductions": "Настройка таймингов",
|
||||
"Memory Timings": "Тайминги RAM",
|
||||
"Advanced": "Расширенные",
|
||||
"t6 tRTW Fine Tune": "Точная настройка t6 tRTW",
|
||||
"tRTW Fine Tune": "Точная настройка tRTW",
|
||||
"t7 tWTR Fine Tune": "Точная настройка t7 tWTR",
|
||||
"tWTR Fine Tune": "Точная настройка tWTR",
|
||||
"Memory Latencies": "Задержки памяти",
|
||||
"Read Latency": "Задержка чтения",
|
||||
"Write Latency": "Задержка записи",
|
||||
"High speedo needed!": "Для высоких speedo",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 MHz (нужны невероятные speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 MHz (нужны невероятные speedo/PLL)",
|
||||
@@ -104,43 +122,8 @@
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 MHz (нужны безумные speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 MHz (нужны безумные speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 MHz (нужны безумные speedo/PLL)",
|
||||
"Ram Max Clock": "Макс. частота",
|
||||
"RAM Latency Editor": "Редактор задержек",
|
||||
"1333 Latency Max": "1333 задержка",
|
||||
"1600 Latency Max": "1600 задержка",
|
||||
"1866 Latency Max": "1866 задержка",
|
||||
"2133 Latency Max": "2133 задержка",
|
||||
"RAM Timing Reductions": "Настройка таймингов",
|
||||
"Memory Timings": "Тайминги RAM",
|
||||
"RAM-Timing tBreak": "Разбитие таблицы таймингов",
|
||||
"Memory": "RAM",
|
||||
"mem": "RAM",
|
||||
"MEM": "RAM",
|
||||
"Profile": "Профиль",
|
||||
"Governor": "Говернор",
|
||||
"Advanced": "Расширенные",
|
||||
"Docked": "В доке",
|
||||
"Handheld": "Портатив",
|
||||
"Charging": "На зарядке",
|
||||
"USB Charger": "USB Зарядка",
|
||||
"PD Charger": "PD Зарядка",
|
||||
"Handheld TDP": "TPD в портативе",
|
||||
"Thermal Throttle": "Троттлинг",
|
||||
"Uncapped Clocks": "Максимальные частоты",
|
||||
"SoC DVB Shift": "SoC DVB сдвиг",
|
||||
"SoC Max Volt": "Макс. вольт SoC",
|
||||
"Overwrite Boost Mode": "Перезапись буста",
|
||||
"Display Refresh Rate Changing": "Изменение частоты экрана",
|
||||
"Low t6 tRTW": "Нижний t6 tRTW",
|
||||
"Low t7 tWTR": "Нижний t7 tWTR",
|
||||
"1333WL t2 RP Cap": "Предел 1333WL t2 RP",
|
||||
"t6 tRTW Fine Tune": " Точная настройка t6 tRTW",
|
||||
"tRTW Fine Tune": " Точная настройка tRTW",
|
||||
"t7 tWTR Fine Tune": " Точная настройка t7 tWTR",
|
||||
"tWTR Fine Tune": " Точная настройка tWTR",
|
||||
"Memory Latencies": "Задержки памяти",
|
||||
"Read Latency": "Задержка чтения",
|
||||
"Write Latency": "Задержка записи",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "Частота буста",
|
||||
"CPU UV": "Андервольт CPU",
|
||||
"CPU Unlock": "Разблокировка CPU",
|
||||
@@ -153,6 +136,7 @@
|
||||
"CPU High UV": "Андервольт верхних частот",
|
||||
"CPU Low VMIN": "Мин. вольт. нижних частот",
|
||||
"CPU High VMIN": "Мин. вольт. верхних частот",
|
||||
|
||||
"No Undervolt": "Без андервольта",
|
||||
"SLT Table": "Таблица SLT",
|
||||
"HiOPT Table": "Таблица HiOPT",
|
||||
@@ -162,18 +146,71 @@
|
||||
"GPU VMIN": "Мин. вольтаж",
|
||||
"GPU Maximum Voltage": "Макс. вольтаж",
|
||||
"GPU Voltage Offset": "Смещение вольтажа",
|
||||
"Do not override": "Не менять",
|
||||
"Enabled (Default)": "Включено (По умолчанию)",
|
||||
"96.6% limit": "≤96,6%",
|
||||
"99.7% limit": "≤99,7%",
|
||||
"GPU Scheduling Override": "Перезапись планировщика",
|
||||
"Official Service": "Официальная служба",
|
||||
"GPU DVFS Mode": "Режим DVFS",
|
||||
"GPU DVFS Offset": "Смещение DVFS",
|
||||
"GPU Voltage Table": "Таблица вольтажей",
|
||||
"GPU Custom Table (mV)": "Ручная таблица (мВ)",
|
||||
"\uE150 Setting GPU Clocks past": "\uE150 Установка частот GPU выше",
|
||||
"1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц",
|
||||
"Official Service": "Официальная служба",
|
||||
"96.6% limit": "≤96,6%",
|
||||
"99.7% limit": "≤99,7%",
|
||||
" Setting GPU Clocks past": "Установка частот GPU выше",
|
||||
"1228MHz without a proper undervolt": "Установка частот GPU выше 1228 МГц",
|
||||
"can cause degradation or damage": "без хорошего андервольта может",
|
||||
"to your console!": "повредить вашу консоль!"
|
||||
"to your console!": "повредить вашу консоль!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 МГц без UV, 1152 МГц на SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "или 1228 МГц на HiOPT может привести к",
|
||||
"permanent damage to your Switch!": "постоянному повреждению вашей Switch!",
|
||||
"921MHz without UV and 960MHz on": "921 МГц без UV и 960 МГц на",
|
||||
"SLT or HiOPT can cause ": "SLT или HiOPT могут привести к",
|
||||
|
||||
"Default (Mariko)": "По умолчанию (M)",
|
||||
"Default (Erista)": "По умолчанию (E)",
|
||||
"Rating": "Рейтинг",
|
||||
"Safe Max (Mariko)": "Сейф Макс (M)",
|
||||
"Safe Max (Erista)": "Сейф Макс (E)",
|
||||
|
||||
"Voltages": "Напряжения",
|
||||
"RAM Voltage:": "Напряжение RAM:",
|
||||
"Display Voltage:": "Напряжение дисплея:",
|
||||
"Temperatures": "Температуры",
|
||||
"PLLX Temp:": "PLLX Темп.:",
|
||||
"AOTAG Temp:": "AOTAG Темп.:",
|
||||
"BQ24193 Temp:": "BQ24193 Темп.:",
|
||||
"Normal": "Нормальная",
|
||||
"Warm": "Тёплая",
|
||||
"Hot": "Горячая",
|
||||
"Overheat": "Перегрев",
|
||||
"Not Patched": "Не пропатчено",
|
||||
"Invalid": "Недействительно",
|
||||
"RAM Bandwidth": "Пропускная способность RAM",
|
||||
"RAM BW (Peak):": "Полоса RAM (Макс.):",
|
||||
"RAM BW (All):": "Полоса RAM (Всего):",
|
||||
"RAM BW (CPU):": "Полоса RAM (CPU):",
|
||||
"RAM BW (GPU):": "Полоса RAM (GPU):",
|
||||
"Hardware Info": "Информация об оборудовании",
|
||||
"Console Type:": "Тип консоли:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Модуль DRAM: ",
|
||||
"Software Info": "Информация о программе",
|
||||
"KIP version:": "Версия KIP:",
|
||||
"sys-dock status:": "Статус sys-dock:",
|
||||
"SaltyNX status:": "Статус SaltyNX:",
|
||||
"RR Display status:": "Статус RR Display:",
|
||||
"Wafer Position:": "Wafer Position:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Module:",
|
||||
"Board": "Board",
|
||||
"Display": "Дисплей",
|
||||
|
||||
"Developers": "Разработчики",
|
||||
"Contributors": "Внесли вклад",
|
||||
"Testers": "Тестеры",
|
||||
"Translators": "Переводчики",
|
||||
"Special Thanks": "Особая благодарность",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u мВ",
|
||||
"Compiling with minimal features": "Собрано с урезанием функций",
|
||||
"THE BEER-WARE LICENSE": "BEER-WARE LICENSE",
|
||||
"Auto": "Авто"
|
||||
}
|
||||
|
||||
214
Source/hoc-clk/overlay/lang/template.json
Normal file
214
Source/hoc-clk/overlay/lang/template.json
Normal file
@@ -0,0 +1,214 @@
|
||||
{
|
||||
"Information": "",
|
||||
"Unknown": "",
|
||||
"Installed": "",
|
||||
"Not Installed": "",
|
||||
"Default": "",
|
||||
"Do Not Override": "",
|
||||
"Do not override": "",
|
||||
"Disabled": "",
|
||||
"Enabled": "",
|
||||
"Enabled (Default)": "",
|
||||
"Enable": "",
|
||||
"Fatal error": "",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "",
|
||||
"Please make sure everything is\\n\\n": "",
|
||||
"correctly installed and enabled.": "",
|
||||
|
||||
"Edit App Profile": "",
|
||||
"Edit Global Profile": "",
|
||||
"Temporary Overrides": "",
|
||||
"Temporary Overrides ": "",
|
||||
" Reset": "",
|
||||
"Settings": "",
|
||||
"About": "",
|
||||
"Credits": "",
|
||||
|
||||
"Application changed\\n\\n": "",
|
||||
"The running application changed\\n\\n": "",
|
||||
"while editing was going on.": "",
|
||||
|
||||
"Sleep Mode": "",
|
||||
"Stock": "",
|
||||
"Dev OC": "",
|
||||
"Boost Mode": "",
|
||||
"Safe Max": "",
|
||||
"Unsafe Max": "",
|
||||
"Absolute Max": "",
|
||||
"Handheld Safe Max": "",
|
||||
|
||||
"General Settings": "",
|
||||
"Governor Settings": "",
|
||||
"Safety Settings": "",
|
||||
"Save KIP Settings": "",
|
||||
"RAM Settings": "",
|
||||
"CPU Settings": "",
|
||||
"GPU Settings": "",
|
||||
"Display Settings": "",
|
||||
"Experimental Settings": "",
|
||||
"Experimental": "",
|
||||
|
||||
" Settings marked in blue": "",
|
||||
"don't require a reboot to apply!": "",
|
||||
"You can also press to show": "",
|
||||
"information about each setting.": "",
|
||||
|
||||
" Experimental Settings are incomplete ": "",
|
||||
"and may not work correctly or at all!": "",
|
||||
"Here be dragons!": "",
|
||||
|
||||
"RAM Voltage Display Mode": "",
|
||||
"RAM Display Unit": "",
|
||||
"Polling Interval": "",
|
||||
|
||||
"GPU Scheduling Override Method": "",
|
||||
"GPU Scheduling Override": "",
|
||||
"GPU Boot Volt": "",
|
||||
"GPU Boot Voltage": "",
|
||||
"Memory Frequency Measurement Mode": "",
|
||||
" Overriding the charge current": "",
|
||||
"can be dangerous and may cause": "",
|
||||
"damage to your battery or charger!": "",
|
||||
"Charge Current Override": "",
|
||||
"Display Color Preset": "",
|
||||
"Basic": "",
|
||||
"Saturated": "",
|
||||
"Washed": "",
|
||||
"Natural": "",
|
||||
"Vivid": "",
|
||||
|
||||
"CPU Governor Minimum Frequency": "",
|
||||
" Usage of unsafe display": "",
|
||||
"refresh rates may cause stress": "",
|
||||
"or damage to your display! ": "",
|
||||
"Proceed at your own risk!": "",
|
||||
"Max Handheld Display": "",
|
||||
"Max Handheld Display Hz": "",
|
||||
"Display Clock": "",
|
||||
" Adjust the display voltage": "",
|
||||
"with caution to avoid damage": "",
|
||||
"to your display panel! ": "",
|
||||
"Display Voltage": "",
|
||||
|
||||
"Thermal Throttle Limit": "",
|
||||
"Official Rating": "",
|
||||
"TDP Threshold": "",
|
||||
"Power": "",
|
||||
"HP Mode": "",
|
||||
|
||||
"DVB Shift": "",
|
||||
"SoC Max Volt": "",
|
||||
"Step Mode": "",
|
||||
"RAM VDD2 Voltage": "",
|
||||
"RAM VDDQ Voltage": "",
|
||||
"Voltage": "",
|
||||
"RAM Frequency Editor": "",
|
||||
"Ram Max Clock": "",
|
||||
"RAM Latency Editor": "",
|
||||
"RAM Timing Reductions": "",
|
||||
"Memory Timings": "",
|
||||
"Advanced": "",
|
||||
"t6 tRTW Fine Tune": "",
|
||||
"tRTW Fine Tune": "",
|
||||
"t7 tWTR Fine Tune": "",
|
||||
"tWTR Fine Tune": "",
|
||||
"Memory Latencies": "",
|
||||
"Read Latency": "",
|
||||
"Write Latency": "",
|
||||
"High speedo needed!": "",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "",
|
||||
"JEDEC.": "",
|
||||
|
||||
"CPU Boost Clock": "",
|
||||
"CPU UV": "",
|
||||
"CPU Unlock": "",
|
||||
"CPU VMIN": "",
|
||||
"CPU Max Voltage": "",
|
||||
"CPU Max Clock": "",
|
||||
"Extreme UV Table": "",
|
||||
"CPU UV Table": "",
|
||||
"CPU Low UV": "",
|
||||
"CPU High UV": "",
|
||||
"CPU Low VMIN": "",
|
||||
"CPU High VMIN": "",
|
||||
|
||||
"No Undervolt": "",
|
||||
"SLT Table": "",
|
||||
"HiOPT Table": "",
|
||||
"GPU Undervolt Table": "",
|
||||
"GPU Minimum Voltage": "",
|
||||
"Calculate GPU Vmin": "",
|
||||
"GPU VMIN": "",
|
||||
"GPU Maximum Voltage": "",
|
||||
"GPU Voltage Offset": "",
|
||||
"GPU DVFS Mode": "",
|
||||
"GPU DVFS Offset": "",
|
||||
"GPU Voltage Table": "",
|
||||
"GPU Custom Table (mV)": "",
|
||||
"Official Service": "",
|
||||
"96.6% limit": "",
|
||||
"99.7% limit": "",
|
||||
" Setting GPU Clocks past": "",
|
||||
"1228MHz without a proper undervolt": "",
|
||||
"can cause degradation or damage": "",
|
||||
"to your console!": "",
|
||||
"1075MHz without UV, 1152MHz on SLT": "",
|
||||
"or 1228MHz on HiOPT can cause ": "",
|
||||
"permanent damage to your Switch!": "",
|
||||
"921MHz without UV and 960MHz on": "",
|
||||
"SLT or HiOPT can cause ": "",
|
||||
|
||||
"Default (Mariko)": "",
|
||||
"Default (Erista)": "",
|
||||
"Rating": "",
|
||||
"Safe Max (Mariko)": "",
|
||||
"Safe Max (Erista)": "",
|
||||
|
||||
"Voltages": "",
|
||||
"RAM Voltage:": "",
|
||||
"Display Voltage:": "",
|
||||
"Temperatures": "",
|
||||
"PLLX Temp:": "",
|
||||
"AOTAG Temp:": "",
|
||||
"BQ24193 Temp:": "",
|
||||
"Normal": "",
|
||||
"Warm": "",
|
||||
"Hot": "",
|
||||
"Overheat": "",
|
||||
"Not Patched": "",
|
||||
"Invalid": "",
|
||||
"RAM Bandwidth": "",
|
||||
"RAM BW (Peak):": "",
|
||||
"RAM BW (All):": "",
|
||||
"RAM BW (CPU):": "",
|
||||
"RAM BW (GPU):": "",
|
||||
"Hardware Info": "",
|
||||
"Console Type:": "",
|
||||
"Speedo:": "",
|
||||
"DRAM Module: ": "",
|
||||
"Software Info": "",
|
||||
"KIP version:": "",
|
||||
"sys-dock status:": "",
|
||||
"SaltyNX status:": "",
|
||||
"RR Display status:": "",
|
||||
"Wafer Position:": "",
|
||||
"IDDQ:": "",
|
||||
"Module: ": "",
|
||||
"Board": "",
|
||||
"Display": "",
|
||||
|
||||
"Developers": "",
|
||||
"Contributors": "",
|
||||
"Testers": "",
|
||||
"Translators": "",
|
||||
"Special Thanks": "",
|
||||
|
||||
"X: %u Y: %u": "",
|
||||
"%u.%u%u mV": "",
|
||||
"Compiling with minimal features": "",
|
||||
}
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "Інформація",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Модуль:",
|
||||
"sys-dock status:": "стан sys-dock:",
|
||||
"SaltyNX status:": "Статус SaltyNX:",
|
||||
"RR Display status:": "Статус дисплея RR:",
|
||||
"Wafer Position:": "Позиція пластини:",
|
||||
"Credits": "Кредити",
|
||||
"Developers": "Розробники",
|
||||
"Contributors": "Дописувачі",
|
||||
"Testers": "Тестери",
|
||||
"Special Thanks": "Особлива подяка",
|
||||
"Unknown": "Невідомий",
|
||||
"Installed": "встановлено",
|
||||
"Not Installed": "Не встановлено",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД",
|
||||
"Default": "За замовчуванням",
|
||||
"Do Not Override": "Не перевизначати",
|
||||
"Do not override": "Не перевизначати",
|
||||
"Disabled": "Вимкнено",
|
||||
"Enabled": "Увімкнено",
|
||||
" \\ue0e3 Reset": "\\ue0e3 Скидання",
|
||||
"Display": "Дисплей",
|
||||
"Application changed\\n\\n": "Додаток змінено\\n\\n",
|
||||
"The running application changed\\n\\n": "Запущена програма змінена\\n\\n",
|
||||
"while editing was going on.": "поки йшло редагування.",
|
||||
"Board": "дошка",
|
||||
"%u.%u%u mV": "%u.%u%u мВ",
|
||||
"Enabled (Default)": "Увімкнено (за замовчуванням)",
|
||||
"Enable": "Увімкнути",
|
||||
"Fatal error": "Фатальна помилка",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "Не вдалося підключитися до системного модуля hoc-clk.\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "Переконайтеся, що все\\n\\n",
|
||||
"correctly installed and enabled.": "правильно встановлено та включено.",
|
||||
"Fatal error": "Фатальна помилка",
|
||||
|
||||
"Edit App Profile": "Редагувати профіль програми",
|
||||
"Edit Global Profile": "Редагувати глобальний профіль",
|
||||
"Temporary Overrides": "Тимчасові перевизначення",
|
||||
"Temporary Overrides ": "Тимчасові перевизначення",
|
||||
" Reset": " Скидання",
|
||||
"Settings": "Налаштування",
|
||||
"About": "про",
|
||||
"Credits": "Кредити",
|
||||
|
||||
"Application changed\\n\\n": "Додаток змінено\\n\\n",
|
||||
"The running application changed\\n\\n": "Запущена програма змінена\\n\\n",
|
||||
"while editing was going on.": "поки йшло редагування.",
|
||||
|
||||
"Sleep Mode": "Режим сну",
|
||||
"Stock": "Запас",
|
||||
"Stock": "Стандарт",
|
||||
"Dev OC": "Розробник OC",
|
||||
"Boost Mode": "Режим посилення",
|
||||
"Safe Max": "Безпечний макс",
|
||||
"Unsafe Max": "Небезпечний макс",
|
||||
"Absolute Max": "Абсолютний макс",
|
||||
"Handheld Safe Max": "Портативний сейф Макс",
|
||||
"Enable": "Увімкнути",
|
||||
"Edit App Profile": "Редагувати профіль програми",
|
||||
"Edit Global Profile": "Редагувати глобальний профіль",
|
||||
"Temporary Overrides": "Тимчасові перевизначення",
|
||||
"Settings": "Налаштування",
|
||||
"About": "про",
|
||||
"Compiling with minimal features": "Компіляція з мінімальними можливостями",
|
||||
"Handheld Safe Max": "Портативний безпечний макс",
|
||||
|
||||
"General Settings": "Загальні налаштування",
|
||||
"Governor Settings": "Налаштування губернатора",
|
||||
"Safety Settings": "Налаштування безпеки",
|
||||
@@ -55,41 +45,64 @@
|
||||
"CPU Settings": "Налаштування ЦП",
|
||||
"GPU Settings": "Налаштування GPU",
|
||||
"Display Settings": "Налаштування дисплея",
|
||||
"Experimental Settings": "Експериментальні налаштування",
|
||||
"Experimental": "Експериментальний",
|
||||
|
||||
" Settings marked in blue": "Налаштування, позначені синім",
|
||||
"don't require a reboot to apply!": "не потребують перезавантаження!",
|
||||
"You can also press to show": "Також натисніть для показу",
|
||||
"information about each setting.": "інформацію про кожне налаштування.",
|
||||
|
||||
" Experimental Settings are incomplete ": "Експериментальні налаштування неповні",
|
||||
"and may not work correctly or at all!": "і можуть взагалі не працювати!",
|
||||
"Here be dragons!": "Тут є дракони!",
|
||||
|
||||
"RAM Voltage Display Mode": "Режим відображення напруги RAM",
|
||||
"RAM Display Unit": "Одиниця відображення RAM",
|
||||
"Polling Interval": "Інтервал опитування",
|
||||
|
||||
"GPU Scheduling Override Method": "Метод перевизначення планування GPU",
|
||||
"GPU Scheduling Override": "Перевизначення планування GPU",
|
||||
"GPU Boot Volt": "Напруга завантаження GPU",
|
||||
"GPU Boot Voltage": "Напруга завантаження GPU",
|
||||
"Memory Frequency Measurement Mode": "Режим вимірювання частоти пам'яті",
|
||||
" Overriding the charge current": "Перевизначення струму заряду",
|
||||
"can be dangerous and may cause": "може бути небезпечним і може спричинити",
|
||||
"damage to your battery or charger!": "пошкодження акумулятора або зарядного пристрою!",
|
||||
"Charge Current Override": "Перевизначення струму заряду",
|
||||
"RAM Voltage Display Mode": "Режим відображення напруги RAM",
|
||||
"Polling Interval": "Інтервал опитування",
|
||||
"Display Color Preset": "Кольоровий пресет дисплея",
|
||||
"Basic": "Базовий",
|
||||
"Saturated": "Насичений",
|
||||
"Washed": "Блідий",
|
||||
"Natural": "Природний",
|
||||
"Vivid": "Яскравий",
|
||||
|
||||
"CPU Governor Minimum Frequency": "Мінімальна частота регулятора ЦП",
|
||||
" Usage of unsafe display": "Використання небезпечних частот екрана",
|
||||
"refresh rates may cause stress": "частоти оновлення можуть викликати стрес",
|
||||
"or damage to your display! ": "або пошкодження дисплея!",
|
||||
"Proceed at your own risk!": "Продовжуйте на свій страх і ризик!",
|
||||
"Max Handheld Display": "Максимальний портативний дисплей",
|
||||
"Max Handheld Display Hz": "Макс. Гц в портативному режимі",
|
||||
"Display Clock": "Відображення годинника",
|
||||
" Adjust the display voltage": "Налаштуйте напругу дисплея",
|
||||
"with caution to avoid damage": "обережно, щоб уникнути пошкоджень",
|
||||
"to your display panel! ": "до панелі дисплея!",
|
||||
"Display Voltage": "Напруга дисплея",
|
||||
|
||||
"Thermal Throttle Limit": "Термічний дросельний ліміт",
|
||||
"Official Rating": "Офіційний рейтинг",
|
||||
"TDP Threshold": "Поріг TDP",
|
||||
"Power": "потужність",
|
||||
"Thermal Throttle Limit": "Термічний дросельний ліміт",
|
||||
"HP Mode": "Режим HP",
|
||||
"Default (Mariko)": "За замовчуванням (Маріко)",
|
||||
"Default (Erista)": "За замовчуванням (Erista)",
|
||||
"Rating": "Рейтинг",
|
||||
"Safe Max (Mariko)": "Сейф Макс (Маріко)",
|
||||
"Safe Max (Erista)": "Сейф Макс (Еріста)",
|
||||
|
||||
"DVB Shift": "DVB зсув",
|
||||
"SoC Max Volt": "Макс. напруга SoC",
|
||||
"Step Mode": "Покроковий режим",
|
||||
"RAM VDD2 Voltage": "Напруга RAM VDD2",
|
||||
"Voltage": "Напруга",
|
||||
"RAM VDDQ Voltage": "Напруга RAM VDDQ",
|
||||
"Voltage": "Напруга",
|
||||
"RAM Frequency Editor": "Редактор частоти оперативної пам'яті",
|
||||
"JEDEC.": "JEDEC.",
|
||||
"High speedo needed!": "Потрібна висока швидкість!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)",
|
||||
"Ram Max Clock": "Годинник Ram Max",
|
||||
"RAM Latency Editor": "Редактор затримки оперативної пам'яті",
|
||||
"RAM Timing Reductions": "Скорочення оперативної пам'яті",
|
||||
@@ -100,20 +113,30 @@
|
||||
"t7 tWTR Fine Tune": "t7 tWTR Точне налаштування",
|
||||
"tWTR Fine Tune": "Точна настройка tWTR",
|
||||
"Memory Latencies": "Затримки пам'яті",
|
||||
"Read Latency": "Прочитати затримку",
|
||||
"Read Latency": "Затримка читання",
|
||||
"Write Latency": "Затримка запису",
|
||||
"High speedo needed!": "Потрібна висока швидкість Speedo!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400 МГц (потрібна екстремальна швидкість/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433 МГц (потрібен смішний Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466 МГц (потрібен смішний Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500 МГц (потрібен смішний Speedo/PLL)",
|
||||
"JEDEC.": "JEDEC.",
|
||||
|
||||
"CPU Boost Clock": "CPU Boost Clock",
|
||||
"CPU UV": "CPU UV",
|
||||
"CPU Unlock": "Розблокування ЦП",
|
||||
"CPU VMIN": "CPU VMIN",
|
||||
"CPU Max Voltage": "Максимальна напруга ЦП",
|
||||
"CPU Max Clock": "Максимальна частота ЦП",
|
||||
"Extreme UV Table": "Екстремальний ультрафіолетовий стіл",
|
||||
"Extreme UV Table": "Екстремальна UV таблиця",
|
||||
"CPU UV Table": "CPU UV Таблиця",
|
||||
"CPU Low UV": "CPU Low UV",
|
||||
"CPU High UV": "CPU High UV",
|
||||
"CPU Low VMIN": "CPU Low VMIN",
|
||||
"CPU High VMIN": "CPU High VMIN",
|
||||
|
||||
"No Undervolt": "Без андервольта",
|
||||
"SLT Table": "Таблиця SLT",
|
||||
"HiOPT Table": "Таблиця HiOPT",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "Максимальна напруга GPU",
|
||||
"GPU Voltage Offset": "Зсув напруги GPU",
|
||||
"Do not override": "Не перевизначати",
|
||||
"Enabled (Default)": "Увімкнено (за замовчуванням)",
|
||||
"96.6% limit": "96,6% обмеження",
|
||||
"99.7% limit": "Обмеження 99,7%.",
|
||||
"GPU Scheduling Override": "Перевизначення планування GPU",
|
||||
"Official Service": "Офіційний сервіс",
|
||||
"GPU DVFS Mode": "Режим GPU DVFS",
|
||||
"GPU DVFS Offset": "GPU DVFS Offset",
|
||||
"GPU Voltage Table": "Таблиця напруги GPU",
|
||||
"GPU Custom Table (mV)": "Спеціальна таблиця GPU (мВ)",
|
||||
"Official Service": "Офіційний сервіс",
|
||||
"96.6% limit": "96,6% обмеження",
|
||||
"99.7% limit": "99,7% обмеження",
|
||||
" Setting GPU Clocks past": "Встановлення тактових частот GPU вище",
|
||||
"1228MHz without a proper undervolt": "1228 МГц без належного підвольту",
|
||||
"can cause degradation or damage": "може спричинити деградацію або пошкодження",
|
||||
"to your console!": "вашій консолі!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075 МГц без УФ, 1152 МГц на SLT",
|
||||
"or 1228MHz on HiOPT can cause ": "або 1228 МГц на HiOPT може спричинити",
|
||||
"permanent damage to your Switch!": "незворотне пошкодження вашого комутатора!",
|
||||
"permanent damage to your Switch!": "незворотне пошкодження вашого Switch!",
|
||||
"921MHz without UV and 960MHz on": "921 МГц без УФ і 960 МГц увімкнено",
|
||||
"SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити"
|
||||
"SLT or HiOPT can cause ": "SLT або HiOPT можуть спричинити",
|
||||
|
||||
"Default (Mariko)": "За замовчуванням (Маріко)",
|
||||
"Default (Erista)": "За замовчуванням (Erista)",
|
||||
"Rating": "Рейтинг",
|
||||
"Safe Max (Mariko)": "Сейф Макс (Маріко)",
|
||||
"Safe Max (Erista)": "Сейф Макс (Еріста)",
|
||||
|
||||
"Voltages": "Напруги",
|
||||
"RAM Voltage:": "Напруга RAM:",
|
||||
"Display Voltage:": "Напруга дисплея:",
|
||||
"Temperatures": "Температури",
|
||||
"PLLX Temp:": "PLLX Темп.:",
|
||||
"AOTAG Temp:": "AOTAG Темп.:",
|
||||
"BQ24193 Temp:": "BQ24193 Темп.:",
|
||||
"Normal": "Нормально",
|
||||
"Warm": "Тепло",
|
||||
"Hot": "Гаряче",
|
||||
"Overheat": "Перегрів",
|
||||
"Not Patched": "Не виправлено",
|
||||
"Invalid": "Недійсний",
|
||||
"RAM Bandwidth": "Пропускна здатність RAM",
|
||||
"RAM BW (Peak):": "BW RAM (Пік):",
|
||||
"RAM BW (All):": "BW RAM (Усі):",
|
||||
"RAM BW (CPU):": "BW RAM (CPU):",
|
||||
"RAM BW (GPU):": "BW RAM (GPU):",
|
||||
"Hardware Info": "Інфо про апаратне забезпечення",
|
||||
"Console Type:": "Тип консолі:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "Модуль DRAM: ",
|
||||
"Software Info": "Інфо про програмне забезпечення",
|
||||
"KIP version:": "Версія KIP:",
|
||||
"sys-dock status:": "стан sys-dock:",
|
||||
"SaltyNX status:": "Статус SaltyNX:",
|
||||
"RR Display status:": "Статус дисплея RR:",
|
||||
"Wafer Position:": "Позиція пластини:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "Модуль:",
|
||||
"Board": "дошка",
|
||||
"Display": "Дисплей",
|
||||
|
||||
"Developers": "Розробники",
|
||||
"Contributors": "Дописувачі",
|
||||
"Testers": "Тестери",
|
||||
"Translators": "Перекладачі",
|
||||
"Special Thanks": "Особлива подяка",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u мВ",
|
||||
"Compiling with minimal features": "Компіляція з мінімальними можливостями",
|
||||
"THE BEER-WARE LICENSE": "ЛІЦЕНЗІЯ НА ПИВНИЙ ПОСУД"
|
||||
}
|
||||
|
||||
@@ -1,37 +1,33 @@
|
||||
{
|
||||
"Information": "信息",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "模块: ",
|
||||
"sys-dock status:": "sys-dock 状态:",
|
||||
"SaltyNX status:": "SaltyNX 状态:",
|
||||
"RR Display status:": "RR 显示状态:",
|
||||
"Wafer Position:": "晶圆位置:",
|
||||
"Credits": "致谢",
|
||||
"Developers": "开发者",
|
||||
"Contributors": "贡献者",
|
||||
"Testers": "测试者",
|
||||
"Special Thanks": "特别感谢",
|
||||
"Unknown": "未知",
|
||||
"Installed": "已安装",
|
||||
"Not Installed": "未安装",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "啤酒软件许可协议",
|
||||
"Default": "默认",
|
||||
"Do Not Override": "不修改",
|
||||
"Do not override": "不修改",
|
||||
"Disabled": "已禁用",
|
||||
"Enabled": "已启用",
|
||||
" \\ue0e3 Reset": " \\ue0e3 重置",
|
||||
"Display": "显示",
|
||||
"Application changed\\n\\n": "应用已变更\\n\\n",
|
||||
"The running application changed\\n\\n": "正在运行的应用已变更\\n\\n",
|
||||
"while editing was going on.": "编辑过程中发生变更。",
|
||||
"Board": "主板",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Enabled (Default)": "已启用 (默认)",
|
||||
"Enable": "启用",
|
||||
"Fatal error": "致命错误",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "无法连接到 hoc-clk 系统模块。\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "请确保所有内容均已\\n\\n",
|
||||
"correctly installed and enabled.": "正确安装并启用。",
|
||||
"Fatal error": "致命错误",
|
||||
|
||||
"Edit App Profile": "编辑应用配置",
|
||||
"Edit Global Profile": "编辑全局配置",
|
||||
"Temporary Overrides": "临时配置",
|
||||
"Temporary Overrides ": "临时配置 ",
|
||||
" Reset": " 重置",
|
||||
"Settings": "设置",
|
||||
"About": "关于",
|
||||
"Credits": "致谢",
|
||||
|
||||
"Application changed\\n\\n": "应用已变更\\n\\n",
|
||||
"The running application changed\\n\\n": "正在运行的应用已变更\\n\\n",
|
||||
"while editing was going on.": "编辑过程中发生变更。",
|
||||
|
||||
"Sleep Mode": "睡眠模式",
|
||||
"Stock": "原厂默认",
|
||||
"Dev OC": "开发者超频",
|
||||
@@ -40,13 +36,7 @@
|
||||
"Unsafe Max": "危险最大值",
|
||||
"Absolute Max": "绝对最大值",
|
||||
"Handheld Safe Max": "掌机模式安全最大值",
|
||||
"Enable": "启用",
|
||||
"Edit App Profile": "编辑应用配置",
|
||||
"Edit Global Profile": "编辑全局配置",
|
||||
"Temporary Overrides": "临时配置",
|
||||
"Settings": "设置",
|
||||
"About": "关于",
|
||||
"Compiling with minimal features": "以最小功能编译",
|
||||
|
||||
"General Settings": "通用设置",
|
||||
"Governor Settings": "调频器设置",
|
||||
"Safety Settings": "安全设置",
|
||||
@@ -55,61 +45,69 @@
|
||||
"CPU Settings": "CPU 设置",
|
||||
"GPU Settings": "GPU 设置",
|
||||
"Display Settings": "显示设置",
|
||||
"Experimental Settings": "实验性设置",
|
||||
"Experimental": "实验性功能",
|
||||
|
||||
" Settings marked in blue": "蓝色标注的设置",
|
||||
"don't require a reboot to apply!": "无需重启即可应用!",
|
||||
"You can also press to show": "也可按 查看",
|
||||
"information about each setting.": "每项设置的说明。",
|
||||
|
||||
" Experimental Settings are incomplete ": "实验性设置尚未完成",
|
||||
"and may not work correctly or at all!": "且可能无法正常工作!",
|
||||
"Here be dragons!": "此处有险!",
|
||||
|
||||
"RAM Voltage Display Mode": "内存电压显示模式",
|
||||
"RAM Display Unit": "内存显示单位",
|
||||
"Polling Interval": "刷新间隔",
|
||||
|
||||
"GPU Scheduling Override Method": "GPU 调度覆盖方式",
|
||||
"GPU Scheduling Override": "GPU 调度修改",
|
||||
"GPU Boot Volt": "GPU 启动电压",
|
||||
"GPU Boot Voltage": "GPU 启动电压",
|
||||
"Memory Frequency Measurement Mode": "内存频率测量模式",
|
||||
" Overriding the charge current": "修改充电电流",
|
||||
"can be dangerous and may cause": "存在风险,可能导致",
|
||||
"damage to your battery or charger!": "电池或充电器损坏!",
|
||||
"Charge Current Override": "充电电流修改",
|
||||
"RAM Voltage Display Mode": "内存电压显示模式",
|
||||
"Polling Interval": "刷新间隔",
|
||||
"Display Color Preset": "显示颜色预设",
|
||||
"Basic": "基础",
|
||||
"Saturated": "饱和",
|
||||
"Washed": "淡色",
|
||||
"Natural": "自然",
|
||||
"Vivid": "鲜艳",
|
||||
|
||||
"CPU Governor Minimum Frequency": "CPU 调频器最低频率",
|
||||
"\uE150 Usage of unsafe display": "\uE150 不安全的显示屏",
|
||||
" Usage of unsafe display": "不安全的显示屏",
|
||||
"refresh rates may cause stress": "刷新率可能会对",
|
||||
"or damage to your display! ": "显示屏造成压力或损坏! ",
|
||||
"Proceed at your own risk!": "操作风险自负!",
|
||||
"Max Handheld Display": "掌机模式最大显示率",
|
||||
"Max Handheld Display Hz": "掌机最大显示率 Hz",
|
||||
"Display Clock": "显示时钟",
|
||||
" Adjust the display voltage": "调整显示电压",
|
||||
"with caution to avoid damage": "请谨慎以避免损坏",
|
||||
"to your display panel! ": "显示屏面板!",
|
||||
"Display Voltage": "显示电压",
|
||||
|
||||
"Thermal Throttle Limit": "温控设置",
|
||||
"Official Rating": "官方额定值",
|
||||
"TDP Threshold": "TDP 阈值",
|
||||
"Power": "电源",
|
||||
"Thermal Throttle Limit": "温控设置",
|
||||
"HP Mode": "高性能模式",
|
||||
"Default (Mariko)": "默认 (Mariko)",
|
||||
"Default (Erista)": "默认 (Erista)",
|
||||
"Rating": "额定值",
|
||||
"Safe Max (Mariko)": "安全最大值 (Mariko)",
|
||||
"Safe Max (Erista)": "安全最大值 (Erista)",
|
||||
|
||||
"DVB Shift": "DVB 偏移",
|
||||
"SoC Max Volt": "SoC 最大电压",
|
||||
"Step Mode": "步进模式",
|
||||
"RAM VDD2 Voltage": "内存 VDD2 电压",
|
||||
"Voltage": "电压",
|
||||
"RAM VDDQ Voltage": "内存 VDDQ 电压",
|
||||
"Voltage": "电压",
|
||||
"RAM Frequency Editor": "内存频率编辑器",
|
||||
"JEDEC.": "JEDEC 标准。",
|
||||
"High speedo needed!": "需要高 Speedo 配置!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)",
|
||||
"Ram Max Clock": "内存最大频率",
|
||||
"RAM Latency Editor": "内存延迟编辑器",
|
||||
"RAM Timing Reductions": "内存时序优化",
|
||||
"Memory Timings": "内存时序",
|
||||
"Memory": "内存",
|
||||
"mem": "内存",
|
||||
"Governor": "调频器",
|
||||
"Advanced": "高级",
|
||||
"Docked": "底座模式",
|
||||
"Handheld": "掌机模式",
|
||||
"Charging": "充电中",
|
||||
"USB Charger": "USB 充电器",
|
||||
"PD Charger": "PD 充电器",
|
||||
"Handheld TDP": "掌机模式功耗限制",
|
||||
"Thermal Throttle": "温度控制",
|
||||
"Uncapped Clocks": "解除频率上限",
|
||||
"Soc DVB Shift": "SoC DVB偏移",
|
||||
"Overwrite Boost Mode": "接管官方CPU调度",
|
||||
"Display Refresh Rate Changing": "显示刷新率变更",
|
||||
"t6 tRTW Fine Tune": "t6 tRTW 微调",
|
||||
"tRTW Fine Tune": "tRTW 微调",
|
||||
"t7 tWTR Fine Tune": "t7 tWTR 微调",
|
||||
@@ -117,6 +115,15 @@
|
||||
"Memory Latencies": "内存延迟",
|
||||
"Read Latency": "读取延迟",
|
||||
"Write Latency": "写入延迟",
|
||||
"High speedo needed!": "需要高 Speedo 配置!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz (需要极限 Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz (需要极限 Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz (需要极限 Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz (需要极端 Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz (需要极端 Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz (需要极端 Speedo/PLL)",
|
||||
"JEDEC.": "JEDEC 标准。",
|
||||
|
||||
"CPU Boost Clock": "CPU 超频频率",
|
||||
"CPU UV": "CPU 降压",
|
||||
"CPU Unlock": "CPU 解锁",
|
||||
@@ -129,6 +136,7 @@
|
||||
"CPU High UV": "CPU 高压降压",
|
||||
"CPU Low VMIN": "CPU 低压最低电压",
|
||||
"CPU High VMIN": "CPU 高压最低电压",
|
||||
|
||||
"No Undervolt": "不降压",
|
||||
"SLT Table": "SLT 表",
|
||||
"HiOPT Table": "HiOPT 表",
|
||||
@@ -138,20 +146,70 @@
|
||||
"GPU VMIN": "GPU 最低电压",
|
||||
"GPU Maximum Voltage": "GPU 最大电压",
|
||||
"GPU Voltage Offset": "GPU 电压偏移",
|
||||
"Do not override": "不修改",
|
||||
"Enabled (Default)": "已启用 (默认)",
|
||||
"96.6% limit": "96.6% 限制",
|
||||
"99.7% limit": "99.7% 限制",
|
||||
"GPU Scheduling Override": "GPU 调度修改",
|
||||
"Official Service": "官方服务",
|
||||
"GPU DVFS Mode": "GPU DVFS 模式",
|
||||
"GPU DVFS Offset": "GPU DVFS 偏移",
|
||||
"GPU Voltage Table": "GPU 电压表",
|
||||
"GPU Custom Table (mV)": "GPU 自定义表 (mV)",
|
||||
"\uE150 Setting GPU Clocks past": "\uE150 将 GPU 频率设置超过",
|
||||
"Official Service": "官方服务",
|
||||
"96.6% limit": "96.6% 限制",
|
||||
"99.7% limit": "99.7% 限制",
|
||||
" Setting GPU Clocks past": " 将 GPU 频率设置超过",
|
||||
"1228MHz without a proper undervolt": "没有适当降压的 1228MHz",
|
||||
"can cause degradation or damage": "可能导致损耗或损坏",
|
||||
"to your console!": "您的主机!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "1075MHz 无降压,SLT 表下 1152MHz",
|
||||
"or 1228MHz on HiOPT can cause ": "或 HiOPT 表下 1228MHz 可能导致 ",
|
||||
"permanent damage to your Switch!": "Switch 永久损坏!",
|
||||
"921MHz without UV and 960MHz on": "921MHz 无降压,SLT/HiOPT 表下 960MHz",
|
||||
"SLT or HiOPT can cause ": "可能导致 "
|
||||
"SLT or HiOPT can cause ": "可能导致 ",
|
||||
|
||||
"Default (Mariko)": "默认 (Mariko)",
|
||||
"Default (Erista)": "默认 (Erista)",
|
||||
"Rating": "额定值",
|
||||
"Safe Max (Mariko)": "安全最大值 (Mariko)",
|
||||
"Safe Max (Erista)": "安全最大值 (Erista)",
|
||||
|
||||
"Voltages": "电压",
|
||||
"RAM Voltage:": "内存电压:",
|
||||
"Display Voltage:": "显示电压:",
|
||||
"Temperatures": "温度",
|
||||
"PLLX Temp:": "PLLX 温度:",
|
||||
"AOTAG Temp:": "AOTAG 温度:",
|
||||
"BQ24193 Temp:": "BQ24193 温度:",
|
||||
"Normal": "正常",
|
||||
"Warm": "温热",
|
||||
"Hot": "过热",
|
||||
"Overheat": "严重过热",
|
||||
"Not Patched": "未修补",
|
||||
"Invalid": "无效",
|
||||
"RAM Bandwidth": "内存带宽",
|
||||
"RAM BW (Peak):": "RAM带宽(峰值):",
|
||||
"RAM BW (All):": "RAM带宽(全部):",
|
||||
"RAM BW (CPU):": "RAM带宽(CPU):",
|
||||
"RAM BW (GPU):": "RAM带宽(GPU):",
|
||||
"Hardware Info": "硬件信息",
|
||||
"Console Type:": "主机类型:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAM 模块: ",
|
||||
"Software Info": "软件信息",
|
||||
"KIP version:": "KIP 版本:",
|
||||
"sys-dock status:": "sys-dock 状态:",
|
||||
"SaltyNX status:": "SaltyNX 状态:",
|
||||
"RR Display status:": "RR 显示状态:",
|
||||
"Wafer Position:": "晶圆位置:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "模块: ",
|
||||
"Board": "主板",
|
||||
"Display": "显示",
|
||||
|
||||
"Developers": "开发者",
|
||||
"Contributors": "贡献者",
|
||||
"Testers": "测试者",
|
||||
"Translators": "翻译",
|
||||
"Special Thanks": "特别感谢",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "以最小功能编译",
|
||||
"THE BEER-WARE LICENSE": "啤酒软件许可协议"
|
||||
}
|
||||
|
||||
@@ -1,52 +1,42 @@
|
||||
{
|
||||
"Information": "資訊",
|
||||
"IDDQ:": "國際電話號碼:",
|
||||
"Module: ": "模組:",
|
||||
"sys-dock status:": "系統塢站狀態:",
|
||||
"SaltyNX status:": "SaltyNX 狀態:",
|
||||
"RR Display status:": "RR 顯示狀態:",
|
||||
"Wafer Position:": "晶圓位置:",
|
||||
"Credits": "製作人員",
|
||||
"Developers": "開發商",
|
||||
"Contributors": "貢獻者",
|
||||
"Testers": "測試人員",
|
||||
"Special Thanks": "特別感謝",
|
||||
"Unknown": "未知",
|
||||
"Installed": "已安裝",
|
||||
"Not Installed": "未安裝",
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"THE BEER-WARE LICENSE": "啤酒製品許可證",
|
||||
"Default": "預設",
|
||||
"Do Not Override": "不要覆蓋",
|
||||
"Disabled": "殘障人士",
|
||||
"Enabled": "啟用",
|
||||
" \\ue0e3 Reset": "\\ue0e3 重設",
|
||||
"Display": "顯示",
|
||||
"Do not override": "不要覆蓋",
|
||||
"Disabled": "已停用",
|
||||
"Enabled": "已啟用",
|
||||
"Enabled (Default)": "已啟用(預設)",
|
||||
"Enable": "啟用",
|
||||
"Fatal error": "致命錯誤",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。\\n\\n",
|
||||
"Please make sure everything is\\n\\n": "請確保一切正常\\n\\n",
|
||||
"correctly installed and enabled.": "正確安裝並啟用。",
|
||||
|
||||
"Edit App Profile": "編輯應用程式設定檔",
|
||||
"Edit Global Profile": "編輯全域設定檔",
|
||||
"Temporary Overrides": "臨時覆蓋",
|
||||
"Temporary Overrides ": "臨時覆蓋",
|
||||
" Reset": " 重設",
|
||||
"Settings": "設定",
|
||||
"About": "關於",
|
||||
"Credits": "製作人員",
|
||||
|
||||
"Application changed\\n\\n": "應用程式已更改\\n\\n",
|
||||
"The running application changed\\n\\n": "正在運行的應用程式已更改\\n\\n",
|
||||
"while editing was going on.": "當編輯正在進行時。",
|
||||
"Board": "董事會",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Could not connect to hoc-clk sysmodule.\\n\\n": "無法連接到 hoc-clk 系統模組。 \\n\\n",
|
||||
"Please make sure everything is\\n\\n": "請確保一切正常\\n\\n",
|
||||
"correctly installed and enabled.": "正確安裝並啟用。",
|
||||
"Fatal error": "致命錯誤",
|
||||
"Temporary Overrides ": "臨時覆蓋",
|
||||
|
||||
"Sleep Mode": "睡眠模式",
|
||||
"Stock": "庫存",
|
||||
"Stock": "原廠預設",
|
||||
"Dev OC": "開發OC",
|
||||
"Boost Mode": "升壓模式",
|
||||
"Safe Max": "安全最大值",
|
||||
"Unsafe Max": "不安全最大值",
|
||||
"Absolute Max": "絕對最大值",
|
||||
"Handheld Safe Max": "手持式安全最大",
|
||||
"Enable": "啟用",
|
||||
"Edit App Profile": "編輯應用程式設定檔",
|
||||
"Edit Global Profile": "編輯全域設定檔",
|
||||
"Temporary Overrides": "臨時覆蓋",
|
||||
"Settings": "設定",
|
||||
"About": "關於",
|
||||
"Compiling with minimal features": "使用最少的功能進行編譯",
|
||||
"Handheld Safe Max": "手持式安全最大值",
|
||||
|
||||
"General Settings": "常規設定",
|
||||
"Governor Settings": "調速器設定",
|
||||
"Safety Settings": "安全設定",
|
||||
@@ -55,42 +45,65 @@
|
||||
"CPU Settings": "中央處理器設定",
|
||||
"GPU Settings": "GPU設定",
|
||||
"Display Settings": "顯示設定",
|
||||
"Experimental Settings": "實驗性設定",
|
||||
"Experimental": "實驗性的",
|
||||
|
||||
" Settings marked in blue": "藍色標示的設定",
|
||||
"don't require a reboot to apply!": "無需重開機即可套用!",
|
||||
"You can also press to show": "也可按 顯示",
|
||||
"information about each setting.": "每項設定的說明。",
|
||||
|
||||
" Experimental Settings are incomplete ": "實驗性設定尚未完成",
|
||||
"and may not work correctly or at all!": "且可能無法正常運作!",
|
||||
"Here be dragons!": "此處有危險!",
|
||||
|
||||
"RAM Voltage Display Mode": "RAM電壓顯示模式",
|
||||
"RAM Display Unit": "記憶體顯示單位",
|
||||
"Polling Interval": "輪詢間隔",
|
||||
|
||||
"GPU Scheduling Override Method": "GPU調度覆蓋方法",
|
||||
"GPU Scheduling Override": "GPU 調度覆蓋",
|
||||
"GPU Boot Volt": "GPU 啟動電壓",
|
||||
"GPU Boot Voltage": "GPU 啟動電壓",
|
||||
"Memory Frequency Measurement Mode": "記憶體頻率測量模式",
|
||||
" Overriding the charge current": "覆蓋充電電流",
|
||||
"can be dangerous and may cause": "可能很危險並可能導致",
|
||||
"damage to your battery or charger!": "損壞電池或充電器!",
|
||||
"Charge Current Override": "充電電流覆蓋",
|
||||
"RAM Voltage Display Mode": "RAM電壓顯示模式",
|
||||
"Polling Interval": "輪詢間隔",
|
||||
"Display Color Preset": "顯示顏色預設",
|
||||
"Basic": "基本",
|
||||
"Saturated": "飽和",
|
||||
"Washed": "淡色",
|
||||
"Natural": "自然",
|
||||
"Vivid": "鮮艷",
|
||||
|
||||
"CPU Governor Minimum Frequency": "CPU調速器最低頻率",
|
||||
" Usage of unsafe display": "不安全的顯示率",
|
||||
"refresh rates may cause stress": "刷新率可能會造成壓力",
|
||||
"or damage to your display! ": "或損壞您的顯示器!",
|
||||
"Proceed at your own risk!": "請自行承擔風險!",
|
||||
"Max Handheld Display": "最大手持顯示器",
|
||||
"Max Handheld Display Hz": "最大手持顯示率 Hz",
|
||||
"Display Clock": "顯示時鐘",
|
||||
" Adjust the display voltage": "調整顯示電壓",
|
||||
"with caution to avoid damage": "請謹慎操作以避免損壞",
|
||||
"to your display panel! ": "顯示面板!",
|
||||
"Display Voltage": "顯示電壓",
|
||||
|
||||
"Thermal Throttle Limit": "熱油門限制",
|
||||
"Official Rating": "官方評級",
|
||||
"TDP Threshold": "TDP閾值",
|
||||
"Power": "電源",
|
||||
"Thermal Throttle Limit": "熱油門限制",
|
||||
"HP Mode": "惠普模式",
|
||||
"Default (Mariko)": "預設(真理子)",
|
||||
"Default (Erista)": "預設(埃里斯塔)",
|
||||
"Rating": "評級",
|
||||
"Safe Max (Mariko)": "安全最大(真理子)",
|
||||
"Safe Max (Erista)": "安全最大(埃里斯塔)",
|
||||
"HP Mode": "高效能模式",
|
||||
|
||||
"DVB Shift": "DVB 偏移",
|
||||
"SoC Max Volt": "SoC 最大電壓",
|
||||
"Step Mode": "步進模式",
|
||||
"RAM VDD2 Voltage": "RAM VDD2 電壓",
|
||||
"Voltage": "電壓",
|
||||
"RAM VDDQ Voltage": "RAM VDDQ 電壓",
|
||||
"Voltage": "電壓",
|
||||
"RAM Frequency Editor": "RAM頻率編輯器",
|
||||
"JEDEC.": "JEDEC。",
|
||||
"High speedo needed!": "需要高速!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)",
|
||||
"Ram Max Clock": "記憶體最大時鐘",
|
||||
"Ram Max Clock": "記憶體最大時脈",
|
||||
"RAM Latency Editor": "RAM 延遲編輯器",
|
||||
"RAM Timing Reductions": "RAM 時序減少",
|
||||
"Memory Timings": "記憶體時序",
|
||||
@@ -102,18 +115,28 @@
|
||||
"Memory Latencies": "記憶體延遲",
|
||||
"Read Latency": "讀取延遲",
|
||||
"Write Latency": "寫入延遲",
|
||||
"CPU Boost Clock": "CPU 升壓時鐘",
|
||||
"CPU UV": "中央處理器紫外線",
|
||||
"High speedo needed!": "需要高 Speedo 值!",
|
||||
"3333MHz (Needs extreme Speedo/PLL)": "3333MHz(需要極高的 Speedo/PLL)",
|
||||
"3366MHz (Needs extreme Speedo/PLL)": "3366MHz(需要極高的 Speedo/PLL)",
|
||||
"3400MHz (Needs extreme Speedo/PLL)": "3400MHz(需要極高的 Speedo/PLL)",
|
||||
"3433MHz (Needs ridiculous Speedo/PLL)": "3433MHz(需要荒謬的 Speedo/PLL)",
|
||||
"3466MHz (Needs ridiculous Speedo/PLL)": "3466MHz(需要荒謬的 Speedo/PLL)",
|
||||
"3500MHz (Needs ridiculous Speedo/PLL)": "3500MHz(需要荒謬的 Speedo/PLL)",
|
||||
"JEDEC.": "JEDEC。",
|
||||
|
||||
"CPU Boost Clock": "CPU 升壓時脈",
|
||||
"CPU UV": "CPU 降壓",
|
||||
"CPU Unlock": "CPU解鎖",
|
||||
"CPU VMIN": "CPU最低電壓",
|
||||
"CPU VMIN": "CPU 最低電壓",
|
||||
"CPU Max Voltage": "CPU最大電壓",
|
||||
"CPU Max Clock": "CPU 最大時脈",
|
||||
"Extreme UV Table": "極端紫外線表",
|
||||
"CPU UV Table": "CPU UV表",
|
||||
"CPU Low UV": "CPU低紫外線",
|
||||
"CPU High UV": "CPU高紫外線",
|
||||
"Extreme UV Table": "極限降壓表",
|
||||
"CPU UV Table": "CPU 降壓表",
|
||||
"CPU Low UV": "CPU 低壓降壓",
|
||||
"CPU High UV": "CPU 高壓降壓",
|
||||
"CPU Low VMIN": "CPU 低 VMIN",
|
||||
"CPU High VMIN": "CPU 高 VMIN",
|
||||
|
||||
"No Undervolt": "無欠壓",
|
||||
"SLT Table": "SLT表",
|
||||
"HiOPT Table": "HiOPT表",
|
||||
@@ -123,19 +146,70 @@
|
||||
"GPU VMIN": "GPU VMIN",
|
||||
"GPU Maximum Voltage": "GPU最大電壓",
|
||||
"GPU Voltage Offset": "GPU電壓偏移",
|
||||
"Do not override": "不要覆蓋",
|
||||
"Enabled (Default)": "啟用(預設)",
|
||||
"96.6% limit": "96.6%限制",
|
||||
"99.7% limit": "99.7%限制",
|
||||
"GPU Scheduling Override": "GPU 調度覆蓋",
|
||||
"Official Service": "官方服務",
|
||||
"GPU DVFS Mode": "GPU DVFS 模式",
|
||||
"GPU DVFS Offset": "GPU DVFS 偏移",
|
||||
"GPU Voltage Table": "GPU電壓表",
|
||||
"GPU Custom Table (mV)": "GPU 自訂表 (mV)",
|
||||
"Official Service": "官方服務",
|
||||
"96.6% limit": "96.6%限制",
|
||||
"99.7% limit": "99.7%限制",
|
||||
" Setting GPU Clocks past": "將 GPU 頻率設定超過",
|
||||
"1228MHz without a proper undervolt": "1228MHz 未適當降壓",
|
||||
"can cause degradation or damage": "可能導致劣化或損壞",
|
||||
"to your console!": "您的主機!",
|
||||
"1075MHz without UV, 1152MHz on SLT": "無 UV 時為 1075MHz,SLT 時為 1152MHz",
|
||||
"or 1228MHz on HiOPT can cause ": "或 HiOPT 上的 1228MHz 可能會導致",
|
||||
"permanent damage to your Switch!": "對您的 Switch 造成永久性損壞!",
|
||||
"921MHz without UV and 960MHz on": "無 UV 時為 921MHz,開啟時為 960MHz",
|
||||
"SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致"
|
||||
"SLT or HiOPT can cause ": "SLT 或 HiOPT 可能會導致",
|
||||
|
||||
"Default (Mariko)": "預設 (Mariko)",
|
||||
"Default (Erista)": "預設 (Erista)",
|
||||
"Rating": "評級",
|
||||
"Safe Max (Mariko)": "安全最大值 (Mariko)",
|
||||
"Safe Max (Erista)": "安全最大值 (Erista)",
|
||||
|
||||
"Voltages": "電壓",
|
||||
"RAM Voltage:": "記憶體電壓:",
|
||||
"Display Voltage:": "顯示電壓:",
|
||||
"Temperatures": "溫度",
|
||||
"PLLX Temp:": "PLLX 溫度:",
|
||||
"AOTAG Temp:": "AOTAG 溫度:",
|
||||
"BQ24193 Temp:": "BQ24193 溫度:",
|
||||
"Normal": "正常",
|
||||
"Warm": "溫熱",
|
||||
"Hot": "過熱",
|
||||
"Overheat": "嚴重過熱",
|
||||
"Not Patched": "未修補",
|
||||
"Invalid": "無效",
|
||||
"RAM Bandwidth": "記憶體頻寬",
|
||||
"RAM BW (Peak):": "RAM頻寬(峰值):",
|
||||
"RAM BW (All):": "RAM頻寬(全部):",
|
||||
"RAM BW (CPU):": "RAM頻寬(CPU):",
|
||||
"RAM BW (GPU):": "RAM頻寬(GPU):",
|
||||
"Hardware Info": "硬體資訊",
|
||||
"Console Type:": "主機類型:",
|
||||
"Speedo:": "Speedo:",
|
||||
"DRAM Module: ": "DRAM 模組:",
|
||||
"Software Info": "軟體資訊",
|
||||
"KIP version:": "KIP 版本:",
|
||||
"sys-dock status:": "系統塢站狀態:",
|
||||
"SaltyNX status:": "SaltyNX 狀態:",
|
||||
"RR Display status:": "RR 顯示狀態:",
|
||||
"Wafer Position:": "晶圓位置:",
|
||||
"IDDQ:": "IDDQ:",
|
||||
"Module: ": "模組:",
|
||||
"Board": "主板",
|
||||
"Display": "顯示",
|
||||
|
||||
"Developers": "開發商",
|
||||
"Contributors": "貢獻者",
|
||||
"Testers": "測試人員",
|
||||
"Translators": "翻譯",
|
||||
"Special Thanks": "特別感謝",
|
||||
|
||||
"X: %u Y: %u": "X: %u Y: %u",
|
||||
"%u.%u%u mV": "%u.%u%u mV",
|
||||
"Compiling with minimal features": "使用最少的功能進行編譯",
|
||||
"THE BEER-WARE LICENSE": "啤酒製品許可證"
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,17 +24,16 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(__cplusplus)
|
||||
#include "cpp_util.hpp"
|
||||
#include "cpp_util.hpp"
|
||||
|
||||
extern "C"
|
||||
{
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <hocclk.h>
|
||||
|
||||
#include <hocclk/client/ipc.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,72 +24,62 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#define TESLA_INIT_IMPL
|
||||
#include <tesla.hpp>
|
||||
|
||||
#include "ui/gui/fatal_gui.h"
|
||||
#include "ui/gui/main_gui.h"
|
||||
|
||||
class AppOverlay : public tsl::Overlay
|
||||
{
|
||||
class AppOverlay : public tsl::Overlay {
|
||||
public:
|
||||
AppOverlay() {}
|
||||
~AppOverlay() {}
|
||||
AppOverlay() {
|
||||
}
|
||||
~AppOverlay() {
|
||||
}
|
||||
|
||||
//virtual void initServices() override {
|
||||
// rgltrInitialize();
|
||||
//}
|
||||
// virtual void initServices() override {
|
||||
// rgltrInitialize();
|
||||
// }
|
||||
|
||||
virtual void exitServices() override {
|
||||
hocclkIpcExit();
|
||||
virtual void exitServices() override {
|
||||
hocclkIpcExit();
|
||||
}
|
||||
|
||||
virtual std::unique_ptr<tsl::Gui> loadInitialGui() override {
|
||||
uint32_t apiVersion;
|
||||
smInitialize();
|
||||
|
||||
tsl::hlp::ScopeGuard smGuard([] { smExit(); });
|
||||
|
||||
if (!hocclkIpcRunning()) {
|
||||
return initially<FatalGui>("hoc-clk is not running.\n\n"
|
||||
"\n"
|
||||
"Please make sure it is correctly\n\n"
|
||||
"installed and enabled.",
|
||||
"");
|
||||
}
|
||||
|
||||
virtual std::unique_ptr<tsl::Gui> loadInitialGui() override
|
||||
{
|
||||
uint32_t apiVersion;
|
||||
smInitialize();
|
||||
|
||||
tsl::hlp::ScopeGuard smGuard([] { smExit(); });
|
||||
|
||||
if(!hocclkIpcRunning())
|
||||
{
|
||||
return initially<FatalGui>(
|
||||
"hoc-clk is not running.\n\n"
|
||||
"\n"
|
||||
"Please make sure it is correctly\n\n"
|
||||
"installed and enabled.",
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
if(R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion)))
|
||||
{
|
||||
return initially<FatalGui>(
|
||||
"Could not connect to hoc-clk.\n\n"
|
||||
"\n"
|
||||
"Please make sure it is correctly\n\n"
|
||||
"installed and enabled.",
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
if(HOCCLK_IPC_API_VERSION != apiVersion)
|
||||
{
|
||||
return initially<FatalGui>(
|
||||
"Overlay not compatible with\n\n"
|
||||
"the running hoc-clk version.\n\n"
|
||||
"\n"
|
||||
"Please make sure everything is\n\n"
|
||||
"installed and up to date.",
|
||||
""
|
||||
);
|
||||
}
|
||||
|
||||
return initially<MainGui>();
|
||||
if (R_FAILED(hocclkIpcInitialize()) || R_FAILED(hocclkIpcGetAPIVersion(&apiVersion))) {
|
||||
return initially<FatalGui>("Could not connect to hoc-clk.\n\n"
|
||||
"\n"
|
||||
"Please make sure it is correctly\n\n"
|
||||
"installed and enabled.",
|
||||
"");
|
||||
}
|
||||
|
||||
if (HOCCLK_IPC_API_VERSION != apiVersion) {
|
||||
return initially<FatalGui>("Overlay not compatible with\n\n"
|
||||
"the running hoc-clk version.\n\n"
|
||||
"\n"
|
||||
"Please make sure everything is\n\n"
|
||||
"installed and up to date.",
|
||||
"");
|
||||
}
|
||||
|
||||
return initially<MainGui>();
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int main(int argc, char **argv) {
|
||||
return tsl::loop<AppOverlay>(argc, argv);
|
||||
}
|
||||
|
||||
@@ -28,20 +28,21 @@
|
||||
#pragma once
|
||||
|
||||
#include <tesla.hpp>
|
||||
#include "../gui/base_gui.h"
|
||||
|
||||
class BaseGui;
|
||||
|
||||
static constexpr u16 HOC_HEADER_HEIGHT = 287;
|
||||
// Bottom edge of the drawn box: 106 + TOP_Y_OFFSET(15) + 156 = 277
|
||||
static constexpr u16 HOC_BOX_BOTTOM = 277;
|
||||
|
||||
class BaseFrame : public tsl::elm::HeaderOverlayFrame
|
||||
{
|
||||
public:
|
||||
BaseFrame(BaseGui* gui) : tsl::elm::HeaderOverlayFrame(234) {
|
||||
BaseFrame(BaseGui* gui, u16 headerHeight = HOC_HEADER_HEIGHT) : tsl::elm::HeaderOverlayFrame(headerHeight) {
|
||||
this->gui = gui;
|
||||
}
|
||||
|
||||
void draw(tsl::gfx::Renderer* renderer) override
|
||||
{
|
||||
tsl::elm::HeaderOverlayFrame::draw(renderer);
|
||||
this->gui->preDraw(renderer);
|
||||
}
|
||||
void draw(tsl::gfx::Renderer* renderer) override;
|
||||
|
||||
protected:
|
||||
BaseGui* gui;
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,20 +24,18 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <string>
|
||||
#include <cstdint>
|
||||
|
||||
#include <hocclk/board.h>
|
||||
|
||||
#define FREQ_DEFAULT_TEXT "Do not override"
|
||||
|
||||
static inline std::string formatListFreqMHz(std::uint32_t mhz)
|
||||
{
|
||||
if(mhz == 0)
|
||||
{
|
||||
static inline std::string formatListFreqMHz(std::uint32_t mhz) {
|
||||
if (mhz == 0) {
|
||||
return FREQ_DEFAULT_TEXT;
|
||||
}
|
||||
|
||||
@@ -45,17 +43,17 @@ static inline std::string formatListFreqMHz(std::uint32_t mhz)
|
||||
return std::string(buf, snprintf(buf, sizeof(buf), "%u MHz", mhz));
|
||||
}
|
||||
|
||||
static inline std::string formatListFreqHz(uint32_t hz) { return formatListFreqMHz(hz / 1000000); }
|
||||
static inline std::string formatListFreqHz(uint32_t hz) {
|
||||
return formatListFreqMHz(hz / 1000000);
|
||||
}
|
||||
|
||||
static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit)
|
||||
{
|
||||
if(mhz == 0)
|
||||
static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit) {
|
||||
if (mhz == 0)
|
||||
return FREQ_DEFAULT_TEXT;
|
||||
|
||||
uint32_t mts = mhz * 2;
|
||||
char buf[24];
|
||||
switch(unit)
|
||||
{
|
||||
switch (unit) {
|
||||
case RamDisplayUnit_MHz:
|
||||
snprintf(buf, sizeof(buf), "%u MHz", mhz);
|
||||
break;
|
||||
@@ -70,18 +68,15 @@ static inline std::string formatListFreqMem(uint32_t mhz, RamDisplayUnit unit)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit)
|
||||
{
|
||||
static inline std::string formatListFreqHzMem(uint32_t hz, RamDisplayUnit unit) {
|
||||
return formatListFreqMem(hz / 1000000, unit);
|
||||
}
|
||||
|
||||
static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit)
|
||||
{
|
||||
static inline std::string formatMemClockKhzLabel(uint32_t khz, RamDisplayUnit unit) {
|
||||
uint32_t mhz = khz / 1000;
|
||||
uint32_t mts = khz / 500;
|
||||
char buf[32];
|
||||
switch(unit)
|
||||
{
|
||||
switch (unit) {
|
||||
case RamDisplayUnit_MHz:
|
||||
snprintf(buf, sizeof(buf), "%u MHz", mhz);
|
||||
break;
|
||||
|
||||
@@ -41,11 +41,11 @@ tsl::elm::ListItem* ramBWItemMax = NULL;
|
||||
tsl::elm::ListItem* bqtempitem = NULL;
|
||||
tsl::elm::ListItem* aotagTempItem = NULL;
|
||||
tsl::elm::ListItem* cTypeItem = NULL;
|
||||
tsl::elm::ListItem* creditsItem = NULL;
|
||||
|
||||
ImageElement* CatImage = NULL;
|
||||
HideableCategoryHeader* CatHeader = NULL;
|
||||
HideableCustomDrawer* CatSpacer = NULL;
|
||||
int lightosClickCount = 0;
|
||||
#define R_ARROW "\u2192"
|
||||
|
||||
class CreditsSubMenu;
|
||||
|
||||
AboutGui::AboutGui()
|
||||
{
|
||||
@@ -166,156 +166,19 @@ void AboutGui::listUI()
|
||||
this->listElement->addItem(saltyNXStatusItem);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Credits")
|
||||
new tsl::elm::CategoryHeader("General Info")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Developers")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Souldbminer")
|
||||
);
|
||||
|
||||
// Create special clickable item for Lightos
|
||||
auto lightosItem = new tsl::elm::ListItem("Lightos_");
|
||||
lightosItem->setClickListener([this](u64 keys) -> bool {
|
||||
creditsItem = new tsl::elm::ListItem("Credits");
|
||||
creditsItem->setClickListener([](u64 keys) {
|
||||
if (keys & HidNpadButton_A) {
|
||||
lightosClickCount++;
|
||||
if (lightosClickCount >= 10) {
|
||||
if (CatImage != NULL) CatImage->setVisible(true);
|
||||
if (CatHeader != NULL) CatHeader->setVisible(true);
|
||||
if (CatSpacer != NULL) CatSpacer->setVisible(true);
|
||||
}
|
||||
tsl::changeTo<CreditsSubMenu>();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
this->listElement->addItem(lightosItem);
|
||||
|
||||
// ---- Contributors ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Contributors")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Dom")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Blaise25")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("tetetete-ctrl")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("B3711")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("TDRR")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("MasaGratoR")
|
||||
);
|
||||
|
||||
// ---- Testers ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Testers")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Samybigio2011")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("arcdelta")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Miki1305")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Happy")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Winnerboi77")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Blaise25")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("WE1ZARD")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Alvise")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("agjeococh")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Xenshen")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Frost")
|
||||
);
|
||||
|
||||
// ---- Special Thanks ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Special Thanks")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("SciresM - Atmosphere CFW")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("KazushiMe - Switch OC Suite")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("NaGaa95 - L4T-OC-Kernel")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("RetroNX - sys-clk")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("ppkantorski - Ultrahand")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings")
|
||||
);
|
||||
|
||||
// Create cat elements but hide them initially
|
||||
CatHeader = new HideableCategoryHeader("Cat");
|
||||
CatHeader->setVisible(false);
|
||||
this->listElement->addItem(CatHeader);
|
||||
|
||||
CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT);
|
||||
CatImage->setVisible(false);
|
||||
this->listElement->addItem(CatImage);
|
||||
|
||||
CatSpacer = new HideableCustomDrawer(75);
|
||||
CatSpacer->setVisible(false);
|
||||
this->listElement->addItem(CatSpacer);
|
||||
creditsItem->setValue(R_ARROW);
|
||||
this->listElement->addItem(creditsItem);
|
||||
}
|
||||
|
||||
std::string AboutGui::formatRamModule() {
|
||||
@@ -446,5 +309,158 @@ void AboutGui::refresh()
|
||||
bqtempitem->setValue(strings[10]);
|
||||
|
||||
cTypeItem->setValue(hocClkFormatConsoleType(this->context->consoleType, true));
|
||||
|
||||
}
|
||||
|
||||
class CreditsSubMenu : public AboutGui {
|
||||
public:
|
||||
CreditsSubMenu() { }
|
||||
|
||||
protected:
|
||||
ImageElement* CatImage = NULL;
|
||||
HideableCategoryHeader* CatHeader = NULL;
|
||||
HideableCustomDrawer* CatSpacer = NULL;
|
||||
int lightosClickCount = 0;
|
||||
|
||||
void listUI() override {
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Developers")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Souldbminer")
|
||||
);
|
||||
|
||||
// Create special clickable item for Lightos
|
||||
auto lightosItem = new tsl::elm::ListItem("Lightos_");
|
||||
lightosItem->setClickListener([this](u64 keys) -> bool {
|
||||
if (keys & HidNpadButton_A) {
|
||||
lightosClickCount++;
|
||||
if (lightosClickCount >= 10) {
|
||||
if (CatImage != NULL) CatImage->setVisible(true);
|
||||
if (CatHeader != NULL) CatHeader->setVisible(true);
|
||||
if (CatSpacer != NULL) CatSpacer->setVisible(true);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
this->listElement->addItem(lightosItem);
|
||||
|
||||
// ---- Contributors ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Contributors")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Dom")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Blaise25")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("tetetete-ctrl")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("B3711")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("TDRR")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("MasaGratoR")
|
||||
);
|
||||
|
||||
// ---- Testers ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Testers")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Samybigio2011")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("arcdelta")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Miki1305")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Happy")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Winnerboi77")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Blaise25")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("WE1ZARD")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Alvise")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("agjeococh")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("Frost")
|
||||
);
|
||||
|
||||
// ---- Special Thanks ----
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::CategoryHeader("Special Thanks")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("SciresM, hexkyz and Alula - Atmosphere CFW")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("KazushiMe - Switch OC Suite")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("hanai3Bi - Switch OC Suite & EOS")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("RetroNX - sys-clk")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("ppkantorski - Ultrahand")
|
||||
);
|
||||
|
||||
this->listElement->addItem(
|
||||
new tsl::elm::ListItem("CtCaer - Hekate, L4T and Proper Timings")
|
||||
);
|
||||
|
||||
// Create cat elements but hide them initially
|
||||
CatHeader = new HideableCategoryHeader("Cat");
|
||||
CatHeader->setVisible(false);
|
||||
this->listElement->addItem(CatHeader);
|
||||
|
||||
CatImage = new ImageElement(CAT_DATA, CAT_WIDTH, CAT_HEIGHT);
|
||||
CatImage->setVisible(false);
|
||||
this->listElement->addItem(CatImage);
|
||||
|
||||
CatSpacer = new HideableCustomDrawer(75);
|
||||
CatSpacer->setVisible(false);
|
||||
this->listElement->addItem(CatSpacer);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "ult_ext.h"
|
||||
#include "app_profile_gui.h"
|
||||
|
||||
#include "../format.h"
|
||||
@@ -303,7 +304,7 @@ public:
|
||||
static constexpr struct { const char* label; int shift; } kAll[] = {
|
||||
{"CPU", 0}, {"GPU", 8}, {"VRR", 16}
|
||||
};
|
||||
int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper ? 3 : 2;
|
||||
int count = configList.values[HocClkConfigValue_OverwriteRefreshRate] || this->context->isUsingRetroSuper || this->context->profile == HocClkProfile_Docked ? 3 : 2;
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
u8 cur = (this->profileList->mhzMap[this->profile][HocClkModule_Governor] >> kAll[i].shift) & 0xFF;
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -28,53 +28,29 @@
|
||||
#include "base_menu_gui.h"
|
||||
#include "freq_choice_gui.h"
|
||||
#include "value_choice_gui.h"
|
||||
class AppProfileGui : public BaseMenuGui
|
||||
{
|
||||
class AppProfileGui : public BaseMenuGui {
|
||||
protected:
|
||||
std::uint64_t applicationId;
|
||||
HocClkTitleProfileList* profileList;
|
||||
void openFreqChoiceGui(tsl::elm::ListItem* listItem, HocClkProfile profile, HocClkModule module);
|
||||
void addModuleListItem(HocClkProfile profile, HocClkModule module);
|
||||
void addModuleListItemToggle(HocClkProfile profile, HocClkModule module);
|
||||
void openValueChoiceGui(
|
||||
tsl::elm::ListItem* listItem,
|
||||
std::uint32_t currentValue,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
ValueChoiceListener listener,
|
||||
const ValueThresholds& thresholds = ValueThresholds(),
|
||||
bool enableThresholds = false,
|
||||
const std::map<std::uint32_t, std::string>& labels = {},
|
||||
const std::vector<NamedValue>& namedValues = {},
|
||||
bool showDefaultValue = true
|
||||
);
|
||||
std::string formatValueDisplay(
|
||||
std::uint32_t value,
|
||||
const std::vector<NamedValue>& namedValues,
|
||||
const std::string& suffix,
|
||||
std::uint32_t divisor,
|
||||
int decimalPlaces
|
||||
);
|
||||
void addModuleListItemValue(
|
||||
HocClkProfile profile,
|
||||
HocClkModule module,
|
||||
const std::string& categoryName,
|
||||
std::uint32_t min,
|
||||
std::uint32_t max,
|
||||
std::uint32_t step,
|
||||
const std::string& suffix,
|
||||
std::uint32_t divisor,
|
||||
int decimalPlaces,
|
||||
ValueThresholds thresholds,
|
||||
std::vector<NamedValue> namedValues = {},
|
||||
bool showDefaultValue = true
|
||||
);
|
||||
void addGovernorSection(HocClkProfile profile);
|
||||
void addProfileUI(HocClkProfile profile);
|
||||
std::uint64_t applicationId;
|
||||
HocClkTitleProfileList *profileList;
|
||||
void openFreqChoiceGui(tsl::elm::ListItem *listItem, HocClkProfile profile, HocClkModule module);
|
||||
void addModuleListItem(HocClkProfile profile, HocClkModule module);
|
||||
void addModuleListItemToggle(HocClkProfile profile, HocClkModule module);
|
||||
void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName,
|
||||
ValueChoiceListener listener, const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false,
|
||||
const std::map<std::uint32_t, std::string> &labels = {}, const std::vector<NamedValue> &namedValues = {},
|
||||
bool showDefaultValue = true);
|
||||
std::string formatValueDisplay(std::uint32_t value, const std::vector<NamedValue> &namedValues, const std::string &suffix, std::uint32_t divisor,
|
||||
int decimalPlaces);
|
||||
void addModuleListItemValue(HocClkProfile profile, HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max,
|
||||
std::uint32_t step, const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds,
|
||||
std::vector<NamedValue> namedValues = {}, bool showDefaultValue = true);
|
||||
void addGovernorSection(HocClkProfile profile);
|
||||
void addProfileUI(HocClkProfile profile);
|
||||
|
||||
public:
|
||||
AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList* profileList);
|
||||
~AppProfileGui();
|
||||
void listUI() override;
|
||||
static void changeTo(std::uint64_t applicationId);
|
||||
void update() override;
|
||||
AppProfileGui(std::uint64_t applicationId, HocClkTitleProfileList *profileList);
|
||||
~AppProfileGui();
|
||||
void listUI() override;
|
||||
static void changeTo(std::uint64_t applicationId);
|
||||
void update() override;
|
||||
};
|
||||
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
@@ -24,21 +24,41 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "../elements/base_frame.h"
|
||||
#include "base_gui.h"
|
||||
|
||||
#include "../elements/base_frame.h"
|
||||
|
||||
#include <tesla.hpp>
|
||||
void BaseFrame::draw(tsl::gfx::Renderer *renderer) {
|
||||
tsl::elm::HeaderOverlayFrame::draw(renderer);
|
||||
this->gui->preDraw(renderer);
|
||||
}
|
||||
|
||||
#include <math.h>
|
||||
#include <tesla.hpp>
|
||||
|
||||
|
||||
#define LOGO_Y_REAL 65
|
||||
|
||||
#define LOGO_X 20
|
||||
#define LOGO_Y 50
|
||||
#define LOGO_Y 60
|
||||
#define LOGO_LABEL_FONT_SIZE 45
|
||||
|
||||
#define VERSION_X (LOGO_X + 250)
|
||||
#define TEXT_Y 57
|
||||
|
||||
#define LOGO_IMG_W 50
|
||||
#define LOGO_IMG_H 50
|
||||
#define LOGO_IMG_PAD 8
|
||||
#define LOGO_TEXT_X (LOGO_X + LOGO_IMG_W + LOGO_IMG_PAD)
|
||||
|
||||
#define VERSION_X (LOGO_TEXT_X + 185)
|
||||
#define VERSION_Y (LOGO_Y - 40)
|
||||
#define VERSION_FONT_SIZE 15
|
||||
|
||||
extern "C" {
|
||||
extern const u8 hoc_rgba[];
|
||||
extern const u32 hoc_rgba_size;
|
||||
}
|
||||
|
||||
std::string getVersionString() {
|
||||
char buf[0x100] = "";
|
||||
Result rc = hocclkIpcGetVersionString(buf, sizeof(buf));
|
||||
@@ -48,35 +68,28 @@ std::string getVersionString() {
|
||||
return std::string(buf);
|
||||
}
|
||||
|
||||
static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(0, 15, 3, 15);
|
||||
static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(0, 8, 1, 15);
|
||||
static constexpr tsl::Color STATIC_GREEN = tsl::Color(0, 15, 0, 15);
|
||||
const std::string name = "Horizon OC Gaea";
|
||||
static constexpr tsl::Color dynamicLogoRGB1 = tsl::Color(7, 15, 15, 15);
|
||||
static constexpr tsl::Color dynamicLogoRGB2 = tsl::Color(2, 8, 11, 15);
|
||||
static constexpr tsl::Color STATIC_TEAL = tsl::Color(7, 15, 15, 15);
|
||||
const std::string name = " Horizon OC";
|
||||
|
||||
static s32 drawDynamicUltraText(
|
||||
tsl::gfx::Renderer* renderer,
|
||||
s32 startX,
|
||||
s32 y,
|
||||
u32 fontSize,
|
||||
const tsl::Color& staticColor,
|
||||
bool useNotificationMethod = false)
|
||||
{
|
||||
static s32 drawDynamicUltraText(tsl::gfx::Renderer *renderer, s32 startX, s32 y, u32 fontSize, const tsl::Color &staticColor,
|
||||
bool useNotificationMethod = false) {
|
||||
static constexpr double cycleDuration = 1.6;
|
||||
|
||||
s32 currentX = startX;
|
||||
|
||||
const u64 currentTime_ns = armTicksToNs(armGetSystemTick());
|
||||
const double timeNow = static_cast<double>(currentTime_ns) / 1e9;
|
||||
const double timeBase = fmod(timeNow, cycleDuration);
|
||||
|
||||
const double waveScale = 2.0 * M_PI / cycleDuration;
|
||||
|
||||
for (size_t i = 0; i < name.size(); i++)
|
||||
{
|
||||
for (size_t i = 0; i < name.size(); i++) {
|
||||
char letter = name[i];
|
||||
if (letter == '\0') break;
|
||||
if (letter == '\0')
|
||||
break;
|
||||
|
||||
double phase = waveScale * (timeBase + i * 0.12);
|
||||
double phase = waveScale * (timeNow + i * 0.12);
|
||||
|
||||
double raw = cos(phase);
|
||||
double n = (raw + 1.0) * 0.5;
|
||||
@@ -86,15 +99,9 @@ static s32 drawDynamicUltraText(
|
||||
double glow = (cos(phase * 1.5) + 1.0) * 0.5;
|
||||
double brightness = 0.75 + glow * 0.25;
|
||||
|
||||
u8 r = static_cast<u8>(
|
||||
(dynamicLogoRGB1.r + (dynamicLogoRGB2.r - dynamicLogoRGB1.r) * blend) * brightness
|
||||
);
|
||||
u8 g = static_cast<u8>(
|
||||
(dynamicLogoRGB1.g + (dynamicLogoRGB2.g - dynamicLogoRGB1.g) * blend) * brightness
|
||||
);
|
||||
u8 b = static_cast<u8>(
|
||||
(dynamicLogoRGB1.b + (dynamicLogoRGB2.b - dynamicLogoRGB1.b) * blend) * brightness
|
||||
);
|
||||
u8 r = static_cast<u8>(((int)dynamicLogoRGB1.r + ((int)dynamicLogoRGB2.r - (int)dynamicLogoRGB1.r) * blend) * brightness);
|
||||
u8 g = static_cast<u8>(((int)dynamicLogoRGB1.g + ((int)dynamicLogoRGB2.g - (int)dynamicLogoRGB1.g) * blend) * brightness);
|
||||
u8 b = static_cast<u8>(((int)dynamicLogoRGB1.b + ((int)dynamicLogoRGB2.b - (int)dynamicLogoRGB1.b) * blend) * brightness);
|
||||
|
||||
r = std::clamp<u8>(r, 0, 15);
|
||||
g = std::clamp<u8>(g, 0, 15);
|
||||
@@ -120,25 +127,34 @@ static s32 drawDynamicUltraText(
|
||||
return currentX;
|
||||
}
|
||||
|
||||
void BaseGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
drawDynamicUltraText(
|
||||
renderer,
|
||||
LOGO_X,
|
||||
LOGO_Y,
|
||||
LOGO_LABEL_FONT_SIZE,
|
||||
STATIC_GREEN,
|
||||
false
|
||||
);
|
||||
void BaseGui::preDraw(tsl::gfx::Renderer *renderer) {
|
||||
renderer->drawBitmap(LOGO_X, LOGO_Y_REAL - LOGO_LABEL_FONT_SIZE, LOGO_IMG_W, LOGO_IMG_H, hoc_rgba);
|
||||
|
||||
drawDynamicUltraText(renderer, LOGO_TEXT_X, TEXT_Y, LOGO_LABEL_FONT_SIZE, STATIC_TEAL, false);
|
||||
|
||||
static const std::string versionStr = "Version " + getVersionString() + " \"Gaea\"";
|
||||
static constexpr tsl::Color versionColor(9, 9, 9, 15);
|
||||
static constexpr s32 vx = LOGO_TEXT_X + 15;
|
||||
static constexpr s32 vy = TEXT_Y + 18;
|
||||
static constexpr s32 fs = 15;
|
||||
static constexpr s32 skew = 3;
|
||||
static constexpr s32 passes = 25;
|
||||
for (s32 i = 0; i < passes; i++) {
|
||||
s32 sliceY = (vy - fs) + i * fs / passes;
|
||||
s32 sliceH = fs / passes + 1;
|
||||
s32 xOff = skew - (skew * i / (passes - 1));
|
||||
renderer->enableScissoring(0, sliceY, tsl::cfg::FramebufferWidth, sliceH);
|
||||
renderer->drawString(versionStr.c_str(), false, vx + xOff, vy, fs, versionColor);
|
||||
renderer->disableScissoring();
|
||||
}
|
||||
}
|
||||
|
||||
tsl::elm::Element* BaseGui::createUI()
|
||||
{
|
||||
BaseFrame* rootFrame = new BaseFrame(this);
|
||||
tsl::elm::Element *BaseGui::createUI() {
|
||||
BaseFrame *rootFrame = new BaseFrame(this, this->headerHeight());
|
||||
rootFrame->setContent(this->baseUI());
|
||||
return rootFrame;
|
||||
}
|
||||
|
||||
void BaseGui::update()
|
||||
{
|
||||
void BaseGui::update() {
|
||||
this->refresh();
|
||||
}
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,30 +24,36 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <tesla.hpp>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <tesla.hpp>
|
||||
#include <vector>
|
||||
|
||||
#include "../style.h"
|
||||
#include "../../ipc.h"
|
||||
#include "../elements/base_frame.h"
|
||||
#include "../style.h"
|
||||
|
||||
class BaseGui : public tsl::Gui
|
||||
{
|
||||
|
||||
class BaseGui : public tsl::Gui {
|
||||
public:
|
||||
BaseGui() {}
|
||||
~BaseGui() {}
|
||||
virtual void preDraw(tsl::gfx::Renderer* renderer);
|
||||
void update() override;
|
||||
tsl::elm::Element* createUI() override;
|
||||
virtual tsl::elm::Element* baseUI() = 0;
|
||||
virtual void refresh() {}
|
||||
BaseGui() {
|
||||
}
|
||||
~BaseGui() {
|
||||
}
|
||||
virtual void preDraw(tsl::gfx::Renderer *renderer);
|
||||
void update() override;
|
||||
tsl::elm::Element *createUI() override;
|
||||
virtual tsl::elm::Element *baseUI() = 0;
|
||||
virtual void refresh() {
|
||||
}
|
||||
virtual u16 headerHeight() const {
|
||||
return HOC_HEADER_HEIGHT;
|
||||
}
|
||||
|
||||
private:
|
||||
};
|
||||
|
||||
|
||||
extern std::string getVersionString();
|
||||
|
||||
@@ -24,21 +24,24 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "../format.h"
|
||||
#include "base_menu_gui.h"
|
||||
#include "fatal_gui.h"
|
||||
#include "../format.h"
|
||||
|
||||
|
||||
#define TOP_Y_OFFSET 15
|
||||
|
||||
// Cache hardware model to avoid repeated syscalls
|
||||
|
||||
BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), }
|
||||
{
|
||||
BaseMenuGui::BaseMenuGui()
|
||||
: tempColors{
|
||||
tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0), tsl::Color(0),
|
||||
} {
|
||||
tsl::initializeThemeVars();
|
||||
this->context = nullptr;
|
||||
this->lastContextUpdate = 0;
|
||||
this->listElement = nullptr;
|
||||
|
||||
|
||||
// Pre-cache hardware model during initialization
|
||||
IsAula();
|
||||
IsMariko();
|
||||
@@ -49,20 +52,19 @@ BaseMenuGui::BaseMenuGui() : tempColors{ tsl::Color(0), tsl::Color(0), tsl::Colo
|
||||
}
|
||||
|
||||
BaseMenuGui::~BaseMenuGui() {
|
||||
delete this->context; // delete handles nullptr automatically
|
||||
delete this->context; // delete handles nullptr automatically
|
||||
}
|
||||
|
||||
// Fast preDraw - just renders pre-computed strings
|
||||
void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
void BaseMenuGui::preDraw(tsl::gfx::Renderer *renderer) {
|
||||
BaseGui::preDraw(renderer);
|
||||
if(!this->context) [[unlikely]] return;
|
||||
|
||||
// All constants pre-calculated and cached
|
||||
const char* labels[] = {
|
||||
"App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board", "Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() ? "OLED" : "LCD", "FPS", "RES"
|
||||
};
|
||||
const char *labels[] = { "App ID", "Profile", "CPU", "GPU", "MEM", "SoC", "Board",
|
||||
"Skin", "Now", "Avg", "BAT", "PMIC", "Fan", IsAula() || this->context->isUsingRetroSuper ? "OLED" : "LCD",
|
||||
"FPS", "RES" };
|
||||
|
||||
static constexpr u32 dataPositions[6] = {63-3+3, 200-1, 344-1-3, 200-1, 342-1, 321-1};
|
||||
static constexpr u32 dataPositions[6] = { 63 - 3 + 3, 200 - 1, 344 - 1 - 3, 200 - 1, 342 - 1, 321 - 1 };
|
||||
|
||||
static u32 labelWidths[10];
|
||||
static bool positionsInitialized = false;
|
||||
@@ -73,14 +75,23 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
}
|
||||
positionsInitialized = true;
|
||||
}
|
||||
static u32 positions[10] = {24-1, 310-labelWidths[1], 24-1, 192-labelWidths[3], 332-labelWidths[4], 24-1, 192 - labelWidths[6], 332-labelWidths[7], 192 - labelWidths[8], 332-labelWidths[9]};
|
||||
static u32 positions[10] = { 24 - 1,
|
||||
310 - labelWidths[1],
|
||||
24 - 1,
|
||||
192 - labelWidths[3],
|
||||
332 - labelWidths[4],
|
||||
24 - 1,
|
||||
192 - labelWidths[6],
|
||||
332 - labelWidths[7],
|
||||
192 - labelWidths[8],
|
||||
332 - labelWidths[9] };
|
||||
|
||||
static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word
|
||||
static u32 maxProfileValueWidth = renderer->getTextDimensions("USB Charger", false, SMALL_TEXT_SIZE).first; // longest word
|
||||
|
||||
u32 y = 91;
|
||||
u32 y = 91 + TOP_Y_OFFSET;
|
||||
|
||||
// === TOP SECTION ===
|
||||
renderer->drawRoundedRect(14, 70-1, 420, 30+2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor));
|
||||
renderer->drawRoundedRect(14, 70 - 1 + TOP_Y_OFFSET, 420, 30 + 2, 12.0f, renderer->aWithOpacity(tsl::tableBGColor));
|
||||
|
||||
// App ID - use pre-formatted string
|
||||
renderer->drawString(labels[0], false, positions[0], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
|
||||
@@ -90,10 +101,10 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
renderer->drawString(labels[1], false, 423 - maxProfileValueWidth - labelWidths[1] - 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
|
||||
renderer->drawString(displayStrings[1], false, 423 - maxProfileValueWidth, y, SMALL_TEXT_SIZE, tsl::infoTextColor);
|
||||
|
||||
y += 38; // Direct assignment instead of += 38
|
||||
y += 38; // Direct assignment instead of += 38
|
||||
|
||||
// === MAIN DATA SECTION ===
|
||||
renderer->drawRoundedRect(14, 106, 420, 156, 10.0f, renderer->aWithOpacity(tsl::tableBGColor));
|
||||
renderer->drawRoundedRect(14, 106 + TOP_Y_OFFSET, 420, 156, 10.0f, renderer->aWithOpacity(tsl::tableBGColor));
|
||||
|
||||
// === FREQUENCY SECTION ===
|
||||
// Labels first (better cache locality)
|
||||
@@ -105,8 +116,7 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
renderer->drawString(displayStrings[3], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU
|
||||
renderer->drawString(displayStrings[4], false, dataPositions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // MEM
|
||||
|
||||
y += 20; // Direct assignment (129 + 20)
|
||||
|
||||
y += 20; // Direct assignment (129 + 20)
|
||||
|
||||
renderer->drawString(displayStrings[5], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU real
|
||||
renderer->drawString(displayStrings[6], false, dataPositions[1], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU real
|
||||
@@ -118,19 +128,20 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
|
||||
// === REAL FREQUENCIES ===
|
||||
|
||||
y += 20; // Direct assignment (149 + 20)
|
||||
y += 20; // Direct assignment (149 + 20)
|
||||
|
||||
// === VOLTAGES ===
|
||||
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[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->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);
|
||||
|
||||
renderer->drawString(displayStrings[19], false, positions[2], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // CPU Usage
|
||||
renderer->drawString(displayStrings[17], false, positions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // GPU Usage
|
||||
renderer->drawString(displayStrings[18], false, positions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RAM Usage
|
||||
|
||||
y += 22; // Direct assignment (169 + 22)
|
||||
y += 22; // Direct assignment (169 + 22)
|
||||
|
||||
// === TEMPERATURE SECTION ===
|
||||
// Labels
|
||||
@@ -140,59 +151,57 @@ void BaseMenuGui::preDraw(tsl::gfx::Renderer* renderer) {
|
||||
|
||||
// Temperatures with color - use pre-computed colors
|
||||
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[13], false, dataPositions[2], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Skin]); // Skin
|
||||
renderer->drawString(displayStrings[12], false, dataPositions[1], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_PCB]); // PCB
|
||||
renderer->drawString(displayStrings[13], false, dataPositions[2], 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); // SOC voltage
|
||||
renderer->drawString(displayStrings[14], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // SOC voltage
|
||||
|
||||
// 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);
|
||||
renderer->drawString(labels[9], false, positions[9], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
|
||||
|
||||
renderer->drawString(displayStrings[15], false, dataPositions[3], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power now
|
||||
renderer->drawString(displayStrings[16], false, dataPositions[4], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Power avg
|
||||
|
||||
y+=20;
|
||||
y += 20;
|
||||
|
||||
renderer->drawString(labels[10], false, positions[2], y, SMALL_TEXT_SIZE, tsl::sectionTextColor);
|
||||
|
||||
renderer->drawString(displayStrings[20], false, dataPositions[0], y, SMALL_TEXT_SIZE, tempColors[HocClkThermalSensor_Battery]); // Battery
|
||||
|
||||
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] + 5, 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(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
|
||||
renderer->drawString(displayStrings[25], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // disp freq
|
||||
|
||||
y+=20;
|
||||
y += 20;
|
||||
|
||||
renderer->drawString(displayStrings[21], false, dataPositions[0], y, SMALL_TEXT_SIZE, tsl::infoTextColor); // Bat voltage
|
||||
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
|
||||
|
||||
if(this->context->isSaltyNXInstalled) {
|
||||
if (this->context->isSaltyNXInstalled) {
|
||||
|
||||
renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label
|
||||
renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES
|
||||
|
||||
renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label
|
||||
renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS
|
||||
renderer->drawString(labels[15], false, positions[3] + 7, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // RES label
|
||||
renderer->drawString(displayStrings[27], false, dataPositions[1] + 5, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // RES
|
||||
|
||||
renderer->drawString(labels[14], false, positions[4] + 9, y, SMALL_TEXT_SIZE, tsl::sectionTextColor); // FPS label
|
||||
renderer->drawString(displayStrings[26], false, dataPositions[2] + 6, y, SMALL_TEXT_SIZE, tsl::infoTextColor); // FPS
|
||||
}
|
||||
|
||||
y+=20;
|
||||
y += 20;
|
||||
}
|
||||
|
||||
// Optimized refresh - now does all the string formatting once per second
|
||||
void BaseMenuGui::refresh()
|
||||
{
|
||||
void BaseMenuGui::refresh() {
|
||||
const u64 ticks = armGetSystemTick();
|
||||
// Use cached comparison - 1 billion nanoseconds
|
||||
if (armTicksToNs(ticks - this->lastContextUpdate) <= 1000000000UL) [[likely]] {
|
||||
return; // Early exit for most calls
|
||||
return; // Early exit for most calls
|
||||
}
|
||||
|
||||
this->lastContextUpdate = ticks;
|
||||
@@ -223,22 +232,22 @@ void BaseMenuGui::refresh()
|
||||
strcpy(displayStrings[1], hocclkFormatProfile(context->profile, true));
|
||||
|
||||
// Current frequencies
|
||||
u32 hz = context->freqs[HocClkModule_CPU]; // CPU
|
||||
u32 hz = context->freqs[HocClkModule_CPU]; // CPU
|
||||
sprintf(displayStrings[2], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U);
|
||||
|
||||
hz = context->freqs[HocClkModule_GPU]; // GPU
|
||||
hz = context->freqs[HocClkModule_GPU]; // GPU
|
||||
sprintf(displayStrings[3], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U);
|
||||
|
||||
hz = context->freqs[HocClkModule_MEM]; // MEM
|
||||
hz = context->freqs[HocClkModule_MEM]; // MEM
|
||||
std::uint32_t unit = configList.values[HocClkConfigValue_RamDisplayUnit];
|
||||
std::uint32_t mhz = hz / 1000000U;
|
||||
std::uint32_t mts = mhz * 2;
|
||||
std::uint32_t tenth = (hz / 100000U) % 10U;
|
||||
if(unit == RamDisplayUnit_MTs)
|
||||
if (unit == RamDisplayUnit_MTs)
|
||||
sprintf(displayStrings[4], "%u MT/s", mts);
|
||||
else if(unit == RamDisplayUnit_MHz)
|
||||
else if (unit == RamDisplayUnit_MHz)
|
||||
sprintf(displayStrings[4], "%u.%u MHz", mhz, tenth);
|
||||
else if(unit == RamDisplayUnit_MHzMTs) {
|
||||
else if (unit == RamDisplayUnit_MHzMTs) {
|
||||
hz = context->realFreqs[HocClkModule_MEM];
|
||||
mhz = hz / 1000000U;
|
||||
tenth = (hz / 100000U) % 10U;
|
||||
@@ -246,18 +255,18 @@ void BaseMenuGui::refresh()
|
||||
}
|
||||
|
||||
// Real frequencies
|
||||
hz = context->realFreqs[HocClkModule_CPU]; // CPU
|
||||
hz = context->realFreqs[HocClkModule_CPU]; // CPU
|
||||
sprintf(displayStrings[5], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U);
|
||||
|
||||
hz = context->realFreqs[HocClkModule_GPU]; // GPU
|
||||
hz = context->realFreqs[HocClkModule_GPU]; // GPU
|
||||
sprintf(displayStrings[6], "%u.%u MHz", hz / 1000000U, (hz / 100000U) % 10U);
|
||||
|
||||
hz = context->realFreqs[HocClkModule_MEM]; // MEM
|
||||
hz = context->realFreqs[HocClkModule_MEM]; // MEM
|
||||
unit = configList.values[HocClkConfigValue_RamDisplayUnit];
|
||||
mhz = hz / 1000000U;
|
||||
mts = mhz * 2;
|
||||
tenth = (hz / 100000U) % 10U;
|
||||
if(unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs)
|
||||
if (unit == RamDisplayUnit_MTs || unit == RamDisplayUnit_MHzMTs)
|
||||
sprintf(displayStrings[7], "%u MT/s", mts);
|
||||
else
|
||||
sprintf(displayStrings[7], "%u.%u MHz", mhz, tenth);
|
||||
@@ -266,12 +275,14 @@ void BaseMenuGui::refresh()
|
||||
sprintf(displayStrings[8], "%.1f mV", context->voltages[HocClkVoltage_CPU] / 1000.0);
|
||||
sprintf(displayStrings[9], "%.1f mV", context->voltages[HocClkVoltage_GPU] / 1000.0);
|
||||
|
||||
switch(configList.values[HocClkConfigValue_RAMVoltDisplayMode]) {
|
||||
switch (configList.values[HocClkConfigValue_RAMVoltDisplayMode]) {
|
||||
case RamDisplayMode_VDD2:
|
||||
sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U, (context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U);
|
||||
sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDD2] / 1000U,
|
||||
(context->voltages[HocClkVoltage_EMCVDD2] % 1000U) / 100U);
|
||||
break;
|
||||
case RamDisplayMode_VDDQ:
|
||||
sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U, (context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U);
|
||||
sprintf(displayStrings[10], "%u.%u mV", context->voltages[HocClkVoltage_EMCVDDQ] / 1000U,
|
||||
(context->voltages[HocClkVoltage_EMCVDDQ] % 1000U) / 100U);
|
||||
break;
|
||||
default:
|
||||
strcpy(displayStrings[10], "N/A");
|
||||
@@ -279,15 +290,15 @@ void BaseMenuGui::refresh()
|
||||
}
|
||||
|
||||
// Temperatures and pre-compute colors
|
||||
u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC
|
||||
u32 millis = context->temps[HocClkThermalSensor_SOC]; // SOC
|
||||
sprintf(displayStrings[11], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U);
|
||||
tempColors[HocClkThermalSensor_SOC] = tsl::GradientColor(millis * 0.001f);
|
||||
|
||||
millis = context->temps[HocClkThermalSensor_PCB]; // PCB
|
||||
millis = context->temps[HocClkThermalSensor_PCB]; // PCB
|
||||
sprintf(displayStrings[12], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U);
|
||||
tempColors[HocClkThermalSensor_PCB] = tsl::GradientColor(millis * 0.001f);
|
||||
|
||||
millis = context->temps[HocClkThermalSensor_Skin]; // Skin
|
||||
millis = context->temps[HocClkThermalSensor_Skin]; // Skin
|
||||
sprintf(displayStrings[13], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U);
|
||||
tempColors[HocClkThermalSensor_Skin] = tsl::GradientColor(millis * 0.001f);
|
||||
|
||||
@@ -295,26 +306,26 @@ void BaseMenuGui::refresh()
|
||||
sprintf(displayStrings[14], "%u mV", context->voltages[HocClkVoltage_SOC] / 1000U);
|
||||
|
||||
// Power
|
||||
sprintf(displayStrings[15], "%d mW", context->power[0]); // Now
|
||||
sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg
|
||||
sprintf(displayStrings[15], "%d mW", context->power[0]); // Now
|
||||
sprintf(displayStrings[16], "%d mW", context->power[1]); // Avg
|
||||
|
||||
sprintf(displayStrings[17], "%u%%", context->partLoad[HocClkPartLoad_GPU] / 10);
|
||||
sprintf(displayStrings[18], "%u%%", context->partLoad[HocClkPartLoad_EMC] / 10);
|
||||
sprintf(displayStrings[19], "%u%%", context->partLoad[HocClkPartLoad_CPUMax] / 10);
|
||||
|
||||
millis = context->temps[HocClkThermalSensor_Battery]; // Battery
|
||||
millis = context->temps[HocClkThermalSensor_Battery]; // Battery
|
||||
sprintf(displayStrings[20], "%u.%u °C", millis / 1000U, (millis % 1000U) / 100U);
|
||||
tempColors[HocClkThermalSensor_Battery] = tsl::GradientColor(millis * 0.001f);
|
||||
|
||||
sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG
|
||||
sprintf(displayStrings[21], "%d mV", context->voltages[HocClkVoltage_Battery]); // BAT AVG
|
||||
|
||||
sprintf(displayStrings[23], "%u%%", context->partLoad[HocClkPartLoad_BAT] / 1000);
|
||||
|
||||
sprintf(displayStrings[24], "%u%%", context->partLoad[HocClkPartLoad_FAN]);
|
||||
|
||||
sprintf(displayStrings[25], "%u Hz", context->realFreqs[HocClkModule_Display]);
|
||||
if(this->context->isSaltyNXInstalled) {
|
||||
if(context->fps == 254) {
|
||||
if (this->context->isSaltyNXInstalled) {
|
||||
if (context->fps == 254) {
|
||||
strcpy(displayStrings[26], "N/A");
|
||||
} else {
|
||||
memset(displayStrings[26], 0, sizeof(displayStrings[26]));
|
||||
@@ -322,8 +333,8 @@ void BaseMenuGui::refresh()
|
||||
}
|
||||
}
|
||||
|
||||
if(this->context->isSaltyNXInstalled) {
|
||||
if(context->resolutionHeight == 0) {
|
||||
if (this->context->isSaltyNXInstalled) {
|
||||
if (context->resolutionHeight == 0) {
|
||||
strcpy(displayStrings[27], "N/A");
|
||||
} else {
|
||||
memset(displayStrings[27], 0, sizeof(displayStrings[27]));
|
||||
@@ -342,13 +353,10 @@ void BaseMenuGui::refresh()
|
||||
millis = context->temps[HocClkThermalSensor_MEM];
|
||||
sprintf(displayStrings[30], "%u.%u", millis / 1000U, (millis % 1000U) / 100U);
|
||||
tempColors[HocClkThermalSensor_MEM] = tsl::GradientColor(millis * 0.001f);
|
||||
|
||||
}
|
||||
|
||||
tsl::elm::Element* BaseMenuGui::baseUI()
|
||||
{
|
||||
auto* list = new tsl::elm::List();
|
||||
list->addItem(new tsl::elm::CustomDrawer([](tsl::gfx::Renderer*, s32, s32, s32, s32) {}), 35); // add a bit of space
|
||||
tsl::elm::Element *BaseMenuGui::baseUI() {
|
||||
auto *list = new tsl::elm::List();
|
||||
this->listElement = list;
|
||||
this->listUI();
|
||||
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,68 +24,66 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../../ipc.h"
|
||||
#include "base_gui.h"
|
||||
|
||||
class BaseMenuGui : public BaseGui
|
||||
{
|
||||
class BaseMenuGui : public BaseGui {
|
||||
protected:
|
||||
|
||||
public:
|
||||
// u8 dockedHighestAllowedRefreshRate = 60;
|
||||
HocClkContext* context;
|
||||
std::uint64_t lastContextUpdate;
|
||||
HocClkConfigValueList configList;
|
||||
bool g_hardwareModelCached = false;
|
||||
bool g_isMariko = false;
|
||||
bool g_isAula = false;
|
||||
bool g_isHoag = false;
|
||||
SetSysProductModel HWmodel = SetSysProductModel_Invalid;
|
||||
|
||||
bool IsAula() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isAula = (HWmodel == SetSysProductModel_Aula);
|
||||
return g_isAula;
|
||||
}
|
||||
bool IsHoag() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isHoag = (HWmodel == SetSysProductModel_Hoag);
|
||||
return g_isHoag;
|
||||
}
|
||||
bool IsMariko() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isMariko = (HWmodel == SetSysProductModel_Iowa ||
|
||||
HWmodel == SetSysProductModel_Hoag ||
|
||||
HWmodel == SetSysProductModel_Calcio ||
|
||||
HWmodel == SetSysProductModel_Aula);
|
||||
// u8 dockedHighestAllowedRefreshRate = 60;
|
||||
HocClkContext *context;
|
||||
std::uint64_t lastContextUpdate;
|
||||
HocClkConfigValueList configList;
|
||||
bool g_hardwareModelCached = false;
|
||||
bool g_isMariko = false;
|
||||
bool g_isAula = false;
|
||||
bool g_isHoag = false;
|
||||
SetSysProductModel HWmodel = SetSysProductModel_Invalid;
|
||||
|
||||
return g_isMariko;
|
||||
bool IsAula() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isAula = (HWmodel == SetSysProductModel_Aula);
|
||||
return g_isAula;
|
||||
}
|
||||
bool IsHoag() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isHoag = (HWmodel == SetSysProductModel_Hoag);
|
||||
return g_isHoag;
|
||||
}
|
||||
bool IsMariko() {
|
||||
if (!g_hardwareModelCached) {
|
||||
setsysGetProductModel(&HWmodel);
|
||||
g_hardwareModelCached = true;
|
||||
}
|
||||
g_isMariko = (HWmodel == SetSysProductModel_Iowa || HWmodel == SetSysProductModel_Hoag || HWmodel == SetSysProductModel_Calcio ||
|
||||
HWmodel == SetSysProductModel_Aula);
|
||||
|
||||
bool IsErista() {
|
||||
return !IsMariko();
|
||||
}
|
||||
BaseMenuGui();
|
||||
~BaseMenuGui();
|
||||
void preDraw(tsl::gfx::Renderer* renderer) override;
|
||||
tsl::elm::List* listElement;
|
||||
tsl::elm::Element* baseUI() override;
|
||||
void refresh() override;
|
||||
virtual void listUI() = 0;
|
||||
return g_isMariko;
|
||||
}
|
||||
|
||||
bool IsErista() {
|
||||
return !IsMariko();
|
||||
}
|
||||
BaseMenuGui();
|
||||
~BaseMenuGui();
|
||||
void preDraw(tsl::gfx::Renderer *renderer) override;
|
||||
tsl::elm::List *listElement;
|
||||
tsl::elm::Element *baseUI() override;
|
||||
void refresh() override;
|
||||
virtual void listUI() = 0;
|
||||
u16 headerHeight() const override {
|
||||
return HOC_BOX_BOTTOM + 9;
|
||||
}
|
||||
|
||||
private:
|
||||
char displayStrings[48][32]; // Pre-formatted display strings
|
||||
tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors
|
||||
char displayStrings[48][32]; // Pre-formatted display strings
|
||||
tsl::Color tempColors[HocClkThermalSensor_EnumMax]; // Pre-computed temperature colors
|
||||
};
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -90,6 +90,13 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
isHoag ? "Default: 1664 mA" : "2048 mA"
|
||||
};
|
||||
|
||||
|
||||
case HocClkConfigValue_InputCurrentLimit:
|
||||
return {
|
||||
"Overrides the maximum input current from the charger.",
|
||||
isHoag ? "Default: 900 mA" : "1200 mA"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_AulaDisplayColorPreset:
|
||||
return {
|
||||
"Current display color preset. Default is Basic",
|
||||
@@ -98,8 +105,8 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"- Washed: Washed out colors.",
|
||||
"- Basic: Real natural profile.",
|
||||
"- Natural: Not actually natural.. Extra saturation.",
|
||||
"- Vivid: Saturated.",
|
||||
"Default: Do not override"
|
||||
"- Vivid: Saturated.",
|
||||
"Default: Do not override"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_CpuGovernorMinimumFreq:
|
||||
@@ -137,13 +144,17 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"Warning: Enabling this may cause damage to your device without a proper undervolt. Use with caution!",
|
||||
"Clock cappings:",
|
||||
"- Handheld:",
|
||||
" - GPU (HiOPT): 614 MHz",
|
||||
" - GPU (HiOPT - 15mV): 691 MHz",
|
||||
" - GPU (High UV): 768 MHz",
|
||||
" - GPU (No UV): 614 MHz",
|
||||
" - GPU (SLT): 691 MHz",
|
||||
" - GPU (HiOPT): 768 MHz",
|
||||
" - GPU (HiOPT - 15mV): 844 MHz",
|
||||
" - GPU (High UV): 921 MHz",
|
||||
"- USB Charger",
|
||||
" - GPU (HiOPT): 844 MHz",
|
||||
" - GPU (HiOPT - 15mV): 921 MHz",
|
||||
" - GPU (High UV): 998 MHz",
|
||||
" - GPU (No UV): 844 MHz",
|
||||
" - GPU (SLT): 921 MHz",
|
||||
" - GPU (HiOPT): 998 MHz",
|
||||
" - GPU (HiOPT - 15mV): 1075 MHz",
|
||||
" - GPU (High UV): 1152 MHz",
|
||||
"- PD Charger / Docked:",
|
||||
" - No capping applied",
|
||||
"Default: OFF"
|
||||
@@ -170,19 +181,6 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"Default: ON",
|
||||
};
|
||||
|
||||
case HocClkConfigValue_HandheldTDP:
|
||||
return {
|
||||
"If enabled, Resets to stock clocks when power consumption is above the threshold in handheld mode",
|
||||
"Default: ON",
|
||||
};
|
||||
|
||||
case HocClkConfigValue_HandheldTDPLimit:
|
||||
case HocClkConfigValue_LiteTDPLimit:
|
||||
return {
|
||||
"The power consumption threshold (in mW) for resetting to stock clocks in handheld mode when Handheld TDP is enabled.",
|
||||
isHoag ? "Default: 6400mW" : "Default: 9600mW"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_ThermalThrottleThreshold:
|
||||
return {
|
||||
"The temperature threshold (in °C) for resetting to stock clocks when Thermal Throttle is enabled.",
|
||||
@@ -227,7 +225,7 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"Default: 600 mV"
|
||||
};
|
||||
|
||||
case KipConfigValue_stepMode:
|
||||
case KipConfigValue_stepMode:
|
||||
return {
|
||||
"The step that RAM clocks take.",
|
||||
"Options (with examples):",
|
||||
@@ -250,8 +248,6 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
};
|
||||
|
||||
case KipConfigValue_eristaEmcMaxClock:
|
||||
case KipConfigValue_eristaEmcMaxClock1:
|
||||
case KipConfigValue_eristaEmcMaxClock2:
|
||||
return {
|
||||
"The RAM frequency used in the particular slot. Higher frequencies may cause instability, so increase this gradually and test for stability.",
|
||||
"Default: Disabled (1600 MHz)"
|
||||
@@ -363,19 +359,6 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"These properties apply for both write and read latencies, and you can mix-and-match the brackets if necessary",
|
||||
"Default: -"
|
||||
};
|
||||
|
||||
case KipConfigValue_mem_burst_read_latency:
|
||||
return {
|
||||
"The read latency for the ram",
|
||||
"Default: 1600 RL"
|
||||
};
|
||||
|
||||
case KipConfigValue_mem_burst_write_latency:
|
||||
return {
|
||||
"The write latency for the ram",
|
||||
"Default: 1600 WL"
|
||||
};
|
||||
|
||||
case KipConfigValue_marikoCpuUVLow:
|
||||
return {
|
||||
"The CPU UV level used before tBreak",
|
||||
@@ -463,6 +446,23 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"The clock used for the CPU in \"boost mode\"",
|
||||
"Default: 1785 MHz"
|
||||
};
|
||||
case HocClkConfigValue_AutoRAMCPUOverclock:
|
||||
return {
|
||||
"When enabled, automatically raises the CPU clock to the configured OC frequency when RAM clock meets or exceeds the threshold to meet the increased voltage requirement.",
|
||||
"Default: ON"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_AutoRamCpuCpuOCFreq:
|
||||
return {
|
||||
"The CPU clock (in MHz) applied when Auto High RAM CPU OC is enabled and the RAM threshold is met.",
|
||||
"Default: 1683 MHz"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_AutoRamCpuRamOCThreshold:
|
||||
return {
|
||||
"The RAM clock threshold (in MHz) at or above which the Auto High RAM CPU OC will activate.",
|
||||
"Default: 2133MHz"
|
||||
};
|
||||
|
||||
case HocClkConfigValue_OverwriteBoostMode:
|
||||
return {
|
||||
@@ -474,10 +474,12 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
return {
|
||||
"GPU undervolt level",
|
||||
"Options:",
|
||||
" - HiOPT: L4T Custom HiOPT table",
|
||||
" - No Undervolt: No Undervolt, HOS default",
|
||||
" - SLT Table: NVIDIA custom SLT Table",
|
||||
" - HiOPT: L4T Custom HiOPT table, HOC Default",
|
||||
" - HiOPT - 15mV: L4T Custom HiOPT table with a 15mV offset",
|
||||
" - High UV: The highest undervolt table, recommended",
|
||||
"Default: HiOPT"
|
||||
" - High UV: The highest undervolt table",
|
||||
"Default: No Undervolt"
|
||||
};
|
||||
|
||||
case KipConfigValue_marikoGpuVmin:
|
||||
@@ -492,7 +494,7 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
"Maximum GPU voltage",
|
||||
"Default: 800 mV"
|
||||
};
|
||||
|
||||
|
||||
case HocClkConfigValue_DVFSMode:
|
||||
return {
|
||||
"The mode used for GPU DVFS",
|
||||
@@ -513,10 +515,10 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
return {
|
||||
"GPU undervolt level",
|
||||
"Options:",
|
||||
" - No Undervolt: No Undervolt...",
|
||||
" - SLT Table: NVIDIA custom SLT Table",
|
||||
" - HiOPT: L4T Custom HiOPT table",
|
||||
" - HiOPT - 15mV: L4T Custom HiOPT table with a 15mV offset",
|
||||
" - High UV: The highest undervolt table, recommended",
|
||||
"Default: HiOPT"
|
||||
"Default: No Undervolt"
|
||||
};
|
||||
|
||||
case KipConfigValue_eristaGpuVmin:
|
||||
@@ -527,7 +529,7 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
|
||||
case KipConfigValue_commonGpuVoltOffset:
|
||||
return {
|
||||
"The offset added/subtracted to all AUTO GPU voltages",
|
||||
"The offset added/subtracted to all GPU voltages marked as \"auto\"",
|
||||
"Default: 0 mV (Disabled)"
|
||||
};
|
||||
|
||||
@@ -549,4 +551,4 @@ std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko,
|
||||
default:
|
||||
return {};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,8 +16,9 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include "misc_gui.h"
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "misc_gui.h"
|
||||
|
||||
std::vector<std::string> ConfigInfoStrings(HocClkConfigValue val, bool isMariko, bool isHoag);
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,45 +24,37 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "fatal_gui.h"
|
||||
|
||||
FatalGui::FatalGui(const std::string message, const std::string info)
|
||||
{
|
||||
FatalGui::FatalGui(const std::string message, const std::string info) {
|
||||
this->message = message;
|
||||
this->info = info;
|
||||
}
|
||||
|
||||
void FatalGui::openWithResultCode(std::string tag, Result rc)
|
||||
{
|
||||
void FatalGui::openWithResultCode(std::string tag, Result rc) {
|
||||
char rcStr[32];
|
||||
std::string info = tag;
|
||||
info.append(rcStr, snprintf(rcStr, sizeof(rcStr), "\n\n[0x%x] %04d-%04d", rc, R_MODULE(rc), R_DESCRIPTION(rc)));
|
||||
|
||||
tsl::changeTo<FatalGui>(
|
||||
"Could not connect to hoc-clk sysmodule.\n\n"
|
||||
"\n"
|
||||
"Please make sure everything is\n\n"
|
||||
"correctly installed and enabled.",
|
||||
info
|
||||
);
|
||||
tsl::changeTo<FatalGui>("Could not connect to hoc-clk sysmodule.\n\n"
|
||||
"\n"
|
||||
"Please make sure everything is\n\n"
|
||||
"correctly installed and enabled.",
|
||||
info);
|
||||
}
|
||||
|
||||
tsl::elm::Element* FatalGui::baseUI()
|
||||
{
|
||||
tsl::elm::CustomDrawer* drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer* renderer, u16 x, u16 y, u16 w, u16 h) {
|
||||
tsl::elm::Element *FatalGui::baseUI() {
|
||||
tsl::elm::CustomDrawer *drawer = new tsl::elm::CustomDrawer([this](tsl::gfx::Renderer *renderer, u16 x, u16 y, u16 w, u16 h) {
|
||||
renderer->drawString("\uE150", false, 40, 210, 40, TEXT_COLOR);
|
||||
renderer->drawString("Fatal error", false, 100, 210, 30, TEXT_COLOR);
|
||||
|
||||
std::uint32_t txtY = 255;
|
||||
if(!this->message.empty())
|
||||
{
|
||||
if (!this->message.empty()) {
|
||||
txtY += renderer->drawString(this->message.c_str(), false, 40, txtY, 23, TEXT_COLOR).second;
|
||||
txtY += 55;
|
||||
}
|
||||
|
||||
if(!this->info.empty())
|
||||
{
|
||||
if (!this->info.empty()) {
|
||||
renderer->drawString(this->info.c_str(), false, 40, txtY, 18, DESC_COLOR);
|
||||
}
|
||||
});
|
||||
@@ -70,11 +62,10 @@ tsl::elm::Element* FatalGui::baseUI()
|
||||
return drawer;
|
||||
}
|
||||
|
||||
bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight)
|
||||
{
|
||||
if((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B)
|
||||
{
|
||||
while(tsl::Overlay::get()->getCurrentGui() != nullptr) {
|
||||
bool FatalGui::handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft,
|
||||
HidAnalogStickState joyStickPosRight) {
|
||||
if ((keysDown & HidNpadButton_A) == HidNpadButton_A || (keysDown & HidNpadButton_B) == HidNpadButton_B) {
|
||||
while (tsl::Overlay::get()->getCurrentGui() != nullptr) {
|
||||
tsl::goBack();
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,23 +24,23 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <list>
|
||||
|
||||
#include "base_gui.h"
|
||||
|
||||
class FatalGui : public BaseGui
|
||||
{
|
||||
class FatalGui : public BaseGui {
|
||||
protected:
|
||||
std::string message;
|
||||
std::string info;
|
||||
std::string message;
|
||||
std::string info;
|
||||
|
||||
public:
|
||||
FatalGui(const std::string message, const std::string info);
|
||||
~FatalGui() {}
|
||||
tsl::elm::Element* baseUI() override;
|
||||
bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft, HidAnalogStickState joyStickPosRight);
|
||||
static void openWithResultCode(std::string tag, Result rc);
|
||||
FatalGui(const std::string message, const std::string info);
|
||||
~FatalGui() {
|
||||
}
|
||||
tsl::elm::Element *baseUI() override;
|
||||
bool handleInput(u64 keysDown, u64 keysHeld, const HidTouchState &touchPos, HidAnalogStickState joyStickPosLeft,
|
||||
HidAnalogStickState joyStickPosRight);
|
||||
static void openWithResultCode(std::string tag, Result rc);
|
||||
};
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,20 +24,13 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "freq_choice_gui.h"
|
||||
|
||||
#include "../format.h"
|
||||
#include "fatal_gui.h"
|
||||
#include "freq_choice_gui.h"
|
||||
#include "ult_ext.h"
|
||||
|
||||
FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz,
|
||||
std::uint32_t* hzList,
|
||||
std::uint32_t hzCount,
|
||||
HocClkModule module,
|
||||
FreqChoiceListener listener,
|
||||
bool checkMax,
|
||||
std::map<uint32_t, std::string> labels)
|
||||
{
|
||||
FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener,
|
||||
bool checkMax, std::map<uint32_t, std::string> labels) {
|
||||
this->selectedHz = selectedHz;
|
||||
this->hzList = hzList;
|
||||
this->hzCount = hzCount;
|
||||
@@ -45,18 +38,16 @@ FreqChoiceGui::FreqChoiceGui(std::uint32_t selectedHz,
|
||||
this->listener = listener;
|
||||
this->checkMax = checkMax;
|
||||
this->labels = labels;
|
||||
this->configList = new HocClkConfigValueList {};
|
||||
this->configList = new HocClkConfigValueList{};
|
||||
}
|
||||
|
||||
FreqChoiceGui::~FreqChoiceGui()
|
||||
{
|
||||
FreqChoiceGui::~FreqChoiceGui() {
|
||||
delete this->configList;
|
||||
}
|
||||
|
||||
tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety)
|
||||
{
|
||||
tsl::elm::ListItem *FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool selected, int safety) {
|
||||
std::string text;
|
||||
if(module == HocClkModule_MEM)
|
||||
if (module == HocClkModule_MEM)
|
||||
text = formatListFreqHzMem(hz, (RamDisplayUnit)this->configList->values[HocClkConfigValue_RamDisplayUnit]);
|
||||
else
|
||||
text = formatListFreqHz(hz);
|
||||
@@ -67,35 +58,32 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel
|
||||
rightText = it->second;
|
||||
|
||||
if (selected)
|
||||
const_cast<std::string&>(rightText) = "\uE14B";
|
||||
const_cast<std::string &>(rightText) = "\uE14B";
|
||||
|
||||
tsl::elm::ListItem* listItem =
|
||||
new tsl::elm::ListItem(text, rightText, false);
|
||||
tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false);
|
||||
|
||||
switch (safety)
|
||||
{
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
switch (safety) {
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
}
|
||||
|
||||
// Make annotation grey
|
||||
if (!rightText.empty() && !selected)
|
||||
listItem->setValueColor(tsl::Color(180, 180, 180, 255));
|
||||
else if(selected)
|
||||
else if (selected)
|
||||
listItem->setValueColor(tsl::infoTextColor);
|
||||
|
||||
listItem->setClickListener([this, hz](u64 keys)
|
||||
{
|
||||
listItem->setClickListener([this, hz](u64 keys) {
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) {
|
||||
if (this->listener(hz)) {
|
||||
tsl::goBack();
|
||||
@@ -108,8 +96,7 @@ tsl::elm::ListItem* FreqChoiceGui::createFreqListItem(std::uint32_t hz, bool sel
|
||||
return listItem;
|
||||
}
|
||||
|
||||
void FreqChoiceGui::listUI()
|
||||
{
|
||||
void FreqChoiceGui::listUI() {
|
||||
hocclkIpcGetConfigValues(this->configList);
|
||||
|
||||
// Header based on CPU/GPU/MEM module
|
||||
@@ -117,11 +104,9 @@ void FreqChoiceGui::listUI()
|
||||
this->listElement->addItem(new tsl::elm::CategoryHeader(moduleName));
|
||||
|
||||
// Default option
|
||||
this->listElement->addItem(
|
||||
this->createFreqListItem(0, this->selectedHz == 0, 0));
|
||||
this->listElement->addItem(this->createFreqListItem(0, this->selectedHz == 0, 0));
|
||||
|
||||
for (std::uint32_t i = 0; i < this->hzCount; i++)
|
||||
{
|
||||
for (std::uint32_t i = 0; i < this->hzCount; i++) {
|
||||
std::uint32_t hz = this->hzList[i];
|
||||
uint32_t mhz = hz / 1000000;
|
||||
|
||||
@@ -159,23 +144,14 @@ void FreqChoiceGui::listUI()
|
||||
uint32_t danger_cpu;
|
||||
uint32_t danger_gpu;
|
||||
|
||||
if (IsMariko())
|
||||
{
|
||||
if (IsMariko()) {
|
||||
unsafe_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2398 : 1964;
|
||||
if(this->configList->values[KipConfigValue_marikoGpuUV] == 0) {
|
||||
unsafe_gpu = 1076;
|
||||
} else if (this->configList->values[KipConfigValue_marikoGpuUV] == 1) {
|
||||
unsafe_gpu = 1153;
|
||||
} else {
|
||||
unsafe_gpu = 1229;
|
||||
}
|
||||
unsafe_gpu = 1229;
|
||||
danger_cpu = this->configList->values[KipConfigValue_marikoCpuUVHigh] ? 2500 : 2398;
|
||||
danger_gpu = 1306;
|
||||
}
|
||||
else
|
||||
{
|
||||
} else {
|
||||
unsafe_cpu = this->configList->values[KipConfigValue_eristaCpuUV] ? 2092 : 1786;
|
||||
if(this->configList->values[KipConfigValue_eristaGpuUV] == 0) {
|
||||
if (this->configList->values[KipConfigValue_eristaGpuUV] == GPUUVLevel_NoUV) {
|
||||
unsafe_gpu = 922;
|
||||
} else {
|
||||
unsafe_gpu = 961;
|
||||
@@ -207,16 +183,9 @@ void FreqChoiceGui::listUI()
|
||||
} else if (moduleName == "mem") {
|
||||
|
||||
safety = 0;
|
||||
|
||||
}
|
||||
|
||||
this->listElement->addItem(
|
||||
this->createFreqListItem(
|
||||
hz,
|
||||
(mhz == this->selectedHz / 1000000),
|
||||
safety
|
||||
)
|
||||
);
|
||||
this->listElement->addItem(this->createFreqListItem(hz, (mhz == this->selectedHz / 1000000), safety));
|
||||
}
|
||||
|
||||
this->listElement->jumpToItem("", "");
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,22 +24,21 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <list>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <map>
|
||||
|
||||
#include "base_menu_gui.h"
|
||||
|
||||
using FreqChoiceListener = std::function<bool(std::uint32_t hz)>;
|
||||
|
||||
class FreqChoiceGui : public BaseMenuGui
|
||||
{
|
||||
protected:
|
||||
HocClkConfigValueList* configList;
|
||||
class FreqChoiceGui : public BaseMenuGui {
|
||||
protected:
|
||||
HocClkConfigValueList *configList;
|
||||
std::uint32_t selectedHz;
|
||||
std::uint32_t* hzList;
|
||||
std::uint32_t *hzList;
|
||||
std::uint32_t hzCount;
|
||||
HocClkModule module;
|
||||
FreqChoiceListener listener;
|
||||
@@ -47,16 +46,11 @@ protected:
|
||||
|
||||
std::map<uint32_t, std::string> labels;
|
||||
|
||||
tsl::elm::ListItem* createFreqListItem(std::uint32_t hz, bool selected, int safety);
|
||||
tsl::elm::ListItem *createFreqListItem(std::uint32_t hz, bool selected, int safety);
|
||||
|
||||
public:
|
||||
FreqChoiceGui(std::uint32_t selectedHz,
|
||||
std::uint32_t* hzList,
|
||||
std::uint32_t hzCount,
|
||||
HocClkModule module,
|
||||
FreqChoiceListener listener,
|
||||
bool checkMax = true,
|
||||
std::map<uint32_t, std::string> labels = {});
|
||||
public:
|
||||
FreqChoiceGui(std::uint32_t selectedHz, std::uint32_t *hzList, std::uint32_t hzCount, HocClkModule module, FreqChoiceListener listener,
|
||||
bool checkMax = true, std::map<uint32_t, std::string> labels = {});
|
||||
|
||||
~FreqChoiceGui();
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "ult_ext.h"
|
||||
#include "../format.h"
|
||||
#include "fatal_gui.h"
|
||||
#include "global_override_gui.h"
|
||||
|
||||
@@ -13,9 +13,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -25,50 +25,33 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
#include "../../ipc.h"
|
||||
#include "base_menu_gui.h"
|
||||
#include "freq_choice_gui.h"
|
||||
#include <string>
|
||||
#include "value_choice_gui.h"
|
||||
class GlobalOverrideGui : public BaseMenuGui
|
||||
{
|
||||
class GlobalOverrideGui : public BaseMenuGui {
|
||||
protected:
|
||||
std::map<HocClkModule, std::tuple<std::string, std::uint32_t, int>> customFormatModules;
|
||||
tsl::elm::ListItem* listItems[HocClkModule_EnumMax];
|
||||
std::uint32_t listHz[HocClkModule_EnumMax];
|
||||
void openFreqChoiceGui(HocClkModule module);
|
||||
void addGovernorSection();
|
||||
void addModuleListItem(HocClkModule module);
|
||||
void addModuleToggleItem(HocClkModule module);
|
||||
void openValueChoiceGui(
|
||||
tsl::elm::ListItem* listItem,
|
||||
std::uint32_t currentValue,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
ValueChoiceListener listener,
|
||||
const ValueThresholds& thresholds,
|
||||
bool enableThresholds,
|
||||
const std::map<std::uint32_t, std::string>& labels,
|
||||
const std::vector<NamedValue>& namedValues,
|
||||
bool showDefaultValue
|
||||
);
|
||||
void addModuleListItemValue(
|
||||
HocClkModule module,
|
||||
const std::string& categoryName,
|
||||
std::uint32_t min,
|
||||
std::uint32_t max,
|
||||
std::uint32_t step,
|
||||
const std::string& suffix,
|
||||
std::uint32_t divisor,
|
||||
int decimalPlaces,
|
||||
ValueThresholds thresholds = {},
|
||||
const std::vector<NamedValue>& namedValues = {},
|
||||
bool showDefaultValue = true
|
||||
);
|
||||
std::map<HocClkModule, std::tuple<std::string, std::uint32_t, int>> customFormatModules;
|
||||
tsl::elm::ListItem *listItems[HocClkModule_EnumMax];
|
||||
std::uint32_t listHz[HocClkModule_EnumMax];
|
||||
void openFreqChoiceGui(HocClkModule module);
|
||||
void addGovernorSection();
|
||||
void addModuleListItem(HocClkModule module);
|
||||
void addModuleToggleItem(HocClkModule module);
|
||||
void openValueChoiceGui(tsl::elm::ListItem *listItem, std::uint32_t currentValue, const ValueRange &range, const std::string &categoryName,
|
||||
ValueChoiceListener listener, const ValueThresholds &thresholds, bool enableThresholds,
|
||||
const std::map<std::uint32_t, std::string> &labels, const std::vector<NamedValue> &namedValues, bool showDefaultValue);
|
||||
void addModuleListItemValue(HocClkModule module, const std::string &categoryName, std::uint32_t min, std::uint32_t max, std::uint32_t step,
|
||||
const std::string &suffix, std::uint32_t divisor, int decimalPlaces, ValueThresholds thresholds = {},
|
||||
const std::vector<NamedValue> &namedValues = {}, bool showDefaultValue = true);
|
||||
|
||||
public:
|
||||
GlobalOverrideGui();
|
||||
~GlobalOverrideGui() {}
|
||||
void listUI() override;
|
||||
void refresh() override;
|
||||
void setModuleCustomFormat(HocClkModule module, const std::string& suffix, std::uint32_t divisor, int decimalPlaces);
|
||||
GlobalOverrideGui();
|
||||
~GlobalOverrideGui() {
|
||||
}
|
||||
void listUI() override;
|
||||
void refresh() override;
|
||||
void setModuleCustomFormat(HocClkModule module, const std::string &suffix, std::uint32_t divisor, int decimalPlaces);
|
||||
};
|
||||
@@ -16,72 +16,70 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "info_gui.h"
|
||||
#include "ult_ext.h"
|
||||
#include <sstream>
|
||||
|
||||
InfoGui::InfoGui(std::string title, std::vector<std::string> strings)
|
||||
: m_title(std::move(title)), m_strings(std::move(strings)) {}
|
||||
#include "info_gui.h"
|
||||
#include "ult_ext.h"
|
||||
|
||||
static constexpr s32 TEXT_SIZE = 16;
|
||||
static constexpr s32 LINE_H = 22;
|
||||
static constexpr s32 PARA_GAP = 10;
|
||||
static constexpr s32 MARGIN_L = 20;
|
||||
static constexpr s32 MARGIN_R = 35;
|
||||
InfoGui::InfoGui(std::string title, std::vector<std::string> strings) : m_title(std::move(title)), m_strings(std::move(strings)) {
|
||||
}
|
||||
|
||||
static std::vector<std::string> wrapText(const std::string& text, s32 maxWidth)
|
||||
{
|
||||
static constexpr s32 TEXT_SIZE = 16;
|
||||
static constexpr s32 LINE_H = 22;
|
||||
static constexpr s32 PARA_GAP = 10;
|
||||
static constexpr s32 MARGIN_L = 20;
|
||||
static constexpr s32 MARGIN_R = 35;
|
||||
|
||||
static std::vector<std::string> wrapText(const std::string &text, s32 maxWidth) {
|
||||
constexpr float CHAR_W = 10.0f;
|
||||
|
||||
// Preserve leading whitespace as an indent prefix for wrapped continuation lines.
|
||||
std::string indent;
|
||||
for (char c : text) {
|
||||
if (c == ' ') indent += ' ';
|
||||
else break;
|
||||
if (c == ' ')
|
||||
indent += ' ';
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
std::vector<std::string> lines;
|
||||
std::istringstream ss(text);
|
||||
std::string word, line = indent; // seed with indent so first word inherits it
|
||||
std::string word, line = indent; // seed with indent so first word inherits it
|
||||
bool first = true;
|
||||
while (ss >> word) {
|
||||
std::string candidate = (first && !indent.empty()) ? indent + word
|
||||
: line.empty() ? word
|
||||
: line + " " + word;
|
||||
std::string candidate = (first && !indent.empty()) ? indent + word : line.empty() ? word : line + " " + word;
|
||||
first = false;
|
||||
if (static_cast<s32>(candidate.size() * CHAR_W) <= maxWidth)
|
||||
line = std::move(candidate);
|
||||
else {
|
||||
if (!line.empty() && line != indent) lines.push_back(line);
|
||||
if (!line.empty() && line != indent)
|
||||
lines.push_back(line);
|
||||
line = indent + word;
|
||||
}
|
||||
}
|
||||
if (!line.empty() && line != indent) lines.push_back(line);
|
||||
if (lines.empty()) lines.emplace_back("");
|
||||
if (!line.empty() && line != indent)
|
||||
lines.push_back(line);
|
||||
if (lines.empty())
|
||||
lines.emplace_back("");
|
||||
return lines;
|
||||
}
|
||||
|
||||
void InfoGui::listUI()
|
||||
{
|
||||
void InfoGui::listUI() {
|
||||
this->listElement->addItem(new tsl::elm::CategoryHeader(m_title));
|
||||
|
||||
const s32 maxWidth = tsl::cfg::FramebufferWidth - MARGIN_L - MARGIN_R;
|
||||
|
||||
for (const auto& para : m_strings) {
|
||||
for (const auto& lineText : wrapText(para, maxWidth)) {
|
||||
auto* d = new FocusableDrawer(
|
||||
[lineText](tsl::gfx::Renderer* r, s32 x, s32 y, s32 w, s32 h) {
|
||||
r->drawString((lineText + "\n").c_str(), false,
|
||||
x + MARGIN_L, y + LINE_H - 5,
|
||||
TEXT_SIZE, tsl::style::color::ColorText);
|
||||
});
|
||||
for (const auto ¶ : m_strings) {
|
||||
for (const auto &lineText : wrapText(para, maxWidth)) {
|
||||
auto *d = new FocusableDrawer([lineText](tsl::gfx::Renderer *r, s32 x, s32 y, s32 w, s32 h) {
|
||||
r->drawString((lineText + "\n").c_str(), false, x + MARGIN_L, y + LINE_H - 5, TEXT_SIZE, tsl::style::color::ColorText);
|
||||
});
|
||||
d->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, LINE_H);
|
||||
this->listElement->addItem(d, LINE_H);
|
||||
}
|
||||
|
||||
// paragraph gap
|
||||
auto* gap = new tsl::elm::CustomDrawer(
|
||||
[](tsl::gfx::Renderer*, s32, s32, s32, s32) {});
|
||||
auto *gap = new tsl::elm::CustomDrawer([](tsl::gfx::Renderer *, s32, s32, s32, s32) {});
|
||||
gap->setBoundaries(0, 0, tsl::cfg::FramebufferWidth, PARA_GAP);
|
||||
this->listElement->addItem(gap, PARA_GAP);
|
||||
}
|
||||
|
||||
@@ -16,18 +16,18 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include "base_menu_gui.h"
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
class InfoGui : public BaseMenuGui
|
||||
{
|
||||
public:
|
||||
#include "base_menu_gui.h"
|
||||
|
||||
class InfoGui : public BaseMenuGui {
|
||||
public:
|
||||
InfoGui(std::string title, std::vector<std::string> strings);
|
||||
~InfoGui() = default;
|
||||
void listUI() override;
|
||||
|
||||
private:
|
||||
private:
|
||||
std::string m_title;
|
||||
std::vector<std::string> m_strings;
|
||||
};
|
||||
|
||||
@@ -12,124 +12,73 @@
|
||||
*
|
||||
* 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 <map>
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
std::map<uint32_t, std::string> cpu_freq_label_m = {
|
||||
{612000000, "Sleep Mode"},
|
||||
{1020000000, "Stock"},
|
||||
{1224000000, "Dev OC"},
|
||||
{1785000000, "Boost Mode"},
|
||||
{1963000000, "Safe Max"},
|
||||
{2397000000, "Unsafe Max"},
|
||||
{2703000000, "Absolute Max"},
|
||||
{ 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" },
|
||||
{ 1963000000, "Safe Max" }, { 2397000000, "Unsafe Max" }, { 2703000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> cpu_freq_label_m_uv = {
|
||||
{612000000, "Sleep Mode"},
|
||||
{1020000000, "Stock"},
|
||||
{1224000000, "Dev OC"},
|
||||
{1785000000, "Boost Mode"},
|
||||
{2397000000, "Safe Max"},
|
||||
{2499000000, "Unsafe Max"},
|
||||
{2703000000, "Absolute Max"},
|
||||
{ 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" },
|
||||
{ 2397000000, "Safe Max" }, { 2499000000, "Unsafe Max" }, { 2703000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> cpu_freq_label_e = {
|
||||
{612000000, "Sleep Mode"},
|
||||
{1020000000, "Stock"},
|
||||
{1224000000, "Dev OC"},
|
||||
{1785000000, "Safe Max"},
|
||||
{2091000000, "Unsafe Max"},
|
||||
{2397000000, "Absolute Max"},
|
||||
{ 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" },
|
||||
{ 1785000000, "Safe Max" }, { 2091000000, "Unsafe Max" }, { 2397000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> cpu_freq_label_e_uv = {
|
||||
{612000000, "Sleep Mode"},
|
||||
{1020000000, "Stock"},
|
||||
{1224000000, "Dev OC"},
|
||||
{1785000000, "Boost Mode"},
|
||||
{2091000000, "Safe Max"},
|
||||
{2193000000, "Unsafe Max"},
|
||||
{2397000000, "Absolute Max"},
|
||||
{ 612000000, "Sleep Mode" }, { 1020000000, "Stock" }, { 1224000000, "Dev OC" }, { 1785000000, "Boost Mode" },
|
||||
{ 2091000000, "Safe Max" }, { 2193000000, "Unsafe Max" }, { 2397000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
|
||||
std::map<uint32_t, std::string> gpu_freq_label_e = {
|
||||
{76800000, "Boost Mode"},
|
||||
{307200000, "Handheld"},
|
||||
{345600000, "Handheld"},
|
||||
{384000000, "Handheld"},
|
||||
{422400000, "Handheld"},
|
||||
{460800000, "Handheld Safe Max"},
|
||||
{768000000, "Docked"},
|
||||
{921600000, "Safe Max"},
|
||||
{960000000, "Unsafe Max"},
|
||||
{1075200000, "Absolute Max"},
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" },
|
||||
{ 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 921600000, "Safe Max" },
|
||||
{ 960000000, "Unsafe Max" }, { 1075200000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> gpu_freq_label_e_uv = {
|
||||
{76800000, "Boost Mode"},
|
||||
{307200000, "Handheld"},
|
||||
{345600000, "Handheld"},
|
||||
{384000000, "Handheld"},
|
||||
{422400000, "Handheld"},
|
||||
{460800000, "Handheld Safe Max"},
|
||||
{768000000, "Docked"},
|
||||
{960000000, "Safe Max"},
|
||||
{1075200000, "Absolute Max"},
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" },
|
||||
{ 384000000, "Handheld" }, { 422400000, "Handheld" }, { 460800000, "Handheld Safe Max" },
|
||||
{ 768000000, "Docked" }, { 960000000, "Safe Max" }, { 1075200000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> gpu_freq_label_m = {
|
||||
{76800000, "Boost Mode"},
|
||||
{307200000, "Handheld"},
|
||||
{345600000, "Handheld"},
|
||||
{384000000, "Handheld"},
|
||||
{422400000, "Handheld"},
|
||||
{460800000, "Handheld"},
|
||||
{614400000, "Handheld Safe Max"},
|
||||
{768000000, "Docked"},
|
||||
{1075200000, "Safe Max"},
|
||||
{1305600000, "Unsafe Max"},
|
||||
{1536000000, "Absolute Max"},
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" }, { 422400000, "Handheld" },
|
||||
{ 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" }, { 998400000, "Safe Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> gpu_freq_label_m_slt = {
|
||||
{76800000, "Boost Mode"},
|
||||
{307200000, "Handheld"},
|
||||
{384000000, "Handheld"},
|
||||
{460800000, "Handheld"},
|
||||
{614400000, "Handheld Safe Max"},
|
||||
{768000000, "Docked"},
|
||||
{1152200000, "Safe Max"},
|
||||
{1305600000, "Unsafe Max"},
|
||||
{1536000000, "Absolute Max"},
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" },
|
||||
{ 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" },
|
||||
{ 1075200000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> gpu_freq_label_m_hiopt = {
|
||||
{76800000, "Boost Mode"},
|
||||
{307200000, "Handheld"},
|
||||
{384000000, "Handheld"},
|
||||
{460800000, "Handheld"},
|
||||
{614400000, "Handheld Safe Max"},
|
||||
{768000000, "Docked"},
|
||||
{1228800000, "Safe Max"},
|
||||
{1305600000, "Unsafe Max"},
|
||||
{1536000000, "Absolute Max"},
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 345600000, "Handheld" }, { 384000000, "Handheld" },
|
||||
{ 422400000, "Handheld" }, { 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" },
|
||||
{ 1152000000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string>* marikoUV[3] {
|
||||
&gpu_freq_label_m,
|
||||
&gpu_freq_label_m_slt,
|
||||
&gpu_freq_label_m_hiopt,
|
||||
std::map<uint32_t, std::string> gpu_freq_label_m_highuv = {
|
||||
{ 76800000, "Boost Mode" }, { 307200000, "Handheld" }, { 384000000, "Handheld" },
|
||||
{ 460800000, "Handheld" }, { 614400000, "Handheld Safe Max" }, { 768000000, "Docked" },
|
||||
{ 1228800000, "Safe Max" }, { 1305600000, "Unsafe Max" }, { 1536000000, "Absolute Max" },
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string> *marikoUV[5]{
|
||||
&gpu_freq_label_m, &gpu_freq_label_m_slt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_hiopt, &gpu_freq_label_m_highuv,
|
||||
};
|
||||
|
||||
std::map<uint32_t, std::string>* eristaUV[3] {
|
||||
std::map<uint32_t, std::string> *eristaUV[3]{
|
||||
&gpu_freq_label_e,
|
||||
&gpu_freq_label_e_uv,
|
||||
&gpu_freq_label_e_uv,
|
||||
|
||||
@@ -27,8 +27,10 @@ extern std::map<uint32_t, std::string> cpu_freq_label_e_uv;
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_m;
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_m_slt;
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_m_hiopt;
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_m_highuv;
|
||||
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_e;
|
||||
extern std::map<uint32_t, std::string> gpu_freq_label_e_uv;
|
||||
|
||||
extern std::map<uint32_t, std::string>* marikoUV[3];
|
||||
extern std::map<uint32_t, std::string>* marikoUV[5];
|
||||
extern std::map<uint32_t, std::string>* eristaUV[3];
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,17 +24,23 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "main_gui.h"
|
||||
|
||||
#include "fatal_gui.h"
|
||||
#include "app_profile_gui.h"
|
||||
#include "global_override_gui.h"
|
||||
#include "misc_gui.h"
|
||||
#include "about_gui.h"
|
||||
#include "app_profile_gui.h"
|
||||
#include "fatal_gui.h"
|
||||
#include "global_override_gui.h"
|
||||
#include "main_gui.h"
|
||||
#include "misc_gui.h"
|
||||
#include "ult_ext.h"
|
||||
|
||||
void MainGui::listUI()
|
||||
{
|
||||
|
||||
tsl::elm::Element *MainGui::baseUI() {
|
||||
auto *list = new BoxClippedList();
|
||||
this->listElement = list;
|
||||
this->listUI();
|
||||
return list;
|
||||
}
|
||||
|
||||
void MainGui::listUI() {
|
||||
// this->enabledToggle = new tsl::elm::ToggleListItem("Enable", false);
|
||||
// enabledToggle->setStateChangedListener([this](bool state) {
|
||||
// Result rc = hocclkIpcSetEnabled(state);
|
||||
@@ -48,10 +54,9 @@ void MainGui::listUI()
|
||||
// });
|
||||
// this->listElement->addItem(this->enabledToggle);
|
||||
|
||||
tsl::elm::ListItem* appProfileItem = new tsl::elm::ListItem("Edit App Profile");
|
||||
tsl::elm::ListItem *appProfileItem = new tsl::elm::ListItem("Edit App Profile");
|
||||
appProfileItem->setClickListener([this](u64 keys) {
|
||||
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)
|
||||
{
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) {
|
||||
AppProfileGui::changeTo(this->context->applicationId);
|
||||
return true;
|
||||
}
|
||||
@@ -60,11 +65,9 @@ void MainGui::listUI()
|
||||
});
|
||||
this->listElement->addItem(appProfileItem);
|
||||
|
||||
|
||||
tsl::elm::ListItem* globalProfileItem = new tsl::elm::ListItem("Edit Global Profile");
|
||||
tsl::elm::ListItem *globalProfileItem = new tsl::elm::ListItem("Edit Global Profile");
|
||||
globalProfileItem->setClickListener([this](u64 keys) {
|
||||
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)
|
||||
{
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) {
|
||||
AppProfileGui::changeTo(HOCCLK_GLOBAL_PROFILE_TID);
|
||||
return true;
|
||||
}
|
||||
@@ -73,10 +76,9 @@ void MainGui::listUI()
|
||||
});
|
||||
this->listElement->addItem(globalProfileItem);
|
||||
|
||||
tsl::elm::ListItem* globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides");
|
||||
tsl::elm::ListItem *globalOverrideItem = new tsl::elm::ListItem("Temporary Overrides");
|
||||
globalOverrideItem->setClickListener([this](u64 keys) {
|
||||
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)
|
||||
{
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) {
|
||||
tsl::changeTo<GlobalOverrideGui>();
|
||||
return true;
|
||||
}
|
||||
@@ -85,12 +87,11 @@ void MainGui::listUI()
|
||||
});
|
||||
this->listElement->addItem(globalOverrideItem);
|
||||
|
||||
//this->listElement->addItem(new tsl::elm::CategoryHeader("Misc"));
|
||||
// this->listElement->addItem(new tsl::elm::CategoryHeader("Misc"));
|
||||
|
||||
tsl::elm::ListItem* miscItem = new tsl::elm::ListItem("Settings");
|
||||
tsl::elm::ListItem *miscItem = new tsl::elm::ListItem("Settings");
|
||||
miscItem->setClickListener([this](u64 keys) {
|
||||
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)
|
||||
{
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) {
|
||||
tsl::changeTo<MiscGui>();
|
||||
return true;
|
||||
}
|
||||
@@ -99,10 +100,9 @@ void MainGui::listUI()
|
||||
});
|
||||
this->listElement->addItem(miscItem);
|
||||
|
||||
tsl::elm::ListItem* aboutItem = new tsl::elm::ListItem("About");
|
||||
tsl::elm::ListItem *aboutItem = new tsl::elm::ListItem("About");
|
||||
aboutItem->setClickListener([this](u64 keys) {
|
||||
if((keys & HidNpadButton_A) == HidNpadButton_A && this->context)
|
||||
{
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->context) {
|
||||
tsl::changeTo<AboutGui>();
|
||||
return true;
|
||||
}
|
||||
@@ -110,14 +110,12 @@ void MainGui::listUI()
|
||||
return false;
|
||||
});
|
||||
this->listElement->addItem(aboutItem);
|
||||
|
||||
}
|
||||
|
||||
void MainGui::refresh()
|
||||
{
|
||||
void MainGui::refresh() {
|
||||
BaseMenuGui::refresh();
|
||||
//if(this->context)
|
||||
// if(this->context)
|
||||
//{
|
||||
// this->enabledToggle->setState(this->context->enabled);
|
||||
//}
|
||||
// this->enabledToggle->setState(this->context->enabled);
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,16 +24,20 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "base_menu_gui.h"
|
||||
|
||||
class MainGui : public BaseMenuGui
|
||||
{
|
||||
class MainGui : public BaseMenuGui {
|
||||
public:
|
||||
MainGui() {}
|
||||
~MainGui() {}
|
||||
void listUI() override;
|
||||
void refresh() override;
|
||||
MainGui() {
|
||||
}
|
||||
~MainGui() {
|
||||
}
|
||||
tsl::elm::Element *baseUI() override;
|
||||
void listUI() override;
|
||||
void refresh() override;
|
||||
u16 headerHeight() const override {
|
||||
return HOC_HEADER_HEIGHT - 25;
|
||||
}
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -16,67 +16,51 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include "../../ipc.h"
|
||||
#include "base_menu_gui.h"
|
||||
#include <initializer_list>
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "../../ipc.h"
|
||||
#include "base_menu_gui.h"
|
||||
#include "freq_choice_gui.h"
|
||||
#include "value_choice_gui.h"
|
||||
#include "info_gui.h"
|
||||
class MiscGui : public BaseMenuGui
|
||||
{
|
||||
public:
|
||||
#include "value_choice_gui.h"
|
||||
#include <initializer_list>
|
||||
#include <unordered_map>
|
||||
class MiscGui : public BaseMenuGui {
|
||||
public:
|
||||
MiscGui();
|
||||
~MiscGui();
|
||||
void listUI() override;
|
||||
void refresh() override;
|
||||
|
||||
protected:
|
||||
HocClkConfigValueList* configList;
|
||||
std::map<HocClkConfigValue, tsl::elm::ListItem*> configButtons;
|
||||
protected:
|
||||
HocClkConfigValueList *configList;
|
||||
std::map<HocClkConfigValue, tsl::elm::ListItem *> configButtons;
|
||||
std::map<HocClkConfigValue, ValueRange> configRanges;
|
||||
std::map<HocClkConfigValue, std::vector<NamedValue>> configNamedValues;
|
||||
std::map<HocClkConfigValue, tsl::elm::ToggleListItem*> configToggles;
|
||||
std::map<HocClkConfigValue, std::tuple<tsl::elm::TrackBar*, tsl::elm::ListItem*, std::vector<uint64_t>>> configTrackbars;
|
||||
std::map<HocClkConfigValue, tsl::elm::ToggleListItem *> configToggles;
|
||||
std::map<HocClkConfigValue, std::tuple<tsl::elm::TrackBar *, tsl::elm::ListItem *, std::vector<uint64_t>>> configTrackbars;
|
||||
std::set<HocClkConfigValue> configButtonSKeys;
|
||||
std::map<HocClkConfigValue, std::string> configButtonSSubtext;
|
||||
std::set<HocClkConfigValue> emcClockConfigs;
|
||||
|
||||
void addConfigToggle(HocClkConfigValue configVal, const char* altName, bool kip = false);
|
||||
void addConfigTrackbar(HocClkConfigValue configVal, const char* altName, const ValueRange& range, bool kip = true);
|
||||
void addMappedConfigTrackbar(HocClkConfigValue configVal, const char* altName,
|
||||
std::vector<u32> vals,
|
||||
std::initializer_list<std::string> names, bool kip = true);
|
||||
void addConfigButton(HocClkConfigValue configVal,
|
||||
const char* altName,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
const ValueThresholds* thresholds,
|
||||
const std::map<uint32_t, std::string>& labels = {},
|
||||
const std::vector<NamedValue>& namedValues = {},
|
||||
bool showDefaultValue = true,
|
||||
bool kip = false);
|
||||
void addConfigToggle(HocClkConfigValue configVal, const char *altName, bool kip = false);
|
||||
void addConfigTrackbar(HocClkConfigValue configVal, const char *altName, const ValueRange &range, bool kip = true);
|
||||
void addMappedConfigTrackbar(HocClkConfigValue configVal, const char *altName, std::vector<u32> vals, std::initializer_list<std::string> names,
|
||||
bool kip = true);
|
||||
void addConfigButton(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName,
|
||||
const ValueThresholds *thresholds, const std::map<uint32_t, std::string> &labels = {},
|
||||
const std::vector<NamedValue> &namedValues = {}, bool showDefaultValue = true, bool kip = false);
|
||||
|
||||
void addConfigButtonS(HocClkConfigValue configVal,
|
||||
const char* altName,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
const ValueThresholds* thresholds,
|
||||
const std::map<uint32_t, std::string>& labels = {},
|
||||
const std::vector<NamedValue>& namedValues = {},
|
||||
bool showDefaultValue = true,
|
||||
const char* subText = nullptr,
|
||||
bool kip = false);
|
||||
void addFreqButton(HocClkConfigValue configVal,
|
||||
const char* altName,
|
||||
HocClkModule module,
|
||||
const std::map<uint32_t, std::string>& labels = {});
|
||||
void addConfigButtonS(HocClkConfigValue configVal, const char *altName, const ValueRange &range, const std::string &categoryName,
|
||||
const ValueThresholds *thresholds, const std::map<uint32_t, std::string> &labels = {},
|
||||
const std::vector<NamedValue> &namedValues = {}, bool showDefaultValue = true, const char *subText = nullptr,
|
||||
bool kip = false);
|
||||
void addFreqButton(HocClkConfigValue configVal, const char *altName, HocClkModule module, const std::map<uint32_t, std::string> &labels = {});
|
||||
void updateConfigToggles();
|
||||
|
||||
tsl::elm::ToggleListItem* enabledToggle;
|
||||
tsl::elm::ToggleListItem *enabledToggle;
|
||||
u8 frameCounter = 60;
|
||||
bool shouldSaveKip = false;
|
||||
};
|
||||
|
||||
@@ -12,40 +12,62 @@
|
||||
*
|
||||
* 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 <tesla.hpp>
|
||||
|
||||
#include "../elements/base_frame.h"
|
||||
|
||||
|
||||
class TopAnchoredList : public tsl::elm::List {
|
||||
public:
|
||||
TopAnchoredList() {
|
||||
m_hasSetInitialFocusHack = true;
|
||||
}
|
||||
};
|
||||
class BoxClippedList : public tsl::elm::List {
|
||||
public:
|
||||
void draw(tsl::gfx::Renderer *renderer) override {
|
||||
renderer->enableScissoring(0, HOC_BOX_BOTTOM, tsl::cfg::FramebufferWidth, tsl::cfg::FramebufferHeight - HOC_BOX_BOTTOM);
|
||||
tsl::elm::List::draw(renderer);
|
||||
renderer->disableScissoring();
|
||||
}
|
||||
};
|
||||
|
||||
class CompactCategoryHeader : public tsl::elm::CategoryHeader {
|
||||
public:
|
||||
CompactCategoryHeader(const std::string &text) : tsl::elm::CategoryHeader(text) {
|
||||
}
|
||||
void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override {
|
||||
this->setBoundaries(this->getX(), this->getY(), this->getWidth(), 33);
|
||||
}
|
||||
};
|
||||
|
||||
class ImageElement : public tsl::elm::ListItem {
|
||||
private:
|
||||
const uint8_t* imgData;
|
||||
private:
|
||||
const uint8_t *imgData;
|
||||
uint32_t imgWidth, imgHeight;
|
||||
bool visible;
|
||||
|
||||
public:
|
||||
ImageElement(const uint8_t* data, uint32_t w, uint32_t h)
|
||||
: tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) {}
|
||||
|
||||
|
||||
public:
|
||||
ImageElement(const uint8_t *data, uint32_t w, uint32_t h) : tsl::elm::ListItem(""), imgData(data), imgWidth(w), imgHeight(h), visible(true) {
|
||||
}
|
||||
|
||||
void setVisible(bool v) {
|
||||
visible = v;
|
||||
}
|
||||
|
||||
|
||||
virtual void draw(tsl::gfx::Renderer *renderer) override {
|
||||
if (!visible) return;
|
||||
|
||||
if (!visible)
|
||||
return;
|
||||
|
||||
// Draw image centered horizontally
|
||||
u16 centerX = this->getX() + (this->getWidth() - imgWidth) / 2;
|
||||
renderer->drawBitmap(
|
||||
centerX,
|
||||
this->getY() + 10,
|
||||
imgWidth,
|
||||
imgHeight,
|
||||
imgData
|
||||
);
|
||||
renderer->drawBitmap(centerX, this->getY() + 10, imgWidth, imgHeight, imgData);
|
||||
}
|
||||
|
||||
|
||||
virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override {
|
||||
if (!visible) {
|
||||
// Take up no space when hidden
|
||||
@@ -55,37 +77,38 @@ public:
|
||||
tsl::elm::ListItem::layout(parentX, parentY, parentWidth, parentHeight);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual void drawHighlight(tsl::gfx::Renderer *renderer) override {
|
||||
// Do nothing - no highlight
|
||||
}
|
||||
|
||||
|
||||
virtual bool onClick(u64 keys) override {
|
||||
return false; // Non-clickable
|
||||
return false; // Non-clickable
|
||||
}
|
||||
|
||||
virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override {
|
||||
return nullptr; // Make it non-focusable
|
||||
|
||||
virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override {
|
||||
return nullptr; // Make it non-focusable
|
||||
}
|
||||
};
|
||||
|
||||
class HideableCategoryHeader : public tsl::elm::CategoryHeader {
|
||||
private:
|
||||
private:
|
||||
bool visible;
|
||||
|
||||
public:
|
||||
HideableCategoryHeader(const std::string& title)
|
||||
: tsl::elm::CategoryHeader(title), visible(true) {}
|
||||
|
||||
|
||||
public:
|
||||
HideableCategoryHeader(const std::string &title) : tsl::elm::CategoryHeader(title), visible(true) {
|
||||
}
|
||||
|
||||
void setVisible(bool v) {
|
||||
visible = v;
|
||||
}
|
||||
|
||||
|
||||
virtual void draw(tsl::gfx::Renderer *renderer) override {
|
||||
if (!visible) return;
|
||||
if (!visible)
|
||||
return;
|
||||
tsl::elm::CategoryHeader::draw(renderer);
|
||||
}
|
||||
|
||||
|
||||
virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override {
|
||||
if (!visible) {
|
||||
this->setBoundaries(parentX, parentY, 0, 0);
|
||||
@@ -96,34 +119,34 @@ public:
|
||||
};
|
||||
|
||||
class FocusableDrawer : public tsl::elm::CustomDrawer {
|
||||
public:
|
||||
template<typename... Args>
|
||||
FocusableDrawer(Args&&... args) : tsl::elm::CustomDrawer(std::forward<Args>(args)...) {
|
||||
public:
|
||||
template <typename... Args> FocusableDrawer(Args &&...args) : tsl::elm::CustomDrawer(std::forward<Args>(args)...) {
|
||||
m_isItem = true;
|
||||
}
|
||||
Element* requestFocus(Element*, tsl::FocusDirection) override {
|
||||
Element *requestFocus(Element *, tsl::FocusDirection) override {
|
||||
return this;
|
||||
}
|
||||
void drawHighlight(tsl::gfx::Renderer*) override {}
|
||||
void drawHighlight(tsl::gfx::Renderer *) override {
|
||||
}
|
||||
};
|
||||
|
||||
class HideableCustomDrawer : public tsl::elm::Element {
|
||||
private:
|
||||
private:
|
||||
bool visible;
|
||||
u32 height;
|
||||
|
||||
public:
|
||||
HideableCustomDrawer(u32 h)
|
||||
: Element(), visible(true), height(h) {}
|
||||
|
||||
|
||||
public:
|
||||
HideableCustomDrawer(u32 h) : Element(), visible(true), height(h) {
|
||||
}
|
||||
|
||||
void setVisible(bool v) {
|
||||
visible = v;
|
||||
}
|
||||
|
||||
|
||||
virtual void draw(tsl::gfx::Renderer *renderer) override {
|
||||
// Empty drawer - just for spacing
|
||||
}
|
||||
|
||||
|
||||
virtual void layout(u16 parentX, u16 parentY, u16 parentWidth, u16 parentHeight) override {
|
||||
if (!visible) {
|
||||
this->setBoundaries(parentX, parentY, 0, 0);
|
||||
@@ -131,8 +154,8 @@ public:
|
||||
this->setBoundaries(parentX, parentY, parentWidth, height);
|
||||
}
|
||||
}
|
||||
|
||||
virtual Element* requestFocus(Element *oldFocus, tsl::FocusDirection direction) override {
|
||||
|
||||
virtual Element *requestFocus(Element *oldFocus, tsl::FocusDirection direction) override {
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
@@ -16,43 +16,27 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#include "value_choice_gui.h"
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
#include "../format.h"
|
||||
#include "fatal_gui.h"
|
||||
#include <sstream>
|
||||
#include <iomanip>
|
||||
#include "ult_ext.h"
|
||||
#include "value_choice_gui.h"
|
||||
|
||||
ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
ValueChoiceListener listener,
|
||||
const ValueThresholds& thresholds,
|
||||
bool enableThresholds,
|
||||
std::map<std::uint32_t, std::string> labels,
|
||||
std::vector<NamedValue> namedValues,
|
||||
bool showDefaultValue,
|
||||
bool showDNO)
|
||||
: selectedValue(selectedValue),
|
||||
range(range),
|
||||
categoryName(categoryName),
|
||||
listener(listener),
|
||||
thresholds(thresholds),
|
||||
enableThresholds(enableThresholds),
|
||||
labels(labels),
|
||||
namedValues(namedValues),
|
||||
showDefaultValue(showDefaultValue),
|
||||
showDNO(showDNO)
|
||||
{
|
||||
ValueChoiceGui::ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener,
|
||||
const ValueThresholds &thresholds, bool enableThresholds, std::map<std::uint32_t, std::string> labels,
|
||||
std::vector<NamedValue> namedValues, bool showDefaultValue, bool showDNO)
|
||||
: selectedValue(selectedValue), range(range), categoryName(categoryName), listener(listener), thresholds(thresholds),
|
||||
enableThresholds(enableThresholds), labels(labels), namedValues(namedValues), showDefaultValue(showDefaultValue), showDNO(showDNO) {
|
||||
}
|
||||
|
||||
ValueChoiceGui::~ValueChoiceGui()
|
||||
{
|
||||
ValueChoiceGui::~ValueChoiceGui() {
|
||||
}
|
||||
|
||||
std::string ValueChoiceGui::formatValue(std::uint32_t value)
|
||||
{
|
||||
std::string ValueChoiceGui::formatValue(std::uint32_t value) {
|
||||
std::ostringstream oss;
|
||||
if(showDefaultValue) {
|
||||
if (showDefaultValue) {
|
||||
if (value == 0) {
|
||||
return this->showDNO ? FREQ_DEFAULT_TEXT : VALUE_DEFAULT_TEXT;
|
||||
}
|
||||
@@ -65,12 +49,11 @@ std::string ValueChoiceGui::formatValue(std::uint32_t value)
|
||||
return oss.str();
|
||||
}
|
||||
|
||||
int ValueChoiceGui::getSafetyLevel(std::uint32_t value)
|
||||
{
|
||||
if(thresholds.warning == 0 && thresholds.danger == 0) {
|
||||
int ValueChoiceGui::getSafetyLevel(std::uint32_t value) {
|
||||
if (thresholds.warning == 0 && thresholds.danger == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
if (value > thresholds.danger) {
|
||||
return 2;
|
||||
}
|
||||
@@ -80,8 +63,7 @@ int ValueChoiceGui::getSafetyLevel(std::uint32_t value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety)
|
||||
{
|
||||
tsl::elm::ListItem *ValueChoiceGui::createValueListItem(std::uint32_t value, bool selected, int safety) {
|
||||
std::string text = formatValue(value);
|
||||
std::string rightText = "";
|
||||
|
||||
@@ -91,34 +73,32 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo
|
||||
}
|
||||
|
||||
if (selected) {
|
||||
const_cast<std::string&>(rightText) = "\uE14B";
|
||||
const_cast<std::string &>(rightText) = "\uE14B";
|
||||
}
|
||||
|
||||
tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, rightText, false);
|
||||
switch (safety)
|
||||
{
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, rightText, false);
|
||||
switch (safety) {
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
}
|
||||
|
||||
// Make annotation grey
|
||||
if (!rightText.empty() && !selected)
|
||||
listItem->setValueColor(tsl::Color(180, 180, 180, 255));
|
||||
else if(selected)
|
||||
listItem->setValueColor(tsl::infoTextColor);
|
||||
|
||||
listItem->setClickListener([this, value](u64 keys)
|
||||
{
|
||||
else if (selected)
|
||||
listItem->setValueColor(tsl::infoTextColor);
|
||||
|
||||
listItem->setClickListener([this, value](u64 keys) {
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) {
|
||||
if (this->listener(value)) {
|
||||
tsl::goBack();
|
||||
@@ -130,37 +110,34 @@ tsl::elm::ListItem* ValueChoiceGui::createValueListItem(std::uint32_t value, boo
|
||||
return listItem;
|
||||
}
|
||||
|
||||
tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety)
|
||||
{
|
||||
tsl::elm::ListItem *ValueChoiceGui::createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety) {
|
||||
std::string text = namedValue.name;
|
||||
if (selected) {
|
||||
const_cast<std::string&>(namedValue.rightText) = "\uE14B";
|
||||
const_cast<std::string &>(namedValue.rightText) = "\uE14B";
|
||||
}
|
||||
|
||||
tsl::elm::ListItem* listItem = new tsl::elm::ListItem(text, namedValue.rightText, false);
|
||||
switch (safety)
|
||||
{
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
|
||||
tsl::elm::ListItem *listItem = new tsl::elm::ListItem(text, namedValue.rightText, false);
|
||||
switch (safety) {
|
||||
case 0:
|
||||
listItem->setTextColor(tsl::Color(255, 255, 255, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 255, 255, 255));
|
||||
break;
|
||||
case 1:
|
||||
listItem->setTextColor(tsl::Color(255, 165, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 165, 0, 255));
|
||||
break;
|
||||
case 2:
|
||||
listItem->setTextColor(tsl::Color(255, 0, 0, 255));
|
||||
listItem->setValueColor(tsl::Color(255, 0, 0, 255));
|
||||
break;
|
||||
}
|
||||
|
||||
if (!namedValue.rightText.empty() && !selected)
|
||||
listItem->setValueColor(tsl::Color(180, 180, 180, 255));
|
||||
else if(selected)
|
||||
listItem->setValueColor(tsl::infoTextColor);
|
||||
else if (selected)
|
||||
listItem->setValueColor(tsl::infoTextColor);
|
||||
|
||||
listItem->setClickListener([this, value = namedValue.value](u64 keys)
|
||||
{
|
||||
listItem->setClickListener([this, value = namedValue.value](u64 keys) {
|
||||
if ((keys & HidNpadButton_A) == HidNpadButton_A && this->listener) {
|
||||
if (this->listener(value)) {
|
||||
tsl::goBack();
|
||||
@@ -172,8 +149,7 @@ tsl::elm::ListItem* ValueChoiceGui::createNamedValueListItem(const NamedValue& n
|
||||
return listItem;
|
||||
}
|
||||
|
||||
void ValueChoiceGui::listUI()
|
||||
{
|
||||
void ValueChoiceGui::listUI() {
|
||||
if (!categoryName.empty()) {
|
||||
this->listElement->addItem(new tsl::elm::CategoryHeader(categoryName));
|
||||
}
|
||||
@@ -181,20 +157,19 @@ void ValueChoiceGui::listUI()
|
||||
if (showDefaultValue) {
|
||||
this->listElement->addItem(this->createValueListItem(0, this->selectedValue == 0, 0));
|
||||
}
|
||||
for (const auto& namedValue : namedValues) {
|
||||
for (const auto &namedValue : namedValues) {
|
||||
int safety = enableThresholds ? getSafetyLevel(namedValue.value) : 0;
|
||||
bool selected = (namedValue.value == this->selectedValue);
|
||||
this->listElement->addItem(this->createNamedValueListItem(namedValue, selected, safety));
|
||||
}
|
||||
|
||||
|
||||
if (namedValues.empty()) {
|
||||
for (std::uint32_t value = range.min; value <= range.max; value += range.step)
|
||||
{
|
||||
for (std::uint32_t value = range.min; value <= range.max; value += range.step) {
|
||||
int safety = getSafetyLevel(value);
|
||||
bool selected = (value == this->selectedValue);
|
||||
this->listElement->addItem(this->createValueListItem(value, selected, safety));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this->listElement->jumpToItem("", "\uE14B");
|
||||
}
|
||||
@@ -17,11 +17,12 @@
|
||||
*
|
||||
*/
|
||||
#pragma once
|
||||
#include <list>
|
||||
#include <functional>
|
||||
#include <string>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "base_menu_gui.h"
|
||||
|
||||
using ValueChoiceListener = std::function<bool(std::uint32_t value)>;
|
||||
@@ -34,33 +35,32 @@ struct ValueRange {
|
||||
std::string suffix;
|
||||
std::uint32_t divisor;
|
||||
int decimalPlaces;
|
||||
ValueRange()
|
||||
: min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) {}
|
||||
ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step,
|
||||
const std::string& suffix = "", std::uint32_t divisor = 1, int decimalPlaces = 0)
|
||||
: min(min), max(max), step(step), suffix(suffix),
|
||||
divisor(divisor), decimalPlaces(decimalPlaces) {}
|
||||
ValueRange() : min(0), max(0), step(1), suffix(""), divisor(1), decimalPlaces(0) {
|
||||
}
|
||||
ValueRange(std::uint32_t min, std::uint32_t max, std::uint32_t step, const std::string &suffix = "", std::uint32_t divisor = 1,
|
||||
int decimalPlaces = 0)
|
||||
: min(min), max(max), step(step), suffix(suffix), divisor(divisor), decimalPlaces(decimalPlaces) {
|
||||
}
|
||||
};
|
||||
|
||||
struct ValueThresholds {
|
||||
std::uint32_t warning;
|
||||
std::uint32_t danger;
|
||||
ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0)
|
||||
: warning(warning), danger(danger) {}
|
||||
ValueThresholds(std::uint32_t warning = 0, std::uint32_t danger = 0) : warning(warning), danger(danger) {
|
||||
}
|
||||
};
|
||||
|
||||
struct NamedValue {
|
||||
std::string name;
|
||||
std::uint32_t value;
|
||||
std::string rightText;
|
||||
|
||||
NamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "")
|
||||
: name(name), value(value), rightText(rightText) {}
|
||||
|
||||
NamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") : name(name), value(value), rightText(rightText) {
|
||||
}
|
||||
};
|
||||
|
||||
class ValueChoiceGui : public BaseMenuGui
|
||||
{
|
||||
protected:
|
||||
class ValueChoiceGui : public BaseMenuGui {
|
||||
protected:
|
||||
std::uint32_t selectedValue;
|
||||
ValueRange range;
|
||||
std::string categoryName;
|
||||
@@ -68,47 +68,37 @@ protected:
|
||||
ValueThresholds thresholds;
|
||||
bool enableThresholds;
|
||||
std::map<std::uint32_t, std::string> labels;
|
||||
|
||||
|
||||
std::vector<NamedValue> namedValues;
|
||||
bool showDefaultValue = true;
|
||||
bool showDNO = false;
|
||||
tsl::elm::ListItem* createValueListItem(std::uint32_t value, bool selected, int safety);
|
||||
tsl::elm::ListItem* createNamedValueListItem(const NamedValue& namedValue, bool selected, int safety);
|
||||
tsl::elm::ListItem *createValueListItem(std::uint32_t value, bool selected, int safety);
|
||||
tsl::elm::ListItem *createNamedValueListItem(const NamedValue &namedValue, bool selected, int safety);
|
||||
std::string formatValue(std::uint32_t value);
|
||||
int getSafetyLevel(std::uint32_t value);
|
||||
|
||||
public:
|
||||
ValueChoiceGui(std::uint32_t selectedValue,
|
||||
const ValueRange& range,
|
||||
const std::string& categoryName,
|
||||
ValueChoiceListener listener,
|
||||
const ValueThresholds& thresholds = ValueThresholds(),
|
||||
bool enableThresholds = false,
|
||||
std::map<std::uint32_t, std::string> labels = {},
|
||||
std::vector<NamedValue> namedValues = {},
|
||||
bool showDefaultValue = true,
|
||||
|
||||
public:
|
||||
ValueChoiceGui(std::uint32_t selectedValue, const ValueRange &range, const std::string &categoryName, ValueChoiceListener listener,
|
||||
const ValueThresholds &thresholds = ValueThresholds(), bool enableThresholds = false,
|
||||
std::map<std::uint32_t, std::string> labels = {}, std::vector<NamedValue> namedValues = {}, bool showDefaultValue = true,
|
||||
bool showDNO = false);
|
||||
~ValueChoiceGui();
|
||||
|
||||
void addNamedValue(const std::string& name, std::uint32_t value, const std::string& rightText = "")
|
||||
{
|
||||
|
||||
void addNamedValue(const std::string &name, std::uint32_t value, const std::string &rightText = "") {
|
||||
namedValues.emplace_back(name, value, rightText);
|
||||
}
|
||||
|
||||
void addNamedValues(const std::vector<NamedValue>& values)
|
||||
{
|
||||
|
||||
void addNamedValues(const std::vector<NamedValue> &values) {
|
||||
namedValues.insert(namedValues.end(), values.begin(), values.end());
|
||||
}
|
||||
|
||||
void clearNamedValues()
|
||||
{
|
||||
|
||||
void clearNamedValues() {
|
||||
namedValues.clear();
|
||||
}
|
||||
|
||||
void setShowDefaultValue(bool show)
|
||||
{
|
||||
|
||||
void setShowDefaultValue(bool show) {
|
||||
showDefaultValue = show;
|
||||
}
|
||||
|
||||
|
||||
void listUI() override;
|
||||
};
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,7 +24,6 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <tesla.hpp>
|
||||
|
||||
@@ -24,31 +24,32 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <battery.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
#include <i2c.h>
|
||||
#include <max17050.h>
|
||||
#include <notification.h>
|
||||
#include <pwm.h>
|
||||
#include <registers.h>
|
||||
#include <battery.h>
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include <notification.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../hos/integrations.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "board.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
#include "board_load.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "board_misc.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../hos/integrations.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "board_volt.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr;
|
||||
@@ -62,26 +63,25 @@ namespace board {
|
||||
|
||||
u32 fd = 0, fd2 = 0;
|
||||
|
||||
#define PMC_BASE 0x7000E400
|
||||
#define APB_MISC_GP_HIDREV 0x804
|
||||
#define GP_HIDREV_MAJOR_T210 0x1
|
||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||
#define APB_BASE 0x70000000
|
||||
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
||||
#define FUSE_OFFSET 0x800
|
||||
#define PMC_BASE 0x7000E400
|
||||
#define APB_MISC_GP_HIDREV 0x804
|
||||
#define GP_HIDREV_MAJOR_T210 0x1
|
||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||
#define APB_BASE 0x70000000
|
||||
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
||||
#define FUSE_OFFSET 0x800
|
||||
void FetchHardwareInfos() {
|
||||
ReadFuses(fuseData, fuseVirtAddr);
|
||||
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
||||
|
||||
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||
u32 hidrev = *(u32 *)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||
if (((hidrev >> 4) & 0xF) >= GP_HIDREV_MAJOR_T210B01) {
|
||||
gSocType = HocClkSocType_Mariko;
|
||||
CacheGpuVoltTable();
|
||||
} else {
|
||||
gSocType = HocClkSocType_Erista;
|
||||
}
|
||||
|
||||
u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4));
|
||||
u32 odm4 = *(u32 *)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4));
|
||||
|
||||
if (gSocType == HocClkSocType_Mariko) {
|
||||
switch ((odm4 & 0xF0000) >> 16) {
|
||||
@@ -124,7 +124,7 @@ namespace board {
|
||||
rc = psmInitialize();
|
||||
ASSERT_RESULT_OK(rc, "psmInitialize");
|
||||
|
||||
if(HOSSVC_HAS_TC) {
|
||||
if (HOSSVC_HAS_TC) {
|
||||
rc = tcInitialize();
|
||||
ASSERT_RESULT_OK(rc, "tcInitialize");
|
||||
}
|
||||
@@ -171,7 +171,7 @@ namespace board {
|
||||
|
||||
batteryInfoInitialize();
|
||||
|
||||
tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG
|
||||
tsensor::InitializeSoctherm(); // SOCTHERM must be init before AOTAG
|
||||
|
||||
// PMC exosphere check
|
||||
SecmonArgs args = {};
|
||||
@@ -179,21 +179,25 @@ namespace board {
|
||||
args.X[1] = PMC_BASE;
|
||||
svcCallSecureMonitor(&args);
|
||||
|
||||
if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed
|
||||
if (args.X[1] != PMC_BASE) { // if param 1 is identical read failed
|
||||
tsensor::InitializeAotag(GetSocType() == HocClkSocType_Mariko);
|
||||
}
|
||||
|
||||
Result pwmCheck = 1;
|
||||
if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) {
|
||||
if (hosversionAtLeast(6, 0, 0) && R_SUCCEEDED(pwmInitialize())) {
|
||||
pwmCheck = pwmOpenSession2(&iCon, 0x3D000001);
|
||||
}
|
||||
|
||||
StartMiscThread(pwmCheck, &iCon);
|
||||
|
||||
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);
|
||||
|
||||
CacheDfllData();
|
||||
CacheGpuVoltTable();
|
||||
}
|
||||
|
||||
void Exit() {
|
||||
@@ -243,7 +247,7 @@ namespace board {
|
||||
args.X[1] = MC_REGISTER_BASE + MC_EMEM_CFG_0;
|
||||
svcCallSecureMonitor(&args);
|
||||
|
||||
if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed
|
||||
if (args.X[1] == (MC_REGISTER_BASE + MC_EMEM_CFG_0)) { // if param 1 is identical read failed
|
||||
notification::writeNotification("Horizon OC\nSecmon-Lesen fehlgeschlagen!\nDies könnte ein Hardwareproblem sein!");
|
||||
return false;
|
||||
}
|
||||
@@ -270,4 +274,4 @@ namespace board {
|
||||
return false; /* stub for now. */
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -26,18 +26,20 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "../mapping/mem_map.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
#include "board_load.hpp"
|
||||
#include "board_name.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_profile.hpp"
|
||||
#include "board_sensor.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "board_profile.hpp"
|
||||
#include "../mapping/mem_map.hpp"
|
||||
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0))
|
||||
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))
|
||||
|
||||
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8, 0, 0))
|
||||
#define HOSSVC_HAS_TC (hosversionAtLeast(5, 0, 0))
|
||||
|
||||
namespace board {
|
||||
extern u64 clkVirtAddr, dsiVirtAddr, apbVirtAddr, fuseVirtAddr;
|
||||
@@ -46,7 +48,7 @@ namespace board {
|
||||
extern HocClkConsoleType gConsoleType;
|
||||
extern FuseData fuseData;
|
||||
extern u8 speedoBracket;
|
||||
|
||||
|
||||
void Initialize();
|
||||
void Exit();
|
||||
HocClkSocType GetSocType();
|
||||
@@ -58,4 +60,4 @@ namespace board {
|
||||
FuseData *GetFuseData();
|
||||
bool IsUsingRetroSuperDisplay();
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -24,27 +24,32 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
#include "../display/display_refresh_rate.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../file/errors.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../soc/gm20b.hpp"
|
||||
#include "../soc/pllmb.hpp"
|
||||
#include "board.hpp"
|
||||
#include "board_name.hpp"
|
||||
#include "../file/errors.hpp"
|
||||
#include "../soc/pllmb.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../soc/gm20b.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
namespace board {
|
||||
#define MIDDLE_FREQ_TABLE_START_POINT 1228800000
|
||||
static u32 currentInjectedHz = 0;
|
||||
static u32 gMarikoGm20bCutoff = 1228800000;
|
||||
|
||||
void SetMarikoGm20bCutoff(u32 hz) {
|
||||
gMarikoGm20bCutoff = hz;
|
||||
}
|
||||
PcvModule GetPcvModule(HocClkModule hocclkModule) {
|
||||
switch (hocclkModule) {
|
||||
case HocClkModule_CPU:
|
||||
@@ -76,12 +81,12 @@ namespace board {
|
||||
ASSERT_RESULT_OK(pcvSetClockRate(moduleID, hz), "pcvSetClockRate");
|
||||
}
|
||||
|
||||
void HandleCpuUv()
|
||||
{
|
||||
void HandleCpuUv() {
|
||||
if (board::GetSocType() == HocClkSocType_Erista)
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_eristaCpuUV), 0, 1581000000); // Erista tbreak is always 1581MHz
|
||||
else
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh), board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf)));
|
||||
board::SetDfllTunings(config::GetConfigValue(KipConfigValue_marikoCpuUVLow), config::GetConfigValue(KipConfigValue_marikoCpuUVHigh),
|
||||
board::CalculateTbreak(config::GetConfigValue(KipConfigValue_tableConf)));
|
||||
}
|
||||
|
||||
void SetHz(HocClkModule module, u32 hz) {
|
||||
@@ -97,7 +102,8 @@ namespace board {
|
||||
return;
|
||||
}
|
||||
|
||||
bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) && hz < MIDDLE_FREQ_TABLE_START_POINT;
|
||||
bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0) &&
|
||||
hz < gMarikoGm20bCutoff;
|
||||
|
||||
u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz;
|
||||
|
||||
@@ -125,7 +131,7 @@ namespace board {
|
||||
PcvSetHz(GetPcvModule(module), pcvHz);
|
||||
}
|
||||
}
|
||||
if(config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) {
|
||||
if (config::GetConfigValue(HocClkConfigValue_LiveCpuUv) && module == HocClkModule_CPU) {
|
||||
HandleCpuUv();
|
||||
}
|
||||
if (useGm20b) {
|
||||
@@ -177,7 +183,9 @@ namespace board {
|
||||
case HocClkModule_GPU:
|
||||
return t210ClkGpuFreq();
|
||||
case HocClkModule_MEM:
|
||||
return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL ? pllmb::getRamClockRatePLLMB() : t210ClkMemFreq();
|
||||
return config::GetConfigValue(HocClkConfigValue_MemoryFrequencyMeasurementMode) == MemoryFrequencyMeasurementMode_PLL
|
||||
? pllmb::getRamClockRatePLLMB()
|
||||
: t210ClkMemFreq();
|
||||
case HocClkModule_Display:
|
||||
return GetDisplayRate(hz);
|
||||
default:
|
||||
@@ -193,7 +201,6 @@ namespace board {
|
||||
s32 tmpInMaxCount = maxCount;
|
||||
s32 tmpOutCount = 0;
|
||||
|
||||
|
||||
if (HOSSVC_HAS_CLKRST) {
|
||||
ClkrstSession session = {};
|
||||
|
||||
@@ -226,20 +233,20 @@ namespace board {
|
||||
|
||||
void ResetToStock() {
|
||||
Result rc;
|
||||
if (hosversionAtLeast(9,0,0)) {
|
||||
if (hosversionAtLeast(9, 0, 0)) {
|
||||
std::uint32_t confId = 0;
|
||||
rc = apmExtGetCurrentPerformanceConfiguration(&confId);
|
||||
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
|
||||
|
||||
HocClkApmConfiguration* apmConfiguration = nullptr;
|
||||
HocClkApmConfiguration *apmConfiguration = nullptr;
|
||||
for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) {
|
||||
if(hocclk_g_apm_configurations[i].id == confId) {
|
||||
if (hocclk_g_apm_configurations[i].id == confId) {
|
||||
apmConfiguration = &hocclk_g_apm_configurations[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!apmConfiguration) {
|
||||
if (!apmConfiguration) {
|
||||
ERROR_THROW("Unknown apm configuration: %x", confId);
|
||||
}
|
||||
|
||||
@@ -259,4 +266,4 @@ namespace board {
|
||||
void ResetToStockDisplay() {
|
||||
display::SetRate(60);
|
||||
}
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -25,32 +25,34 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../file/errors.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include "../file/errors.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
void SetHz(HocClkModule module, u32 hz);
|
||||
void SetMarikoGm20bCutoff(u32 hz);
|
||||
|
||||
u32 GetHz(HocClkModule module);
|
||||
u32 GetRealHz(HocClkModule module);
|
||||
void GetFreqList(HocClkModule module, u32 *outList, u32 maxCount, u32 *outCount);
|
||||
u32 GetHighestDockedDisplayRate();
|
||||
void HandleCpuUv();
|
||||
|
||||
|
||||
void ResetToStock();
|
||||
void ResetToStockDisplay();
|
||||
|
||||
template <typename Getter>
|
||||
void ResetToStockModule(Getter getHzFunc, HocClkModule module) {
|
||||
template <typename Getter> void ResetToStockModule(Getter getHzFunc, HocClkModule module) {
|
||||
Result rc = 0;
|
||||
|
||||
if (hosversionAtLeast(9, 0, 0)) {
|
||||
@@ -58,7 +60,7 @@ namespace board {
|
||||
rc = apmExtGetCurrentPerformanceConfiguration(&confId);
|
||||
ASSERT_RESULT_OK(rc, "apmExtGetCurrentPerformanceConfiguration");
|
||||
|
||||
HocClkApmConfiguration* apmConfiguration = nullptr;
|
||||
HocClkApmConfiguration *apmConfiguration = nullptr;
|
||||
for (size_t i = 0; hocclk_g_apm_configurations[i].id; ++i) {
|
||||
|
||||
if (hocclk_g_apm_configurations[i].id == confId) {
|
||||
@@ -83,15 +85,15 @@ namespace board {
|
||||
}
|
||||
|
||||
inline void ResetToStockCpu() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg) {return cfg.cpu_hz; }, HocClkModule_CPU);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.cpu_hz; }, HocClkModule_CPU);
|
||||
}
|
||||
|
||||
inline void ResetToStockGpu() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.gpu_hz; }, HocClkModule_GPU);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.gpu_hz; }, HocClkModule_GPU);
|
||||
}
|
||||
|
||||
inline void ResetToStockMem() {
|
||||
ResetToStockModule([](const HocClkApmConfiguration& cfg){ return cfg.mem_hz; }, HocClkModule_MEM);
|
||||
ResetToStockModule([](const HocClkApmConfiguration &cfg) { return cfg.mem_hz; }, HocClkModule_MEM);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -15,31 +15,54 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <fuse.h>
|
||||
#include "board_fuse.hpp"
|
||||
#include <cstring>
|
||||
#include <fuse.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "board.hpp"
|
||||
#include "board_fuse.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
void SetGpuBracket(u16 speedo, u8 &gpuBracket) {
|
||||
if (speedo <= 1624) {
|
||||
gpuBracket = 0;
|
||||
return;
|
||||
}
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
if (speedo <= 1624) {
|
||||
gpuBracket = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
if (speedo <= 1689) {
|
||||
gpuBracket = 1;
|
||||
return;
|
||||
}
|
||||
if (speedo <= 1689) {
|
||||
gpuBracket = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
if (speedo <= 1753) {
|
||||
gpuBracket = 2;
|
||||
return;
|
||||
}
|
||||
if (speedo <= 1753) {
|
||||
gpuBracket = 2;
|
||||
return;
|
||||
}
|
||||
|
||||
/* >= 1754 */
|
||||
gpuBracket = 3;
|
||||
/* >= 1754 */
|
||||
gpuBracket = 3;
|
||||
} else {
|
||||
switch (speedo) {
|
||||
case 1850 ... 1925:
|
||||
gpuBracket = 0;
|
||||
break;
|
||||
case 1926 ... 2025:
|
||||
gpuBracket = 1;
|
||||
break;
|
||||
case 2026 ... 2100:
|
||||
gpuBracket = 2;
|
||||
break;
|
||||
case 2101 ... 2200:
|
||||
gpuBracket = 3;
|
||||
break;
|
||||
default:
|
||||
gpuBracket = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ReadFuses(FuseData &speedo, u64 fuseVa) {
|
||||
@@ -49,12 +72,12 @@ namespace board {
|
||||
speedo.cpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_0_CALIB);
|
||||
speedo.gpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_2_CALIB);
|
||||
speedo.socSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_SPEEDO_0_CALIB);
|
||||
speedo.cpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4;
|
||||
speedo.gpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5;
|
||||
speedo.socIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4;
|
||||
speedo.waferX = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_X_COORDINATE);
|
||||
speedo.waferY = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_Y_COORDINATE);
|
||||
speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX;
|
||||
speedo.cpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4;
|
||||
speedo.gpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5;
|
||||
speedo.socIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4;
|
||||
speedo.waferX = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_X_COORDINATE);
|
||||
speedo.waferY = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_Y_COORDINATE);
|
||||
speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -37,4 +37,4 @@ namespace board {
|
||||
void ReadFuses(FuseData &speedo, u64 fuseVa);
|
||||
void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -24,22 +24,24 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <algorithm>
|
||||
#include <battery.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <math.h>
|
||||
#include <max17050.h>
|
||||
#include <minIni.h>
|
||||
#include <numeric>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "board.hpp"
|
||||
#include "board_misc.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <algorithm>
|
||||
#include <math.h>
|
||||
#include <numeric>
|
||||
#include <minIni.h>
|
||||
#include <battery.h>
|
||||
#include "board_misc.hpp"
|
||||
#include "board.hpp"
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -61,23 +63,24 @@ namespace board {
|
||||
constexpr double Systemtickfrequency = 19200000.0 * (static_cast<double>(CpuTimeOutNs) / 1'000'000'000.0);
|
||||
|
||||
void GpuLoadThread(void *ptr) {
|
||||
#define gpu_samples_average 8
|
||||
#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715
|
||||
uint32_t gpu_load_array[gpu_samples_average] = {0};
|
||||
#define gpu_samples_average 8
|
||||
#define NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD 0x80044715
|
||||
uint32_t gpu_load_array[gpu_samples_average] = { 0 };
|
||||
size_t i = 0;
|
||||
if (R_SUCCEEDED(nvCheck_load)) do {
|
||||
u32 temp;
|
||||
if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) {
|
||||
gpu_load_array[i++ % gpu_samples_average] = temp;
|
||||
gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average;
|
||||
}
|
||||
svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate)
|
||||
} while(true);
|
||||
if (R_SUCCEEDED(nvCheck_load))
|
||||
do {
|
||||
u32 temp;
|
||||
if (R_SUCCEEDED(nvIoctl(_fd, NVGPU_GPU_IOCTL_PMU_GET_GPU_LOAD, &temp))) {
|
||||
gpu_load_array[i++ % gpu_samples_average] = temp;
|
||||
gpuLoad = std::accumulate(&gpu_load_array[0], &gpu_load_array[gpu_samples_average], 0) / gpu_samples_average;
|
||||
}
|
||||
svcSleepThread(16'666'000); // wait a bit (this is the perfect amount of time to keep the reading accurate)
|
||||
} while (true);
|
||||
}
|
||||
|
||||
void CheckCore(void *idletickPtr) {
|
||||
u64* idletick = static_cast<u64 *>(idletickPtr);
|
||||
while(true) {
|
||||
u64 *idletick = static_cast<u64 *>(idletickPtr);
|
||||
while (true) {
|
||||
u64 idletickA;
|
||||
u64 idletickB;
|
||||
svcGetInfo(&idletickB, InfoType_IdleTickCount, INVALID_HANDLE, -1);
|
||||
@@ -107,11 +110,11 @@ namespace board {
|
||||
float cpuUsage0 = std::clamp(((Systemtickfrequency - idletick0) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
float cpuUsage1 = std::clamp(((Systemtickfrequency - idletick1) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
float cpuUsage2 = std::clamp(((Systemtickfrequency - idletick2) / static_cast<double>(Systemtickfrequency)) * 1000.0, 0.0, 1000.0);
|
||||
return std::round(std::max({cpuUsage0, cpuUsage1, cpuUsage2}));
|
||||
return std::round(std::max({ cpuUsage0, cpuUsage1, cpuUsage2 }));
|
||||
}
|
||||
|
||||
u32 GetPartLoad(HocClkPartLoad loadSource) {
|
||||
switch(loadSource) {
|
||||
switch (loadSource) {
|
||||
case HocClkPartLoad_EMC:
|
||||
return t210EmcLoadAll();
|
||||
case HocClkPartLoad_EMCCpu:
|
||||
@@ -148,9 +151,9 @@ namespace board {
|
||||
}
|
||||
|
||||
namespace {
|
||||
constexpr u32 NVschedCtrlEnable = 0x00000601;
|
||||
constexpr u32 NVschedCtrlEnable = 0x00000601;
|
||||
constexpr u32 NVschedCtrlDisable = 0x00000602;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void SetGpuSchedulingMode(GpuSchedulingMode mode, GpuSchedulingOverrideMethod method) {
|
||||
if (R_FAILED(nvCheckSched) && method == GpuSchedulingOverrideMethod_NvService) {
|
||||
@@ -160,7 +163,8 @@ namespace board {
|
||||
u32 temp;
|
||||
bool enabled = false;
|
||||
switch (mode) {
|
||||
case GpuSchedulingMode_DoNotOverride: break;
|
||||
case GpuSchedulingMode_DoNotOverride:
|
||||
break;
|
||||
case GpuSchedulingMode_Disabled:
|
||||
if (method == GpuSchedulingOverrideMethod_NvService) {
|
||||
nvIoctl(_fd2, NVschedCtrlDisable, &temp);
|
||||
@@ -198,4 +202,4 @@ namespace board {
|
||||
nvCheckSched = nvSched;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -37,4 +38,4 @@ namespace board {
|
||||
void SchedSetFD2(u32 fd2);
|
||||
void NvSchedSucceed(Result nvSched);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <pwm.h>
|
||||
#include <cmath>
|
||||
#include <pwm.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -68,4 +68,4 @@ namespace board {
|
||||
threadClose(&miscThread);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <pwm.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -36,4 +36,4 @@ namespace board {
|
||||
void ExitMiscThread();
|
||||
u8 GetFanLevel();
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -24,8 +24,9 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "board.hpp"
|
||||
|
||||
namespace board {
|
||||
@@ -50,4 +51,4 @@ namespace board {
|
||||
return hocclkFormatPowerSensor(sensor, pretty);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -25,8 +25,8 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -35,4 +35,4 @@ namespace board {
|
||||
const char *GetThermalSensorName(HocClkThermalSensor sensor, bool pretty);
|
||||
const char *GetPowerSensorName(HocClkPowerSensor sensor, bool pretty);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -24,16 +24,17 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "board.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include "board.hpp"
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -60,4 +61,4 @@ namespace board {
|
||||
return HocClkProfile_Handheld;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -28,7 +28,5 @@
|
||||
#include <hocclk.h>
|
||||
|
||||
namespace board {
|
||||
|
||||
HocClkProfile GetProfile();
|
||||
|
||||
}
|
||||
|
||||
@@ -24,24 +24,26 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <cmath>
|
||||
#include <battery.h>
|
||||
#include <cmath>
|
||||
#include <hocclk.h>
|
||||
#include <i2c.h>
|
||||
#include <max17050.h>
|
||||
#include <pwm.h>
|
||||
#include "board.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include <switch.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../file/config.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../tsensor/aotag.hpp"
|
||||
#include "../tsensor/bq24193.hpp"
|
||||
#include "../file/config.hpp"
|
||||
#include "../tsensor/soctherm.hpp"
|
||||
#include "board.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -52,7 +54,7 @@ namespace board {
|
||||
tsensor::TSensorTemps temps = {};
|
||||
tsensor::ReadTSensors(temps);
|
||||
|
||||
switch(sensor) {
|
||||
switch (sensor) {
|
||||
case HocClkThermalSensor_SOC: {
|
||||
millis = tmp451TempSoc();
|
||||
break;
|
||||
@@ -127,4 +129,4 @@ namespace board {
|
||||
return 0;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -33,4 +33,4 @@ namespace board {
|
||||
s32 GetTemperatureMilli(HocClkThermalSensor sensor);
|
||||
s32 GetPowerMw(HocClkPowerSensor sensor);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Copyright (c) Souldbminer, Lightos_ and Horizon OC Contributors
|
||||
*
|
||||
*
|
||||
* Copyright (c) B3711
|
||||
*
|
||||
*
|
||||
* 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.
|
||||
@@ -17,22 +17,24 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <switch.h>
|
||||
#include <battery.h>
|
||||
#include <cstring>
|
||||
#include <hocclk.h>
|
||||
#include <memmem.h>
|
||||
#include <registers.h>
|
||||
#include <cstring>
|
||||
#include <battery.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../hos/rgltr.h"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "board.hpp"
|
||||
#include "board_freq.hpp"
|
||||
#include "board_volt.hpp"
|
||||
#include "../file/file_utils.hpp"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../hos/rgltr.h"
|
||||
|
||||
namespace board {
|
||||
|
||||
GpuVoltData voltData = {};
|
||||
u32 cpuVoltTable[32] = {}; // 32LUT
|
||||
u32 cpuVoltTable[32] = {}; // 32LUT
|
||||
u64 cldvfs;
|
||||
CpuDfllData cachedTune;
|
||||
|
||||
@@ -50,45 +52,30 @@ namespace board {
|
||||
u32 tune1_high;
|
||||
};
|
||||
|
||||
EristaCpuUvEntry eristaCpuUvTable[6] = {
|
||||
{0xFFEAD0FF, 0x0},
|
||||
{0xffff, 0x27007ff},
|
||||
{0xefff, 0x27407ff},
|
||||
{0xdfff, 0x27807ff},
|
||||
{0xdfdf, 0x27a07ff},
|
||||
{0xcfdf, 0x37007ff},
|
||||
EristaCpuUvEntry eristaCpuUvTableLowBracket[6] = {
|
||||
// <2118 CPU speedo
|
||||
{ 0xFFEAD0FF, 0x25501d0 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff },
|
||||
{ 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff },
|
||||
};
|
||||
|
||||
EristaCpuUvEntry eristaCpuUvTableHighBracket[6] = {
|
||||
{ 0xFFEAD0FF, 0x20091d9 }, { 0xffff, 0x27007ff }, { 0xefff, 0x27407ff },
|
||||
{ 0xdfff, 0x27807ff }, { 0xdfdf, 0x27a07ff }, { 0xcfdf, 0x37007ff },
|
||||
};
|
||||
|
||||
MarikoCpuUvEntry marikoCpuUvLow[12] = {
|
||||
{0xffa0, 0xffff, 0x21107ff, 0},
|
||||
{0x0, 0xffdf, 0x21107ff, 0x27207ff},
|
||||
{0xffdf, 0xffdf, 0x21107ff, 0x27307ff},
|
||||
{0xffff, 0xffdf, 0x21107ff, 0x27407ff},
|
||||
{0x0, 0xffdf, 0x21607ff, 0x27707ff},
|
||||
{0x0, 0xffdf, 0x21607ff, 0x27807ff},
|
||||
{0x0, 0xdfff, 0x21607ff, 0x27b07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27b07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27c07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27d07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27e07ff},
|
||||
{0xdfff, 0xdfff, 0x21707ff, 0x27f07ff},
|
||||
{ 0xffa0, 0xffff, 0x21107ff, 0 }, { 0x0, 0xffdf, 0x21107ff, 0x27207ff }, { 0xffdf, 0xffdf, 0x21107ff, 0x27307ff },
|
||||
{ 0xffff, 0xffdf, 0x21107ff, 0x27407ff }, { 0x0, 0xffdf, 0x21607ff, 0x27707ff }, { 0x0, 0xffdf, 0x21607ff, 0x27807ff },
|
||||
{ 0x0, 0xdfff, 0x21607ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27b07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27c07ff },
|
||||
{ 0xdfff, 0xdfff, 0x21707ff, 0x27d07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27e07ff }, { 0xdfff, 0xdfff, 0x21707ff, 0x27f07ff },
|
||||
};
|
||||
|
||||
MarikoCpuUvEntry marikoCpuUvHigh[12] = {
|
||||
{0x0, 0xffff, 0, 0},
|
||||
{0x0, 0xffdf, 0, 0x27207ff},
|
||||
{0x0, 0xffdf, 0, 0x27307ff},
|
||||
{0x0, 0xffdf, 0, 0x27407ff},
|
||||
{0x0, 0xffdf, 0, 0x27707ff},
|
||||
{0x0, 0xffdf, 0, 0x27807ff},
|
||||
{0x0, 0xdfff, 0, 0x27b07ff},
|
||||
{0x0, 0xdfff, 0, 0x27c07ff},
|
||||
{0x0, 0xdfff, 0, 0x27d07ff},
|
||||
{0x0, 0xdfff, 0, 0x27e07ff},
|
||||
{0x0, 0xdfff, 0, 0x27f07ff},
|
||||
{0x0, 0xdfff, 0, 0x27f07ff},
|
||||
{ 0x0, 0xffff, 0, 0 }, { 0x0, 0xffdf, 0, 0x27207ff }, { 0x0, 0xffdf, 0, 0x27307ff }, { 0x0, 0xffdf, 0, 0x27407ff },
|
||||
{ 0x0, 0xffdf, 0, 0x27707ff }, { 0x0, 0xffdf, 0, 0x27807ff }, { 0x0, 0xdfff, 0, 0x27b07ff }, { 0x0, 0xdfff, 0, 0x27c07ff },
|
||||
{ 0x0, 0xdfff, 0, 0x27d07ff }, { 0x0, 0xdfff, 0, 0x27e07ff }, { 0x0, 0xdfff, 0, 0x27f07ff }, { 0x0, 0xdfff, 0, 0x27f07ff },
|
||||
};
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void CacheDfllData() {
|
||||
Result rc = QueryMemoryMapping(&cldvfs, CLDVFS_REGION_BASE, CLDVFS_REGION_SIZE);
|
||||
@@ -97,55 +84,44 @@ namespace board {
|
||||
if (GetSocType() == HocClkSocType_Erista) {
|
||||
cachedTune.tune0Low = *reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
cachedTune.tune1Low = *reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE1_0);
|
||||
} else {
|
||||
SetHz(HocClkModule_CPU, 1785000000);
|
||||
cachedTune.tune0High = *reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
ResetToStockCpu();
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: clean up this code. */
|
||||
void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint) {
|
||||
u32* tune0_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
u32* tune1_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE1_0);
|
||||
u32 *tune0_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE0_0);
|
||||
u32 *tune1_ptr = reinterpret_cast<u32 *>(cldvfs + CL_DVFS_TUNE1_0);
|
||||
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint && (levelLow || levelHigh)) {
|
||||
if (levelLow) {
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low;
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low;
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
if (levelLow) {
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow-1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow-1].tune1_low;
|
||||
*tune0_ptr = marikoCpuUvLow[levelLow - 1].tune0_low;
|
||||
*tune1_ptr = marikoCpuUvLow[levelLow - 1].tune1_low;
|
||||
}
|
||||
if (levelHigh) {
|
||||
*tune0_ptr = marikoCpuUvHigh[levelHigh-1].tune0_high;
|
||||
*tune1_ptr = marikoCpuUvHigh[levelHigh-1].tune1_high;
|
||||
*tune0_ptr = marikoCpuUvHigh[levelHigh - 1].tune0_high;
|
||||
*tune1_ptr = marikoCpuUvHigh[levelHigh - 1].tune1_high;
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak
|
||||
if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak
|
||||
*tune0_ptr = 0xCFFF;
|
||||
*tune1_ptr = 0xFF072201;
|
||||
return;
|
||||
} else if (GetHz(HocClkModule_CPU) >= tbreakPoint || (!levelHigh)) {
|
||||
*tune0_ptr = cachedTune.tune0High; // per console?
|
||||
*tune0_ptr = cachedTune.tune0High; // per console?
|
||||
*tune1_ptr = 0xFFF7FF3F;
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// if (GetHz(HocClkModule_CPU) < tbreakPoint || (!levelLow)) { // account for tbreak
|
||||
// *tune0_ptr = cachedTune.tune0Low; // I think each erista has a different tune0/tune1?
|
||||
// *tune1_ptr = cachedTune.tune1Low;
|
||||
// return;
|
||||
// } else {
|
||||
// if (levelLow) {
|
||||
*tune0_ptr = eristaCpuUvTable[levelLow].tune0;
|
||||
*tune1_ptr = eristaCpuUvTable[levelLow].tune1;
|
||||
// } else {
|
||||
// }
|
||||
*tune0_ptr = fuseData.cpuSpeedo > 2118 ? eristaCpuUvTableHighBracket[levelLow].tune0 : eristaCpuUvTableLowBracket[levelLow].tune0;
|
||||
*tune1_ptr = fuseData.cpuSpeedo > 2118 ? eristaCpuUvTableHighBracket[levelLow].tune1 : eristaCpuUvTableLowBracket[levelLow].tune1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -212,9 +188,9 @@ namespace board {
|
||||
PcvPowerDomainId_Max77812_Dram = 0x3A000005, // vddq
|
||||
} PowerDomainId;
|
||||
*/
|
||||
/*
|
||||
Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me)
|
||||
*/
|
||||
/*
|
||||
Note: I think Nintendo's I2C driver (or my driver, but it looks correct to me)
|
||||
*/
|
||||
u32 GetVoltage(HocClkVoltage voltage) {
|
||||
u32 out = 0;
|
||||
BatteryChargeInfo info;
|
||||
@@ -227,7 +203,7 @@ namespace board {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_VDD2);
|
||||
break;
|
||||
case HocClkVoltage_CPU:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_CPU);
|
||||
} else {
|
||||
rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Cpu);
|
||||
@@ -236,16 +212,16 @@ namespace board {
|
||||
}
|
||||
break;
|
||||
case HocClkVoltage_GPU:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_GPU);
|
||||
} else {
|
||||
rgltrOpenSession(&s, PcvPowerDomainId_Max77621_Gpu);
|
||||
rgltrGetVoltage(&s, &out);
|
||||
rgltrCloseSession(&s);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HocClkVoltage_EMCVDDQ:
|
||||
if(GetSocType() == HocClkSocType_Mariko) {
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_Mariko_DRAM_VDDQ);
|
||||
} else {
|
||||
out = I2c_BuckConverter_GetUvOut(&I2c_VDD2);
|
||||
@@ -268,8 +244,8 @@ namespace board {
|
||||
Handle GetPcvHandle() {
|
||||
constexpr u64 PcvID = 0x10000000000001a;
|
||||
u64 processIDList[80]{};
|
||||
s32 processCount = 0;
|
||||
Handle handle = INVALID_HANDLE;
|
||||
s32 processCount = 0;
|
||||
Handle handle = INVALID_HANDLE;
|
||||
|
||||
DebugEventInfo debugEvent{};
|
||||
|
||||
@@ -308,9 +284,9 @@ namespace board {
|
||||
void CacheGpuVoltTable() {
|
||||
// Likely CPU regulator?
|
||||
UnkRegulator reg = {
|
||||
.voltageMin = 600000,
|
||||
.voltageMin = 600000,
|
||||
.voltageStep = 12500,
|
||||
.voltageMax = 1400000,
|
||||
.voltageMax = 1400000,
|
||||
};
|
||||
|
||||
Handle handle = GetPcvHandle();
|
||||
@@ -358,8 +334,8 @@ namespace board {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Assuming mariko. */
|
||||
const u32 vmax = 800;
|
||||
/* 800mV on Mariko, 950mV on Erista. */
|
||||
u32 vmax = GetSocType() == HocClkSocType_Mariko ? 800 : 950;
|
||||
constexpr u32 GpuVoltageTableOffset = 312;
|
||||
if (!std::memcmp(&buffer[index + GpuVoltageTableOffset], &vmax, sizeof(vmax))) {
|
||||
std::memcpy(voltData.voltTable, &buffer[index + GpuVoltageTableOffset], sizeof(voltData.voltTable));
|
||||
@@ -367,18 +343,18 @@ namespace board {
|
||||
}
|
||||
|
||||
constexpr u32 CpuVoltageTableOffset = 0xB8;
|
||||
std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table
|
||||
std::memcpy(cpuVoltTable, &buffer[index + CpuVoltageTableOffset], sizeof(cpuVoltTable)); // TODO: verify the CPU table
|
||||
|
||||
svcCloseHandle(handle);
|
||||
handle = INVALID_HANDLE;
|
||||
|
||||
// Print info AFTER we exit the handle to avoid hangs
|
||||
for(int i = 0; i < (int)std::size(cpuVoltTable); ++i) {
|
||||
for (int i = 0; i < (int)std::size(cpuVoltTable); ++i) {
|
||||
fileUtils::LogLine("[dvfs] cpu volt %d: %u mV", i, cpuVoltTable[i]);
|
||||
}
|
||||
|
||||
for(int i = 0; i < (int)std::size(voltData.voltTable); ++i) {
|
||||
fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[i]);
|
||||
for (int i = 0; i < (int)std::size(voltData.voltTable); ++i) {
|
||||
fileUtils::LogLine("[dvfs] gpu volt %d: %u mV", i, voltData.voltTable[0][i]);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -421,42 +397,157 @@ namespace board {
|
||||
}
|
||||
|
||||
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket) {
|
||||
static const u32 ramTable[][22] = {
|
||||
{ 2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600, 2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100, }, // Bracket 0
|
||||
{ 2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833, 2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266, }, // Bracket 1
|
||||
{ 2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366, }, // Bracket 2
|
||||
{ 2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033, 3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400, }, // Bracket 3
|
||||
};
|
||||
u32 baseVolt = 800;
|
||||
if (GetSocType() == HocClkSocType_Mariko) {
|
||||
static const u32 ramTable[][22] = {
|
||||
{
|
||||
2133, 2200, 2266, 2300, 2366, 2400, 2433, 2466, 2533, 2566, 2600,
|
||||
2633, 2700, 2733, 2766, 2833, 2866, 2900, 2933, 3033, 3066, 3100,
|
||||
}, // Bracket 0
|
||||
{
|
||||
2300, 2366, 2433, 2466, 2533, 2566, 2633, 2700, 2733, 2800, 2833,
|
||||
2900, 2933, 2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3266,
|
||||
}, // Bracket 1
|
||||
{
|
||||
2433, 2466, 2533, 2566, 2600, 2666, 2766, 2800, 2833, 2866, 2933,
|
||||
2966, 3033, 3066, 3100, 3133, 3166, 3200, 3233, 3300, 3333, 3366,
|
||||
}, // Bracket 2
|
||||
{
|
||||
2500, 2533, 2600, 2633, 2666, 2733, 2800, 2866, 2900, 2966, 3033,
|
||||
3100, 3166, 3200, 3233, 3266, 3300, 3333, 3366, 3400, 3400, 3400,
|
||||
}, // Bracket 3
|
||||
};
|
||||
|
||||
static const u32 gpuVoltArray[] = { 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, };
|
||||
static const u32 gpuVoltArray[] = {
|
||||
590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800,
|
||||
};
|
||||
|
||||
if (freqMhz <= 1600) return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable)) bracket = 0;
|
||||
if (freqMhz <= 1600)
|
||||
return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable))
|
||||
bracket = 0;
|
||||
|
||||
u32 bracketStart = ramTable[bracket][0];
|
||||
|
||||
|
||||
u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch!
|
||||
u32 rampSpan = 590 - rampStartVolt;
|
||||
u32 bracketStart = ramTable[bracket][0];
|
||||
|
||||
u32 rampStartVolt = (bracket == 0) ? 535 : 525; // Do not touch!
|
||||
u32 rampSpan = 590 - rampStartVolt;
|
||||
|
||||
if (freqMhz >= 1633 && freqMhz < bracketStart) {
|
||||
u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633);
|
||||
u32 volt = ((raw + 2) / 5) * 5;
|
||||
if (volt < rampStartVolt) volt = rampStartVolt;
|
||||
if (volt > 590) volt = 590;
|
||||
return volt;
|
||||
}
|
||||
if (freqMhz >= 1633 && freqMhz < bracketStart) {
|
||||
u32 raw = rampStartVolt + ((freqMhz - 1633) * rampSpan) / (bracketStart - 1633);
|
||||
u32 volt = ((raw + 2) / 5) * 5;
|
||||
if (volt < rampStartVolt)
|
||||
volt = rampStartVolt;
|
||||
if (volt > 590)
|
||||
volt = 590;
|
||||
return volt;
|
||||
}
|
||||
|
||||
baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1];
|
||||
for (u32 i = 0; i < std::size(gpuVoltArray); ++i) {
|
||||
if (freqMhz <= ramTable[bracket][i]) {
|
||||
baseVolt = gpuVoltArray[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
struct DvfsEntry {
|
||||
u32 freq;
|
||||
u32 volt;
|
||||
};
|
||||
static const DvfsEntry ramTable[][19] = {
|
||||
{ { 1733, 725 },
|
||||
{ 1800, 730 },
|
||||
{ 1866, 735 },
|
||||
{ 1920, 740 },
|
||||
{ 1958, 745 },
|
||||
{ 1996, 750 },
|
||||
{ 2035, 755 },
|
||||
{ 2073, 760 },
|
||||
{ 2112, 765 },
|
||||
{ 2131, 770 },
|
||||
{ 2150, 775 },
|
||||
{ 2169, 780 },
|
||||
{ 2188, 785 },
|
||||
{ 2227, 790 },
|
||||
{ 2265, 795 },
|
||||
{ 2304, 800 },
|
||||
{ 2342, 805 },
|
||||
{ 2380, 810 },
|
||||
{ 2400, 815 } }, // Bracket 0
|
||||
{ { 1733, 715 },
|
||||
{ 1800, 720 },
|
||||
{ 1866, 725 },
|
||||
{ 1920, 730 },
|
||||
{ 1958, 735 },
|
||||
{ 1996, 740 },
|
||||
{ 2035, 745 },
|
||||
{ 2073, 750 },
|
||||
{ 2112, 755 },
|
||||
{ 2131, 760 },
|
||||
{ 2150, 765 },
|
||||
{ 2169, 770 },
|
||||
{ 2188, 775 },
|
||||
{ 2227, 780 },
|
||||
{ 2265, 785 },
|
||||
{ 2304, 790 },
|
||||
{ 2342, 795 },
|
||||
{ 2380, 800 },
|
||||
{ 2400, 805 } }, // Bracket 1
|
||||
{ { 1733, 705 },
|
||||
{ 1800, 710 },
|
||||
{ 1866, 715 },
|
||||
{ 1920, 720 },
|
||||
{ 1958, 725 },
|
||||
{ 1996, 730 },
|
||||
{ 2035, 735 },
|
||||
{ 2073, 740 },
|
||||
{ 2112, 745 },
|
||||
{ 2131, 750 },
|
||||
{ 2150, 755 },
|
||||
{ 2169, 760 },
|
||||
{ 2188, 765 },
|
||||
{ 2227, 770 },
|
||||
{ 2265, 775 },
|
||||
{ 2304, 780 },
|
||||
{ 2342, 785 },
|
||||
{ 2380, 790 },
|
||||
{ 2400, 795 } }, // Bracket 2
|
||||
{ { 1733, 695 },
|
||||
{ 1800, 700 },
|
||||
{ 1866, 705 },
|
||||
{ 1920, 710 },
|
||||
{ 1958, 715 },
|
||||
{ 1996, 720 },
|
||||
{ 2035, 725 },
|
||||
{ 2073, 730 },
|
||||
{ 2112, 735 },
|
||||
{ 2131, 740 },
|
||||
{ 2150, 745 },
|
||||
{ 2169, 750 },
|
||||
{ 2188, 755 },
|
||||
{ 2227, 760 },
|
||||
{ 2265, 765 },
|
||||
{ 2304, 770 },
|
||||
{ 2342, 775 },
|
||||
{ 2380, 780 },
|
||||
{ 2400, 785 } }, // Bracket 3
|
||||
};
|
||||
|
||||
u32 baseVolt = gpuVoltArray[std::size(gpuVoltArray) - 1];
|
||||
for (u32 i = 0; i < std::size(gpuVoltArray); ++i) {
|
||||
if (freqMhz <= ramTable[bracket][i]) {
|
||||
baseVolt = gpuVoltArray[i];
|
||||
break;
|
||||
if (freqMhz <= 1600)
|
||||
return 0; // DVFS doesnt work below 1600MHz, it will just use vMin
|
||||
if (bracket >= std::size(ramTable))
|
||||
bracket = 0;
|
||||
|
||||
const auto &entries = ramTable[bracket];
|
||||
baseVolt = entries[std::size(entries) - 1].volt;
|
||||
for (const auto &entry : entries) {
|
||||
if (freqMhz <= entry.freq) {
|
||||
baseVolt = entry.volt;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return baseVolt;
|
||||
}
|
||||
}
|
||||
} // namespace board
|
||||
@@ -16,8 +16,9 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <hocclk.h>
|
||||
#include <switch.h>
|
||||
|
||||
|
||||
namespace board {
|
||||
|
||||
@@ -37,9 +38,9 @@ namespace board {
|
||||
u32 tune0High;
|
||||
u32 tune1Low;
|
||||
u32 tune1High;
|
||||
// u32 tune_high_min_millivolts;
|
||||
// u32 tune_high_margin_millivolts;
|
||||
// u64 dvco_calibration_max;
|
||||
// u32 tune_high_min_millivolts;
|
||||
// u32 tune_high_margin_millivolts;
|
||||
// u64 dvco_calibration_max;
|
||||
};
|
||||
|
||||
void SetDfllTunings(u32 levelLow, u32 levelHigh, u32 tbreakPoint);
|
||||
@@ -50,4 +51,4 @@ namespace board {
|
||||
void PcvHijackGpuVolts(u32 vmin);
|
||||
u32 GetMinimumGpuVmin(u32 freqMhz, u32 bracket);
|
||||
|
||||
}
|
||||
} // namespace board
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*
|
||||
* 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 "aula.hpp"
|
||||
@@ -23,26 +23,24 @@
|
||||
// I *think* HOS changes this in some ways, so look into it more
|
||||
|
||||
namespace AulaDisplay {
|
||||
#define MMIO_REG32(base, off) *(vu32 *)((base) + (off))
|
||||
#define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u)
|
||||
#define DSI_WR_DATA 0xA
|
||||
#define DSI_TRIGGER 0x13
|
||||
#define MMIO_REG32(base, off) *(vu32 *)((base) + (off))
|
||||
#define DSI(off) MMIO_REG32(board::dsiVirtAddr, (off) << 2u)
|
||||
#define DSI_WR_DATA 0xA
|
||||
#define DSI_TRIGGER 0x13
|
||||
|
||||
void _display_dsi_send_cmd(u8 cmd, u32 param, u32 wait) {
|
||||
DSI(DSI_WR_DATA) = (param << 8) | cmd;
|
||||
DSI(DSI_TRIGGER) = DSI_TRIGGER_HOST;
|
||||
|
||||
if (wait)
|
||||
svcSleepThread(wait * 1000); // usleep-equivalant
|
||||
svcSleepThread(wait * 1000); // usleep-equivalant
|
||||
}
|
||||
|
||||
void SetDisplayColorMode(AulaColorMode mode) {
|
||||
if(mode == AulaDisplayColorMode_DoNotOverride)
|
||||
if (mode == AulaDisplayColorMode_DoNotOverride)
|
||||
return;
|
||||
// send display command to change color mode.
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM,
|
||||
MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0);
|
||||
|
||||
_display_dsi_send_cmd(MIPI_DSI_DCS_SHORT_WRITE_PARAM, MIPI_DCS_PRIV_SM_SET_COLOR_MODE | (mode << 8), 0);
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace AulaDisplay
|
||||
@@ -12,10 +12,10 @@
|
||||
*
|
||||
* 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 "../board/board.hpp"
|
||||
|
||||
namespace AulaDisplay {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,26 +12,27 @@
|
||||
*
|
||||
* 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 "display_refresh_rate.hpp"
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "display_refresh_rate.hpp"
|
||||
|
||||
namespace display {
|
||||
#define DSI_CLOCK_HZ 234000000llu
|
||||
#define NVDISP_GET_MODE2 0x803C021B
|
||||
#define NVDISP_SET_MODE2 0x403C021C
|
||||
#define NVDISP_VALIDATE_MODE2 0xC03C021D
|
||||
#define NVDISP_GET_MODE_DB2 0xEF20021E
|
||||
#define NVDISP_GET_PANEL_DATA 0xC01C0226
|
||||
#define DSI_CLOCK_HZ 234000000llu
|
||||
#define NVDISP_GET_MODE2 0x803C021B
|
||||
#define NVDISP_SET_MODE2 0x403C021C
|
||||
#define NVDISP_VALIDATE_MODE2 0xC03C021D
|
||||
#define NVDISP_GET_MODE_DB2 0xEF20021E
|
||||
#define NVDISP_GET_PANEL_DATA 0xC01C0226
|
||||
|
||||
#define MAX_REFRESH_RATE 72
|
||||
#define MAX_REFRESH_RATE 72
|
||||
|
||||
static DisplayRefreshConfig g_config = {0};
|
||||
static DisplayRefreshConfig g_config = { 0 };
|
||||
static bool g_initialized = false;
|
||||
|
||||
static uint8_t g_dockedHighestRefreshRate = 60;
|
||||
@@ -41,7 +42,8 @@ namespace display {
|
||||
static bool g_canChangeRefreshRateDocked = false;
|
||||
static uint8_t g_lastVActiveSet = 0;
|
||||
|
||||
static const uint8_t g_dockedRefreshRates[] = {40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120, 130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240};
|
||||
static const uint8_t g_dockedRefreshRates[] = { 40, 45, 50, 55, 60, 70, 72, 75, 80, 90, 95, 100, 110, 120,
|
||||
130, 140, 144, 150, 160, 165, 170, 180, 190, 200, 210, 220, 230, 240 };
|
||||
// Calculate with this tool:
|
||||
|
||||
// https://tomverbeure.github.io/video_timings_calculator?horiz_pixels=1920&vert_pixels=1080&refresh_rate=240&margins=false&interlaced=false&bpc=8&color_fmt=rgb444&video_opt=false&custom_hblank=80&custom_vblank=6
|
||||
@@ -59,83 +61,85 @@ namespace display {
|
||||
} DockedTimings;
|
||||
*/
|
||||
static const DockedTimings g_dockedTimings1080p[] = {
|
||||
{8, 32, 40, 7, 8, 6, 0, 88080}, // 40Hz
|
||||
{8, 32, 40, 9, 8, 6, 0, 99270}, // 45Hz
|
||||
{528, 44, 148, 4, 5, 36, 31, 148500}, // 50Hz
|
||||
{8, 32, 40, 15, 8, 6, 0, 121990}, // 55Hz
|
||||
{88, 44, 148, 4, 5, 36, 16, 148500}, // 60Hz
|
||||
{8, 32, 40, 22, 8, 6, 0, 156240}, // 70Hz
|
||||
{8, 32, 40, 23, 8, 6, 0, 160848}, // 72Hz
|
||||
{8, 32, 40, 25, 8, 6, 0, 167850}, // 75Hz
|
||||
{8, 32, 40, 28, 8, 6, 0, 179520}, // 80Hz
|
||||
{8, 32, 40, 33, 8, 6, 0, 202860}, // 90Hz
|
||||
{8, 32, 40, 36, 8, 6, 0, 214700}, // 95Hz
|
||||
{528, 44, 148, 4, 5, 36, 64, 297000}, // 100Hz
|
||||
{8, 32, 40, 44, 8, 6, 0, 250360}, // 110Hz
|
||||
{88, 44, 148, 4, 5, 36, 63, 297000}, // 120Hz
|
||||
{8, 32, 40, 55, 8, 6, 0, 298750}, //130Hz CVT-RBv2
|
||||
{8, 32, 40, 61, 8, 6, 0, 323400}, //140Hz CVT-RBv2
|
||||
{8, 32, 40, 63, 8, 6, 0, 333216}, //144Hz CVT-RBv2
|
||||
{8, 32, 40, 67, 8, 6, 0, 348300}, //150Hz CVT-RBv2
|
||||
{8, 32, 40, 72, 8, 6, 0, 373120}, //160Hz CVT-RBv2
|
||||
{8, 32, 40, 75, 8, 6, 0, 385770}, //165Hz CVT-RBv2
|
||||
{8, 32, 40, 78, 8, 6, 0, 398480}, //170Hz CVT-RBv2
|
||||
{8, 32, 40, 84, 8, 6, 0, 424080}, //180Hz CVT-RBv2
|
||||
{8, 32, 40, 90, 8, 6, 0, 449920}, //190Hz CVT-RBv2
|
||||
{8, 32, 40, 96, 8, 6, 0, 476000}, //200Hz CVT-RBv2
|
||||
{8, 32, 40, 102, 8, 6, 0, 502320}, //210Hz CVT-RBv2
|
||||
{8, 32, 40, 108, 8, 6, 0, 528880}, //220Hz CVT-RBv2
|
||||
{8, 32, 40, 114, 8, 6, 0, 555680}, //230Hz CVT-RBv2
|
||||
{8, 32, 40, 121, 8, 6, 0, 583200}, //240Hz CVT-RBv2
|
||||
{ 8, 32, 40, 7, 8, 6, 0, 88080 }, // 40Hz
|
||||
{ 8, 32, 40, 9, 8, 6, 0, 99270 }, // 45Hz
|
||||
{ 528, 44, 148, 4, 5, 36, 31, 148500 }, // 50Hz
|
||||
{ 8, 32, 40, 15, 8, 6, 0, 121990 }, // 55Hz
|
||||
{ 88, 44, 148, 4, 5, 36, 16, 148500 }, // 60Hz
|
||||
{ 8, 32, 40, 22, 8, 6, 0, 156240 }, // 70Hz
|
||||
{ 8, 32, 40, 23, 8, 6, 0, 160848 }, // 72Hz
|
||||
{ 8, 32, 40, 25, 8, 6, 0, 167850 }, // 75Hz
|
||||
{ 8, 32, 40, 28, 8, 6, 0, 179520 }, // 80Hz
|
||||
{ 8, 32, 40, 33, 8, 6, 0, 202860 }, // 90Hz
|
||||
{ 8, 32, 40, 36, 8, 6, 0, 214700 }, // 95Hz
|
||||
{ 528, 44, 148, 4, 5, 36, 64, 297000 }, // 100Hz
|
||||
{ 8, 32, 40, 44, 8, 6, 0, 250360 }, // 110Hz
|
||||
{ 88, 44, 148, 4, 5, 36, 63, 297000 }, // 120Hz
|
||||
{ 8, 32, 40, 55, 8, 6, 0, 298750 }, // 130Hz CVT-RBv2
|
||||
{ 8, 32, 40, 61, 8, 6, 0, 323400 }, // 140Hz CVT-RBv2
|
||||
{ 8, 32, 40, 63, 8, 6, 0, 333216 }, // 144Hz CVT-RBv2
|
||||
{ 8, 32, 40, 67, 8, 6, 0, 348300 }, // 150Hz CVT-RBv2
|
||||
{ 8, 32, 40, 72, 8, 6, 0, 373120 }, // 160Hz CVT-RBv2
|
||||
{ 8, 32, 40, 75, 8, 6, 0, 385770 }, // 165Hz CVT-RBv2
|
||||
{ 8, 32, 40, 78, 8, 6, 0, 398480 }, // 170Hz CVT-RBv2
|
||||
{ 8, 32, 40, 84, 8, 6, 0, 424080 }, // 180Hz CVT-RBv2
|
||||
{ 8, 32, 40, 90, 8, 6, 0, 449920 }, // 190Hz CVT-RBv2
|
||||
{ 8, 32, 40, 96, 8, 6, 0, 476000 }, // 200Hz CVT-RBv2
|
||||
{ 8, 32, 40, 102, 8, 6, 0, 502320 }, // 210Hz CVT-RBv2
|
||||
{ 8, 32, 40, 108, 8, 6, 0, 528880 }, // 220Hz CVT-RBv2
|
||||
{ 8, 32, 40, 114, 8, 6, 0, 555680 }, // 230Hz CVT-RBv2
|
||||
{ 8, 32, 40, 121, 8, 6, 0, 583200 }, // 240Hz CVT-RBv2
|
||||
// technically you can go to 476hz, but in practice, why would you?
|
||||
};
|
||||
|
||||
// These timings *should* work but are untested
|
||||
static const HandheldTimings g_handheldTimingsRETRO[] = {
|
||||
{72, 136, 72, 1, 660, 9, 78000}, // 40Hz
|
||||
{72, 136, 72, 1, 612, 9, 77982}, // 41Hz
|
||||
{72, 136, 72, 1, 567, 9, 77994}, // 42Hz
|
||||
{72, 136, 72, 1, 524, 9, 78002}, // 43Hz
|
||||
{72, 136, 72, 1, 483, 9, 78012}, // 44Hz
|
||||
{72, 136, 72, 1, 443, 9, 77985}, // 45Hz
|
||||
{72, 136, 72, 1, 406, 9, 78016}, // 46Hz
|
||||
{72, 136, 72, 1, 370, 9, 78020}, // 47Hz
|
||||
{72, 136, 72, 1, 335, 9, 78000}, // 48Hz
|
||||
{72, 136, 72, 1, 302, 9, 78008}, // 49Hz
|
||||
{72, 136, 72, 1, 270, 9, 78000}, // 50Hz
|
||||
{72, 136, 72, 1, 239, 9, 77979}, // 51Hz
|
||||
{72, 136, 72, 1, 210, 9, 78000}, // 52Hz
|
||||
{72, 136, 72, 1, 182, 9, 78016}, // 53Hz
|
||||
{72, 136, 72, 1, 154, 9, 77976}, // 54Hz
|
||||
{72, 136, 72, 1, 128, 9, 77990}, // 55Hz
|
||||
{72, 136, 72, 1, 103, 9, 78008}, // 56Hz
|
||||
{72, 136, 72, 1, 78, 9, 77976}, // 57Hz
|
||||
{72, 136, 72, 1, 55, 9, 78010}, // 58Hz
|
||||
{72, 136, 72, 1, 32, 9, 77998}, // 59Hz
|
||||
{72, 136, 72, 1, 10, 9, 78000}, // 60Hz
|
||||
{ 72, 136, 72, 1, 660, 9, 78000 }, // 40Hz
|
||||
{ 72, 136, 72, 1, 612, 9, 77982 }, // 41Hz
|
||||
{ 72, 136, 72, 1, 567, 9, 77994 }, // 42Hz
|
||||
{ 72, 136, 72, 1, 524, 9, 78002 }, // 43Hz
|
||||
{ 72, 136, 72, 1, 483, 9, 78012 }, // 44Hz
|
||||
{ 72, 136, 72, 1, 443, 9, 77985 }, // 45Hz
|
||||
{ 72, 136, 72, 1, 406, 9, 78016 }, // 46Hz
|
||||
{ 72, 136, 72, 1, 370, 9, 78020 }, // 47Hz
|
||||
{ 72, 136, 72, 1, 335, 9, 78000 }, // 48Hz
|
||||
{ 72, 136, 72, 1, 302, 9, 78008 }, // 49Hz
|
||||
{ 72, 136, 72, 1, 270, 9, 78000 }, // 50Hz
|
||||
{ 72, 136, 72, 1, 239, 9, 77979 }, // 51Hz
|
||||
{ 72, 136, 72, 1, 210, 9, 78000 }, // 52Hz
|
||||
{ 72, 136, 72, 1, 182, 9, 78016 }, // 53Hz
|
||||
{ 72, 136, 72, 1, 154, 9, 77976 }, // 54Hz
|
||||
{ 72, 136, 72, 1, 128, 9, 77990 }, // 55Hz
|
||||
{ 72, 136, 72, 1, 103, 9, 78008 }, // 56Hz
|
||||
{ 72, 136, 72, 1, 78, 9, 77976 }, // 57Hz
|
||||
{ 72, 136, 72, 1, 55, 9, 78010 }, // 58Hz
|
||||
{ 72, 136, 72, 1, 32, 9, 77998 }, // 59Hz
|
||||
{ 72, 136, 72, 1, 10, 9, 78000 }, // 60Hz
|
||||
};
|
||||
|
||||
static const MinMaxRefreshRate g_handheldModeRefreshRate = {40, 80};
|
||||
static const MinMaxRefreshRate g_handheldModeRefreshRate = { 40, 80 };
|
||||
|
||||
static uint8_t _getDockedRefreshRateIterator(uint32_t refreshRate) {
|
||||
for (size_t i = 0; i < sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]); i++) {
|
||||
if (g_dockedRefreshRates[i] == refreshRate) return i;
|
||||
if (g_dockedRefreshRates[i] == refreshRate)
|
||||
return i;
|
||||
}
|
||||
return 0xFF;
|
||||
}
|
||||
|
||||
static void _changeOledElvssSettings(const uint32_t* offsets, const uint32_t* value, uint32_t size, uint32_t start) {
|
||||
if (!g_config.dsiVirtAddr || !value || !size) return;
|
||||
static void _changeOledElvssSettings(const uint32_t *offsets, const uint32_t *value, uint32_t size, uint32_t start) {
|
||||
if (!g_config.dsiVirtAddr || !value || !size)
|
||||
return;
|
||||
|
||||
volatile uint32_t* dsi = (uint32_t*)g_config.dsiVirtAddr;
|
||||
|
||||
#define DSI_VIDEO_MODE_CONTROL 0x4E
|
||||
#define DSI_WR_DATA 0xA
|
||||
#define DSI_TRIGGER 0x13
|
||||
#define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15
|
||||
#define MIPI_DSI_DCS_LONG_WRITE 0x39
|
||||
#define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0
|
||||
#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1
|
||||
volatile uint32_t *dsi = (uint32_t *)g_config.dsiVirtAddr;
|
||||
|
||||
#define DSI_VIDEO_MODE_CONTROL 0x4E
|
||||
#define DSI_WR_DATA 0xA
|
||||
#define DSI_TRIGGER 0x13
|
||||
#define MIPI_DSI_DCS_SHORT_WRITE_PARAM 0x15
|
||||
#define MIPI_DSI_DCS_LONG_WRITE 0x39
|
||||
#define MIPI_DCS_PRIV_SM_SET_REG_OFFSET 0xB0
|
||||
#define MIPI_DCS_PRIV_SM_SET_ELVSS 0xB1
|
||||
|
||||
dsi[DSI_VIDEO_MODE_CONTROL] = true;
|
||||
svcSleepThread(20000000);
|
||||
@@ -164,9 +168,10 @@ namespace display {
|
||||
g_config.isDocked = isDocked;
|
||||
}
|
||||
|
||||
bool Initialize(const DisplayRefreshConfig* config) {
|
||||
if (!config) return false;
|
||||
|
||||
bool Initialize(const DisplayRefreshConfig *config) {
|
||||
if (!config)
|
||||
return false;
|
||||
|
||||
g_config = *config;
|
||||
g_initialized = true;
|
||||
return true;
|
||||
@@ -175,34 +180,38 @@ namespace display {
|
||||
void CorrectOledGamma(uint32_t refresh_rate) {
|
||||
static uint32_t last_refresh_rate = 60;
|
||||
static int counter = 0;
|
||||
|
||||
|
||||
if (g_config.isDocked || refresh_rate < 45 || refresh_rate > 60) {
|
||||
last_refresh_rate = 60;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (counter != 9) {
|
||||
counter++;
|
||||
return;
|
||||
}
|
||||
counter = 0;
|
||||
|
||||
uint32_t offsets[] = {0x1A, 0x24, 0x25};
|
||||
uint32_t values[] = {2, 0, 0x83};
|
||||
|
||||
uint32_t offsets[] = { 0x1A, 0x24, 0x25 };
|
||||
uint32_t values[] = { 2, 0, 0x83 };
|
||||
|
||||
if (refresh_rate == 60) {
|
||||
if (last_refresh_rate == 60) return;
|
||||
if (last_refresh_rate == 60)
|
||||
return;
|
||||
} else if (refresh_rate == 45) {
|
||||
if (last_refresh_rate == 45) return;
|
||||
uint32_t vals[] = {4, 1, 0};
|
||||
if (last_refresh_rate == 45)
|
||||
return;
|
||||
uint32_t vals[] = { 4, 1, 0 };
|
||||
memcpy(values, vals, sizeof(vals));
|
||||
} else if (refresh_rate == 50) {
|
||||
if (last_refresh_rate == 50) return;
|
||||
uint32_t vals[] = {3, 1, 0};
|
||||
if (last_refresh_rate == 50)
|
||||
return;
|
||||
uint32_t vals[] = { 3, 1, 0 };
|
||||
memcpy(values, vals, sizeof(vals));
|
||||
} else if (refresh_rate == 55) {
|
||||
if (last_refresh_rate == 55) return;
|
||||
uint32_t vals[] = {3, 1, 0};
|
||||
if (last_refresh_rate == 55)
|
||||
return;
|
||||
uint32_t vals[] = { 3, 1, 0 };
|
||||
memcpy(values, vals, sizeof(vals));
|
||||
} else {
|
||||
return;
|
||||
@@ -227,69 +236,72 @@ namespace display {
|
||||
static void _getDockedHighestRefreshRate(uint32_t fd_in) {
|
||||
uint8_t highestRefreshRate = 60;
|
||||
uint32_t fd = fd_in;
|
||||
|
||||
if(!fd) nvOpen(&fd, "/dev/nvdisp-disp1");
|
||||
NvdcModeDB2 db2 = {0};
|
||||
|
||||
if (!fd)
|
||||
nvOpen(&fd, "/dev/nvdisp-disp1");
|
||||
NvdcModeDB2 db2 = { 0 };
|
||||
int rc = nvIoctl(fd, NVDISP_GET_MODE_DB2, &db2);
|
||||
|
||||
|
||||
if (rc == 0) {
|
||||
for (size_t i = 0; i < db2.num_modes; i++) {
|
||||
if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080)
|
||||
if (db2.modes[i].hActive < 1920 || db2.modes[i].vActive < 1080)
|
||||
continue;
|
||||
|
||||
|
||||
uint32_t v_total = db2.modes[i].vActive + db2.modes[i].vSyncWidth + db2.modes[i].vFrontPorch + db2.modes[i].vBackPorch;
|
||||
uint32_t h_total = db2.modes[i].hActive + db2.modes[i].hSyncWidth + db2.modes[i].hFrontPorch + db2.modes[i].hBackPorch;
|
||||
double refreshRate = round((double)(db2.modes[i].pclkKHz * 1000) / (double)(v_total * h_total));
|
||||
|
||||
if (highestRefreshRate < (uint8_t)refreshRate)
|
||||
|
||||
if (highestRefreshRate < (uint8_t)refreshRate)
|
||||
highestRefreshRate = (uint8_t)refreshRate;
|
||||
}
|
||||
} else {
|
||||
g_dockedHighestRefreshRate = 60;
|
||||
}
|
||||
|
||||
|
||||
const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]);
|
||||
if (highestRefreshRate > g_dockedRefreshRates[numRates - 1])
|
||||
if (highestRefreshRate > g_dockedRefreshRates[numRates - 1])
|
||||
highestRefreshRate = g_dockedRefreshRates[numRates - 1];
|
||||
|
||||
NvdcMode2 display_b = {0};
|
||||
|
||||
NvdcMode2 display_b = { 0 };
|
||||
rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b);
|
||||
|
||||
|
||||
struct dpaux_read_0x100 {
|
||||
uint32_t cmd;
|
||||
uint32_t addr;
|
||||
uint32_t size;
|
||||
struct {
|
||||
unsigned char link_rate;
|
||||
unsigned int lane_count: 5;
|
||||
unsigned int unk1: 2;
|
||||
unsigned int isFramingEnhanced: 1;
|
||||
unsigned int lane_count : 5;
|
||||
unsigned int unk1 : 2;
|
||||
unsigned int isFramingEnhanced : 1;
|
||||
unsigned char downspread;
|
||||
unsigned char training_pattern;
|
||||
unsigned char lane_pattern[4];
|
||||
unsigned char unk2[8];
|
||||
} set;
|
||||
} dpaux = {6, 0x100, 0x10};
|
||||
|
||||
} dpaux = { 6, 0x100, 0x10 };
|
||||
|
||||
rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux);
|
||||
if (rc == 0) {
|
||||
g_dockedLinkRate = dpaux.set.link_rate;
|
||||
// if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && )
|
||||
// if (display_b.hActive == 1920 && display_b.vActive == 1080 && highestRefreshRate > 75 && dpaux.set.link_rate < 20 && )
|
||||
// highestRefreshRate = 75;
|
||||
}
|
||||
|
||||
if (!fd_in) nvClose(fd);
|
||||
|
||||
if (!fd_in)
|
||||
nvClose(fd);
|
||||
g_dockedHighestRefreshRate = highestRefreshRate;
|
||||
}
|
||||
|
||||
static bool _setPLLDHandheldRefreshRate(uint32_t new_refreshRate) {
|
||||
if (!g_config.clkVirtAddr) return false;
|
||||
if (!g_config.clkVirtAddr)
|
||||
return false;
|
||||
|
||||
uint32_t fd = 0;
|
||||
if (nvOpen(&fd, "/dev/nvdisp-disp0")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
struct dpaux_read {
|
||||
uint32_t cmd;
|
||||
uint32_t addr;
|
||||
@@ -298,24 +310,26 @@ namespace display {
|
||||
unsigned int rev_minor : 4;
|
||||
unsigned int rev_major : 4;
|
||||
unsigned char link_rate;
|
||||
unsigned int lane_count: 5;
|
||||
unsigned int unk1: 2;
|
||||
unsigned int isFramingEnhanced: 1;
|
||||
unsigned int lane_count : 5;
|
||||
unsigned int unk1 : 2;
|
||||
unsigned int isFramingEnhanced : 1;
|
||||
unsigned char unk2[13];
|
||||
} DPCD;
|
||||
} dpaux = {6, 0, 0x10};
|
||||
|
||||
} dpaux = { 6, 0, 0x10 };
|
||||
|
||||
int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux);
|
||||
nvClose(fd);
|
||||
if (rc != 0x75c) return false;
|
||||
if (rc != 0x75c)
|
||||
return false;
|
||||
|
||||
PLLD_BASE base = { 0 };
|
||||
PLLD_MISC misc = { 0 };
|
||||
memcpy(&base, (void *)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
PLLD_BASE base = {0};
|
||||
PLLD_MISC misc = {0};
|
||||
memcpy(&base, (void*)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
uint32_t value = ((base.PLLD_DIVN / base.PLLD_DIVM) * 10) / 4;
|
||||
if (value == 0 || value == 80) return false;
|
||||
if (value == 0 || value == 80)
|
||||
return false;
|
||||
|
||||
if (new_refreshRate > g_handheldModeRefreshRate.max) {
|
||||
new_refreshRate = g_handheldModeRefreshRate.max;
|
||||
@@ -337,7 +351,8 @@ namespace display {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!skip) new_refreshRate = 60;
|
||||
if (!skip)
|
||||
new_refreshRate = 60;
|
||||
}
|
||||
|
||||
uint32_t pixelClock = (9375 * ((4096 * ((2 * base.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * base.PLLD_DIVM);
|
||||
@@ -354,35 +369,34 @@ namespace display {
|
||||
uint64_t expected_pixel_clock = (DSI_CLOCK_HZ * new_refreshRate) / 60;
|
||||
misc.PLLD_SDM_DIN = ((8 * base.PLLD_DIVM * expected_pixel_clock) / 9375) - (4096 * ((2 * base.PLLD_DIVN) + 1));
|
||||
|
||||
memcpy((void*)(g_config.clkVirtAddr + 0xD0), &base, 4);
|
||||
memcpy((void*)(g_config.clkVirtAddr + 0xDC), &misc, 4);
|
||||
memcpy((void *)(g_config.clkVirtAddr + 0xD0), &base, 4);
|
||||
memcpy((void *)(g_config.clkVirtAddr + 0xDC), &misc, 4);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool _setNvDispDockedRefreshRate(uint32_t new_refreshRate) {
|
||||
if (g_config.isLite || !g_canChangeRefreshRateDocked)
|
||||
return false;
|
||||
|
||||
|
||||
uint32_t fd = 0;
|
||||
if (nvOpen(&fd, "/dev/nvdisp-disp1")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
NvdcMode2 display_b = {0};
|
||||
|
||||
NvdcMode2 display_b = { 0 };
|
||||
int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b);
|
||||
if (rc != 0) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!display_b.pclkKHz) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!((display_b.vActive == 480 && display_b.hActive == 720) ||
|
||||
(display_b.vActive == 720 && display_b.hActive == 1280) ||
|
||||
(display_b.vActive == 1080 && display_b.hActive == 1920))) {
|
||||
|
||||
if (!((display_b.vActive == 480 && display_b.hActive == 720) || (display_b.vActive == 720 && display_b.hActive == 1280) ||
|
||||
(display_b.vActive == 1080 && display_b.hActive == 1920))) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
@@ -394,15 +408,15 @@ namespace display {
|
||||
uint32_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch;
|
||||
uint32_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch;
|
||||
uint32_t refreshRateNow = ((display_b.pclkKHz) * 1000 + 999) / (h_total * v_total);
|
||||
|
||||
|
||||
int8_t itr = -1;
|
||||
const size_t numRates = sizeof(g_dockedRefreshRates) / sizeof(g_dockedRefreshRates[0]);
|
||||
|
||||
|
||||
// Find closest matching refresh rate
|
||||
if ((new_refreshRate <= 60) && ((60 % new_refreshRate) == 0)) {
|
||||
itr = _getDockedRefreshRateIterator(60);
|
||||
}
|
||||
|
||||
|
||||
if (itr == -1) {
|
||||
for (size_t i = 0; i < numRates; i++) {
|
||||
uint8_t val = g_dockedRefreshRates[i];
|
||||
@@ -412,7 +426,7 @@ namespace display {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (itr == -1) {
|
||||
if (!g_config.matchLowestDocked) {
|
||||
itr = _getDockedRefreshRateIterator(60);
|
||||
@@ -425,9 +439,10 @@ namespace display {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (itr == -1) itr = _getDockedRefreshRateIterator(60);
|
||||
|
||||
|
||||
if (itr == -1)
|
||||
itr = _getDockedRefreshRateIterator(60);
|
||||
|
||||
// Clamp to highest allowed refresh rate
|
||||
if (g_dockedRefreshRates[itr] > g_dockedHighestRefreshRate) {
|
||||
for (int8_t i = itr; i >= 0; i--) {
|
||||
@@ -437,7 +452,7 @@ namespace display {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (refreshRateNow == g_dockedRefreshRates[itr]) {
|
||||
nvClose(fd);
|
||||
return true;
|
||||
@@ -460,46 +475,47 @@ namespace display {
|
||||
display_b.sync = 3;
|
||||
display_b.bitsPerPixel = 24;
|
||||
}
|
||||
|
||||
|
||||
rc = nvIoctl(fd, NVDISP_VALIDATE_MODE2, &display_b);
|
||||
if (rc == 0) {
|
||||
rc = nvIoctl(fd, NVDISP_SET_MODE2, &display_b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nvClose(fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool _setNvDispHandheldRefreshRate(uint32_t new_refreshRate) {
|
||||
if (!g_config.isRetroSUPER) return false;
|
||||
|
||||
if (!g_config.isRetroSUPER)
|
||||
return false;
|
||||
|
||||
if (!g_config.displaySync) {
|
||||
g_wasRetroSuperTurnedOff = false;
|
||||
} else if (g_wasRetroSuperTurnedOff) {
|
||||
svcSleepThread(2000000000);
|
||||
g_wasRetroSuperTurnedOff = false;
|
||||
}
|
||||
|
||||
|
||||
svcSleepThread(1000000000);
|
||||
|
||||
|
||||
uint32_t fd = 0;
|
||||
if (nvOpen(&fd, "/dev/nvdisp-disp0")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
NvdcMode2 display_b = {0};
|
||||
|
||||
NvdcMode2 display_b = { 0 };
|
||||
int rc = nvIoctl(fd, NVDISP_GET_MODE2, &display_b);
|
||||
if (rc != 0) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (!display_b.pclkKHz) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if ((display_b.vActive == 1280 && display_b.hActive == 720) == false) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
@@ -529,7 +545,8 @@ namespace display {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!skip) new_refreshRate = 60;
|
||||
if (!skip)
|
||||
new_refreshRate = 60;
|
||||
}
|
||||
|
||||
if (new_refreshRate == refreshRateNow) {
|
||||
@@ -552,25 +569,25 @@ namespace display {
|
||||
nvIoctl(fd, NVDISP_SET_MODE2, &display_b);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
nvClose(fd);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SetRate(uint32_t new_refreshRate) {
|
||||
if (!new_refreshRate || !g_initialized) return false;
|
||||
if (!new_refreshRate || !g_initialized)
|
||||
return false;
|
||||
|
||||
uint32_t fd = 0;
|
||||
|
||||
|
||||
if (g_config.isRetroSUPER && !g_config.isDocked) {
|
||||
return _setNvDispHandheldRefreshRate(new_refreshRate);
|
||||
}
|
||||
|
||||
else if ((!g_config.isRetroSUPER && g_config.isLite) || R_FAILED(nvOpen(&fd, "/dev/nvdisp-disp1"))) {
|
||||
if (_setPLLDHandheldRefreshRate(new_refreshRate) == false)
|
||||
if (_setPLLDHandheldRefreshRate(new_refreshRate) == false)
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
struct dpaux_read {
|
||||
uint32_t cmd;
|
||||
uint32_t addr;
|
||||
@@ -579,48 +596,49 @@ namespace display {
|
||||
unsigned int rev_minor : 4;
|
||||
unsigned int rev_major : 4;
|
||||
unsigned char link_rate;
|
||||
unsigned int lane_count: 5;
|
||||
unsigned int unk1: 2;
|
||||
unsigned int isFramingEnhanced: 1;
|
||||
unsigned int lane_count : 5;
|
||||
unsigned int unk1 : 2;
|
||||
unsigned int isFramingEnhanced : 1;
|
||||
unsigned char unk2[13];
|
||||
} DPCD;
|
||||
} dpaux = {6, 0, 0x10};
|
||||
|
||||
} dpaux = { 6, 0, 0x10 };
|
||||
|
||||
int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux);
|
||||
nvClose(fd);
|
||||
|
||||
|
||||
if (rc != 0) {
|
||||
if (!g_config.isRetroSUPER) {
|
||||
return _setPLLDHandheldRefreshRate(new_refreshRate);
|
||||
} else {
|
||||
return _setNvDispHandheldRefreshRate(new_refreshRate);
|
||||
}
|
||||
if (!g_config.isRetroSUPER) {
|
||||
return _setPLLDHandheldRefreshRate(new_refreshRate);
|
||||
} else {
|
||||
return _setNvDispHandheldRefreshRate(new_refreshRate);
|
||||
}
|
||||
} else {
|
||||
if(g_config.isDocked)
|
||||
if (g_config.isDocked)
|
||||
return _setNvDispDockedRefreshRate(new_refreshRate);
|
||||
else
|
||||
else
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool GetRate(uint32_t* out_refreshRate, bool internal) {
|
||||
if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr) return false;
|
||||
bool GetRate(uint32_t *out_refreshRate, bool internal) {
|
||||
if (!out_refreshRate || !g_initialized || !g_config.clkVirtAddr)
|
||||
return false;
|
||||
static uint32_t value = 60;
|
||||
|
||||
if (g_config.isRetroSUPER && !g_config.isDocked) {
|
||||
uint32_t fd = 0;
|
||||
PLLD_BASE temp = {0};
|
||||
PLLD_MISC misc = {0};
|
||||
memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
PLLD_BASE temp = { 0 };
|
||||
PLLD_MISC misc = { 0 };
|
||||
memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4;
|
||||
|
||||
|
||||
if (value != 0 && value != 80) {
|
||||
if (!nvOpen(&fd, "/dev/nvdisp-disp0")) {
|
||||
NvdcMode2 display_b = {0};
|
||||
NvdcMode2 display_b = { 0 };
|
||||
if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) {
|
||||
uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch;
|
||||
uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch;
|
||||
@@ -634,21 +652,21 @@ namespace display {
|
||||
} else {
|
||||
g_wasRetroSuperTurnedOff = true;
|
||||
}
|
||||
}
|
||||
else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) {
|
||||
PLLD_BASE temp = {0};
|
||||
PLLD_MISC misc = {0};
|
||||
memcpy(&temp, (void*)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void*)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
} else if ((!g_config.isPossiblySpoofedRetro) || (g_config.isPossiblySpoofedRetro && !g_config.isRetroSUPER)) {
|
||||
PLLD_BASE temp = { 0 };
|
||||
PLLD_MISC misc = { 0 };
|
||||
memcpy(&temp, (void *)(g_config.clkVirtAddr + 0xD0), 4);
|
||||
memcpy(&misc, (void *)(g_config.clkVirtAddr + 0xDC), 4);
|
||||
|
||||
value = ((temp.PLLD_DIVN / temp.PLLD_DIVM) * 10) / 4;
|
||||
|
||||
|
||||
if (value == 0 || value == 80) {
|
||||
// Docked mode
|
||||
if (g_config.isLite) return false;
|
||||
|
||||
if (g_config.isLite)
|
||||
return false;
|
||||
|
||||
g_config.isDocked = true;
|
||||
|
||||
|
||||
if (!g_canChangeRefreshRateDocked) {
|
||||
uint32_t fd = 0;
|
||||
if (!nvOpen(&fd, "/dev/nvdisp-disp1")) {
|
||||
@@ -658,19 +676,19 @@ namespace display {
|
||||
uint32_t size;
|
||||
struct {
|
||||
unsigned char link_rate;
|
||||
unsigned int lane_count: 5;
|
||||
unsigned int unk1: 2;
|
||||
unsigned int isFramingEnhanced: 1;
|
||||
unsigned int lane_count : 5;
|
||||
unsigned int unk1 : 2;
|
||||
unsigned int isFramingEnhanced : 1;
|
||||
unsigned char downspread;
|
||||
unsigned char training_pattern;
|
||||
unsigned char lane_pattern[4];
|
||||
unsigned char unk2[8];
|
||||
} set;
|
||||
} dpaux = {6, 0x100, 0x10};
|
||||
|
||||
} dpaux = { 6, 0x100, 0x10 };
|
||||
|
||||
int rc = nvIoctl(fd, NVDISP_GET_PANEL_DATA, &dpaux);
|
||||
nvClose(fd);
|
||||
|
||||
|
||||
if (rc == 0) {
|
||||
_getDockedHighestRefreshRate(0);
|
||||
g_canChangeRefreshRateDocked = true;
|
||||
@@ -682,24 +700,24 @@ namespace display {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(internal) {
|
||||
if (internal) {
|
||||
*out_refreshRate = value;
|
||||
return true;
|
||||
}
|
||||
uint32_t fd = 0;
|
||||
if (!nvOpen(&fd, "/dev/nvdisp-disp1")) {
|
||||
NvdcMode2 display_b = {0};
|
||||
NvdcMode2 display_b = { 0 };
|
||||
if (nvIoctl(fd, NVDISP_GET_MODE2, &display_b) == 0) {
|
||||
if (!display_b.pclkKHz) {
|
||||
nvClose(fd);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
if (g_lastVActive != display_b.vActive) {
|
||||
g_lastVActive = display_b.vActive;
|
||||
_getDockedHighestRefreshRate(fd);
|
||||
}
|
||||
|
||||
|
||||
uint64_t h_total = display_b.hActive + display_b.hFrontPorch + display_b.hSyncWidth + display_b.hBackPorch;
|
||||
uint64_t v_total = display_b.vActive + display_b.vFrontPorch + display_b.vSyncWidth + display_b.vBackPorch;
|
||||
uint64_t pixelClock = display_b.pclkKHz * 1000 + 999;
|
||||
@@ -711,16 +729,14 @@ namespace display {
|
||||
} else {
|
||||
value = 60;
|
||||
}
|
||||
}
|
||||
else if (!g_config.isRetroSUPER) {
|
||||
} else if (!g_config.isRetroSUPER) {
|
||||
// Handheld mode
|
||||
g_config.isDocked = false;
|
||||
g_canChangeRefreshRateDocked = false;
|
||||
|
||||
|
||||
uint32_t pixelClock = (9375ULL * ((4096 * ((2 * temp.PLLD_DIVN) + 1)) + misc.PLLD_SDM_DIN)) / (8 * temp.PLLD_DIVM);
|
||||
value = pixelClock / (DSI_CLOCK_HZ / 60);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -733,4 +749,4 @@ namespace display {
|
||||
g_initialized = false;
|
||||
memset(&g_config, 0, sizeof(g_config));
|
||||
}
|
||||
}
|
||||
} // namespace display
|
||||
@@ -12,14 +12,14 @@
|
||||
*
|
||||
* 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 <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
namespace display {
|
||||
typedef struct {
|
||||
uint16_t hFrontPorch;
|
||||
@@ -71,35 +71,35 @@ namespace display {
|
||||
} NvdcModeDB2;
|
||||
|
||||
typedef struct {
|
||||
unsigned int PLLD_DIVM: 8;
|
||||
unsigned int reserved_1: 3;
|
||||
unsigned int PLLD_DIVN: 8;
|
||||
unsigned int reserved_2: 1;
|
||||
unsigned int PLLD_DIVP: 3;
|
||||
unsigned int CSI_CLK_SRC: 1;
|
||||
unsigned int reserved_3: 1;
|
||||
unsigned int PLL_D: 1;
|
||||
unsigned int reserved_4: 1;
|
||||
unsigned int PLLD_LOCK: 1;
|
||||
unsigned int reserved_5: 1;
|
||||
unsigned int PLLD_REF_DIS: 1;
|
||||
unsigned int PLLD_ENABLE: 1;
|
||||
unsigned int PLLD_BYPASS: 1;
|
||||
unsigned int PLLD_DIVM : 8;
|
||||
unsigned int reserved_1 : 3;
|
||||
unsigned int PLLD_DIVN : 8;
|
||||
unsigned int reserved_2 : 1;
|
||||
unsigned int PLLD_DIVP : 3;
|
||||
unsigned int CSI_CLK_SRC : 1;
|
||||
unsigned int reserved_3 : 1;
|
||||
unsigned int PLL_D : 1;
|
||||
unsigned int reserved_4 : 1;
|
||||
unsigned int PLLD_LOCK : 1;
|
||||
unsigned int reserved_5 : 1;
|
||||
unsigned int PLLD_REF_DIS : 1;
|
||||
unsigned int PLLD_ENABLE : 1;
|
||||
unsigned int PLLD_BYPASS : 1;
|
||||
} PLLD_BASE;
|
||||
|
||||
typedef struct {
|
||||
signed int PLLD_SDM_DIN: 16;
|
||||
unsigned int PLLD_EN_SDM: 1;
|
||||
unsigned int PLLD_LOCK_OVERRIDE: 1;
|
||||
unsigned int PLLD_EN_LCKDET: 1;
|
||||
unsigned int PLLD_FREQLOCK: 1;
|
||||
unsigned int PLLD_IDDQ: 1;
|
||||
unsigned int PLLD_ENABLE_CLK: 1;
|
||||
unsigned int PLLD_KVCO: 1;
|
||||
unsigned int PLLD_KCP: 2;
|
||||
unsigned int PLLD_PTS: 2;
|
||||
unsigned int PLLD_LDPULSE_ADJ: 3;
|
||||
unsigned int reserved: 2;
|
||||
signed int PLLD_SDM_DIN : 16;
|
||||
unsigned int PLLD_EN_SDM : 1;
|
||||
unsigned int PLLD_LOCK_OVERRIDE : 1;
|
||||
unsigned int PLLD_EN_LCKDET : 1;
|
||||
unsigned int PLLD_FREQLOCK : 1;
|
||||
unsigned int PLLD_IDDQ : 1;
|
||||
unsigned int PLLD_ENABLE_CLK : 1;
|
||||
unsigned int PLLD_KVCO : 1;
|
||||
unsigned int PLLD_KCP : 2;
|
||||
unsigned int PLLD_PTS : 2;
|
||||
unsigned int PLLD_LDPULSE_ADJ : 3;
|
||||
unsigned int reserved : 2;
|
||||
} PLLD_MISC;
|
||||
|
||||
typedef struct {
|
||||
@@ -116,12 +116,12 @@ namespace display {
|
||||
bool displaySyncDocked;
|
||||
bool displaySyncDockedOutOfFocus60;
|
||||
} DisplayRefreshConfig;
|
||||
bool Initialize(const DisplayRefreshConfig* config);
|
||||
bool Initialize(const DisplayRefreshConfig *config);
|
||||
void SetDockedState(bool isDocked);
|
||||
bool SetRate(uint32_t new_refreshRate);
|
||||
bool GetRate(uint32_t* out_refreshRate, bool internal);
|
||||
bool GetRate(uint32_t *out_refreshRate, bool internal);
|
||||
uint8_t GetDockedHighestAllowed(void);
|
||||
void CorrectOledGamma(uint32_t refresh_rate);
|
||||
void SetAllowedDockedRatesIPC(uint32_t refreshRates, bool is720p);
|
||||
void Shutdown(void);
|
||||
}
|
||||
} // namespace display
|
||||
@@ -24,29 +24,30 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "config.hpp"
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include <sstream>
|
||||
#include <algorithm>
|
||||
#include <atomic>
|
||||
#include <cstring>
|
||||
#include <ctime>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <atomic>
|
||||
#include <initializer_list>
|
||||
#include <minIni.h>
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <map>
|
||||
#include <max17050.h>
|
||||
#include <minIni.h>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "../board/board.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "config.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "file_utils.hpp"
|
||||
#include <initializer_list>
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
namespace config {
|
||||
|
||||
@@ -57,7 +58,7 @@ namespace config {
|
||||
bool gLoaded = false;
|
||||
std::string gPath;
|
||||
time_t gMtime = 0;
|
||||
std::atomic_bool gEnabled{false};
|
||||
std::atomic_bool gEnabled{ false };
|
||||
std::uint32_t gOverrideFreqs[HocClkModule_EnumMax];
|
||||
std::map<std::tuple<std::uint64_t, HocClkProfile, HocClkModule>, std::uint32_t> gProfileMHzMap;
|
||||
std::map<std::uint64_t, std::uint8_t> gProfileCountMap;
|
||||
@@ -83,11 +84,12 @@ namespace config {
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list<HocClkProfile> profiles, u32 mhzMultiplier = 1000000) {
|
||||
std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, HocClkModule module, std::initializer_list<HocClkProfile> profiles,
|
||||
u32 mhzMultiplier = 1000000) {
|
||||
std::uint32_t mhz = 0;
|
||||
|
||||
if (gLoaded) {
|
||||
for (auto profile: profiles) {
|
||||
for (auto profile : profiles) {
|
||||
mhz = FindClockMHz(tid, module, profile);
|
||||
if (mhz) {
|
||||
break;
|
||||
@@ -98,7 +100,7 @@ namespace config {
|
||||
return std::max((std::uint32_t)0, mhz * mhzMultiplier);
|
||||
}
|
||||
|
||||
int BrowseIniFunc(const char* section, const char* key, const char* value, void* userdata) {
|
||||
int BrowseIniFunc(const char *section, const char *key, const char *value, void *userdata) {
|
||||
(void)userdata;
|
||||
std::uint64_t input;
|
||||
if (!strcmp(section, CONFIG_VAL_SECTION)) {
|
||||
@@ -129,14 +131,14 @@ namespace config {
|
||||
HocClkModule parsedModule = HocClkModule_EnumMax;
|
||||
|
||||
for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) {
|
||||
const char* profileCode = board::GetProfileName((HocClkProfile)profile, false);
|
||||
const char *profileCode = board::GetProfileName((HocClkProfile)profile, false);
|
||||
size_t profileCodeLen = strlen(profileCode);
|
||||
|
||||
if (!strncmp(key, profileCode, profileCodeLen) && key[profileCodeLen] == '_') {
|
||||
const char* subkey = key + profileCodeLen + 1;
|
||||
const char *subkey = key + profileCodeLen + 1;
|
||||
|
||||
for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) {
|
||||
const char* moduleCode = board::GetModuleName((HocClkModule)module, false);
|
||||
const char *moduleCode = board::GetModuleName((HocClkModule)module, false);
|
||||
size_t moduleCodeLen = strlen(moduleCode);
|
||||
if (!strncmp(subkey, moduleCode, moduleCodeLen) && subkey[moduleCodeLen] == '\0') {
|
||||
parsedProfile = (HocClkProfile)profile;
|
||||
@@ -191,7 +193,7 @@ namespace config {
|
||||
gLoaded = true;
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void Initialize() {
|
||||
gPath = FILE_CONFIG_DIR "/config.ini";
|
||||
@@ -209,12 +211,12 @@ namespace config {
|
||||
}
|
||||
|
||||
void Exit() {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
Close();
|
||||
}
|
||||
|
||||
bool Refresh() {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
if (!gLoaded || gMtime != CheckModificationTime()) {
|
||||
Load();
|
||||
return true;
|
||||
@@ -223,30 +225,34 @@ namespace config {
|
||||
}
|
||||
|
||||
bool HasProfilesLoaded() {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
return gLoaded;
|
||||
}
|
||||
|
||||
std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw) {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
switch (profile) {
|
||||
case HocClkProfile_Handheld:
|
||||
return FindClockHzFromProfiles(tid, module, {HocClkProfile_Handheld}, returnRaw ? 1 : 1000000);
|
||||
return FindClockHzFromProfiles(tid, module, { HocClkProfile_Handheld }, returnRaw ? 1 : 1000000);
|
||||
case HocClkProfile_HandheldCharging:
|
||||
case HocClkProfile_HandheldChargingUSB:
|
||||
return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000);
|
||||
return FindClockHzFromProfiles(tid, module,
|
||||
{ HocClkProfile_HandheldChargingUSB, HocClkProfile_HandheldCharging, HocClkProfile_Handheld },
|
||||
returnRaw ? 1 : 1000000);
|
||||
case HocClkProfile_HandheldChargingOfficial:
|
||||
return FindClockHzFromProfiles(tid, module, {HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld}, returnRaw ? 1 : 1000000);
|
||||
return FindClockHzFromProfiles(tid, module,
|
||||
{ HocClkProfile_HandheldChargingOfficial, HocClkProfile_HandheldCharging, HocClkProfile_Handheld },
|
||||
returnRaw ? 1 : 1000000);
|
||||
case HocClkProfile_Docked:
|
||||
return FindClockHzFromProfiles(tid, module, {HocClkProfile_Docked}, returnRaw ? 1 : 1000000);
|
||||
return FindClockHzFromProfiles(tid, module, { HocClkProfile_Docked }, returnRaw ? 1 : 1000000);
|
||||
default:
|
||||
ERROR_THROW("Unhandled HocClkProfile: %u", profile);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles) {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles) {
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) {
|
||||
for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) {
|
||||
out_profiles->mhzMap[profile][module] = FindClockMHz(tid, (HocClkModule)module, (HocClkProfile)profile);
|
||||
@@ -254,11 +260,11 @@ namespace config {
|
||||
}
|
||||
}
|
||||
|
||||
bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate) {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate) {
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
uint8_t numProfiles = 0;
|
||||
|
||||
char section[17] = {0};
|
||||
char section[17] = { 0 };
|
||||
snprintf(section, sizeof(section), "%016lX", tid);
|
||||
|
||||
std::vector<std::string> keys;
|
||||
@@ -266,16 +272,15 @@ namespace config {
|
||||
keys.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax);
|
||||
values.reserve(+HocClkProfile_EnumMax * +HocClkModule_EnumMax);
|
||||
|
||||
std::uint32_t* mhz = &profiles->mhz[0];
|
||||
std::uint32_t *mhz = &profiles->mhz[0];
|
||||
|
||||
for (unsigned int profile = 0; profile < HocClkProfile_EnumMax; profile++) {
|
||||
for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) {
|
||||
if (*mhz) {
|
||||
numProfiles++;
|
||||
|
||||
std::string key = std::string(board::GetProfileName((HocClkProfile)profile, false)) +
|
||||
"_" +
|
||||
board::GetModuleName((HocClkModule)module, false);
|
||||
std::string key =
|
||||
std::string(board::GetProfileName((HocClkProfile)profile, false)) + "_" + board::GetModuleName((HocClkModule)module, false);
|
||||
std::string value = std::to_string(*mhz);
|
||||
|
||||
keys.push_back(key);
|
||||
@@ -285,8 +290,8 @@ namespace config {
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<const char*> keyPointers;
|
||||
std::vector<const char*> valuePointers;
|
||||
std::vector<const char *> keyPointers;
|
||||
std::vector<const char *> valuePointers;
|
||||
keyPointers.reserve(keys.size() + 1);
|
||||
valuePointers.reserve(values.size() + 1);
|
||||
|
||||
@@ -337,45 +342,45 @@ namespace config {
|
||||
|
||||
void SetOverrideHz(HocClkModule module, std::uint32_t hz) {
|
||||
ASSERT_ENUM_VALID(HocClkModule, module);
|
||||
std::scoped_lock lock{gOverrideMutex};
|
||||
std::scoped_lock lock{ gOverrideMutex };
|
||||
gOverrideFreqs[module] = hz;
|
||||
}
|
||||
|
||||
std::uint32_t GetOverrideHz(HocClkModule module) {
|
||||
ASSERT_ENUM_VALID(HocClkModule, module);
|
||||
std::scoped_lock lock{gOverrideMutex};
|
||||
std::scoped_lock lock{ gOverrideMutex };
|
||||
return gOverrideFreqs[module];
|
||||
}
|
||||
|
||||
std::uint64_t GetConfigValue(HocClkConfigValue kval) {
|
||||
ASSERT_ENUM_VALID(HocClkConfigValue, kval);
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
return configValues[kval];
|
||||
}
|
||||
|
||||
const char* GetConfigValueName(HocClkConfigValue kval, bool pretty) {
|
||||
const char *GetConfigValueName(HocClkConfigValue kval, bool pretty) {
|
||||
ASSERT_ENUM_VALID(HocClkConfigValue, kval);
|
||||
return hocclkFormatConfigValue(kval, pretty);
|
||||
}
|
||||
|
||||
void GetConfigValues(HocClkConfigValueList* out_configValues) {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
void GetConfigValues(HocClkConfigValueList *out_configValues) {
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) {
|
||||
out_configValues->values[kval] = configValues[kval];
|
||||
}
|
||||
}
|
||||
|
||||
bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate) {
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate) {
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
|
||||
std::vector<const char*> iniKeys;
|
||||
std::vector<const char *> iniKeys;
|
||||
std::vector<std::string> iniValues;
|
||||
iniKeys.reserve(HocClkConfigValue_EnumMax + 1);
|
||||
iniValues.reserve(HocClkConfigValue_EnumMax);
|
||||
|
||||
for (unsigned int kval = 0; kval < HocClkConfigValue_EnumMax; kval++) {
|
||||
if (!hocclkValidConfigValue((HocClkConfigValue)kval, configValues->values[kval]) ||
|
||||
configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) {
|
||||
configValues->values[kval] == hocclkDefaultConfigValue((HocClkConfigValue)kval)) {
|
||||
continue;
|
||||
}
|
||||
iniValues.push_back(std::to_string(configValues->values[kval]));
|
||||
@@ -384,9 +389,9 @@ namespace config {
|
||||
|
||||
iniKeys.push_back(NULL);
|
||||
|
||||
std::vector<const char*> valuePointers;
|
||||
std::vector<const char *> valuePointers;
|
||||
valuePointers.reserve(iniValues.size() + 1);
|
||||
for (const auto& val : iniValues) {
|
||||
for (const auto &val : iniValues) {
|
||||
valuePointers.push_back(val.c_str());
|
||||
}
|
||||
valuePointers.push_back(NULL);
|
||||
@@ -414,11 +419,11 @@ namespace config {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
|
||||
std::uint64_t defaultValue = hocclkDefaultConfigValue(kval);
|
||||
|
||||
std::vector<const char*> iniKeys;
|
||||
std::vector<const char *> iniKeys;
|
||||
std::vector<std::string> iniValues;
|
||||
iniKeys.reserve(2);
|
||||
iniValues.reserve(1);
|
||||
@@ -427,9 +432,9 @@ namespace config {
|
||||
iniValues.push_back("");
|
||||
iniKeys.push_back(NULL);
|
||||
|
||||
std::vector<const char*> valuePointers;
|
||||
std::vector<const char *> valuePointers;
|
||||
valuePointers.reserve(iniValues.size() + 1);
|
||||
for (const auto& val : iniValues) {
|
||||
for (const auto &val : iniValues) {
|
||||
valuePointers.push_back(val.c_str());
|
||||
}
|
||||
valuePointers.push_back(NULL);
|
||||
@@ -453,9 +458,9 @@ namespace config {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::scoped_lock lock{gConfigMutex};
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
|
||||
std::vector<const char*> iniKeys;
|
||||
std::vector<const char *> iniKeys;
|
||||
std::vector<std::string> iniValues;
|
||||
iniKeys.reserve(2);
|
||||
iniValues.reserve(1);
|
||||
@@ -464,7 +469,7 @@ namespace config {
|
||||
iniValues.push_back(std::to_string(value));
|
||||
iniKeys.push_back(NULL);
|
||||
|
||||
std::vector<const char*> valuePointers;
|
||||
std::vector<const char *> valuePointers;
|
||||
valuePointers.reserve(2);
|
||||
valuePointers.push_back(iniValues[0].c_str());
|
||||
valuePointers.push_back(NULL);
|
||||
@@ -480,4 +485,8 @@ namespace config {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
void DeleteKey(const char *section, const char *key) {
|
||||
std::scoped_lock lock{ gConfigMutex };
|
||||
ini_puts(section, key, NULL, gPath.c_str());
|
||||
}
|
||||
} // namespace config
|
||||
|
||||
@@ -40,8 +40,8 @@ namespace config {
|
||||
bool HasProfilesLoaded();
|
||||
|
||||
std::uint8_t GetProfileCount(std::uint64_t tid);
|
||||
void GetProfiles(std::uint64_t tid, HocClkTitleProfileList* out_profiles);
|
||||
bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList* profiles, bool immediate);
|
||||
void GetProfiles(std::uint64_t tid, HocClkTitleProfileList *out_profiles);
|
||||
bool SetProfiles(std::uint64_t tid, HocClkTitleProfileList *profiles, bool immediate);
|
||||
std::uint32_t GetAutoClockHz(std::uint64_t tid, HocClkModule module, HocClkProfile profile, bool returnRaw);
|
||||
|
||||
void SetEnabled(bool enabled);
|
||||
@@ -50,12 +50,13 @@ namespace config {
|
||||
std::uint32_t GetOverrideHz(HocClkModule module);
|
||||
|
||||
std::uint64_t GetConfigValue(HocClkConfigValue val);
|
||||
const char* GetConfigValueName(HocClkConfigValue val, bool pretty);
|
||||
void GetConfigValues(HocClkConfigValueList* out_configValues);
|
||||
bool SetConfigValues(HocClkConfigValueList* configValues, bool immediate);
|
||||
const char *GetConfigValueName(HocClkConfigValue val, bool pretty);
|
||||
void GetConfigValues(HocClkConfigValueList *out_configValues);
|
||||
bool SetConfigValues(HocClkConfigValueList *configValues, bool immediate);
|
||||
bool ResetConfigValue(HocClkConfigValue kval);
|
||||
bool SetConfigValue(HocClkConfigValue kval, std::uint64_t value, bool immediate = true);
|
||||
void DeleteKey(const char *section, const char *key);
|
||||
|
||||
extern uint64_t configValues[HocClkConfigValue_EnumMax];
|
||||
|
||||
}
|
||||
} // namespace config
|
||||
|
||||
@@ -24,13 +24,14 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "errors.hpp"
|
||||
#include "file_utils.hpp"
|
||||
#include <cstdarg>
|
||||
#include <cstring>
|
||||
|
||||
#include "errors.hpp"
|
||||
#include "file_utils.hpp"
|
||||
|
||||
namespace errors {
|
||||
void ThrowException(const char* format, ...) {
|
||||
void ThrowException(const char *format, ...) {
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
fileUtils::LogLine(format, args);
|
||||
@@ -38,4 +39,4 @@ namespace errors {
|
||||
diagAbortWithResult(MAKERESULT(Module_Libnx, LibnxError_ShouldNotHappen));
|
||||
// throw std::runtime_error(msg);
|
||||
}
|
||||
}
|
||||
} // namespace errors
|
||||
|
||||
@@ -26,14 +26,13 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <stdexcept>
|
||||
#include <switch.h>
|
||||
|
||||
#define ERROR_THROW(format, ...) errors::ThrowException(format "\n in %s:%u", ##__VA_ARGS__, __FILE__, __LINE__)
|
||||
#define ERROR_RESULT_THROW(rc, format, ...) ERROR_THROW(format "\n RC: [0x%x] %04d-%04d", ##__VA_ARGS__, rc, R_MODULE(rc), R_DESCRIPTION(rc))
|
||||
#define ASSERT_RESULT_OK(rc, format, ...) \
|
||||
if (R_FAILED(rc)) \
|
||||
{ \
|
||||
#define ASSERT_RESULT_OK(rc, format, ...) \
|
||||
if (R_FAILED(rc)) { \
|
||||
ERROR_RESULT_THROW(rc, "ASSERT_RESULT_OK: " format, ##__VA_ARGS__); \
|
||||
}
|
||||
#define ASSERT_ENUM_VALID(n, v) \
|
||||
@@ -43,6 +42,6 @@
|
||||
|
||||
namespace errors {
|
||||
|
||||
void ThrowException(const char* format, ...);
|
||||
void ThrowException(const char *format, ...);
|
||||
|
||||
}
|
||||
|
||||
@@ -24,12 +24,13 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include "file_utils.hpp"
|
||||
#include "../hos/apm_ext.h"
|
||||
#include <i2c.h>
|
||||
#include <t210.h>
|
||||
#include <max17050.h>
|
||||
#include <t210.h>
|
||||
#include <tmp451.h>
|
||||
|
||||
#include "../hos/apm_ext.h"
|
||||
#include "file_utils.hpp"
|
||||
#include <ipc_server.h>
|
||||
#include <lockable_mutex.h>
|
||||
|
||||
@@ -52,7 +53,7 @@ namespace fileUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
FILE* file = fopen(FILE_LOG_FLAG_PATH, "r");
|
||||
FILE *file = fopen(FILE_LOG_FLAG_PATH, "r");
|
||||
if (file) {
|
||||
g_log_enabled = true;
|
||||
fclose(file);
|
||||
@@ -63,11 +64,11 @@ namespace fileUtils {
|
||||
g_last_flag_check = now;
|
||||
}
|
||||
|
||||
void InitializeThreadFunc(void* args) {
|
||||
void InitializeThreadFunc(void *args) {
|
||||
Initialize();
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace
|
||||
|
||||
bool IsInitialized() {
|
||||
return g_has_initialized;
|
||||
@@ -77,8 +78,8 @@ namespace fileUtils {
|
||||
return g_log_enabled;
|
||||
}
|
||||
|
||||
void LogLine(const char* format, ...) {
|
||||
std::scoped_lock lock{g_log_mutex};
|
||||
void LogLine(const char *format, ...) {
|
||||
std::scoped_lock lock{ g_log_mutex };
|
||||
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
@@ -86,7 +87,7 @@ namespace fileUtils {
|
||||
RefreshFlags(false);
|
||||
|
||||
if (g_log_enabled) {
|
||||
FILE* file = fopen(FILE_LOG_FILE_PATH, "a");
|
||||
FILE *file = fopen(FILE_LOG_FILE_PATH, "a");
|
||||
|
||||
if (file) {
|
||||
timespec now = {};
|
||||
@@ -102,10 +103,10 @@ namespace fileUtils {
|
||||
va_end(args);
|
||||
}
|
||||
|
||||
void WriteContextToCsv(const HocClkContext* context) {
|
||||
std::scoped_lock lock{g_csv_mutex};
|
||||
void WriteContextToCsv(const HocClkContext *context) {
|
||||
std::scoped_lock lock{ g_csv_mutex };
|
||||
|
||||
FILE* file = fopen(FILE_CONTEXT_CSV_PATH, "a");
|
||||
FILE *file = fopen(FILE_CONTEXT_CSV_PATH, "a");
|
||||
|
||||
if (file) {
|
||||
// Print header
|
||||
@@ -134,7 +135,8 @@ namespace fileUtils {
|
||||
struct timespec now;
|
||||
clock_gettime(CLOCK_REALTIME, &now);
|
||||
|
||||
fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false), context->applicationId);
|
||||
fprintf(file, "%ld%03ld,%s,%016lx", now.tv_sec, now.tv_nsec / 1000000UL, hocclkFormatProfile(context->profile, false),
|
||||
context->applicationId);
|
||||
|
||||
for (unsigned int module = 0; module < HocClkModule_EnumMax; module++) {
|
||||
fprintf(file, ",%d", context->freqs[module]);
|
||||
@@ -164,7 +166,7 @@ namespace fileUtils {
|
||||
}
|
||||
|
||||
void InitializeAsync() {
|
||||
Thread initThread = {0};
|
||||
Thread initThread = { 0 };
|
||||
threadCreate(&initThread, InitializeThreadFunc, NULL, NULL, 0x4000, 0x15, 0);
|
||||
threadStart(&initThread);
|
||||
}
|
||||
@@ -210,4 +212,4 @@ namespace fileUtils {
|
||||
fsExit();
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace fileUtils
|
||||
|
||||
@@ -26,13 +26,13 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <switch.h>
|
||||
#include <time.h>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <atomic>
|
||||
#include <cstdarg>
|
||||
#include <hocclk.h>
|
||||
#include <string>
|
||||
#include <switch.h>
|
||||
#include <time.h>
|
||||
#include <vector>
|
||||
|
||||
#define FILE_CONFIG_DIR "/config/" CONFIG_DIR
|
||||
#define FILE_FLAG_CHECK_INTERVAL_NS (10000ULL * 1000000000ULL)
|
||||
@@ -47,7 +47,7 @@ namespace fileUtils {
|
||||
bool IsInitialized();
|
||||
bool IsLogEnabled();
|
||||
void InitializeAsync();
|
||||
void LogLine(const char* format, ...);
|
||||
void WriteContextToCsv(const HocClkContext* context);
|
||||
void LogLine(const char *format, ...);
|
||||
void WriteContextToCsv(const HocClkContext *context);
|
||||
|
||||
}
|
||||
} // namespace fileUtils
|
||||
|
||||
@@ -15,17 +15,17 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "kip.hpp"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../board/board.hpp"
|
||||
#include "file_utils.hpp"
|
||||
#include "../i2c/i2cDrv.h"
|
||||
#include "../mgr/clock_manager.hpp"
|
||||
#include "file_utils.hpp"
|
||||
#include "kip.hpp"
|
||||
|
||||
|
||||
namespace kip {
|
||||
|
||||
bool kipAvailable = false;
|
||||
void SetKipData()
|
||||
{
|
||||
void SetKipData() {
|
||||
// TODO: figure out if this REALLY causes issues (i doubt it)
|
||||
// if(board::GetSocType() == HocClkSocType_Mariko) {
|
||||
// if(R_FAILED(I2c_BuckConverter_SetMvOut(&I2c_Mariko_DRAM_VDDQ, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt) / 1000))) {
|
||||
@@ -34,32 +34,32 @@ namespace kip {
|
||||
// }
|
||||
// }
|
||||
CustomizeTable table;
|
||||
FILE* fp;
|
||||
fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r");
|
||||
FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r+b");
|
||||
|
||||
if (fp == NULL) {
|
||||
notification::writeNotification("Horizon OC\nKIP konnte nicht geöffnet werden!");
|
||||
kipAvailable = false;
|
||||
return;
|
||||
} else {
|
||||
kipAvailable = true;
|
||||
fclose(fp);
|
||||
}
|
||||
kipAvailable = true;
|
||||
|
||||
if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) {
|
||||
if (!cust_read_table_f(fp, &table)) {
|
||||
fclose(fp);
|
||||
fileUtils::LogLine("[kip] Failed to read KIP file");
|
||||
notification::writeNotification("Horizon OC\nKIP konnte nicht gelesen werden!");
|
||||
return;
|
||||
}
|
||||
|
||||
u32 custRev = cust_get_cust_rev(&table);
|
||||
u32 custRev = cust_get_cust_rev(&table);
|
||||
u32 kipVersion = cust_get_kip_version(&table);
|
||||
if (custRev < CUST_REV || kipVersion < KIP_VERSION) {
|
||||
fclose(fp);
|
||||
notification::writeNotification("Horizon OC\nVeraltetes KIP erkannt!\nBitte Horizon OC aktualisieren");
|
||||
fileUtils::LogLine("Cust revision: %u", custRev);
|
||||
fileUtils::LogLine("Kip version: %u", kipVersion);
|
||||
return;
|
||||
} else if (custRev > CUST_REV || kipVersion > KIP_VERSION) {
|
||||
fclose(fp);
|
||||
notification::writeNotification("Horizon OC\nVeraltetes Sysmodule erkannt!\nBitte Horizon OC aktualisieren");
|
||||
fileUtils::LogLine("Cust revision: %u", custRev);
|
||||
fileUtils::LogLine("Kip version: %u", kipVersion);
|
||||
@@ -71,8 +71,6 @@ namespace kip {
|
||||
|
||||
CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, config::GetConfigValue(KipConfigValue_commonEmcMemVolt));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock1, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock1));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock2, config::GetConfigValue(KipConfigValue_eristaEmcMaxClock2));
|
||||
CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, config::GetConfigValue(KipConfigValue_marikoEmcMaxClock));
|
||||
CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, config::GetConfigValue(KipConfigValue_marikoEmcVddqVolt));
|
||||
CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, config::GetConfigValue(KipConfigValue_emcDvbShift));
|
||||
@@ -103,8 +101,6 @@ namespace kip {
|
||||
CUST_WRITE_FIELD_BATCH(&table, writeLatency1866, config::GetConfigValue(KipConfigValue_write_latency_1866));
|
||||
CUST_WRITE_FIELD_BATCH(&table, writeLatency2133, config::GetConfigValue(KipConfigValue_write_latency_2133));
|
||||
|
||||
CUST_WRITE_FIELD_BATCH(&table, mem_burst_read_latency, config::GetConfigValue(KipConfigValue_mem_burst_read_latency));
|
||||
CUST_WRITE_FIELD_BATCH(&table, mem_burst_write_latency, config::GetConfigValue(KipConfigValue_mem_burst_write_latency));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, config::GetConfigValue(KipConfigValue_eristaCpuUV));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaCpuVmin, config::GetConfigValue(KipConfigValue_eristaCpuVmin));
|
||||
CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, config::GetConfigValue(KipConfigValue_eristaCpuMaxVolt));
|
||||
@@ -130,7 +126,6 @@ namespace kip {
|
||||
CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, config::GetConfigValue(KipConfigValue_marikoGpuVmax));
|
||||
|
||||
CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, config::GetConfigValue(KipConfigValue_commonGpuVoltOffset));
|
||||
CUST_WRITE_FIELD_BATCH(&table, gpuSpeedo, config::GetConfigValue(KipConfigValue_gpuSpeedo));
|
||||
|
||||
for (int i = 0; i < 24; i++) {
|
||||
table.marikoGpuVoltArray[i] = config::GetConfigValue((HocClkConfigValue)(KipConfigValue_g_volt_76800 + i));
|
||||
@@ -143,18 +138,22 @@ namespace kip {
|
||||
CUST_WRITE_FIELD_BATCH(&table, t6_tRTW_fine_tune, config::GetConfigValue(KipConfigValue_t6_tRTW_fine_tune));
|
||||
CUST_WRITE_FIELD_BATCH(&table, t7_tWTR_fine_tune, config::GetConfigValue(KipConfigValue_t7_tWTR_fine_tune));
|
||||
|
||||
if (!cust_write_table("sdmc:/atmosphere/kips/hoc.kip", &table)) {
|
||||
if (!cust_write_table_f(fp, &table)) {
|
||||
fclose(fp);
|
||||
fileUtils::LogLine("[kip] Failed to write KIP file");
|
||||
notification::writeNotification("Horizon OC\nKIP konnte nicht geschrieben werden!");
|
||||
return;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
HocClkConfigValueList configValues;
|
||||
config::GetConfigValues(&configValues);
|
||||
|
||||
configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum
|
||||
configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum
|
||||
|
||||
if (config::SetConfigValues(&configValues, false)) {
|
||||
fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]);
|
||||
if (config::SetConfigValues(&configValues, true)) {
|
||||
fileUtils::LogLine("[kip] KIP data set. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32],
|
||||
configValues.values[KipConfigValue_custRev]);
|
||||
for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) {
|
||||
fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]);
|
||||
}
|
||||
@@ -166,51 +165,50 @@ namespace kip {
|
||||
|
||||
// I know this is very hacky, but the config system in the sysmodule doesn't really support writing
|
||||
|
||||
void GetKipData()
|
||||
{
|
||||
FILE* fp;
|
||||
fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r");
|
||||
void GetKipData() {
|
||||
FILE *fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "rb");
|
||||
|
||||
if (fp == NULL) {
|
||||
notification::writeNotification("Horizon OC\nKIP konnte nicht geöffnet werden!");
|
||||
kipAvailable = false;
|
||||
return;
|
||||
} else {
|
||||
kipAvailable = true;
|
||||
fclose(fp);
|
||||
}
|
||||
kipAvailable = true;
|
||||
|
||||
HocClkConfigValueList configValues;
|
||||
config::GetConfigValues(&configValues);
|
||||
|
||||
CustomizeTable table;
|
||||
if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) {
|
||||
if (!cust_read_table_f(fp, &table)) {
|
||||
fclose(fp);
|
||||
fileUtils::LogLine("[kip] Failed to read KIP file for GetKipData");
|
||||
notification::writeNotification("Horizon OC\nKIP konnte nicht gelesen werden!");
|
||||
return;
|
||||
}
|
||||
fclose(fp);
|
||||
|
||||
// if(cust_get_cust_rev(&table) != CUST_REV) {
|
||||
// notification::writeNotification("Horizon OC\nKIP-Versionskonflikt!\nBitte Horizon OC neu installieren");
|
||||
// return;
|
||||
// }
|
||||
|
||||
if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) {
|
||||
if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) &&
|
||||
!config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) {
|
||||
MigrateKipData(cust_get_cust_rev(&table), cust_get_kip_version(&table));
|
||||
SetKipData();
|
||||
notification::writeNotification("Horizon OC\nKIP wurde aktualisiert\nBitte Konsole neu starten");
|
||||
return;
|
||||
}
|
||||
if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) {
|
||||
configValues.values[HocClkConfigValue_IsFirstLoad] = (u64)false;
|
||||
configValues.values[HocClkConfigValue_IsFirstLoad] = (u64) false;
|
||||
notification::writeNotification("Horizon OC wurde installiert");
|
||||
}
|
||||
|
||||
configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum
|
||||
configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum
|
||||
// configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table);
|
||||
clockManager::gContext.custRev = cust_get_cust_rev(&table);
|
||||
clockManager::gContext.custRev = cust_get_cust_rev(&table);
|
||||
|
||||
u32 custRev = cust_get_cust_rev(&table);
|
||||
u32 custRev = cust_get_cust_rev(&table);
|
||||
u32 kipVersion = cust_get_kip_version(&table);
|
||||
if (custRev < CUST_REV || kipVersion < KIP_VERSION) {
|
||||
notification::writeNotification("Horizon OC\nVeraltetes KIP erkannt!\nBitte Horizon OC aktualisieren");
|
||||
@@ -226,13 +224,11 @@ namespace kip {
|
||||
|
||||
clockManager::gContext.kipVersion = kipVersion;
|
||||
configValues.values[KipConfigValue_custRev] = cust_get_cust_rev(&table);
|
||||
configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process
|
||||
configValues.values[KipConfigValue_KipVersion] = cust_get_kip_version(&table); // Run this after the check so we can do migration process
|
||||
configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table);
|
||||
|
||||
configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table);
|
||||
configValues.values[KipConfigValue_eristaEmcMaxClock] = cust_get_erista_emc_max(&table);
|
||||
configValues.values[KipConfigValue_eristaEmcMaxClock1] = cust_get_erista_emc_max1(&table);
|
||||
configValues.values[KipConfigValue_eristaEmcMaxClock2] = cust_get_erista_emc_max2(&table);
|
||||
configValues.values[KipConfigValue_marikoEmcMaxClock] = cust_get_mariko_emc_max(&table);
|
||||
configValues.values[KipConfigValue_marikoEmcVddqVolt] = cust_get_mariko_emc_vddq(&table);
|
||||
configValues.values[KipConfigValue_emcDvbShift] = cust_get_emc_dvb_shift(&table);
|
||||
@@ -263,9 +259,6 @@ namespace kip {
|
||||
configValues.values[KipConfigValue_write_latency_1866] = cust_get_write_latency_1866(&table);
|
||||
configValues.values[KipConfigValue_write_latency_2133] = cust_get_write_latency_2133(&table);
|
||||
|
||||
configValues.values[KipConfigValue_mem_burst_read_latency] = cust_get_burst_read_lat(&table);
|
||||
configValues.values[KipConfigValue_mem_burst_write_latency] = cust_get_burst_write_lat(&table);
|
||||
|
||||
configValues.values[KipConfigValue_eristaCpuUV] = cust_get_erista_cpu_uv(&table);
|
||||
configValues.values[KipConfigValue_eristaCpuVmin] = cust_get_eristaCpuVmin(&table);
|
||||
configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table);
|
||||
@@ -288,7 +281,6 @@ namespace kip {
|
||||
configValues.values[KipConfigValue_marikoGpuBootVolt] = cust_get_mariko_gpu_boot_volt(&table);
|
||||
configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table);
|
||||
configValues.values[KipConfigValue_commonGpuVoltOffset] = cust_get_common_gpu_offset(&table);
|
||||
configValues.values[KipConfigValue_gpuSpeedo] = board::GetFuseData()->gpuSpeedo; // cust_get_gpu_speedo(&table);
|
||||
|
||||
for (int i = 0; i < 24; i++) {
|
||||
configValues.values[KipConfigValue_g_volt_76800 + i] = cust_get_mariko_gpu_volt(&table, i);
|
||||
@@ -302,8 +294,9 @@ namespace kip {
|
||||
configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table);
|
||||
|
||||
if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) {
|
||||
if (config::SetConfigValues(&configValues, false)) {
|
||||
fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]);
|
||||
if (config::SetConfigValues(&configValues, true)) {
|
||||
fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32],
|
||||
configValues.values[KipConfigValue_custRev]);
|
||||
for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) {
|
||||
fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]);
|
||||
}
|
||||
@@ -321,12 +314,25 @@ namespace kip {
|
||||
HocClkConfigValueList configValues;
|
||||
config::GetConfigValues(&configValues);
|
||||
u32 previousVersion = configValues.values[KipConfigValue_KipVersion];
|
||||
if(previousVersion < 240 && version >= 240) {
|
||||
// <2.4.0 -> 2.4.0 migration: add marikoGpuBootVolt with default value of 800mV
|
||||
if (previousVersion < 240 && version >= 240) {
|
||||
// <2.4.0 -> 2.4.0 migration
|
||||
|
||||
// add marikoGpuBootVolt with default value of 800mV
|
||||
configValues.values[KipConfigValue_marikoGpuBootVolt] = 800;
|
||||
|
||||
configValues.values[KipConfigValue_marikoGpuUV] += 2; // Raise UV levels
|
||||
configValues.values[KipConfigValue_commonGpuVoltOffset] =
|
||||
(u32)(-(s64)(configValues.values[KipConfigValue_commonGpuVoltOffset])); // Migrate GPU Volt Offset
|
||||
// Raise min cpu vmin
|
||||
if (configValues.values[KipConfigValue_eristaCpuVmin] < 750) {
|
||||
configValues.values[KipConfigValue_eristaCpuVmin] = 750;
|
||||
}
|
||||
|
||||
// delete handheld TDP config entries
|
||||
config::DeleteKey(CONFIG_VAL_SECTION, "handheld_tdp");
|
||||
config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit");
|
||||
config::DeleteKey(CONFIG_VAL_SECTION, "tdp_limit_l");
|
||||
}
|
||||
config::SetConfigValues(&configValues, true);
|
||||
// This function cannot do anything at the moment. The capabilities will be expanded in the next release
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace kip
|
||||
|
||||
@@ -16,28 +16,28 @@
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <switch.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <crc32.h>
|
||||
#include <notification.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <switch.h>
|
||||
|
||||
#include "config.hpp"
|
||||
#include "file_utils.hpp"
|
||||
#include <notification.h>
|
||||
#include <crc32.h>
|
||||
|
||||
|
||||
namespace kip {
|
||||
extern bool kipAvailable;
|
||||
|
||||
typedef struct {
|
||||
u8 cust[4];
|
||||
u8 cust[4];
|
||||
u32 custRev;
|
||||
u32 kipVersion;
|
||||
u32 hpMode;
|
||||
u32 commonEmcMemVolt;
|
||||
u32 eristaEmcMaxClock;
|
||||
u32 eristaEmcMaxClock1;
|
||||
u32 eristaEmcMaxClock2;
|
||||
u32 stepMode;
|
||||
u32 marikoEmcMaxClock;
|
||||
u32 marikoEmcVddqVolt;
|
||||
@@ -64,9 +64,6 @@ namespace kip {
|
||||
u32 readLatency1333, readLatency1600, readLatency1866, readLatency2133;
|
||||
u32 writeLatency1333, writeLatency1600, writeLatency1866, writeLatency2133;
|
||||
|
||||
u32 mem_burst_read_latency;
|
||||
u32 mem_burst_write_latency;
|
||||
|
||||
u32 eristaCpuUV;
|
||||
u32 eristaCpuVmin;
|
||||
u32 eristaCpuMaxVolt;
|
||||
@@ -93,8 +90,6 @@ namespace kip {
|
||||
|
||||
u32 commonGpuVoltOffset;
|
||||
|
||||
u32 gpuSpeedo;
|
||||
|
||||
u32 eristaGpuVoltArray[27];
|
||||
u32 marikoGpuVoltArray[24];
|
||||
|
||||
@@ -104,24 +99,25 @@ namespace kip {
|
||||
u32 reserved[60];
|
||||
} CustomizeTable;
|
||||
|
||||
#define CUST_MAGIC "CUST"
|
||||
#define CUST_MAGIC_LEN 4
|
||||
#define CUST_MAGIC "CUST"
|
||||
#define CUST_MAGIC_LEN 4
|
||||
|
||||
typedef struct {
|
||||
FILE* file;
|
||||
FILE *file;
|
||||
long offset;
|
||||
CustomizeTable cached_table;
|
||||
bool has_cache;
|
||||
} CustHandle;
|
||||
|
||||
static inline bool cust_find_offset(FILE* f, long* out_offset) {
|
||||
static inline bool cust_find_offset(FILE *f, long *out_offset) {
|
||||
u8 buf[512];
|
||||
long pos = 0;
|
||||
fseek(f, 0, SEEK_SET);
|
||||
|
||||
while (1) {
|
||||
size_t r = fread(buf, 1, sizeof(buf), f);
|
||||
if (r < CUST_MAGIC_LEN) break;
|
||||
if (r < CUST_MAGIC_LEN)
|
||||
break;
|
||||
|
||||
for (size_t i = 0; i <= r - CUST_MAGIC_LEN; i++) {
|
||||
if (memcmp(&buf[i], CUST_MAGIC, CUST_MAGIC_LEN) == 0) {
|
||||
@@ -135,293 +131,503 @@ namespace kip {
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool cust_read_table(const char* path, CustomizeTable* out) {
|
||||
FILE* f = fopen(path, "rb");
|
||||
if (!f) return false;
|
||||
static long cachedCustOffset = -1;
|
||||
|
||||
static inline long cust_get_offset(FILE *f) {
|
||||
if (cachedCustOffset >= 0)
|
||||
return cachedCustOffset;
|
||||
long off;
|
||||
if (!cust_find_offset(f, &off)) {
|
||||
fclose(f);
|
||||
return false;
|
||||
}
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
long size = ftell(f);
|
||||
|
||||
if (off + (long)sizeof(CustomizeTable) > size) {
|
||||
fclose(f);
|
||||
return false;
|
||||
}
|
||||
|
||||
fseek(f, off, SEEK_SET);
|
||||
bool ok = fread(out, 1, sizeof(CustomizeTable), f) == sizeof(CustomizeTable);
|
||||
fclose(f);
|
||||
|
||||
return ok && memcmp(out->cust, CUST_MAGIC, CUST_MAGIC_LEN) == 0;
|
||||
if (!cust_find_offset(f, &off))
|
||||
return -1;
|
||||
cachedCustOffset = off;
|
||||
return off;
|
||||
}
|
||||
|
||||
static inline bool cust_write_table(const char* path, const CustomizeTable* in) {
|
||||
FILE* f = fopen(path, "r+b");
|
||||
if (!f) return false;
|
||||
|
||||
long off;
|
||||
if (!cust_find_offset(f, &off)) {
|
||||
fclose(f);
|
||||
static inline bool cust_read_table_f(FILE *f, CustomizeTable *out) {
|
||||
long off = cust_get_offset(f);
|
||||
if (off < 0)
|
||||
return false;
|
||||
}
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
long size = ftell(f);
|
||||
if (off + (long)sizeof(CustomizeTable) > ftell(f))
|
||||
return false;
|
||||
|
||||
if (off + (long)sizeof(CustomizeTable) > size) {
|
||||
fclose(f);
|
||||
fseek(f, off, SEEK_SET);
|
||||
if (fread(out, 1, sizeof(CustomizeTable), f) != sizeof(CustomizeTable))
|
||||
return false;
|
||||
|
||||
if (memcmp(out->cust, CUST_MAGIC, CUST_MAGIC_LEN) != 0) {
|
||||
cachedCustOffset = -1;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool cust_write_table_f(FILE *f, const CustomizeTable *in) {
|
||||
long off = cust_get_offset(f);
|
||||
if (off < 0)
|
||||
return false;
|
||||
|
||||
fseek(f, 0, SEEK_END);
|
||||
if (off + (long)sizeof(CustomizeTable) > ftell(f))
|
||||
return false;
|
||||
|
||||
fseek(f, off, SEEK_SET);
|
||||
bool ok = fwrite(in, 1, sizeof(CustomizeTable), f) == sizeof(CustomizeTable);
|
||||
fflush(f);
|
||||
fclose(f);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
static inline bool cust_read_and_cache(const char* path, CustomizeTable* out) {
|
||||
static inline bool cust_read_table(const char *path, CustomizeTable *out) {
|
||||
FILE *f = fopen(path, "rb");
|
||||
if (!f)
|
||||
return false;
|
||||
bool ok = cust_read_table_f(f, out);
|
||||
fclose(f);
|
||||
return ok;
|
||||
}
|
||||
|
||||
static inline bool cust_write_table(const char *path, const CustomizeTable *in) {
|
||||
FILE *f = fopen(path, "r+b");
|
||||
if (!f)
|
||||
return false;
|
||||
bool ok = cust_write_table_f(f, in);
|
||||
fclose(f);
|
||||
return ok;
|
||||
}
|
||||
|
||||
static inline bool cust_read_and_cache(const char *path, CustomizeTable *out) {
|
||||
return cust_read_table(path, out);
|
||||
}
|
||||
|
||||
#define CUST_WRITE_FIELD_BATCH(table, field, val) \
|
||||
do { \
|
||||
(table)->field = (val); \
|
||||
} while (0)
|
||||
#define CUST_WRITE_FIELD_BATCH(table, field, val) \
|
||||
do { \
|
||||
(table)->field = (val); \
|
||||
} while (0)
|
||||
|
||||
#define CUST_WRITE_FIELD(path, field, val) \
|
||||
do { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(path, &t)) return false; \
|
||||
t.field = (val); \
|
||||
return cust_write_table(path, &t); \
|
||||
} while (0)
|
||||
#define CUST_WRITE_FIELD(path, field, val) \
|
||||
do { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(path, &t)) \
|
||||
return false; \
|
||||
t.field = (val); \
|
||||
return cust_write_table(path, &t); \
|
||||
} while (0)
|
||||
|
||||
// static inline bool cust_set_cust_rev(const char* p, u32 v) { CUST_WRITE_FIELD(p, custRev, v); }
|
||||
// static inline bool cust_set_mtc_conf(const char* p, u32 v) { CUST_WRITE_FIELD(p, mtcConf, v); }
|
||||
static inline bool cust_set_hp_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, hpMode, v); }
|
||||
static inline bool cust_set_hp_mode(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, hpMode, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_common_emc_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonEmcMemVolt, v); }
|
||||
static inline bool cust_set_erista_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock, v); }
|
||||
static inline bool cust_set_erista_emc_max1(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock1, v); }
|
||||
static inline bool cust_set_erista_emc_max2(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaEmcMaxClock2, v); }
|
||||
static inline bool cust_set_step_mode(const char* p, u32 v) { CUST_WRITE_FIELD(p, stepMode, v); }
|
||||
static inline bool cust_set_mariko_emc_max(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcMaxClock, v); }
|
||||
static inline bool cust_set_mariko_emc_vddq(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v); }
|
||||
static inline bool cust_set_emc_dvb_shift(const char* p, u32 v) { CUST_WRITE_FIELD(p, emcDvbShift, v); }
|
||||
static inline bool cust_set_common_emc_volt(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, commonEmcMemVolt, v);
|
||||
}
|
||||
static inline bool cust_set_erista_emc_max(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaEmcMaxClock, v);
|
||||
}
|
||||
static inline bool cust_set_step_mode(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, stepMode, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_emc_max(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoEmcMaxClock, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_emc_vddq(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoEmcVddqVolt, v);
|
||||
}
|
||||
static inline bool cust_set_emc_dvb_shift(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, emcDvbShift, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_tRCD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t1_tRCD, v); }
|
||||
static inline bool cust_set_tRP(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP, v); }
|
||||
static inline bool cust_set_tRAS(const char* p, u32 v) { CUST_WRITE_FIELD(p, t3_tRAS, v); }
|
||||
static inline bool cust_set_tRRD(const char* p, u32 v) { CUST_WRITE_FIELD(p, t4_tRRD, v); }
|
||||
static inline bool cust_set_tRFC(const char* p, u32 v) { CUST_WRITE_FIELD(p, t5_tRFC, v); }
|
||||
static inline bool cust_set_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW, v); }
|
||||
static inline bool cust_set_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR, v); }
|
||||
static inline bool cust_set_tREFI(const char* p, u32 v) { CUST_WRITE_FIELD(p, t8_tREFI, v); }
|
||||
static inline bool cust_set_tRP_cap(const char* p, u32 v) { CUST_WRITE_FIELD(p, t2_tRP_cap, v); }
|
||||
static inline bool cust_set_timing_emc_tbreak(const char* p, u32 v) { CUST_WRITE_FIELD(p, timingEmcTbreak, v); }
|
||||
static inline bool cust_set_low_tRTW(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t6_tRTW, v); }
|
||||
static inline bool cust_set_low_tWTR(const char* p, u32 v) { CUST_WRITE_FIELD(p, low_t7_tWTR, v); }
|
||||
static inline bool cust_set_tRTW_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v); }
|
||||
static inline bool cust_set_tWTR_fine_tune(const char* p, u32 v) { CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v); }
|
||||
static inline bool cust_set_tRCD(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t1_tRCD, v);
|
||||
}
|
||||
static inline bool cust_set_tRP(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t2_tRP, v);
|
||||
}
|
||||
static inline bool cust_set_tRAS(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t3_tRAS, v);
|
||||
}
|
||||
static inline bool cust_set_tRRD(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t4_tRRD, v);
|
||||
}
|
||||
static inline bool cust_set_tRFC(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t5_tRFC, v);
|
||||
}
|
||||
static inline bool cust_set_tRTW(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t6_tRTW, v);
|
||||
}
|
||||
static inline bool cust_set_tWTR(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t7_tWTR, v);
|
||||
}
|
||||
static inline bool cust_set_tREFI(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t8_tREFI, v);
|
||||
}
|
||||
static inline bool cust_set_tRP_cap(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t2_tRP_cap, v);
|
||||
}
|
||||
static inline bool cust_set_timing_emc_tbreak(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, timingEmcTbreak, v);
|
||||
}
|
||||
static inline bool cust_set_low_tRTW(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, low_t6_tRTW, v);
|
||||
}
|
||||
static inline bool cust_set_low_tWTR(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, low_t7_tWTR, v);
|
||||
}
|
||||
static inline bool cust_set_tRTW_fine_tune(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t6_tRTW_fine_tune, v);
|
||||
}
|
||||
static inline bool cust_set_tWTR_fine_tune(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, t7_tWTR_fine_tune, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_read_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1333, v); }
|
||||
static inline bool cust_set_read_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1600, v); }
|
||||
static inline bool cust_set_read_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency1866, v); }
|
||||
static inline bool cust_set_read_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, readLatency2133, v); }
|
||||
static inline bool cust_set_read_latency_1333(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, readLatency1333, v);
|
||||
}
|
||||
static inline bool cust_set_read_latency_1600(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, readLatency1600, v);
|
||||
}
|
||||
static inline bool cust_set_read_latency_1866(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, readLatency1866, v);
|
||||
}
|
||||
static inline bool cust_set_read_latency_2133(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, readLatency2133, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_write_latency_1333(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1333, v); }
|
||||
static inline bool cust_set_write_latency_1600(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1600, v); }
|
||||
static inline bool cust_set_write_latency_1866(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency1866, v); }
|
||||
static inline bool cust_set_write_latency_2133(const char* p, u32 v) { CUST_WRITE_FIELD(p, writeLatency2133, v); }
|
||||
static inline bool cust_set_write_latency_1333(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, writeLatency1333, v);
|
||||
}
|
||||
static inline bool cust_set_write_latency_1600(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, writeLatency1600, v);
|
||||
}
|
||||
static inline bool cust_set_write_latency_1866(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, writeLatency1866, v);
|
||||
}
|
||||
static inline bool cust_set_write_latency_2133(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, writeLatency2133, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_burst_read_lat(const char* p, u32 v) { CUST_WRITE_FIELD(p, mem_burst_read_latency, v); }
|
||||
static inline bool cust_set_burst_write_lat(const char* p, u32 v) { CUST_WRITE_FIELD(p, mem_burst_write_latency, v); }
|
||||
static inline bool cust_set_erista_cpu_uv(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaCpuUV, v);
|
||||
}
|
||||
static inline bool cust_set_eristaCpuVmin(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaCpuVmin, v);
|
||||
}
|
||||
static inline bool cust_set_erista_cpu_max_volt(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v);
|
||||
}
|
||||
static inline bool cust_set_eristaCpuUnlock(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaCpuUnlock, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_erista_cpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUV, v); }
|
||||
static inline bool cust_set_eristaCpuVmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuVmin, v); }
|
||||
static inline bool cust_set_erista_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuMaxVolt, v); }
|
||||
static inline bool cust_set_eristaCpuUnlock(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuUnlock, v); }
|
||||
static inline bool cust_set_mariko_cpu_uv_low(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuUVLow, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_cpu_uv_high(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuUVHigh, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_cpu_low_vmin(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuLowVmin, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_cpu_high_vmin(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuHighVmin, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_cpu_max_volt(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v);
|
||||
}
|
||||
static inline bool cust_set_erista_cpu_boost(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaCpuBoostClock, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_cpu_boost(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuBoostClock, v);
|
||||
}
|
||||
|
||||
static inline bool cust_set_mariko_cpu_uv_low(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVLow, v); }
|
||||
static inline bool cust_set_mariko_cpu_uv_high(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuUVHigh, v); }
|
||||
static inline bool cust_set_mariko_cpu_low_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuLowVmin, v); }
|
||||
static inline bool cust_set_mariko_cpu_high_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuHighVmin, v); }
|
||||
static inline bool cust_set_mariko_cpu_max_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxVolt, v); }
|
||||
static inline bool cust_set_erista_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaCpuBoostClock, v); }
|
||||
static inline bool cust_set_mariko_cpu_boost(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuBoostClock, v); }
|
||||
|
||||
static inline bool cust_set_erista_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuUV, v); }
|
||||
static inline bool cust_set_erista_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, eristaGpuVmin, v); }
|
||||
static inline bool cust_set_mariko_gpu_uv(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuUV, v); }
|
||||
static inline bool cust_set_mariko_gpu_vmin(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmin, v); }
|
||||
static inline bool cust_set_mariko_gpu_boot_volt(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuBootVolt, v); }
|
||||
static inline bool cust_set_mariko_gpu_vmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoGpuVmax, v); }
|
||||
static inline bool cust_set_common_gpu_offset(const char* p, u32 v) { CUST_WRITE_FIELD(p, commonGpuVoltOffset, v); }
|
||||
static inline bool cust_set_gpu_speedo(const char* p, u32 v) { CUST_WRITE_FIELD(p, gpuSpeedo, v); }
|
||||
static inline bool cust_set_marikoCpuMaxClock(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoCpuMaxClock, v); }
|
||||
static inline bool cust_set_marikoSocVmax(const char* p, u32 v) { CUST_WRITE_FIELD(p, marikoSocVmax, v); }
|
||||
static inline bool cust_set_erista_gpu_uv(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaGpuUV, v);
|
||||
}
|
||||
static inline bool cust_set_erista_gpu_vmin(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, eristaGpuVmin, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_gpu_uv(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoGpuUV, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_gpu_vmin(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoGpuVmin, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_gpu_boot_volt(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoGpuBootVolt, v);
|
||||
}
|
||||
static inline bool cust_set_mariko_gpu_vmax(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoGpuVmax, v);
|
||||
}
|
||||
static inline bool cust_set_common_gpu_offset(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, commonGpuVoltOffset, v);
|
||||
}
|
||||
static inline bool cust_set_marikoCpuMaxClock(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoCpuMaxClock, v);
|
||||
}
|
||||
static inline bool cust_set_marikoSocVmax(const char *p, u32 v) {
|
||||
CUST_WRITE_FIELD(p, marikoSocVmax, v);
|
||||
}
|
||||
|
||||
/* GPU VOLT ARRAY HELPERS */
|
||||
static inline bool cust_set_erista_gpu_volt(const char* p, int idx, u32 v) {
|
||||
if (idx < 0 || idx >= 27) return false;
|
||||
static inline bool cust_set_erista_gpu_volt(const char *p, int idx, u32 v) {
|
||||
if (idx < 0 || idx >= 27)
|
||||
return false;
|
||||
CustomizeTable t;
|
||||
if (!cust_read_table(p, &t)) return false;
|
||||
if (!cust_read_table(p, &t))
|
||||
return false;
|
||||
t.eristaGpuVoltArray[idx] = v;
|
||||
return cust_write_table(p, &t);
|
||||
}
|
||||
|
||||
static inline bool cust_set_mariko_gpu_volt(const char* p, int idx, u32 v) {
|
||||
if (idx < 0 || idx >= 24) return false;
|
||||
static inline bool cust_set_mariko_gpu_volt(const char *p, int idx, u32 v) {
|
||||
if (idx < 0 || idx >= 24)
|
||||
return false;
|
||||
CustomizeTable t;
|
||||
if (!cust_read_table(p, &t)) return false;
|
||||
if (!cust_read_table(p, &t))
|
||||
return false;
|
||||
t.marikoGpuVoltArray[idx] = v;
|
||||
return cust_write_table(p, &t);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_field(const CustomizeTable* t, u32 offset) {
|
||||
if (!t) return 0;
|
||||
return *(u32*)((u8*)t + offset);
|
||||
static inline u32 cust_get_field(const CustomizeTable *t, u32 offset) {
|
||||
if (!t)
|
||||
return 0;
|
||||
return *(u32 *)((u8 *)t + offset);
|
||||
}
|
||||
|
||||
#define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0)
|
||||
#define CUST_GET_FIELD(table, field) ((table) ? (table)->field : 0)
|
||||
|
||||
static inline u32 cust_get_cust_rev(const CustomizeTable* t) { return CUST_GET_FIELD(t, custRev); }
|
||||
static inline u32 cust_get_kip_version(const CustomizeTable* t) { return CUST_GET_FIELD(t, kipVersion); }
|
||||
static inline u32 cust_get_cust_rev(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, custRev);
|
||||
}
|
||||
static inline u32 cust_get_kip_version(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, kipVersion);
|
||||
}
|
||||
// static inline u32 cust_get_mtc_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, mtcConf); }
|
||||
static inline u32 cust_get_hp_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, hpMode); }
|
||||
static inline u32 cust_get_hp_mode(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, hpMode);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_common_emc_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonEmcMemVolt); }
|
||||
static inline u32 cust_get_erista_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock); }
|
||||
static inline u32 cust_get_erista_emc_max1(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock1); }
|
||||
static inline u32 cust_get_erista_emc_max2(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaEmcMaxClock2); }
|
||||
static inline u32 cust_get_step_mode(const CustomizeTable* t) { return CUST_GET_FIELD(t, stepMode); }
|
||||
static inline u32 cust_get_mariko_emc_max(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcMaxClock); }
|
||||
static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoEmcVddqVolt); }
|
||||
static inline u32 cust_get_emc_dvb_shift(const CustomizeTable* t) { return CUST_GET_FIELD(t, emcDvbShift); }
|
||||
static inline u32 cust_get_common_emc_volt(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, commonEmcMemVolt);
|
||||
}
|
||||
static inline u32 cust_get_erista_emc_max(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaEmcMaxClock);
|
||||
}
|
||||
static inline u32 cust_get_step_mode(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, stepMode);
|
||||
}
|
||||
static inline u32 cust_get_mariko_emc_max(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoEmcMaxClock);
|
||||
}
|
||||
static inline u32 cust_get_mariko_emc_vddq(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoEmcVddqVolt);
|
||||
}
|
||||
static inline u32 cust_get_emc_dvb_shift(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, emcDvbShift);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_tRCD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t1_tRCD); }
|
||||
static inline u32 cust_get_tRP(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP); }
|
||||
static inline u32 cust_get_tRAS(const CustomizeTable* t) { return CUST_GET_FIELD(t, t3_tRAS); }
|
||||
static inline u32 cust_get_tRRD(const CustomizeTable* t) { return CUST_GET_FIELD(t, t4_tRRD); }
|
||||
static inline u32 cust_get_tRFC(const CustomizeTable* t) { return CUST_GET_FIELD(t, t5_tRFC); }
|
||||
static inline u32 cust_get_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW); }
|
||||
static inline u32 cust_get_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR); }
|
||||
static inline u32 cust_get_tREFI(const CustomizeTable* t) { return CUST_GET_FIELD(t, t8_tREFI); }
|
||||
static inline u32 cust_get_tRP_cap(const CustomizeTable* t) { return CUST_GET_FIELD(t, t2_tRP_cap); }
|
||||
static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable* t) { return CUST_GET_FIELD(t, timingEmcTbreak); }
|
||||
static inline u32 cust_get_low_t6_tRTW(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t6_tRTW); }
|
||||
static inline u32 cust_get_low_t7_tWTR(const CustomizeTable* t) { return CUST_GET_FIELD(t, low_t7_tWTR); }
|
||||
static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t6_tRTW_fine_tune); }
|
||||
static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable* t) { return CUST_GET_FIELD(t, t7_tWTR_fine_tune); }
|
||||
static inline u32 cust_get_tRCD(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t1_tRCD);
|
||||
}
|
||||
static inline u32 cust_get_tRP(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t2_tRP);
|
||||
}
|
||||
static inline u32 cust_get_tRAS(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t3_tRAS);
|
||||
}
|
||||
static inline u32 cust_get_tRRD(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t4_tRRD);
|
||||
}
|
||||
static inline u32 cust_get_tRFC(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t5_tRFC);
|
||||
}
|
||||
static inline u32 cust_get_tRTW(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t6_tRTW);
|
||||
}
|
||||
static inline u32 cust_get_tWTR(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t7_tWTR);
|
||||
}
|
||||
static inline u32 cust_get_tREFI(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t8_tREFI);
|
||||
}
|
||||
static inline u32 cust_get_tRP_cap(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t2_tRP_cap);
|
||||
}
|
||||
static inline u32 cust_get_timing_emc_tbreak(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, timingEmcTbreak);
|
||||
}
|
||||
static inline u32 cust_get_low_t6_tRTW(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, low_t6_tRTW);
|
||||
}
|
||||
static inline u32 cust_get_low_t7_tWTR(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, low_t7_tWTR);
|
||||
}
|
||||
static inline u32 cust_get_tRTW_fine_tune(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t6_tRTW_fine_tune);
|
||||
}
|
||||
static inline u32 cust_get_tWTR_fine_tune(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, t7_tWTR_fine_tune);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_read_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1333); }
|
||||
static inline u32 cust_get_read_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1600); }
|
||||
static inline u32 cust_get_read_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency1866); }
|
||||
static inline u32 cust_get_read_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, readLatency2133); }
|
||||
static inline u32 cust_get_read_latency_1333(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, readLatency1333);
|
||||
}
|
||||
static inline u32 cust_get_read_latency_1600(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, readLatency1600);
|
||||
}
|
||||
static inline u32 cust_get_read_latency_1866(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, readLatency1866);
|
||||
}
|
||||
static inline u32 cust_get_read_latency_2133(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, readLatency2133);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_write_latency_1333(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1333); }
|
||||
static inline u32 cust_get_write_latency_1600(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1600); }
|
||||
static inline u32 cust_get_write_latency_1866(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency1866); }
|
||||
static inline u32 cust_get_write_latency_2133(const CustomizeTable* t) { return CUST_GET_FIELD(t, writeLatency2133); }
|
||||
static inline u32 cust_get_write_latency_1333(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, writeLatency1333);
|
||||
}
|
||||
static inline u32 cust_get_write_latency_1600(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, writeLatency1600);
|
||||
}
|
||||
static inline u32 cust_get_write_latency_1866(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, writeLatency1866);
|
||||
}
|
||||
static inline u32 cust_get_write_latency_2133(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, writeLatency2133);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_burst_read_lat(const CustomizeTable* t) { return CUST_GET_FIELD(t, mem_burst_read_latency); }
|
||||
static inline u32 cust_get_burst_write_lat(const CustomizeTable* t) { return CUST_GET_FIELD(t, mem_burst_write_latency); }
|
||||
static inline u32 cust_get_erista_cpu_uv(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaCpuUV);
|
||||
}
|
||||
static inline u32 cust_get_eristaCpuVmin(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaCpuVmin);
|
||||
}
|
||||
static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaCpuMaxVolt);
|
||||
}
|
||||
static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaCpuUnlock);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_erista_cpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUV); }
|
||||
static inline u32 cust_get_eristaCpuVmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuVmin); }
|
||||
static inline u32 cust_get_erista_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuMaxVolt); }
|
||||
static inline u32 cust_get_eristaCpuUnlock(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuUnlock); }
|
||||
static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuUVLow);
|
||||
}
|
||||
static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuUVHigh);
|
||||
}
|
||||
static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuLowVmin);
|
||||
}
|
||||
static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuHighVmin);
|
||||
}
|
||||
static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuMaxVolt);
|
||||
}
|
||||
static inline u32 cust_get_erista_cpu_boost(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaCpuBoostClock);
|
||||
}
|
||||
static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuBoostClock);
|
||||
}
|
||||
static inline u32 cust_get_table_conf(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, tableConf);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_mariko_cpu_uv_low(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVLow); }
|
||||
static inline u32 cust_get_mariko_cpu_uv_high(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuUVHigh); }
|
||||
static inline u32 cust_get_mariko_cpu_low_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuLowVmin); }
|
||||
static inline u32 cust_get_mariko_cpu_high_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuHighVmin); }
|
||||
static inline u32 cust_get_mariko_cpu_max_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxVolt); }
|
||||
static inline u32 cust_get_erista_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaCpuBoostClock); }
|
||||
static inline u32 cust_get_mariko_cpu_boost(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuBoostClock); }
|
||||
static inline u32 cust_get_table_conf(const CustomizeTable* t) { return CUST_GET_FIELD(t, tableConf); }
|
||||
static inline u32 cust_get_erista_gpu_uv(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaGpuUV);
|
||||
}
|
||||
static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, eristaGpuVmin);
|
||||
}
|
||||
static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoGpuUV);
|
||||
}
|
||||
static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoGpuVmin);
|
||||
}
|
||||
static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoGpuBootVolt);
|
||||
}
|
||||
static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoGpuVmax);
|
||||
}
|
||||
static inline u32 cust_get_common_gpu_offset(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, commonGpuVoltOffset);
|
||||
}
|
||||
static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoCpuMaxClock);
|
||||
}
|
||||
static inline u32 cust_get_marikoSocVmax(const CustomizeTable *t) {
|
||||
return CUST_GET_FIELD(t, marikoSocVmax);
|
||||
}
|
||||
|
||||
static inline u32 cust_get_erista_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuUV); }
|
||||
static inline u32 cust_get_erista_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, eristaGpuVmin); }
|
||||
static inline u32 cust_get_mariko_gpu_uv(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuUV); }
|
||||
static inline u32 cust_get_mariko_gpu_vmin(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmin); }
|
||||
static inline u32 cust_get_mariko_gpu_boot_volt(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuBootVolt); }
|
||||
static inline u32 cust_get_mariko_gpu_vmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoGpuVmax); }
|
||||
static inline u32 cust_get_common_gpu_offset(const CustomizeTable* t) { return CUST_GET_FIELD(t, commonGpuVoltOffset); }
|
||||
static inline u32 cust_get_gpu_speedo(const CustomizeTable* t) { return CUST_GET_FIELD(t, gpuSpeedo); }
|
||||
static inline u32 cust_get_marikoCpuMaxClock(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoCpuMaxClock); }
|
||||
static inline u32 cust_get_marikoSocVmax(const CustomizeTable* t) { return CUST_GET_FIELD(t, marikoSocVmax); }
|
||||
|
||||
static inline u32 cust_get_erista_gpu_volt(const CustomizeTable* t, int idx) {
|
||||
if (!t || idx < 0 || idx >= 27) return 0;
|
||||
static inline u32 cust_get_erista_gpu_volt(const CustomizeTable *t, int idx) {
|
||||
if (!t || idx < 0 || idx >= 27)
|
||||
return 0;
|
||||
return t->eristaGpuVoltArray[idx];
|
||||
}
|
||||
|
||||
static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable* t, int idx) {
|
||||
if (!t || idx < 0 || idx >= 24) return 0;
|
||||
static inline u32 cust_get_mariko_gpu_volt(const CustomizeTable *t, int idx) {
|
||||
if (!t || idx < 0 || idx >= 24)
|
||||
return 0;
|
||||
return t->marikoGpuVoltArray[idx];
|
||||
}
|
||||
|
||||
#define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \
|
||||
static inline bool cust_set_erista_gpu_volt_##freq( \
|
||||
const char* p, u32 v) { \
|
||||
return cust_set_erista_gpu_volt(p, idx, v); \
|
||||
#define DECL_ERISTA_GPU_VOLT_HELPER(freq, idx) \
|
||||
static inline bool cust_set_erista_gpu_volt_##freq(const char *p, u32 v) { \
|
||||
return cust_set_erista_gpu_volt(p, idx, v); \
|
||||
}
|
||||
|
||||
#define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \
|
||||
static inline bool cust_set_mariko_gpu_volt_##freq( \
|
||||
const char* p, u32 v) { \
|
||||
return cust_set_mariko_gpu_volt(p, idx, v); \
|
||||
#define DECL_MARIKO_GPU_VOLT_HELPER(freq, idx) \
|
||||
static inline bool cust_set_mariko_gpu_volt_##freq(const char *p, u32 v) { \
|
||||
return cust_set_mariko_gpu_volt(p, idx, v); \
|
||||
}
|
||||
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(76800, 0)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(115200, 1)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(153600, 2)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(192000, 3)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(230400, 4)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(268800, 5)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(307200, 6)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(345600, 7)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(384000, 8)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(422400, 9)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(460800, 10)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(499200, 11)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(537600, 12)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(576000, 13)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(614400, 14)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(652800, 15)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(691200, 16)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(729600, 17)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(768000, 18)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(806400, 19)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(844800, 20)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(883200, 21)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(921600, 22)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(960000, 23)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(998400, 24)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(76800, 0)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(115200, 1)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(153600, 2)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(192000, 3)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(230400, 4)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(268800, 5)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(307200, 6)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(345600, 7)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(384000, 8)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(422400, 9)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(460800, 10)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(499200, 11)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(537600, 12)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(576000, 13)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(614400, 14)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(652800, 15)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(691200, 16)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(729600, 17)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(768000, 18)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(806400, 19)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(844800, 20)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(883200, 21)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(921600, 22)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(960000, 23)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(998400, 24)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(1036800, 25)
|
||||
DECL_ERISTA_GPU_VOLT_HELPER(1075200, 26)
|
||||
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(76800, 0)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(153600, 1)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(230400, 2)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(307200, 3)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(384000, 4)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(460800, 5)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(537600, 6)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(614400, 7)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(691200, 8)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(768000, 9)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(844800, 10)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(921600, 11)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(998400, 12)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(76800, 0)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(153600, 1)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(230400, 2)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(307200, 3)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(384000, 4)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(460800, 5)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(537600, 6)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(614400, 7)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(691200, 8)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(768000, 9)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(844800, 10)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(921600, 11)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(998400, 12)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(1075200, 13)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(1152000, 14)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(1228800, 15)
|
||||
@@ -434,60 +640,62 @@ namespace kip {
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(1497600, 22)
|
||||
DECL_MARIKO_GPU_VOLT_HELPER(1536000, 23)
|
||||
|
||||
#define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \
|
||||
static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char* p) { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(p, &t)) return 0; \
|
||||
return cust_get_erista_gpu_volt(&t, idx); \
|
||||
#define DECL_ERISTA_GPU_VOLT_GET(freq, idx) \
|
||||
static inline u32 cust_get_erista_gpu_volt_##freq##_val(const char *p) { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(p, &t)) \
|
||||
return 0; \
|
||||
return cust_get_erista_gpu_volt(&t, idx); \
|
||||
}
|
||||
#define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \
|
||||
static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char* p) { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(p, &t)) return 0; \
|
||||
return cust_get_mariko_gpu_volt(&t, idx); \
|
||||
#define DECL_MARIKO_GPU_VOLT_GET(freq, idx) \
|
||||
static inline u32 cust_get_mariko_gpu_volt_##freq##_val(const char *p) { \
|
||||
CustomizeTable t; \
|
||||
if (!cust_read_table(p, &t)) \
|
||||
return 0; \
|
||||
return cust_get_mariko_gpu_volt(&t, idx); \
|
||||
}
|
||||
|
||||
DECL_ERISTA_GPU_VOLT_GET(76800, 0)
|
||||
DECL_ERISTA_GPU_VOLT_GET(115200, 1)
|
||||
DECL_ERISTA_GPU_VOLT_GET(153600, 2)
|
||||
DECL_ERISTA_GPU_VOLT_GET(192000, 3)
|
||||
DECL_ERISTA_GPU_VOLT_GET(230400, 4)
|
||||
DECL_ERISTA_GPU_VOLT_GET(268800, 5)
|
||||
DECL_ERISTA_GPU_VOLT_GET(307200, 6)
|
||||
DECL_ERISTA_GPU_VOLT_GET(345600, 7)
|
||||
DECL_ERISTA_GPU_VOLT_GET(384000, 8)
|
||||
DECL_ERISTA_GPU_VOLT_GET(422400, 9)
|
||||
DECL_ERISTA_GPU_VOLT_GET(460800, 10)
|
||||
DECL_ERISTA_GPU_VOLT_GET(499200, 11)
|
||||
DECL_ERISTA_GPU_VOLT_GET(537600, 12)
|
||||
DECL_ERISTA_GPU_VOLT_GET(576000, 13)
|
||||
DECL_ERISTA_GPU_VOLT_GET(614400, 14)
|
||||
DECL_ERISTA_GPU_VOLT_GET(652800, 15)
|
||||
DECL_ERISTA_GPU_VOLT_GET(691200, 16)
|
||||
DECL_ERISTA_GPU_VOLT_GET(729600, 17)
|
||||
DECL_ERISTA_GPU_VOLT_GET(768000, 18)
|
||||
DECL_ERISTA_GPU_VOLT_GET(806400, 19)
|
||||
DECL_ERISTA_GPU_VOLT_GET(844800, 20)
|
||||
DECL_ERISTA_GPU_VOLT_GET(883200, 21)
|
||||
DECL_ERISTA_GPU_VOLT_GET(921600, 22)
|
||||
DECL_ERISTA_GPU_VOLT_GET(960000, 23)
|
||||
DECL_ERISTA_GPU_VOLT_GET(998400, 24)
|
||||
DECL_ERISTA_GPU_VOLT_GET(76800, 0)
|
||||
DECL_ERISTA_GPU_VOLT_GET(115200, 1)
|
||||
DECL_ERISTA_GPU_VOLT_GET(153600, 2)
|
||||
DECL_ERISTA_GPU_VOLT_GET(192000, 3)
|
||||
DECL_ERISTA_GPU_VOLT_GET(230400, 4)
|
||||
DECL_ERISTA_GPU_VOLT_GET(268800, 5)
|
||||
DECL_ERISTA_GPU_VOLT_GET(307200, 6)
|
||||
DECL_ERISTA_GPU_VOLT_GET(345600, 7)
|
||||
DECL_ERISTA_GPU_VOLT_GET(384000, 8)
|
||||
DECL_ERISTA_GPU_VOLT_GET(422400, 9)
|
||||
DECL_ERISTA_GPU_VOLT_GET(460800, 10)
|
||||
DECL_ERISTA_GPU_VOLT_GET(499200, 11)
|
||||
DECL_ERISTA_GPU_VOLT_GET(537600, 12)
|
||||
DECL_ERISTA_GPU_VOLT_GET(576000, 13)
|
||||
DECL_ERISTA_GPU_VOLT_GET(614400, 14)
|
||||
DECL_ERISTA_GPU_VOLT_GET(652800, 15)
|
||||
DECL_ERISTA_GPU_VOLT_GET(691200, 16)
|
||||
DECL_ERISTA_GPU_VOLT_GET(729600, 17)
|
||||
DECL_ERISTA_GPU_VOLT_GET(768000, 18)
|
||||
DECL_ERISTA_GPU_VOLT_GET(806400, 19)
|
||||
DECL_ERISTA_GPU_VOLT_GET(844800, 20)
|
||||
DECL_ERISTA_GPU_VOLT_GET(883200, 21)
|
||||
DECL_ERISTA_GPU_VOLT_GET(921600, 22)
|
||||
DECL_ERISTA_GPU_VOLT_GET(960000, 23)
|
||||
DECL_ERISTA_GPU_VOLT_GET(998400, 24)
|
||||
DECL_ERISTA_GPU_VOLT_GET(1036800, 25)
|
||||
DECL_ERISTA_GPU_VOLT_GET(1075200, 26)
|
||||
|
||||
DECL_MARIKO_GPU_VOLT_GET(76800, 0)
|
||||
DECL_MARIKO_GPU_VOLT_GET(153600, 1)
|
||||
DECL_MARIKO_GPU_VOLT_GET(230400, 2)
|
||||
DECL_MARIKO_GPU_VOLT_GET(307200, 3)
|
||||
DECL_MARIKO_GPU_VOLT_GET(384000, 4)
|
||||
DECL_MARIKO_GPU_VOLT_GET(460800, 5)
|
||||
DECL_MARIKO_GPU_VOLT_GET(537600, 6)
|
||||
DECL_MARIKO_GPU_VOLT_GET(614400, 7)
|
||||
DECL_MARIKO_GPU_VOLT_GET(691200, 8)
|
||||
DECL_MARIKO_GPU_VOLT_GET(768000, 9)
|
||||
DECL_MARIKO_GPU_VOLT_GET(844800, 10)
|
||||
DECL_MARIKO_GPU_VOLT_GET(921600, 11)
|
||||
DECL_MARIKO_GPU_VOLT_GET(998400, 12)
|
||||
DECL_MARIKO_GPU_VOLT_GET(76800, 0)
|
||||
DECL_MARIKO_GPU_VOLT_GET(153600, 1)
|
||||
DECL_MARIKO_GPU_VOLT_GET(230400, 2)
|
||||
DECL_MARIKO_GPU_VOLT_GET(307200, 3)
|
||||
DECL_MARIKO_GPU_VOLT_GET(384000, 4)
|
||||
DECL_MARIKO_GPU_VOLT_GET(460800, 5)
|
||||
DECL_MARIKO_GPU_VOLT_GET(537600, 6)
|
||||
DECL_MARIKO_GPU_VOLT_GET(614400, 7)
|
||||
DECL_MARIKO_GPU_VOLT_GET(691200, 8)
|
||||
DECL_MARIKO_GPU_VOLT_GET(768000, 9)
|
||||
DECL_MARIKO_GPU_VOLT_GET(844800, 10)
|
||||
DECL_MARIKO_GPU_VOLT_GET(921600, 11)
|
||||
DECL_MARIKO_GPU_VOLT_GET(998400, 12)
|
||||
DECL_MARIKO_GPU_VOLT_GET(1075200, 13)
|
||||
DECL_MARIKO_GPU_VOLT_GET(1152000, 14)
|
||||
DECL_MARIKO_GPU_VOLT_GET(1228800, 15)
|
||||
@@ -502,4 +710,4 @@ namespace kip {
|
||||
void MigrateKipData(u32 custRev, u32 version);
|
||||
void SetKipData();
|
||||
void GetKipData();
|
||||
}
|
||||
} // namespace kip
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,60 +24,50 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#include <stdatomic.h>
|
||||
|
||||
#include "apm_ext.h"
|
||||
|
||||
#include <stdatomic.h>
|
||||
|
||||
static Service g_apmSrv;
|
||||
static Service g_apmSysSrv;
|
||||
static atomic_size_t g_refCnt;
|
||||
|
||||
Result apmExtInitialize(void)
|
||||
{
|
||||
Result apmExtInitialize(void) {
|
||||
g_refCnt++;
|
||||
|
||||
if (serviceIsActive(&g_apmSrv))
|
||||
{
|
||||
if (serviceIsActive(&g_apmSrv)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
Result rc = 0;
|
||||
|
||||
rc = smGetService(&g_apmSrv, "apm");
|
||||
if(R_SUCCEEDED(rc))
|
||||
{
|
||||
if (R_SUCCEEDED(rc)) {
|
||||
rc = smGetService(&g_apmSysSrv, "apm:sys");
|
||||
}
|
||||
|
||||
if (R_FAILED(rc))
|
||||
{
|
||||
if (R_FAILED(rc)) {
|
||||
apmExtExit();
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void apmExtExit(void)
|
||||
{
|
||||
if (--g_refCnt == 0)
|
||||
{
|
||||
void apmExtExit(void) {
|
||||
if (--g_refCnt == 0) {
|
||||
serviceClose(&g_apmSrv);
|
||||
serviceClose(&g_apmSysSrv);
|
||||
}
|
||||
}
|
||||
|
||||
Result apmExtGetPerformanceMode(u32* out_mode)
|
||||
{
|
||||
Result apmExtGetPerformanceMode(u32 *out_mode) {
|
||||
return serviceDispatchOut(&g_apmSrv, 1, *out_mode);
|
||||
}
|
||||
|
||||
Result apmExtSysRequestPerformanceMode(u32 mode)
|
||||
{
|
||||
Result apmExtSysRequestPerformanceMode(u32 mode) {
|
||||
return serviceDispatchIn(&g_apmSysSrv, 0, mode);
|
||||
}
|
||||
|
||||
Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf)
|
||||
{
|
||||
Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf) {
|
||||
return serviceDispatchOut(&g_apmSysSrv, 7, *out_conf);
|
||||
}
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
* "THE BEER-WARE LICENSE" (Revision 42):
|
||||
* <p-sam@d3vs.net>, <natinusala@gmail.com>, <m4x@m4xw.net>
|
||||
@@ -24,12 +24,10 @@
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <switch.h>
|
||||
@@ -37,19 +35,19 @@ extern "C"
|
||||
Result apmExtInitialize(void);
|
||||
void apmExtExit(void);
|
||||
|
||||
Result apmExtGetPerformanceMode(u32* out_mode);
|
||||
Result apmExtGetPerformanceMode(u32 *out_mode);
|
||||
Result apmExtSysRequestPerformanceMode(u32 mode);
|
||||
Result apmExtGetCurrentPerformanceConfiguration(u32* out_conf);
|
||||
Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf);
|
||||
Result apmExtSysRequestPerformanceMode(u32 mode);
|
||||
Result apmExtSysSetCpuBoostMode(u32 mode);
|
||||
|
||||
Result apmExtGetPerformanceMode(u32 *out_mode);
|
||||
Result apmExtGetCurrentPerformanceConfiguration(u32 *out_conf);
|
||||
|
||||
inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz
|
||||
inline bool apmExtIsCPUBoosted(u32 conf_id) { // CPU boosted to 1785 MHz
|
||||
return (conf_id == 0x92220009 || conf_id == 0x9222000A);
|
||||
};
|
||||
inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz
|
||||
inline bool apmExtIsBoostMode(u32 conf_id) { // GPU throttled to 76.8 MHz
|
||||
return (conf_id >= 0x92220009 && conf_id <= 0x9222000C);
|
||||
};
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user