chore: many changes

This commit is contained in:
souldbminersmwc
2025-10-06 19:18:21 -04:00
parent 4d910c1b39
commit 3bdb6dc23e
31 changed files with 3156 additions and 472 deletions

View File

@@ -0,0 +1,20 @@
/*
* HOC Configurator - Configuration Handler
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <string>
class Config {
public:
std::string kipPath;
bool autoSave;
Config();
bool loadConfig();
bool saveConfig();
bool checkKipExists();
bool checkAtmosphereExists();
};

View File

@@ -0,0 +1,143 @@
/*
* HOC Configurator - Constants
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <cstdint>
#include <string>
namespace Constants {
// Application info
constexpr const char* APP_VERSION = "2.0.0";
constexpr const char* APP_NAME = "HOC Configurator";
constexpr const char* APP_AUTHOR = "Dominatorul";
// Paths
constexpr const char* DEFAULT_KIP_PATH = "sdmc:/atmosphere/kips/loader.kip";
constexpr const char* CONFIG_DIR = "sdmc:/config/hoc-configurator";
constexpr const char* CONFIG_FILE = "sdmc:/config/hoc-configurator/config.ini";
constexpr const char* ATMOSPHERE_PATH = "sdmc:/atmosphere";
constexpr const char* SYSTEM_SETTINGS_INI = "sdmc:/atmosphere/config/system_settings.ini";
// Frequency arrays (in kHz)
constexpr uint32_t MARIKO_GPU_FREQS[] = {
76800, 153600, 230400, 307200, 384000, 460800, 537600, 614400,
691200, 768000, 844800, 921600, 998400, 1075200, 1152000, 1228800,
1267200, 1305600, 1344000, 1382400, 1420800, 1459200, 1497600, 1536000
};
constexpr uint32_t ERISTA_GPU_FREQS[] = {
76800, 153600, 230400, 307200, 384000, 460800, 537600, 614400,
691200, 768000, 844800, 921600, 998400, 1075200
};
constexpr uint32_t CPU_FREQS[] = {
1020000, 1122000, 1224000, 1326000, 1428000, 1581000, 1683000,
1785000, 1887000, 1963500, 2091000, 2193000, 2295000, 2397000,
2499000, 2601000, 2703000, 2805000, 2907000
};
constexpr uint32_t RAM_FREQS[] = {
0, 1600000, 1633000, 1666000, 1700000, 1733000, 1766000, 1800000,
1833000, 1866000, 1900000, 1933000, 1966000, 2000000, 2033000, 2066000,
2100000, 2133000, 2166000, 2200000, 2233000, 2266000, 2300000
};
// Voltage ranges
constexpr uint32_t MARIKO_GPU_MIN_VOLT = 480;
constexpr uint32_t MARIKO_GPU_MAX_VOLT = 960;
constexpr uint32_t MARIKO_GPU_MAX_VMIN = 700;
constexpr uint32_t ERISTA_GPU_MIN_VOLT = 700;
constexpr uint32_t ERISTA_GPU_MAX_VOLT = 1000;
constexpr uint32_t ERISTA_GPU_MAX_VMIN = 850;
constexpr uint32_t MARIKO_CPU_MIN_VMIN = 700;
constexpr uint32_t MARIKO_CPU_MAX_VMIN = 750;
constexpr uint32_t VOLTAGE_STEP = 5;
constexpr uint32_t GPU_OFFSET_MAX = 50;
// Thresholds
constexpr uint32_t MARIKO_MEME_THRESHOLD = 1536000;
constexpr uint32_t MARIKO_DANGEROUS_GPU_THRESHOLD = 1382400;
constexpr uint32_t MARIKO_UNSAFE_GPU_THRESHOLD = 1152000;
constexpr uint32_t ERISTA_DANGEROUS_GPU_THRESHOLD = 1151000;
constexpr uint32_t ERISTA_UNSAFE_GPU_THRESHOLD = 922000;
// RAM Types
const std::string RAM_TYPES[] = {
"Samsung AA-MGCL/MGCR",
"SK Hynix NEI/NEE/x267",
"Micron WT:B",
"Micron AUT:B",
"Micron WT:F",
"Samsung AM-MGCJ",
"Micron WT:E",
"Samsung AB-MGCL",
"SK Hynix NME",
"Samsung HB-MGCH"
};
// Fan curve profiles
namespace FanProfiles {
constexpr const char* V1_ERISTA = "V1_Erista";
constexpr const char* V2_MARIKO = "V2_Mariko";
constexpr const char* LITE_MARIKO = "Lite_Mariko";
constexpr const char* OLED_MARIKO = "OLED_Mariko";
}
// PSM (Battery) options
struct PSMOption {
const char* name;
uint32_t value;
};
constexpr PSMOption PSM_OPTIONS[] = {
{"1024mA", 0x400},
{"1280mA", 0x500},
{"1536mA", 0x600},
{"1660mA (Lite Default)", 0x67C},
{"1792mA", 0x700},
{"2048mA (Default)", 0x800},
{"2304mA (UNSAFE)", 0x900},
{"2560mA (UNSAFE)", 0xA00},
{"2816mA (DANGEROUS)", 0xB00},
{"3072mA (DANGEROUS)", 0xC00}
};
// Memory timing presets
struct TimingPreset {
uint32_t tRCD;
uint32_t tRP;
uint32_t tRAS;
uint32_t tRRD;
uint32_t tRFC;
uint32_t tRTW;
uint32_t tWTR;
uint32_t tREFI;
};
// Default timing preset
constexpr TimingPreset TIMING_DEFAULT = {0, 0, 0, 0, 0, 0, 0, 0};
// Samsung AA-MGCL/MGCR presets
constexpr TimingPreset TIMING_AAMGCL_CONSERVATIVE = {4, 4, 5, 5, 5, 5, 7, 6};
constexpr TimingPreset TIMING_AAMGCL_TIGHT = {4, 4, 8, 6, 5, 7, 8, 6};
// SK Hynix NEE presets
constexpr TimingPreset TIMING_NEE_CONSERVATIVE = {3, 3, 2, 2, 5, 5, 4, 6};
constexpr TimingPreset TIMING_NEE_TIGHT = {4, 4, 4, 3, 7, 6, 5, 6};
// Micron WT:B presets
constexpr TimingPreset TIMING_WTB_CONSERVATIVE = {4, 4, 5, 5, 2, 6, 5, 6};
constexpr TimingPreset TIMING_WTB_TIGHT = {6, 6, 7, 7, 2, 6, 5, 6};
// UI Constants
constexpr int MAX_VISIBLE_ITEMS = 20;
constexpr int MENU_START_Y = 7;
constexpr int SCREEN_WIDTH = 80;
constexpr int SCREEN_HEIGHT = 45;
}

View File

@@ -0,0 +1,94 @@
/*
* HOC Configurator - Default Values
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <cstdint>
class KipHandler;
class Defaults {
public:
template<typename T>
static void initDefaults(T& data) {
data.custRev = 0;
data.mtcConf = 0;
data.commonCpuBoostClock = 1785000;
data.commonEmcMemVolt = 1175000;
data.eristaCpuMaxVolt = 1235;
data.eristaEmcMaxClock = 1862400;
data.marikoCpuMaxVolt = 1120;
data.marikoEmcMaxClock = 1996800;
data.marikoEmcVddqVolt = 600000;
data.marikoCpuUV = 0;
data.marikoGpuUV = 0;
data.eristaCpuUV = 0;
data.eristaGpuUV = 0;
data.enableMarikoGpuUnsafeFreqs = 0;
data.enableEristaGpuUnsafeFreqs = 0;
data.enableMarikoCpuUnsafeFreqs = 0;
data.enableEristaCpuUnsafeFreqs = 0;
data.commonGpuVoltOffset = 0;
data.marikoEmcDvbShift = 0;
// Memory timings
data.t1_tRCD = 0;
data.t2_tRP = 0;
data.t3_tRAS = 0;
data.t4_tRRD = 0;
data.t5_tRFC = 0;
data.t6_tRTW = 0;
data.t7_tWTR = 0;
data.t8_tREFI = 0;
data.mem_burst_latency = 2;
// Additional voltages
data.marikoCpuVmin = 0;
data.eristaGpuVmin = 0;
data.marikoGpuVmin = 0;
data.marikoGpuVmax = 0;
// Initialize all GPU voltages to 600 (default safe value)
data.g_volt_76800 = 600;
data.g_volt_153600 = 600;
data.g_volt_230400 = 600;
data.g_volt_307200 = 600;
data.g_volt_384000 = 600;
data.g_volt_460800 = 600;
data.g_volt_537600 = 600;
data.g_volt_614400 = 600;
data.g_volt_691200 = 600;
data.g_volt_768000 = 600;
data.g_volt_844800 = 605;
data.g_volt_921600 = 635;
data.g_volt_998400 = 665;
data.g_volt_1075200 = 695;
data.g_volt_1152000 = 730;
data.g_volt_1228800 = 760;
data.g_volt_1267200 = 785;
data.g_volt_1305600 = 800;
data.g_volt_1344000 = 0;
data.g_volt_1382400 = 0;
data.g_volt_1420800 = 0;
data.g_volt_1459200 = 0;
data.g_volt_1497600 = 0;
data.g_volt_1536000 = 0;
// Erista GPU voltages
data.g_volt_e_76800 = 700;
data.g_volt_e_153600 = 700;
data.g_volt_e_230400 = 700;
data.g_volt_e_307200 = 700;
data.g_volt_e_384000 = 700;
data.g_volt_e_460800 = 700;
data.g_volt_e_537600 = 700;
data.g_volt_e_614400 = 700;
data.g_volt_e_691200 = 700;
data.g_volt_e_768000 = 700;
data.g_volt_e_844800 = 710;
data.g_volt_e_921600 = 740;
data.g_volt_e_998400 = 770;
data.g_volt_e_1075200 = 800;
}
};

View File

@@ -0,0 +1,24 @@
#pragma once
#include <string>
#include <map>
#include <vector>
class IniHandler {
private:
std::string iniPath;
std::map<std::string, std::map<std::string, std::string>> sections;
public:
IniHandler(const std::string& path);
bool load();
bool save();
void setValue(const std::string& section, const std::string& key, const std::string& value);
std::string getValue(const std::string& section, const std::string& key, const std::string& defaultValue = "");
void removeKey(const std::string& section, const std::string& key);
void removeSection(const std::string& section);
bool sectionExists(const std::string& section);
bool keyExists(const std::string& section, const std::string& key);
};

View File

@@ -0,0 +1,123 @@
/*
* HOC Configurator - KIP Handler
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <string>
#include <cstdint>
#include <vector>
#include "defaults.hpp"
class KipHandler {
private:
std::string kipPath;
const uint8_t MAGIC[4] = {'C', 'U', 'S', 'T'};
struct KipData {
uint32_t custRev;
uint32_t mtcConf;
uint32_t commonCpuBoostClock;
uint32_t commonEmcMemVolt;
uint32_t eristaCpuMaxVolt;
uint32_t eristaEmcMaxClock;
uint32_t marikoCpuMaxVolt;
uint32_t marikoEmcMaxClock;
uint32_t marikoEmcVddqVolt;
uint32_t marikoCpuUV;
uint32_t marikoGpuUV;
uint32_t eristaCpuUV;
uint32_t eristaGpuUV;
uint32_t enableMarikoGpuUnsafeFreqs;
uint32_t enableEristaGpuUnsafeFreqs;
uint32_t enableMarikoCpuUnsafeFreqs;
uint32_t enableEristaCpuUnsafeFreqs;
uint32_t commonGpuVoltOffset;
uint32_t marikoEmcDvbShift;
// Memory timings
uint32_t t1_tRCD;
uint32_t t2_tRP;
uint32_t t3_tRAS;
uint32_t t4_tRRD;
uint32_t t5_tRFC;
uint32_t t6_tRTW;
uint32_t t7_tWTR;
uint32_t t8_tREFI;
uint32_t mem_burst_latency;
// Additional voltages
uint32_t marikoCpuVmin;
uint32_t eristaGpuVmin;
uint32_t marikoGpuVmin;
uint32_t marikoGpuVmax;
// GPU voltages for each frequency (Mariko)
uint32_t g_volt_76800;
uint32_t g_volt_153600;
uint32_t g_volt_230400;
uint32_t g_volt_307200;
uint32_t g_volt_384000;
uint32_t g_volt_460800;
uint32_t g_volt_537600;
uint32_t g_volt_614400;
uint32_t g_volt_691200;
uint32_t g_volt_768000;
uint32_t g_volt_844800;
uint32_t g_volt_921600;
uint32_t g_volt_998400;
uint32_t g_volt_1075200;
uint32_t g_volt_1152000;
uint32_t g_volt_1228800;
uint32_t g_volt_1267200;
uint32_t g_volt_1305600;
uint32_t g_volt_1344000;
uint32_t g_volt_1382400;
uint32_t g_volt_1420800;
uint32_t g_volt_1459200;
uint32_t g_volt_1497600;
uint32_t g_volt_1536000;
// GPU voltages for each frequency (Erista)
uint32_t g_volt_e_76800;
uint32_t g_volt_e_153600;
uint32_t g_volt_e_230400;
uint32_t g_volt_e_307200;
uint32_t g_volt_e_384000;
uint32_t g_volt_e_460800;
uint32_t g_volt_e_537600;
uint32_t g_volt_e_614400;
uint32_t g_volt_e_691200;
uint32_t g_volt_e_768000;
uint32_t g_volt_e_844800;
uint32_t g_volt_e_921600;
uint32_t g_volt_e_998400;
uint32_t g_volt_e_1075200;
};
KipData data;
public:
KipHandler(const std::string& path) : kipPath(path) {
// Initialize with defaults
Defaults::initDefaults(data);
}
bool readKip();
bool writeKip();
// Getters
KipData& getData() { return data; }
const KipData& getData() const { return data; }
// Setters for common values
void setCommonCpuBoostClock(uint32_t val) { data.commonCpuBoostClock = val; }
void setCommonEmcMemVolt(uint32_t val) { data.commonEmcMemVolt = val; }
void setMarikoCpuMaxVolt(uint32_t val) { data.marikoCpuMaxVolt = val; }
void setMarikoEmcMaxClock(uint32_t val) { data.marikoEmcMaxClock = val; }
void setMarikoEmcVddqVolt(uint32_t val) { data.marikoEmcVddqVolt = val; }
// Utility
std::string getKipPath() const { return kipPath; }
void setKipPath(const std::string& path) { kipPath = path; }
};

View File

@@ -0,0 +1,91 @@
/*
* HOC Configurator - UI Handler
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <string>
#include <vector>
#include <functional>
#include <switch.h>
// Forward declarations
class KipHandler;
class ValueEditor;
enum class EditorType {
TOGGLE,
FREQUENCY,
VOLTAGE,
SLIDER,
LIST
};
enum class MenuState {
MAIN,
GPU,
CPU,
RAM,
MISC,
ABOUT,
SETTINGS
};
class UI {
private:
MenuState currentState;
int selectedIndex;
int scrollOffset;
std::string statusMessage;
std::string kipPath;
bool kipLoaded;
bool autoSave;
KipHandler* kipHandler;
ValueEditor* editor;
const int MAX_VISIBLE_ITEMS = 20;
void renderMainMenu();
void renderGPUMenu();
void renderCPUMenu();
void renderRAMMenu();
void renderMiscMenu();
void renderAboutMenu();
void renderSettingsMenu();
void handleMainMenuInput(u64 kDown);
void handleGPUMenuInput(u64 kDown);
void handleCPUMenuInput(u64 kDown);
void handleRAMMenuInput(u64 kDown);
void handleMiscMenuInput(u64 kDown);
void handleAboutMenuInput(u64 kDown);
void handleSettingsMenuInput(u64 kDown);
void drawHeader();
void drawFooter();
void drawMenuItem(const std::string& text, bool selected, int y);
void drawText(const std::string& text, int x, int y);
void showValueEditor(const std::string& title, EditorType type, int currentValue,
std::function<void(int)> callback,
const std::vector<std::string>& options = {},
int min = 0, int max = 100, int step = 1);
public:
UI();
~UI();
void render();
void handleInput(u64 kDown);
void setStatus(const std::string& msg) { statusMessage = msg; }
void setKipPath(const std::string& path) { kipPath = path; }
void setKipLoaded(bool loaded) { kipLoaded = loaded; }
void setAutoSave(bool enabled) { autoSave = enabled; }
void setKipHandler(KipHandler* handler) { kipHandler = handler; }
std::string getStatus() const { return statusMessage; }
std::string getKipPath() const { return kipPath; }
bool isKipLoaded() const { return kipLoaded; }
bool isAutoSaveEnabled() const { return autoSave; }
};

View File

@@ -0,0 +1,43 @@
/*
* HOC Configurator - Value Editor
* Copyright (C) Dominatorul, Souldbminer
*/
#pragma once
#include <string>
#include <vector>
#include <functional>
#include <switch.h>
#include "ui.hpp" // This includes EditorType
class KipHandler;
struct EditorConfig {
std::string title;
EditorType type;
int currentValue;
int minValue;
int maxValue;
int step;
std::vector<std::string> options;
std::function<void(int)> onValueChange;
};
class ValueEditor {
private:
EditorConfig config;
int selectedValue;
bool active;
public:
ValueEditor();
void show(const EditorConfig& cfg);
void hide();
bool isActive() const { return active; }
void handleInput(u64 kDown);
void render();
int getSelectedValue() const { return selectedValue; }
};