Run [page minifier](https://www.npmjs.com/package/minify) locally before deployment

This commit is contained in:
KazushiM committed 2023-01-31 23:27:04 +08:00
1 parent a5e63bc034
commit 9cfe812247
6 files changed
+17 -826

No files matched your search

@@ -1,5 +1,5 @@
# Simple workflow for deploying static content to GitHub Pages
name: Deploy static content to Pages (Configurator)
name: Deploy static content to Pages
on:
# Runs on pushes targeting the default branch
@@ -32,22 +32,11 @@ jobs:
uses: actions/checkout@v3
- name: Setup Pages
uses: actions/configure-pages@v2
- name: HTML/CSS/JS Minifier
# You may pin to the exact commit or the version.
# uses: devatherock/minify-js@a25175eaf2c438680b21b73882d4837418e9d58b
uses: devatherock/minify-js@v1.0.3
with:
# File to minify or a folder containing files to minify. By default, all files in current folder and its subfolders will be minified
directory: './pages/dist' # optional
# Path where the minified files will be saved. By default, the minified files will be saved in the original file path
output: './pages/dist_min' # optional
# Indicates if the output files should have the suffix '.min' added after the name. Default is true
add_suffix: false # optional
- name: Upload artifact
uses: actions/upload-pages-artifact@v1
with:
# Upload entire repository
path: './pages/dist_min'
path: './pages/dist'
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v1
+11 -2
View File
@@ -1,6 +1,15 @@
#!/bin/bash
[ -d "./tmp" ] || mkdir ./tmp
[ -d "./dist" ] || mkdir ./dist
cp -Rf ./src/*.html ./dist/
# README_HTML=`pandoc -f gfm -t html5 ../README.md`
tsc ./src/main.ts --outDir ./dist/ -lib es2015,dom -t es2015
cp -Rf ./src/*.html ./tmp/
tsc ./src/main.ts --outDir ./tmp/ -lib es2015,dom -t es2015
for FILE in ./tmp/*; do
minify "${FILE}" > "./dist/${FILE/.\/tmp\/}"
done
rm -fr ./tmp
+1 -403
View File
@@ -1,403 +1 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Switch OC Suite | Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2.
</title>
<meta name="description"
content="Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2.">
<link rel="stylesheet" href="https://unpkg.com/@picocss/pico@latest/css/pico.min.css">
<style>
nav[role="tab-control"] > button {
border-radius: 0;
border-left-width: calc(var(--border-width) / 2);
border-right-width: calc(var(--border-width) / 2);
}
nav[role="tab-control"] > button:first-child {
border-top-left-radius: var(--border-radius);
border-bottom-left-radius: var(--border-radius);
border-left-width: var(--border-width);
}
nav[role="tab-control"] > button:last-child {
border-top-right-radius: var(--border-radius);
border-bottom-right-radius: var(--border-radius);
border-right-width: var(--border-width);
}
nav[role="tab-control"] > button:not(.secondary) {
pointer-events: none;
cursor: default;
}
div.cust-element {
margin: 1.5rem 0 1.5rem 0;
}
div.cust-element > blockquote {
margin-top: 0;
}
div#download_btn_grid > a {
margin: 0.5rem 0;
}
</style>
</head>
<body>
<div class="hero">
<nav class="container-fluid"
style="position: fixed; top: 0; z-index: 99; -webkit-backdrop-filter: blur(20px); backdrop-filter: blur(20px);">
<ul>
<li><a href="#head" class="contrast">Switch OC Suite</a></li>
</ul>
<ul>
<li><a href="#readme" class="secondary">Read Me</a></li>
<li><a href="#download" class="secondary">Download</a></li>
<li><a href="#config" class="secondary">Config</a></li>
<li><a href="https://github.com/KazushiMe/Switch-OC-Suite" class="contrast">
<svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 496 512" height="16px">
<path fill="currentColor"
d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z">
</path>
</svg>
</a></li>
</ul>
</nav>
<header class="container" style="padding-top: 6rem;">
<hgroup>
<h1>Switch OC Suite</h1>
<h2>Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2.</h2>
</hgroup>
</header>
</div>
<section aria-label="Read Me" id="readme">
<div class="container">
<article>
<header>
<hgroup>
<h2>Read Me</h2>
<h3>🚨DISCLAIMER: THIS IS PROVIDED AS IS. USE AT YOUR OWN RISK!🚨</h3>
</hgroup>
<li>
Overclocking in general will shorten the lifespan of some
hardware components. <strong>YOU ARE RESPONSIBLE for any problem or
potential damage</strong> if unsafe frequencies are ENABLED in
sys-clk-OC. Issues like asking for bypassing limit will BE IGNORED OR
CLOSED WITHOUT REPLY.
</li>
<li>
Due to HorizonOS design, instabilities from unsafe RAM clocks may
cause filesystem corruption. <strong>Always make backup before enabling
DRAM OC.</strong>
</li>
</header>
<body>
<h3>Features</h3>
<details>
<summary>For Erista variant (HAC-001)</summary>
<ul>
<li>CPU Overclock (Safe: 1785 MHz)
<ul>
<li>Unsafe
<ul>
<li>Due to the limit of board power draw or power IC</li>
<li>Unlockable frequencies up to 2091 MHz</li>
<li>See <a
href="https://github.com/KazushiMe/Switch-OC-Suite/blob/master/Source/sys-clk-OC/README.md"
target="_blank">README
for sys-clk-OC</a></li>
</ul>
</li>
</ul>
</li>
<li>DRAM Overclock (Safe: 1862.4 MHz)</li>
</ul>
</details>
<details>
<summary>For Mariko variant (HAC-001-01, HDH-001, HEG-001)</summary>
<ul>
<li>CPU / GPU Overclock (Safe: 1963 / 998 MHz)
<ul>
<li>Unsafe
<ul>
<li>Due to the limit of board power draw or power IC</li>
<li>Unlockable frequencies up to 2397 / 1305 MHz or 2295 / 1267 MHz</li>
<li>See <a
href="https://github.com/KazushiMe/Switch-OC-Suite/blob/master/Source/sys-clk-OC/README.md"
target="_blank">README
for sys-clk-OC</a></li>
</ul>
</li>
</ul>
</li>
<li>DRAM Overclock (Safe: 1996.8 MHz)</li>
</ul>
</details>
<details>
<summary>Modded sys-clk and ReverseNX-RT</summary>
<ul>
<li>Auto CPU Boost
<ul>
<li>For faster game loading</li>
<li>Enable CPU Boost (1785 MHz) when CPU Core#3 (System Core) is
stressed (mainly I/O operations).</li>
<li>Effective only when charger is connected.</li>
</ul>
</li>
<li>CPU &amp; GPU frequency governor (Experimental)
<ul>
<li>Adjust frequency based on load. Might decrease power draw but can
introduce stutters. Can be turned off for specific titles.</li>
</ul>
</li>
<li>Set charging current (100 mA - 2000 mA) and charging limit (20% -
100%)
<ul>
<li>Long-term use of charge limit may render the battery gauge
inaccurate. Performing full cycles could help recalibration, or try <a
href="https://github.com/CTCaer/battery_desync_fix_nx">battery_desync_fix_nx</a>.</li>
</ul>
</li>
<li>Global Profile
<ul>
<li>Designated a dummy title id <code>0xA111111111111111</code>.</li>
<li>Priority: "Temp overrides" &gt; "Application profile" &gt; "Global
profile" &gt; "System default".</li>
</ul>
</li>
<li>Sync ReverseNX Mode
<ul>
<li>No need to change clocks manually after toggling modes in ReverseNX
(-RT and -Tool)</li>
</ul>
</li>
</ul>
</details>
<details>
<summary>System Settings (Optional)</summary>
See <a
href="https://github.com/KazushiMe/Switch-OC-Suite/blob/master/system_settings.md">system_settings.md</a>
</details>
<h3 id="installation">Installation</h3>
<ol type="1">
<li>Download latest <a href="#download">release</a>.</li>
<li>Copy all files in <code>SdOut</code> to the root of SD card.</li>
<li>Grab <code>x.x.x_loader.kip</code> for your Atmosphere version, rename it to <code>loader.kip</code> and
place it in <code>/atmosphere/kips/</code>.</li>
<li>Customization via <a href="#config">online loader configurator</a>
<details>
<summary>Default config</summary>
<table role="grid">
<thead>
<tr>
<th>Defaults</th>
<th>Mariko</th>
<th>Erista</th>
</tr>
</thead>
<tbody>
<tr>
<td>CPU OC</td>
<td>2397 MHz Max</td>
<td>2091 MHz Max</td>
</tr>
<tr>
<td>CPU Boost</td>
<td>1785 MHz</td>
<td>N/A</td>
</tr>
<tr>
<td>CPU Volt</td>
<td>1235 mV Max</td>
<td>1235 mV Max</td>
</tr>
<tr>
<td>GPU OC</td>
<td>1305 MHz Max</td>
<td>N/A</td>
</tr>
<tr>
<td>RAM OC</td>
<td>1996 MHz Max</td>
<td>1862 MHz Max</td>
</tr>
<tr>
<td>RAM Volt</td>
<td>Disabled</td>
<td>Disabled</td>
</tr>
<tr>
<td>RAM Timing</td>
<td>Auto-Adjusted</td>
<td>Disabled</td>
</tr>
</tbody>
</table>
</details>
</li>
<li>Hekate-ipl bootloader Only
<ul>
<li>Add <code>kip1=atmosphere/kips/loader.kip</code> to boot entry
section in <code>bootloader/hekate_ipl.ini</code>.</li>
</ul>
</li>
</ol>
<details>
<summary><s>Deprecated: patching sysmodules manually</s></summary>
<ul>
<li>This method is only served as reference as it could damage your MMC file system if not handled
properly.</li>
<li>Patched sysmodules would be persistent until pcv or ptm was updated in new HOS (normally in
<code>x.0.0</code>).
</li>
<li>Tools:
<ul>
<li>Lockpick_RCM</li>
<li>TegraExplorer</li>
<li><a href="https://github.com/SciresM/hactool">hactool</a></li>
<li><a href="https://github.com/shuffle2/nx2elf">nx2elf</a></li>
<li>elf2nso from <a href="https://github.com/switchbrew/switch-tools/">switch-tools</a></li>
<li><a href="https://github.com/The-4n/hacPack">hacpack</a></li>
</ul>
</li>
</ul>
<ol type="1">
<li>Dump <code>prod.keys</code> with Lockpick_RCM</li>
<li>Dump HOS firmware with TegraExplorer</li>
<li>Configure and run <code>test_patch.sh</code> to generate patched pcv &amp; ptm sysmodules in nca</li>
<li>Replace nca in <code>SYSTEM:/Contents/registered/</code> with TegraExplorer</li>
<li><code>ValidateAcidSignature()</code> should be stubbed to allow unsigned sysmodules to load (a.k.a.
<code>loader_patch</code>)
</li>
</ol>
</details>
<details>
<summary>How to build this project</summary>
<ol type="1">
<li>Grab necessary patches from the repo, then compile sys-clk, ReverseNX-RT and Atmosphere loader with
devkitpro.</li>
<li>Before compiling Atmosphere loader, run <code>patch.py</code> in
<code>Atmosphere/stratosphere/loader/source/</code> to insert oc module into loader sysmodule.
</li>
<li>When compilation is done, uncompress the kip to make it work with configurator:
<code>hactool -t kip1 Atmosphere/stratosphere/loader/out/nintendo_nx_arm64_armv8a/release/loader.kip --uncompress=./loader.kip</code>
</li>
</ol>
</details>
<h3 id="faq">Frequently Asked Questions</h3>
<details>
<summary>How to enable unsafe frequencies in sys-clk-OC?</summary>
<li>Above all else, you should know <a href="#readme">what "unsafe" means and issues might arise</a>.</li>
<li>See the end of <a
href="https://github.com/KazushiMe/Switch-OC-Suite/blob/master/Source/sys-clk-OC/README.md"
target="_blank">README in sys-clk-OC</a>. Add this line <code>allow_unsafe_freq=1</code> into
<code>/config/sys-clk/config.ini</code>
</li>
</details>
<details>
<summary>I would like to bypass limit enforced in sys-clk to improve handheld performance without charger
connected.</summary>
<li>Never will it be implemented here, or work out of the box.</li>
<li>You have to modify the code yourself for your own use. If you are to share modified binaries you have
made based on this project publicly, make sure to comply with GPL v2 licenses.</li>
</details>
</body>
<footer>
<details role="list">
<summary aria-haspopup="listbox" role="button" class="secondary">
Acknowledgement
</summary>
<ul role="listbox">
<li><a href="https://github.com/CTCaer/hekate" target="_blank">CTCaer for Hekate-ipl bootloader, RE and
hardware research</a></li>
<li><a href="https://devkitpro.org/" target="_blank">devkitPro for All-In-One homebrew toolchains</a>
</li>
<li><a href="https://github.com/masagrator/ReverseNX-RT" target="_blank">masagrator for ReverseNX-RT and
info
on BatteryChargeInfoFields in psm module</a></li>
<li><a href="https://developer.nvidia.com/embedded/dlc/tegra-x1-technical-reference-manual"
target="_blank">Nvidia for Tegra X1 Technical Reference Manual</a></li>
<li><a href="https://github.com/retronx-team/sys-clk" target="_blank">RetroNX team for sys-clk</a></li>
<li><a href="https://github.com/Atmosphere-NX/Atmosphere" target="_blank">SciresM and Reswitched Team for
the
state-of-the-art Atmosphere CFW of Switch</a></li>
<li><a href="http://switchbrew.org/wiki/" target="_blank">Switchbrew wiki for Switch in-depth info</a>
</li>
<li><a href="https://gitlab.com/switchroot/kernel" target="_blank">Switchroot for their modified L4T
kernel
and device tree</a></li>
<li>ZatchyCatGames for RE and original OC loader patches for Atmosphere</li>
</ul>
</details>
</footer>
</article>
</div>
</section>
<section aria-label="Download" id="download">
<div class="container">
<article>
<header>
<hgroup>
<h2>Download</h2>
<h3>Get latest version of Switch OC Suite and its corresponding Atmosphere package here.</h3>
</hgroup>
</header>
<body>
<div class="grid" id="download_btn_grid">
<a role="button" aria-busy="true" id="loader_kip_btn">Generating link, please wait...</a>
<a role="button" aria-busy="true" id="sdout_zip_btn">Generating link, please wait...</a>
<a target="_blank" role="button" aria-busy="true" id="ams_btn">Generating link, please wait...</a>
</div>
</body>
<footer>
See <a href="#installation">Installation section</a> for how to use Switch OC Suite.
</footer>
</article>
</div>
</section>
<section aria-label="Config" id="config">
<div class="container">
<article>
<header>
<hgroup>
<h2>Configurator</h2>
<h3>Configure frequencies and voltages to suit your hardware and preferences.</h3>
</hgroup>
</header>
<body>
<nav role="tab-control">
<button class="" id="tab_all" data-filter="0" disabled>Show All</button>
<button class="outline secondary" id="tab_erista" data-filter="1" disabled>For Erista</button>
<button class="outline secondary" id="tab_mariko" data-filter="2" disabled>For Mariko</button>
</nav>
<form id="form">
<label for="file">
<input id="file" type="file">
<p id="cust_rev">Upload loader.kip here</p>
</label>
</form>
</body>
<footer>
<div class="grid">
<button id="load_default" role="button" disabled>Load Default</button>
<button id="load_saved" role="button" disabled>Load Last Saved</button>
<button id="save" role="button" disabled>Save</button>
</div>
</footer>
</article>
</div>
</section>
<footer class="container">
<small>Build with <a href="https://picocss.com" target="_blank">Pico</a></small>
</footer>
</body>
<script type="text/javascript" src="./main.js"></script>
</html>
<!doctype html><html lang=en><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Switch OC Suite | Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2.</title><meta name=description content="Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2."><link rel=stylesheet href=https://unpkg.com/@picocss/pico@latest/css/pico.min.css><style>nav[role=tab-control]>button{border-radius:0;border-left-width:calc(var(--border-width)/ 2);border-right-width:calc(var(--border-width)/ 2)}nav[role=tab-control]>button:first-child{border-top-left-radius:var(--border-radius);border-bottom-left-radius:var(--border-radius);border-left-width:var(--border-width)}nav[role=tab-control]>button:last-child{border-top-right-radius:var(--border-radius);border-bottom-right-radius:var(--border-radius);border-right-width:var(--border-width)}nav[role=tab-control]>button:not(.secondary){pointer-events:none;cursor:default}div.cust-element{margin:1.5rem 0 1.5rem 0}div.cust-element>blockquote{margin-top:0}div#download_btn_grid>a{margin:.5rem 0}</style><div class=hero><nav class=container-fluid style=position:fixed;top:0;z-index:99;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)><ul><li><a href=#head class=contrast>Switch OC Suite</a></ul><ul><li><a href=#readme class=secondary>Read Me</a><li><a href=#download class=secondary>Download</a><li><a href=#config class=secondary>Config</a><li><a href=https://github.com/KazushiMe/Switch-OC-Suite class=contrast><svg aria-hidden=true focusable=false role=img xmlns=http://www.w3.org/2000/svg viewBox="0 0 496 512" height=16px><path fill=currentColor d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></a></ul></nav><header class=container style=padding-top:6rem><hgroup><h1>Switch OC Suite</h1><h2>Overclocking suite for Horizon OS (HOS) running on Atmosphere CFW. Licensed under GPL v2.</h2></hgroup></header></div><section aria-label="Read Me" id=readme><div class=container><article><header><hgroup><h2>Read Me</h2><h3>🚨DISCLAIMER: THIS IS PROVIDED AS IS. USE AT YOUR OWN RISK!🚨</h3></hgroup><li>Overclocking in general will shorten the lifespan of some hardware components. <strong>YOU ARE RESPONSIBLE for any problem or potential damage</strong> if unsafe frequencies are ENABLED in sys-clk-OC. Issues like asking for bypassing limit will BE IGNORED OR CLOSED WITHOUT REPLY.<li>Due to HorizonOS design, instabilities from unsafe RAM clocks may cause filesystem corruption. <strong>Always make backup before enabling DRAM OC.</strong></header><h3>Features</h3><details><summary>For Erista variant (HAC-001)</summary><ul><li>CPU Overclock (Safe: 1785 MHz)<ul><li>Unsafe<ul><li>Due to the limit of board power draw or power IC<li>Unlockable frequencies up to 2091 MHz<li>See <a href=https://github.com/KazushiMe/Switch-OC-Suite/blob/master/Source/sys-clk-OC/README.md target=_blank>README for sys-clk-OC</a></ul></ul><li>DRAM Overclock (Safe: 1862.4 MHz)</ul></details><details><summary>For Mariko variant (HAC-001-01, HDH-001, HEG-001)</summary><ul><li>CPU / GPU Overclock (Safe: 1963 / 998 MHz)<ul><li>Unsafe<ul><li>Due to the limit of board power draw or power IC<li>Unlockable frequencies up to 2397 / 1305 MHz or 2295 / 1267 MHz<li>See <a href=https://github.com/KazushiMe/Switch-OC-Suite/blob/master/Source/sys-clk-OC/README.md target=_blank>README for sys-clk-OC</a></ul></ul><li>DRAM Overclock (Safe: 1996.8 MHz)</ul></details><details><summary>Modded sys-clk and ReverseNX-RT</summary><ul><li>Auto CPU Boost<ul><li>For faster game loading<li>Enable CPU Boost (1785 MHz) when CPU Core#3 (System Core) is stressed (mainly I/O operations).<li>Effective only whenLine truncated
+1 -405
View File
@@ -1,405 +1 @@
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
/* Config: Cust */
const CUST_REV = 3;
var buffer;
var CustPlatform;
(function (CustPlatform) {
CustPlatform[CustPlatform["Undefined"] = 0] = "Undefined";
CustPlatform[CustPlatform["Erista"] = 1] = "Erista";
CustPlatform[CustPlatform["Mariko"] = 2] = "Mariko";
CustPlatform[CustPlatform["All"] = 3] = "All";
})(CustPlatform || (CustPlatform = {}));
;
class CustEntry {
constructor(id, name, platform, size, desc, defval, minmax = [0, 1000000], step = 1, zeroable = true) {
this.id = id;
this.name = name;
this.platform = platform;
this.size = size;
this.desc = desc;
this.defval = defval;
this.min = minmax[0];
this.max = minmax[1];
this.step = step;
this.zeroable = zeroable;
}
;
validate() {
let tip = new ErrorToolTip(this.id);
tip.clear();
if (Number.isNaN(this.value) || !this.value) {
tip.setMsg(`Invalid value: Not a number`);
tip.show();
return false;
}
if (this.zeroable && this.value == 0)
return true;
if (this.value < this.min || this.value > this.max) {
tip.setMsg(`Expected range: [${this.min}, ${this.max}], got ${this.value}.`);
tip.show();
return false;
}
if (this.value % this.step != 0) {
tip.setMsg(`${this.value} % ${this.step} ≠ 0`);
tip.show();
return false;
}
return true;
}
;
getInputElement() {
return document.getElementById(this.id);
}
updateValueFromElement() {
this.value = Number(this.getInputElement().value);
}
isAvailableFor(platform) {
return platform === CustPlatform.Undefined || this.platform === platform || this.platform === CustPlatform.All;
}
createElement() {
let form = document.getElementById("form");
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 = this.desc;
desc.setAttribute("for", this.id);
grid.appendChild(desc);
form.appendChild(grid);
let tooltip = new ErrorToolTip(this.id);
tooltip.addChangeListener();
}
input.value = String(this.value);
}
setElementDefaultValue() {
document.getElementById(this.id).value = String(this.defval);
}
removeElement() {
let input = this.getInputElement();
if (input) {
input.parentElement.parentElement.remove();
}
}
showElement() {
let input = this.getInputElement();
if (input) {
input.parentElement.parentElement.style.removeProperty("display");
}
}
hideElement() {
let input = this.getInputElement();
if (input) {
input.parentElement.parentElement.style.setProperty("display", "none");
}
}
}
var CustTable = [
new CustEntry("mtcConf", "DRAM Timing", CustPlatform.Mariko, 2, "<li><b>0</b>: AUTO_ADJ_MARIKO_SAFE: Auto adjust timings for LPDDR4 ≤3733 Mbps specs, 8Gb density. (Default)</li>\
<li><b>1</b>: AUTO_ADJ_MARIKO_4266: Auto adjust timings for LPDDR4X 4266 Mbps specs, 8Gb density.</li>\
<li><b>2</b>: NO_ADJ_ALL: No timing adjustment for both Erista and Mariko. Might achieve better performance on Mariko but lower maximum frequency is expected.", 0, [0, 2], 1),
new CustEntry("marikoCpuMaxClock", "Mariko CPU Max Clock in kHz", CustPlatform.Mariko, 4, "<li>System default: 1785000</li>\
<li>2397000 might be unreachable for some SoCs.</li>", 2397000, [1785000, 3000000], 1),
new CustEntry("marikoCpuBoostClock", "Mariko CPU Boost Clock in kHz", CustPlatform.Mariko, 4, "<li>System default: 1785000</li>\
<li>Boost clock will be applied when applications request higher CPU frequency for quicker loading.</li>\
<li>This will be set regardless of whether sys-clk is enabled.</li>", 1785000, [1020000, 3000000], 1, false),
new CustEntry("marikoCpuMaxVolt", "Mariko CPU Max Voltage in mV", CustPlatform.Mariko, 4, "<li>System default: 1120</li>\
<li>Acceptable range: 1100 ≤ x ≤ 1300</li>", 1235, [1100, 1300], 5),
new CustEntry("marikoGpuMaxClock", "Mariko GPU Max Clock in kHz", CustPlatform.Mariko, 4, "<li>System default: 921600</li>\
<li>Tegra X1+ official maximum: 1267200</li>\
<li>1305600 might be unreachable for some SoCs.</li>", 1305600, [768000, 1536000], 100),
new CustEntry("marikoEmcMaxClock", "Mariko RAM Max Clock in kHz", CustPlatform.Mariko, 4, "<li>Values should be ≥ 1600000, and divided evenly by 3200.</li>\
<li><b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM</li>", 1996800, [1600000, 2400000], 3200),
new CustEntry("marikoEmcVddqVolt", "EMC Vddq (Mariko Only) Voltage in uV", CustPlatform.Mariko, 4, "<li>Acceptable range: 550000 ≤ x ≤ 650000</li>\
<li>Value should be divided evenly by 5000</li>\
<li>Default: 600000</li>\
<li>Not enabled by default.</li>\
<li>This will not work without sys-clk-OC.</li>", 0, [550000, 650000], 5000),
new CustEntry("eristaCpuMaxVolt", "Erista CPU Max Voltage in mV", CustPlatform.Erista, 4, "<li>Acceptable range: 1100 ≤ x ≤ 1300</li>", 1235, [1100, 1300], 1),
new CustEntry("eristaEmcMaxClock", "Erista RAM Max Clock in kHz", CustPlatform.Erista, 4, "<li>Values should be ≥ 1600000, and divided evenly by 3200.</li>\
<li><b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM</li>", 1862400, [1600000, 2400000], 3200),
new CustEntry("commonEmcMemVolt", "EMC Vddq (Erista Only) & RAM Vdd2 Voltage in uV", CustPlatform.All, 4, "<li>Acceptable range: 1100000 ≤ x ≤ 1250000, and it should be divided evenly by 12500.</li>\
<li>Erista Default (HOS): 1125000 (bootloader: 1100000)</li>\
<li>Mariko Default: 1100000 (It will not work without sys-clk-OC)</li>\
<li>Not enabled by default</li>", 0, [1100000, 1250000], 12500),
];
function FindMagicOffset(buffer) {
let view = new DataView(buffer);
for (let i = 0; i < view.byteLength; i += 4) {
if (view.getUint32(i, true) == 0x54535543) { // "CUST"
return i;
}
}
throw new Error("Invalid loader.kip file");
}
class ErrorToolTip {
constructor(id, msg) {
this.id = id;
this.element = document.getElementById(id);
if (msg) {
this.setMsg(msg);
}
}
;
setMsg(msg) {
this.message = msg;
}
show() {
if (this.element) {
this.element.setAttribute("aria-invalid", "true");
if (this.message) {
this.element.setAttribute("title", this.message);
this.element.parentElement.setAttribute("data-tooltip", this.message);
this.element.parentElement.setAttribute("data-placement", "top");
}
}
}
;
clear() {
if (this.element) {
this.element.removeAttribute("aria-invalid");
this.element.removeAttribute("title");
this.element.parentElement.removeAttribute("data-tooltip");
this.element.parentElement.removeAttribute("data-placement");
}
}
addChangeListener() {
if (this.element) {
this.element.addEventListener('change', (_evt) => {
let obj = CustTable.filter((obj) => { return obj.id === this.id; })[0];
obj.value = Number(this.element.value);
obj.validate();
});
}
}
}
;
function SaveCust(buffer) {
let view = new DataView(buffer);
let storage = {};
CustTable.forEach(i => {
i.updateValueFromElement();
if (!i.validate() || !i.value) {
document.getElementById(i.id).focus();
throw new Error(`Invalid ${i.name}`);
}
if (!i.offset) {
document.getElementById(i.id).focus();
throw new Error(`Failed to get offset for ${i.name}`);
;
}
switch (i.size) {
case 2:
view.setUint16(i.offset, i.value, true);
break;
case 4:
view.setUint32(i.offset, i.value, true);
break;
default:
document.getElementById(i.id).focus();
throw new Error(`Unknown size at ${i.name}`);
}
storage[i.id] = i.value;
});
storage["custRev"] = CUST_REV;
localStorage.setItem("last_saved", JSON.stringify(storage));
let a = document.createElement("a");
a.href = window.URL.createObjectURL(new Blob([buffer], { type: "application/octet-stream" }));
a.download = "loader.kip";
a.click();
}
function LastSaved() {
let storage = localStorage.getItem("last_saved");
if (!storage) {
return false;
}
let sObj = JSON.parse(storage);
if (!sObj["custRev"] || sObj["custRev"] != CUST_REV) {
localStorage.removeItem("last_saved");
return false;
}
return true;
}
function CustNavTabsInit() {
const custNavTabs = Array.from(document.querySelectorAll(`nav[role="tab-control"] > button`));
custNavTabs.forEach(i => {
i.removeAttribute("disabled");
let platform = Number(i.getAttribute("data-filter"));
i.addEventListener('click', (_evt) => {
const unfocusedClasses = ["outline", "secondary"];
i.classList.remove(...unfocusedClasses);
custNavTabs.filter(j => j != i).forEach(k => k.classList.add(...unfocusedClasses));
CustTable.forEach(e => {
if (e.isAvailableFor(platform)) {
e.showElement();
}
else {
e.hideElement();
}
});
});
});
}
function UpdateHTMLForm() {
CustTable.forEach(i => i.createElement());
let default_btn = document.getElementById("load_default");
default_btn.removeAttribute("disabled");
default_btn.addEventListener('click', () => {
CustTable.forEach(i => i.setElementDefaultValue());
});
let last_btn = document.getElementById("load_saved");
if (LastSaved()) {
last_btn.style.removeProperty("display");
last_btn.removeAttribute("disabled");
last_btn.addEventListener('click', () => {
// Load last saved from localStorage
JSON.parse(localStorage.getItem("last_saved"))
.filter((key) => key != "custRev")
.forEach((key) => document.getElementById(key).value = key);
});
}
else {
last_btn.style.setProperty("display", "none");
}
let save_btn = document.getElementById("save");
save_btn.removeAttribute("disabled");
save_btn.addEventListener('click', () => {
try {
SaveCust(buffer);
}
catch (e) {
console.log(e);
alert(e);
}
});
}
function ParseCust(magicOffset, buffer) {
let view = new DataView(buffer);
let offset = magicOffset + 4;
let rev = view.getUint16(offset, true);
offset += 2;
if (rev != CUST_REV) {
throw new Error(`Unsupported custRev, expected: ${CUST_REV}, got ${rev}`);
}
document.getElementById("cust_rev").innerHTML = `Cust V${CUST_REV} is loaded.`;
CustTable.forEach(i => {
i.offset = offset;
switch (i.size) {
case 2:
i.value = view.getUint16(offset, true);
break;
case 4:
i.value = view.getUint32(offset, true);
break;
default:
document.getElementById(i.id).focus();
throw new Error("Unknown size at " + i);
}
offset += i.size;
i.validate();
});
}
const fileInput = document.getElementById("file");
fileInput.addEventListener('change', (event) => {
let reader = new FileReader();
reader.readAsArrayBuffer(event.target.files[0]);
reader.onloadend = (progEvent) => {
if (progEvent.target.readyState === FileReader.DONE) {
buffer = (progEvent.target.result);
try {
let offset = FindMagicOffset(buffer);
CustTable.forEach(i => i.removeElement());
ParseCust(offset, buffer);
CustNavTabsInit();
UpdateHTMLForm();
}
catch (e) {
console.log(e);
alert(e);
fileInput.value = "";
}
}
};
});
function fetchRelease() {
return __awaiter(this, void 0, void 0, function* () {
try {
const responseFromSuite = yield fetch('https://api.github.com/repos/KazushiMe/Switch-OC-Suite/releases/latest', {
method: 'GET',
headers: {
Accept: 'application/json',
},
});
if (!responseFromSuite.ok) {
throw new Error(`Failed to fetch latest release info from GitHub: ${responseFromSuite.status}`);
}
const resultFromSuite = yield responseFromSuite.json();
const latestVerFromSuite = resultFromSuite.tag_name;
const amsVer = latestVerFromSuite.split(".").slice(0, 3).join(".");
const loaderKip = resultFromSuite.assets.filter((obj) => {
return obj.name.endsWith("loader.kip");
})[0];
const sdOut = resultFromSuite.assets.filter((obj) => {
return obj.name.endsWith(".zip");
})[0];
const amsReleaseUrl = `https://github.com/Atmosphere-NX/Atmosphere/releases/tags/${amsVer}`;
let info = {
OCSuiteVer: latestVerFromSuite,
LoaderKipUrl: loaderKip.browser_download_url,
LoaderKipTime: loaderKip.updated_at,
SdOutZipUrl: sdOut.browser_download_url,
SdOutZipTime: sdOut.updated_at,
AMSVer: amsVer,
AMSUrl: amsReleaseUrl
};
return info;
}
catch (e) {
console.log(e);
alert(e);
}
});
}
function updateDownloadUrls() {
return __awaiter(this, void 0, void 0, function* () {
const updateHref = (id, name, url) => {
let element = document.getElementById(id);
element.innerHTML = name;
element.removeAttribute("aria-busy");
element.setAttribute("href", url);
};
let info = yield fetchRelease();
if (info) {
const loaderKipName = `loader.kip <b>${info.OCSuiteVer}</b><br>${info.LoaderKipTime}`;
updateHref("loader_kip_btn", loaderKipName, info.LoaderKipUrl);
const sdOutName = `SdOut.zip <b>${info.OCSuiteVer}</b><br>${info.SdOutZipTime}`;
updateHref("sdout_zip_btn", sdOutName, info.SdOutZipUrl);
const amsName = `Atmosphere-NX <b>${info.AMSVer}</b>`;
updateHref("ams_btn", amsName, info.AMSUrl);
}
});
}
addEventListener('DOMContentLoaded', (_evt) => __awaiter(this, void 0, void 0, function* () {
yield updateDownloadUrls();
}));
var __awaiter=this&&this.__awaiter||function(e,t,i,a){return new(i||(i=Promise))((function(l,r){function n(e){try{o(a.next(e))}catch(e){r(e)}}function s(e){try{o(a.throw(e))}catch(e){r(e)}}function o(e){var t;e.done?l(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(n,s)}o((a=a.apply(e,t||[])).next())}))};const CUST_REV=3;var buffer,CustPlatform;!function(e){e[e.Undefined=0]="Undefined",e[e.Erista=1]="Erista",e[e.Mariko=2]="Mariko",e[e.All=3]="All"}(CustPlatform||(CustPlatform={}));class CustEntry{constructor(e,t,i,a,l,r,n=[0,1e6],s=1,o=!0){this.id=e,this.name=t,this.platform=i,this.size=a,this.desc=l,this.defval=r,this.min=n[0],this.max=n[1],this.step=s,this.zeroable=o}validate(){let e=new ErrorToolTip(this.id);return e.clear(),Number.isNaN(this.value)||!this.value?(e.setMsg("Invalid value: Not a number"),e.show(),!1):!(!this.zeroable||0!=this.value)||(this.value<this.min||this.value>this.max?(e.setMsg(`Expected range: [${this.min}, ${this.max}], got ${this.value}.`),e.show(),!1):this.value%this.step==0||(e.setMsg(`${this.value} % ${this.step} ≠ 0`),e.show(),!1))}getInputElement(){return document.getElementById(this.id)}updateValueFromElement(){this.value=Number(this.getInputElement().value)}isAvailableFor(e){return e===CustPlatform.Undefined||this.platform===e||this.platform===CustPlatform.All}createElement(){let e=this.getInputElement();if(!e){let t=document.createElement("div");t.classList.add("grid","cust-element"),e=document.createElement("input"),e.min=String(this.zeroable?0:this.min),e.max=String(this.max),e.id=this.id,e.type="number",e.step=String(this.step);let i=document.createElement("label");i.setAttribute("for",this.id),i.innerHTML=this.name,i.appendChild(e),t.appendChild(i);let a=document.createElement("blockquote");a.innerHTML=this.desc,a.setAttribute("for",this.id),t.appendChild(a),document.getElementById("form").appendChild(t),new ErrorToolTip(this.id).addChangeListener()}e.value=String(this.value)}setElementDefaultValue(){document.getElementById(this.id).value=String(this.defval)}removeElement(){let e=this.getInputElement();e&&e.parentElement.parentElement.remove()}showElement(){let e=this.getInputElement();e&&e.parentElement.parentElement.style.removeProperty("display")}hideElement(){let e=this.getInputElement();e&&e.parentElement.parentElement.style.setProperty("display","none")}}var CustTable=[new CustEntry("mtcConf","DRAM Timing",CustPlatform.Mariko,2,"<li><b>0</b>: AUTO_ADJ_MARIKO_SAFE: Auto adjust timings for LPDDR4 ≤3733 Mbps specs, 8Gb density. (Default)</li> <li><b>1</b>: AUTO_ADJ_MARIKO_4266: Auto adjust timings for LPDDR4X 4266 Mbps specs, 8Gb density.</li> <li><b>2</b>: NO_ADJ_ALL: No timing adjustment for both Erista and Mariko. Might achieve better performance on Mariko but lower maximum frequency is expected.",0,[0,2],1),new CustEntry("marikoCpuMaxClock","Mariko CPU Max Clock in kHz",CustPlatform.Mariko,4,"<li>System default: 1785000</li> <li>2397000 might be unreachable for some SoCs.</li>",2397e3,[1785e3,3e6],1),new CustEntry("marikoCpuBoostClock","Mariko CPU Boost Clock in kHz",CustPlatform.Mariko,4,"<li>System default: 1785000</li> <li>Boost clock will be applied when applications request higher CPU frequency for quicker loading.</li> <li>This will be set regardless of whether sys-clk is enabled.</li>",1785e3,[102e4,3e6],1,!1),new CustEntry("marikoCpuMaxVolt","Mariko CPU Max Voltage in mV",CustPlatform.Mariko,4,"<li>System default: 1120</li> <li>Acceptable range: 1100 ≤ x ≤ 1300</li>",1235,[1100,1300],5),new CustEntry("marikoGpuMaxClock","Mariko GPU Max Clock in kHz",CustPlatform.Mariko,4,"<li>System default: 921600</li> <li>Tegra X1+ official maximum: 1267200</li> <li>1305600 might be unreachable for some SoCs.</li>",1305600,[768e3,1536e3],100),new CustEntry("marikoEmcMaxClock","Mariko RAM Max Clock in kHz",CustPlatform.Mariko,4,"<li>Values should be ≥ 1600000, and divided evenly by 3200.</li> <li><b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM</li>",1996800,[16e5,24e5],3200),new CustEntry("marikoEmcVddqVolt","EMC Vddq (Mariko Only) Voltage in uV",CustPlatform.Mariko,4,"<li>Acceptable range: 550000 ≤ x ≤ 650000</li> <li>Value should be divided evenly by 5000</li> <li>Default: 600000</li> <li>Not enabled by default.</li> <li>This will not work without sys-clk-OC.</li>",0,[55e4,65e4],5e3),new CustEntry("eristaCpuMaxVolt","Erista CPU Max Voltage in mV",CustPlatform.Erista,4,"<li>Acceptable range: 1100 ≤ x ≤ 1300</li>",1235,[1100,1300],1),new CustEntry("eristaEmcMaxClock","Erista RAM Max Clock in kHz",CustPlatform.Erista,4,"<li>Values should be ≥ 1600000, and divided evenly by 3200.</li> <li><b>WARNING:</b> RAM overclock could be UNSTABLE if timing parameters are not suitable for your DRAM</li>",1862400,[16e5,24e5],3200),new CustEntry("commonEmcMemVolt","EMC Vddq (Erista Only) & RAM Vdd2 Voltage in uV",CustPlatform.All,4,"<liLine truncated
+1 -1
View File
@@ -380,7 +380,7 @@
<form id="form">
<label for="file">
<input id="file" type="file">
<p id="cust_rev">Upload loader.kip here</p>
<small id="cust_rev">Upload loader.kip here</small>
</label>
</form>
</body>
+1 -2
View File
@@ -72,7 +72,6 @@ class CustEntry {
}
createElement() {
let form = document.getElementById("form")!;
let input = this.getInputElement();
if (!input) {
let grid = document.createElement("div");
@@ -97,7 +96,7 @@ class CustEntry {
desc.setAttribute("for", this.id);
grid.appendChild(desc);
form.appendChild(grid);
document.getElementById("form")!.appendChild(grid);
let tooltip = new ErrorToolTip(this.id);
tooltip.addChangeListener();