sysclk: fix display rate bug on lite

This commit is contained in:
souldbminersmwc
2026-01-03 21:10:18 -05:00
parent fca0c3ae15
commit c892b08097
10 changed files with 74 additions and 39 deletions

View File

@@ -24,6 +24,7 @@
* --------------------------------------------------------------------------
*/
// Note: Hoag crashes on display refresh rate init while in sleep mode
#include <nxExt.h>
#include "board.h"
@@ -254,16 +255,17 @@ void Board::Initialize()
if (hosversionAtLeast(6,0,0) && R_SUCCEEDED(pwmInitialize())) {
pwmCheck = pwmOpenSession2(&g_ICon, 0x3D000001);
}
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite) {
u64 clkVirtAddr, dsiVirtAddr, outsize;
rc = svcQueryMemoryMapping(&clkVirtAddr, &outsize, 0x60006000, 0x1000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (clk)");
rc = svcQueryMemoryMapping(&dsiVirtAddr, &outsize, 0x54300000, 0x40000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (dsi)");
u64 clkVirtAddr, dsiVirtAddr, outsize;
rc = svcQueryMemoryMapping(&clkVirtAddr, &outsize, 0x60006000, 0x1000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (clk)");
rc = svcQueryMemoryMapping(&dsiVirtAddr, &outsize, 0x54300000, 0x40000);
ASSERT_RESULT_OK(rc, "svcQueryMemoryMapping (dsi)");
DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr};
DisplayRefreshConfig cfg = {.clkVirtAddr = clkVirtAddr, .dsiVirtAddr = dsiVirtAddr};
DisplayRefresh_Initialize(&cfg);
DisplayRefresh_Initialize(&cfg);
}
FetchHardwareInfos();
}
@@ -366,6 +368,8 @@ void Board::Exit()
rgltrExit();
batteryInfoExit();
pmdmntExit();
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite)
DisplayRefresh_Shutdown();
}
SysClkProfile Board::GetProfile()
@@ -400,7 +404,7 @@ void Board::SetHz(SysClkModule module, std::uint32_t hz)
{
Result rc = 0;
if(module == HorizonOCModule_Display) {
if(module == HorizonOCModule_Display && Board::GetConsoleType() != HorizonOCConsoleType_Lite) {
DisplayRefresh_SetRate(hz);
return;
}
@@ -430,7 +434,10 @@ std::uint32_t Board::GetHz(SysClkModule module)
std::uint32_t hz = 0;
if(module == HorizonOCModule_Display) {
DisplayRefresh_GetRate(&hz, false);
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite)
DisplayRefresh_GetRate(&hz, false);
else
hz = 60;
return hz;
}
@@ -467,7 +474,10 @@ std::uint32_t Board::GetRealHz(SysClkModule module)
case SysClkModule_MEM:
return t210ClkMemFreq();
case HorizonOCModule_Display:
DisplayRefresh_GetRate(&hz, false);
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite)
DisplayRefresh_GetRate(&hz, false);
else
hz = 60;
return hz;
default:
ASSERT_ENUM_VALID(SysClkModule, module);
@@ -662,11 +672,15 @@ void Board::ResetToStockGpu()
}
void Board::ResetToStockDisplay() {
DisplayRefresh_SetRate(60);
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite)
DisplayRefresh_SetRate(60);
}
u8 Board::GetHighestDockedDisplayRate() {
return DisplayRefresh_GetDockedHighestAllowed();
if(Board::GetConsoleType() != HorizonOCConsoleType_Lite)
return DisplayRefresh_GetDockedHighestAllowed();
else
return 60;
}
std::uint32_t Board::GetTemperatureMilli(SysClkThermalSensor sensor)