Merge branch 'feature_impl'
This commit is contained in:
@@ -91,6 +91,8 @@ volatile CustomizeTable C = {
|
|||||||
|
|
||||||
.marikoGpuUV = 0,
|
.marikoGpuUV = 0,
|
||||||
|
|
||||||
|
.marikoEmcDvbShift = 0,
|
||||||
|
|
||||||
.ramTimingPresetOne = 0,
|
.ramTimingPresetOne = 0,
|
||||||
|
|
||||||
.ramTimingPresetTwo = 0,
|
.ramTimingPresetTwo = 0,
|
||||||
@@ -105,6 +107,8 @@ volatile CustomizeTable C = {
|
|||||||
|
|
||||||
.ramTimingPresetSeven = 0,
|
.ramTimingPresetSeven = 0,
|
||||||
|
|
||||||
|
.marikoGpuVoltArray = {610, 610, 610, 610, 610, 610, 610, 610, 610, 610, 620, 640, 675, 710, 735, 785, 815},
|
||||||
|
|
||||||
/* Advanced Settings:
|
/* Advanced Settings:
|
||||||
* - Erista CPU DVFS Table:
|
* - Erista CPU DVFS Table:
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -52,9 +52,10 @@ typedef struct CustomizeTable {
|
|||||||
u32 marikoCpuMaxVolt;
|
u32 marikoCpuMaxVolt;
|
||||||
u32 marikoEmcMaxClock;
|
u32 marikoEmcMaxClock;
|
||||||
u32 marikoEmcVddqVolt;
|
u32 marikoEmcVddqVolt;
|
||||||
//advanced config
|
|
||||||
u32 marikoCpuUV;
|
u32 marikoCpuUV;
|
||||||
u32 marikoGpuUV;
|
u32 marikoGpuUV;
|
||||||
|
// advanced config
|
||||||
|
u32 marikoEmcDvbShift;
|
||||||
u32 ramTimingPresetOne;
|
u32 ramTimingPresetOne;
|
||||||
u32 ramTimingPresetTwo;
|
u32 ramTimingPresetTwo;
|
||||||
u32 ramTimingPresetThree;
|
u32 ramTimingPresetThree;
|
||||||
@@ -62,6 +63,8 @@ typedef struct CustomizeTable {
|
|||||||
u32 ramTimingPresetFive;
|
u32 ramTimingPresetFive;
|
||||||
u32 ramTimingPresetSix;
|
u32 ramTimingPresetSix;
|
||||||
u32 ramTimingPresetSeven;
|
u32 ramTimingPresetSeven;
|
||||||
|
//
|
||||||
|
u32 marikoGpuVoltArray[17];
|
||||||
CustomizeCpuDvfsTable eristaCpuDvfsTable;
|
CustomizeCpuDvfsTable eristaCpuDvfsTable;
|
||||||
CustomizeCpuDvfsTable marikoCpuDvfsTable;
|
CustomizeCpuDvfsTable marikoCpuDvfsTable;
|
||||||
CustomizeCpuDvfsTable marikoCpuDvfsTableSLT;
|
CustomizeCpuDvfsTable marikoCpuDvfsTableSLT;
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ void SafetyCheck() {
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
marikoGpuDvfsMaxFreq = static_cast<u32>(GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sValidator validators[] = {
|
sValidator validators[] = {
|
||||||
@@ -115,7 +116,7 @@ void SafetyCheck() {
|
|||||||
{ C.eristaCpuMaxVolt, 1100, 1300 },
|
{ C.eristaCpuMaxVolt, 1100, 1300 },
|
||||||
{ C.eristaEmcMaxClock, 1600'000, 2131'200 },
|
{ C.eristaEmcMaxClock, 1600'000, 2131'200 },
|
||||||
{ C.marikoCpuMaxVolt, 1100, 1300 },
|
{ C.marikoCpuMaxVolt, 1100, 1300 },
|
||||||
{ C.marikoEmcMaxClock, 1600'000, 2400'000 },
|
{ C.marikoEmcMaxClock, 1600'000, 2800'000 },
|
||||||
{ C.marikoEmcVddqVolt, 550'000, 650'000 },
|
{ C.marikoEmcVddqVolt, 550'000, 650'000 },
|
||||||
{ eristaCpuDvfsMaxFreq, 1785'000, 3000'000 },
|
{ eristaCpuDvfsMaxFreq, 1785'000, 3000'000 },
|
||||||
{ marikoCpuDvfsMaxFreq, 1785'000, 3000'000 },
|
{ marikoCpuDvfsMaxFreq, 1785'000, 3000'000 },
|
||||||
|
|||||||
@@ -203,7 +203,11 @@ Result CpuFreqCvbTable(u32* ptr) {
|
|||||||
cvb_entry_t* entry = static_cast<cvb_entry_t *>(cpu_cvb_table_head);
|
cvb_entry_t* entry = static_cast<cvb_entry_t *>(cpu_cvb_table_head);
|
||||||
for (size_t i = 0; i < customize_entry_count; i++) {
|
for (size_t i = 0; i < customize_entry_count; i++) {
|
||||||
if (entry->freq >= cpu_freq_threshold) {
|
if (entry->freq >= cpu_freq_threshold) {
|
||||||
PATCH_OFFSET(&(entry->cvb_pll_param.c0), cpu_max_volt * 1000);
|
if (isMariko) {
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c0), cpu_max_volt * 1000);
|
||||||
|
} else {
|
||||||
|
PATCH_OFFSET(&(entry->cvb_dfll_param.c0), cpu_max_volt * 1000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
entry++;
|
entry++;
|
||||||
}
|
}
|
||||||
@@ -215,7 +219,25 @@ Result CpuFreqCvbTable(u32* ptr) {
|
|||||||
template<bool isMariko>
|
template<bool isMariko>
|
||||||
Result GpuFreqCvbTable(u32* ptr) {
|
Result GpuFreqCvbTable(u32* ptr) {
|
||||||
cvb_entry_t* default_table = isMariko ? (cvb_entry_t *)(&mariko::GpuCvbTableDefault) : (cvb_entry_t *)(&erista::GpuCvbTableDefault);
|
cvb_entry_t* default_table = isMariko ? (cvb_entry_t *)(&mariko::GpuCvbTableDefault) : (cvb_entry_t *)(&erista::GpuCvbTableDefault);
|
||||||
cvb_entry_t* customize_table = const_cast<cvb_entry_t *>(isMariko ? (C.marikoGpuUV ? (C.marikoGpuUV == 2 ? C.marikoGpuDvfsTableHiOPT : C.marikoGpuDvfsTableSLT) : C.marikoGpuDvfsTable) : C.eristaGpuDvfsTable);
|
cvb_entry_t* customize_table;
|
||||||
|
if (isMariko) {
|
||||||
|
switch (C.marikoGpuUV) {
|
||||||
|
case 0:
|
||||||
|
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTable);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableSLT);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTableHiOPT);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
customize_table = const_cast<cvb_entry_t *>(C.marikoGpuDvfsTable);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
customize_table = const_cast<cvb_entry_t *>(C.eristaGpuDvfsTable);
|
||||||
|
}
|
||||||
|
|
||||||
size_t default_entry_count = GetDvfsTableEntryCount(default_table);
|
size_t default_entry_count = GetDvfsTableEntryCount(default_table);
|
||||||
size_t default_table_size = default_entry_count * sizeof(cvb_entry_t);
|
size_t default_table_size = default_entry_count * sizeof(cvb_entry_t);
|
||||||
@@ -230,6 +252,20 @@ Result GpuFreqCvbTable(u32* ptr) {
|
|||||||
|
|
||||||
std::memcpy(gpu_cvb_table_head, (void*)customize_table, customize_table_size);
|
std::memcpy(gpu_cvb_table_head, (void*)customize_table, customize_table_size);
|
||||||
|
|
||||||
|
// Patch GPU volt
|
||||||
|
if (isMariko && C.marikoGpuUV == 3) {
|
||||||
|
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), C.marikoGpuVoltArray[i] * 1000);
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c1), 0);
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c2), 0);
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c3), 0);
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c4), 0);
|
||||||
|
PATCH_OFFSET(&(entry->cvb_pll_param.c5), 0);
|
||||||
|
entry++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,9 @@ Result GpuFreqMaxAsm(u32* ptr32) {
|
|||||||
case 2:
|
case 2:
|
||||||
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq;
|
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTableHiOPT)->freq;
|
||||||
break;
|
break;
|
||||||
default: max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
default:
|
||||||
|
max_clock = GetDvfsTableLastEntry(C.marikoGpuDvfsTable)->freq;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
u32 asm_patch[2] = {
|
u32 asm_patch[2] = {
|
||||||
asm_set_rd(asm_set_imm16(asm_pattern[0], max_clock), rd),
|
asm_set_rd(asm_set_imm16(asm_pattern[0], max_clock), rd),
|
||||||
@@ -369,10 +371,10 @@ Result MemFreqDvbTable(u32* ptr) {
|
|||||||
emc_dvb_dvfs_table_t oc_table = { 2131200, { 725, 700, 675, } };
|
emc_dvb_dvfs_table_t oc_table = { 2131200, { 725, 700, 675, } };
|
||||||
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
||||||
} else if (C.marikoEmcMaxClock < 2665600){
|
} else if (C.marikoEmcMaxClock < 2665600){
|
||||||
emc_dvb_dvfs_table_t oc_table = { 2400000, { 750, 725, 700, } };
|
emc_dvb_dvfs_table_t oc_table = { 2400000, { 750+25*C.marikoEmcDvbShift, 725+25*C.marikoEmcDvbShift, 700+25*C.marikoEmcDvbShift, } };
|
||||||
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
||||||
} else {
|
} else {
|
||||||
emc_dvb_dvfs_table_t oc_table = { 2665600, { 775, 750, 725, } };
|
emc_dvb_dvfs_table_t oc_table = { 2665600, { 775+25*C.marikoEmcDvbShift, 750+25*C.marikoEmcDvbShift, 725+25*C.marikoEmcDvbShift, } };
|
||||||
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
std::memcpy(new_start, &oc_table, sizeof(emc_dvb_dvfs_table_t));
|
||||||
}
|
}
|
||||||
new_start->freq = C.marikoEmcMaxClock;
|
new_start->freq = C.marikoEmcMaxClock;
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ typedef struct CustTable {
|
|||||||
u32 marikoEmcVddqVolt;
|
u32 marikoEmcVddqVolt;
|
||||||
u32 marikoCpuUV;
|
u32 marikoCpuUV;
|
||||||
u32 marikoGpuUV;
|
u32 marikoGpuUV;
|
||||||
|
u32 marikoEmcDvbShift;
|
||||||
u32 ramTimingPresetOne;
|
u32 ramTimingPresetOne;
|
||||||
u32 ramTimingPresetTwo;
|
u32 ramTimingPresetTwo;
|
||||||
u32 ramTimingPresetThree;
|
u32 ramTimingPresetThree;
|
||||||
@@ -65,6 +66,7 @@ typedef struct CustTable {
|
|||||||
u32 ramTimingPresetFive;
|
u32 ramTimingPresetFive;
|
||||||
u32 ramTimingPresetSix;
|
u32 ramTimingPresetSix;
|
||||||
u32 ramTimingPresetSeven;
|
u32 ramTimingPresetSeven;
|
||||||
|
u32 marikoGpuVoltArray[17];
|
||||||
CustomizeCpuDvfsTable eristaCpuDvfsTable;
|
CustomizeCpuDvfsTable eristaCpuDvfsTable;
|
||||||
CustomizeCpuDvfsTable marikoCpuDvfsTable;
|
CustomizeCpuDvfsTable marikoCpuDvfsTable;
|
||||||
CustomizeCpuDvfsTable marikoCpuDvfsTableSLT;
|
CustomizeCpuDvfsTable marikoCpuDvfsTableSLT;
|
||||||
|
|||||||
@@ -401,6 +401,7 @@
|
|||||||
</label>
|
</label>
|
||||||
<div id="config-list-basic"></div>
|
<div id="config-list-basic"></div>
|
||||||
<div id="config-list-advanced"></div>
|
<div id="config-list-advanced"></div>
|
||||||
|
<div id="config-list-gpu"></div>
|
||||||
</form>
|
</form>
|
||||||
</body>
|
</body>
|
||||||
<footer>
|
<footer>
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
/* Config: Cust */
|
/* Config: Cust */
|
||||||
const CUST_REV = 4;
|
|
||||||
const CUST_REV_ADV = 8;
|
const CUST_REV_ADV = 8;
|
||||||
|
|
||||||
enum CustPlatform {
|
enum CustPlatform {
|
||||||
@@ -156,6 +155,53 @@ class AdvEntry extends CustEntry {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class GpuEntry extends CustEntry {
|
||||||
|
constructor(
|
||||||
|
public id: string,
|
||||||
|
public name: string,
|
||||||
|
public platform: CustPlatform = CustPlatform.Mariko,
|
||||||
|
public size: number = 4,
|
||||||
|
public desc: string[] = ["range: 610 ≤ x ≤ 1000"],
|
||||||
|
public defval: number = 610,
|
||||||
|
minmax: [number, number] = [610, 1000],
|
||||||
|
public step: number = 5,
|
||||||
|
public zeroable: boolean = false) {
|
||||||
|
super(id, name, platform, size, desc, defval, minmax, step, zeroable);
|
||||||
|
};
|
||||||
|
|
||||||
|
createElement() {
|
||||||
|
let input = this.getInputElement();
|
||||||
|
if (!input) {
|
||||||
|
let grid = document.createElement("div");
|
||||||
|
grid.classList.add("grid", "cust-element");
|
||||||
|
|
||||||
|
// Label and input
|
||||||
|
input = document.createElement("input");
|
||||||
|
input.min = String(this.zeroable ? 0 : this.min);
|
||||||
|
input.max = String(this.max);
|
||||||
|
input.id = this.id;
|
||||||
|
input.type = "number";
|
||||||
|
input.step = String(this.step);
|
||||||
|
let label = document.createElement("label");
|
||||||
|
label.setAttribute("for", this.id);
|
||||||
|
label.innerHTML = this.name;
|
||||||
|
label.appendChild(input);
|
||||||
|
grid.appendChild(label);
|
||||||
|
|
||||||
|
// Description in blockquote style
|
||||||
|
let desc = document.createElement("blockquote");
|
||||||
|
desc.innerHTML = "<ul>" + this.desc.map(i => `<li>${i}</li>`).join('') + "</ul>";
|
||||||
|
desc.setAttribute("for", this.id);
|
||||||
|
grid.appendChild(desc);
|
||||||
|
|
||||||
|
document.getElementById("config-list-gpu")!.appendChild(grid);
|
||||||
|
|
||||||
|
new ErrorToolTip(this.id).addChangeListener();
|
||||||
|
}
|
||||||
|
input.value = String(this.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var CustTable: Array<CustEntry> = [
|
var CustTable: Array<CustEntry> = [
|
||||||
new CustEntry(
|
new CustEntry(
|
||||||
"mtcConf",
|
"mtcConf",
|
||||||
@@ -237,9 +283,10 @@ var CustTable: Array<CustEntry> = [
|
|||||||
4,
|
4,
|
||||||
["Values should be ≥ 1600000, and divided evenly by 3200.",
|
["Values should be ≥ 1600000, and divided evenly by 3200.",
|
||||||
"Recommended Clocks: 1862400, 2131200, 2400000 (JEDEC)",
|
"Recommended Clocks: 1862400, 2131200, 2400000 (JEDEC)",
|
||||||
|
"Clocks above 2400Mhz might not boot, or work correctly",
|
||||||
"<b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM."],
|
"<b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM."],
|
||||||
1996_800,
|
1996_800,
|
||||||
[1600_000, 2400_000],
|
[1600_000, 2502_400],
|
||||||
3200,
|
3200,
|
||||||
),
|
),
|
||||||
new CustEntry(
|
new CustEntry(
|
||||||
@@ -280,14 +327,28 @@ var CustTable: Array<CustEntry> = [
|
|||||||
"Can hang your console, or crash games",
|
"Can hang your console, or crash games",
|
||||||
"<b>0</b> : Default Table",
|
"<b>0</b> : Default Table",
|
||||||
"<b>1</b> : Undervolt Level 1 (SLT: Aggressive)",
|
"<b>1</b> : Undervolt Level 1 (SLT: Aggressive)",
|
||||||
"<b>2</b> : Undervolt Level 2 (HiOPT: Drastic)"],
|
"<b>2</b> : Undervolt Level 2 (HiOPT: Drastic)",
|
||||||
|
"<b>3</b> : Custom static GPU Table (Use Gpu Configuation below)"],
|
||||||
0,
|
0,
|
||||||
[0,2],
|
[0,3],
|
||||||
1,
|
1,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
var AdvTable: Array<AdvEntry> = [
|
var AdvTable: Array<AdvEntry> = [
|
||||||
|
new AdvEntry(
|
||||||
|
"marikoEmcDvbShift",
|
||||||
|
"Step up Mariko EMC DVB Table",
|
||||||
|
CustPlatform.Mariko,
|
||||||
|
4,
|
||||||
|
["Might help with stability at higher memory clock",
|
||||||
|
"<b>0</b> : Don't Adjust",
|
||||||
|
"<b>1</b> : Shift one step",
|
||||||
|
"<b>2</b> : Shift two step"],
|
||||||
|
0,
|
||||||
|
[0,2],
|
||||||
|
1,
|
||||||
|
),
|
||||||
new AdvEntry(
|
new AdvEntry(
|
||||||
"ramTimingPresetOne",
|
"ramTimingPresetOne",
|
||||||
"Primary RAM Timing Preset",
|
"Primary RAM Timing Preset",
|
||||||
@@ -421,6 +482,26 @@ var AdvTable: Array<AdvEntry> = [
|
|||||||
)
|
)
|
||||||
];
|
];
|
||||||
|
|
||||||
|
var GpuTable: Array<GpuEntry> = [
|
||||||
|
new GpuEntry("0", "76.8",),
|
||||||
|
new GpuEntry("1", "153.6",),
|
||||||
|
new GpuEntry("2", "230.4",),
|
||||||
|
new GpuEntry("3", "307.2",),
|
||||||
|
new GpuEntry("4", "384.0",),
|
||||||
|
new GpuEntry("5", "460.8",),
|
||||||
|
new GpuEntry("6", "537.6",),
|
||||||
|
new GpuEntry("7", "614.4",),
|
||||||
|
new GpuEntry("8", "691.2",),
|
||||||
|
new GpuEntry("9", "768.0",),
|
||||||
|
new GpuEntry("10", "844.8",),
|
||||||
|
new GpuEntry("11", "921.6",),
|
||||||
|
new GpuEntry("12", "998.4",),
|
||||||
|
new GpuEntry("13", "1075.2",),
|
||||||
|
new GpuEntry("14", "1152.0",),
|
||||||
|
new GpuEntry("15", "1228.8",),
|
||||||
|
new GpuEntry("16", "1267.2",),
|
||||||
|
];
|
||||||
|
|
||||||
class ErrorToolTip {
|
class ErrorToolTip {
|
||||||
element: HTMLElement | null;
|
element: HTMLElement | null;
|
||||||
|
|
||||||
@@ -467,21 +548,17 @@ class CustStorage {
|
|||||||
readonly key = "last_saved";
|
readonly key = "last_saved";
|
||||||
|
|
||||||
updateFromTable() {
|
updateFromTable() {
|
||||||
CustTable.forEach(i => {
|
let update = (i => {
|
||||||
i.updateValueFromElement();
|
i.updateValueFromElement();
|
||||||
if (!i.validate()) {
|
if (!i.validate()) {
|
||||||
i.getInputElement()?.focus();
|
i.getInputElement()?.focus();
|
||||||
throw new Error(`Invalid ${i.name}`);
|
throw new Error(`Invalid ${i.name}`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
AdvTable.forEach(i => {
|
CustTable.forEach(update);
|
||||||
i.updateValueFromElement();
|
AdvTable.forEach(update);
|
||||||
if (!i.validate()) {
|
GpuTable.forEach(update);
|
||||||
i.getInputElement()?.focus();
|
|
||||||
throw new Error(`Invalid ${i.name}`);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
this.storage = {};
|
this.storage = {};
|
||||||
let kv = Object.fromEntries(CustTable.map((i) => [i.id, i.value]));
|
let kv = Object.fromEntries(CustTable.map((i) => [i.id, i.value]));
|
||||||
Object.keys(kv)
|
Object.keys(kv)
|
||||||
@@ -516,6 +593,13 @@ class CustStorage {
|
|||||||
}
|
}
|
||||||
i.setElementValue();
|
i.setElementValue();
|
||||||
});
|
});
|
||||||
|
GpuTable.forEach(i => {
|
||||||
|
if (!i.validate()) {
|
||||||
|
i.getInputElement()?.focus();
|
||||||
|
throw new Error(`Invalid ${i.name}`);
|
||||||
|
}
|
||||||
|
i.setElementValue();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
@@ -580,7 +664,7 @@ class Cust {
|
|||||||
|
|
||||||
save() {
|
save() {
|
||||||
this.storage.updateFromTable();
|
this.storage.updateFromTable();
|
||||||
let lambda = (i => {
|
let saveValue = (i => {
|
||||||
if (!i.offset) {
|
if (!i.offset) {
|
||||||
i.getInputElement()?.focus();
|
i.getInputElement()?.focus();
|
||||||
throw new Error(`Failed to get offset for ${i.name}`);
|
throw new Error(`Failed to get offset for ${i.name}`);
|
||||||
@@ -592,10 +676,9 @@ class Cust {
|
|||||||
}
|
}
|
||||||
mapper.set(i.offset, i.value!);
|
mapper.set(i.offset, i.value!);
|
||||||
});
|
});
|
||||||
CustTable.forEach(lambda);
|
CustTable.forEach(saveValue);
|
||||||
if (this.rev == CUST_REV_ADV) {
|
AdvTable.forEach(saveValue);
|
||||||
AdvTable.forEach(lambda);
|
GpuTable.forEach(saveValue);
|
||||||
}
|
|
||||||
|
|
||||||
this.storage.save();
|
this.storage.save();
|
||||||
|
|
||||||
@@ -633,7 +716,12 @@ class Cust {
|
|||||||
advanced.innerHTML = "Advanced configuration";
|
advanced.innerHTML = "Advanced configuration";
|
||||||
document.getElementById("config-list-advanced")?.appendChild(advanced);
|
document.getElementById("config-list-advanced")?.appendChild(advanced);
|
||||||
|
|
||||||
|
let gpu = document.createElement("p");
|
||||||
|
gpu.innerHTML = "Gpu Volt configuration";
|
||||||
|
document.getElementById("config-list-gpu")?.appendChild(gpu);
|
||||||
|
|
||||||
AdvTable.forEach(i => i.createElement());
|
AdvTable.forEach(i => i.createElement());
|
||||||
|
GpuTable.forEach(i => i.createElement());
|
||||||
|
|
||||||
let default_btn = document.getElementById("load_default")!;
|
let default_btn = document.getElementById("load_default")!;
|
||||||
default_btn.removeAttribute("disabled");
|
default_btn.removeAttribute("disabled");
|
||||||
@@ -678,13 +766,13 @@ class Cust {
|
|||||||
let offset = this.beginOffset + this.magicLen;
|
let offset = this.beginOffset + this.magicLen;
|
||||||
let revLen = 4;
|
let revLen = 4;
|
||||||
this.rev = this.mapper[revLen].get(offset);
|
this.rev = this.mapper[revLen].get(offset);
|
||||||
if (this.rev != CUST_REV && this.rev != CUST_REV_ADV) {
|
if (this.rev != CUST_REV_ADV) {
|
||||||
throw new Error(`Unsupported custRev, expected: ${CUST_REV} or ${CUST_REV_ADV}, got ${this.rev}`);
|
throw new Error(`Unsupported custRev, expected: ${CUST_REV_ADV}, got ${this.rev}`);
|
||||||
}
|
}
|
||||||
offset += revLen;
|
offset += revLen;
|
||||||
document.getElementById("cust_rev")!.innerHTML = `Cust v${this.rev} is loaded.`;
|
document.getElementById("cust_rev")!.innerHTML = `Cust v${this.rev} is loaded.`;
|
||||||
|
|
||||||
let lambda = (i => {
|
let loadValue = (i => {
|
||||||
i.offset = offset;
|
i.offset = offset;
|
||||||
let mapper = this.mapper[i.size];
|
let mapper = this.mapper[i.size];
|
||||||
if (!mapper) {
|
if (!mapper) {
|
||||||
@@ -696,10 +784,9 @@ class Cust {
|
|||||||
i.validate();
|
i.validate();
|
||||||
});
|
});
|
||||||
|
|
||||||
CustTable.forEach(lambda);
|
CustTable.forEach(loadValue);
|
||||||
if (this.rev == CUST_REV_ADV) {
|
AdvTable.forEach(loadValue);
|
||||||
AdvTable.forEach(lambda);
|
GpuTable.forEach(loadValue);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
load(buffer: ArrayBuffer) {
|
load(buffer: ArrayBuffer) {
|
||||||
|
|||||||
Reference in New Issue
Block a user