sysclk: add speedo/iddq reading
This commit is contained in:
@@ -119,6 +119,14 @@ typedef enum
|
|||||||
} ReverseNXMode;
|
} ReverseNXMode;
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
HorizonOCSpeedo_CPU = 0,
|
||||||
|
HorizonOCSpeedo_GPU,
|
||||||
|
HorizonOCSpeedo_SOC,
|
||||||
|
HorizonOCSpeedo_EnumMax,
|
||||||
|
} HorizonOCSpeedo;
|
||||||
|
|
||||||
|
|
||||||
#define SYSCLK_ENUM_VALID(n, v) ((v) < n##_EnumMax)
|
#define SYSCLK_ENUM_VALID(n, v) ((v) < n##_EnumMax)
|
||||||
|
|
||||||
static inline const char* sysclkFormatModule(SysClkModule module, bool pretty)
|
static inline const char* sysclkFormatModule(SysClkModule module, bool pretty)
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ typedef struct
|
|||||||
uint32_t perfConfId;
|
uint32_t perfConfId;
|
||||||
u8 maxDisplayFreq;
|
u8 maxDisplayFreq;
|
||||||
u8 fps;
|
u8 fps;
|
||||||
|
u16 speedos[HorizonOCSpeedo_EnumMax];
|
||||||
} SysClkContext;
|
} SysClkContext;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|||||||
@@ -279,6 +279,7 @@ void BaseMenuGui::refresh()
|
|||||||
sprintf(displayStrings[25], "%u Hz", context->realFreqs[HorizonOCModule_Display]);
|
sprintf(displayStrings[25], "%u Hz", context->realFreqs[HorizonOCModule_Display]);
|
||||||
|
|
||||||
sprintf(displayStrings[26], "%u.%u mV", context->voltages[HocClkVoltage_Display] / 1000U, context->voltages[HocClkVoltage_Display] % 1000U);
|
sprintf(displayStrings[26], "%u.%u mV", context->voltages[HocClkVoltage_Display] / 1000U, context->voltages[HocClkVoltage_Display] % 1000U);
|
||||||
|
//sprintf(displayStrings[26], "%u", context->speedos[HorizonOCSpeedo_CPU]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"is_retail": true,
|
"is_retail": true,
|
||||||
"pool_partition": 2,
|
"pool_partition": 2,
|
||||||
"is_64_bit": true,
|
"is_64_bit": true,
|
||||||
"address_space_type": 3,
|
"address_space_type": 1,
|
||||||
"filesystem_access": {
|
"filesystem_access": {
|
||||||
"permissions": "0xFFFFFFFFFFFFFFFF"
|
"permissions": "0xFFFFFFFFFFFFFFFF"
|
||||||
},
|
},
|
||||||
@@ -60,66 +60,135 @@
|
|||||||
{
|
{
|
||||||
"type": "syscalls",
|
"type": "syscalls",
|
||||||
"value": {
|
"value": {
|
||||||
"svcSetHeapSize": "0x01",
|
"svcUnknown": "0x00",
|
||||||
"svcSetMemoryPermission": "0x02",
|
"svcSetHeapSize": "0x01",
|
||||||
"svcSetMemoryAttribute": "0x03",
|
"svcSetMemoryPermission": "0x02",
|
||||||
"svcMapMemory": "0x04",
|
"svcSetMemoryAttribute": "0x03",
|
||||||
"svcUnmapMemory": "0x05",
|
"svcMapMemory": "0x04",
|
||||||
"svcQueryMemory": "0x06",
|
"svcUnmapMemory": "0x05",
|
||||||
"svcExitProcess": "0x07",
|
"svcQueryMemory": "0x06",
|
||||||
"svcCreateThread": "0x08",
|
"svcExitProcess": "0x07",
|
||||||
"svcStartThread": "0x09",
|
"svcCreateThread": "0x08",
|
||||||
"svcExitThread": "0x0a",
|
"svcStartThread": "0x09",
|
||||||
"svcSleepThread": "0x0b",
|
"svcExitThread": "0x0a",
|
||||||
"svcGetThreadPriority": "0x0c",
|
"svcSleepThread": "0x0b",
|
||||||
"svcSetThreadPriority": "0x0d",
|
"svcGetThreadPriority": "0x0c",
|
||||||
"svcGetThreadCoreMask": "0x0e",
|
"svcSetThreadPriority": "0x0d",
|
||||||
"svcSetThreadCoreMask": "0x0f",
|
"svcGetThreadCoreMask": "0x0e",
|
||||||
"svcGetCurrentProcessorNumber": "0x10",
|
"svcSetThreadCoreMask": "0x0f",
|
||||||
"svcSignalEvent": "0x11",
|
"svcGetCurrentProcessorNumber": "0x10",
|
||||||
"svcClearEvent": "0x12",
|
"svcSignalEvent": "0x11",
|
||||||
"svcMapSharedMemory": "0x13",
|
"svcClearEvent": "0x12",
|
||||||
"svcUnmapSharedMemory": "0x14",
|
"svcMapSharedMemory": "0x13",
|
||||||
"svcCreateTransferMemory": "0x15",
|
"svcUnmapSharedMemory": "0x14",
|
||||||
"svcCloseHandle": "0x16",
|
"svcCreateTransferMemory": "0x15",
|
||||||
"svcResetSignal": "0x17",
|
"svcCloseHandle": "0x16",
|
||||||
"svcWaitSynchronization": "0x18",
|
"svcResetSignal": "0x17",
|
||||||
"svcCancelSynchronization": "0x19",
|
"svcWaitSynchronization": "0x18",
|
||||||
"svcArbitrateLock": "0x1a",
|
"svcCancelSynchronization": "0x19",
|
||||||
"svcArbitrateUnlock": "0x1b",
|
"svcArbitrateLock": "0x1a",
|
||||||
"svcWaitProcessWideKeyAtomic": "0x1c",
|
"svcArbitrateUnlock": "0x1b",
|
||||||
"svcSignalProcessWideKey": "0x1d",
|
"svcWaitProcessWideKeyAtomic": "0x1c",
|
||||||
"svcGetSystemTick": "0x1e",
|
"svcSignalProcessWideKey": "0x1d",
|
||||||
"svcConnectToNamedPort": "0x1f",
|
"svcGetSystemTick": "0x1e",
|
||||||
"svcSendSyncRequestLight": "0x20",
|
"svcConnectToNamedPort": "0x1f",
|
||||||
"svcSendSyncRequest": "0x21",
|
"svcSendSyncRequestLight": "0x20",
|
||||||
"svcSendSyncRequestWithUserBuffer": "0x22",
|
"svcSendSyncRequest": "0x21",
|
||||||
"svcSendAsyncRequestWithUserBuffer": "0x23",
|
"svcSendSyncRequestWithUserBuffer": "0x22",
|
||||||
"svcGetProcessId": "0x24",
|
"svcSendAsyncRequestWithUserBuffer": "0x23",
|
||||||
"svcGetThreadId": "0x25",
|
"svcGetProcessId": "0x24",
|
||||||
"svcBreak": "0x26",
|
"svcGetThreadId": "0x25",
|
||||||
"svcOutputDebugString": "0x27",
|
"svcBreak": "0x26",
|
||||||
"svcReturnFromException": "0x28",
|
"svcOutputDebugString": "0x27",
|
||||||
"svcGetInfo": "0x29",
|
"svcReturnFromException": "0x28",
|
||||||
"svcWaitForAddress": "0x34",
|
"svcGetInfo": "0x29",
|
||||||
"svcSignalToAddress": "0x35",
|
"svcFlushEntireDataCache": "0x2a",
|
||||||
"svcCreateSession": "0x40",
|
"svcFlushDataCache": "0x2b",
|
||||||
"svcAcceptSession": "0x41",
|
"svcMapPhysicalMemory": "0x2c",
|
||||||
"svcReplyAndReceiveLight": "0x42",
|
"svcUnmapPhysicalMemory": "0x2d",
|
||||||
"svcReplyAndReceive": "0x43",
|
"svcGetFutureThreadInfo": "0x2e",
|
||||||
"svcReplyAndReceiveWithUserBuffer": "0x44",
|
"svcGetLastThreadInfo": "0x2f",
|
||||||
"svcCreateEvent": "0x45",
|
"svcGetResourceLimitLimitValue": "0x30",
|
||||||
"svcCreateInterruptEvent": "0x53",
|
"svcGetResourceLimitCurrentValue": "0x31",
|
||||||
"svcReadWriteRegister": "0x4E",
|
"svcSetThreadActivity": "0x32",
|
||||||
"svcQueryMemoryMapping": "0x55",
|
"svcGetThreadContext3": "0x33",
|
||||||
"svcCreateDeviceAddressSpace": "0x56",
|
"svcWaitForAddress": "0x34",
|
||||||
"svcAttachDeviceAddressSpace": "0x57",
|
"svcSignalToAddress": "0x35",
|
||||||
"svcDetachDeviceAddressSpace": "0x58",
|
"svcUnknown": "0x36",
|
||||||
"svcMapDeviceAddressSpaceAligned": "0x5a",
|
"svcUnknown": "0x37",
|
||||||
"svcUnmapDeviceAddressSpace": "0x5c",
|
"svcUnknown": "0x38",
|
||||||
"svcGetSystemInfo": "0x6f",
|
"svcUnknown": "0x39",
|
||||||
"svcCallSecureMonitor": "0x7f"
|
"svcUnknown": "0x3a",
|
||||||
}
|
"svcUnknown": "0x3b",
|
||||||
|
"svcDumpInfo": "0x3c",
|
||||||
|
"svcDumpInfoNew": "0x3d",
|
||||||
|
"svcUnknown": "0x3e",
|
||||||
|
"svcUnknown": "0x3f",
|
||||||
|
"svcCreateSession": "0x40",
|
||||||
|
"svcAcceptSession": "0x41",
|
||||||
|
"svcReplyAndReceiveLight": "0x42",
|
||||||
|
"svcReplyAndReceive": "0x43",
|
||||||
|
"svcReplyAndReceiveWithUserBuffer": "0x44",
|
||||||
|
"svcCreateEvent": "0x45",
|
||||||
|
"svcUnknown": "0x46",
|
||||||
|
"svcUnknown": "0x47",
|
||||||
|
"svcMapPhysicalMemoryUnsafe": "0x48",
|
||||||
|
"svcUnmapPhysicalMemoryUnsafe": "0x49",
|
||||||
|
"svcSetUnsafeLimit": "0x4a",
|
||||||
|
"svcCreateCodeMemory": "0x4b",
|
||||||
|
"svcControlCodeMemory": "0x4c",
|
||||||
|
"svcSleepSystem": "0x4d",
|
||||||
|
"svcReadWriteRegister": "0x4e",
|
||||||
|
"svcSetProcessActivity": "0x4f",
|
||||||
|
"svcCreateSharedMemory": "0x50",
|
||||||
|
"svcMapTransferMemory": "0x51",
|
||||||
|
"svcUnmapTransferMemory": "0x52",
|
||||||
|
"svcCreateInterruptEvent": "0x53",
|
||||||
|
"svcQueryPhysicalAddress": "0x54",
|
||||||
|
"svcQueryIoMapping": "0x55",
|
||||||
|
"svcCreateDeviceAddressSpace": "0x56",
|
||||||
|
"svcAttachDeviceAddressSpace": "0x57",
|
||||||
|
"svcDetachDeviceAddressSpace": "0x58",
|
||||||
|
"svcMapDeviceAddressSpaceByForce": "0x59",
|
||||||
|
"svcMapDeviceAddressSpaceAligned": "0x5a",
|
||||||
|
"svcMapDeviceAddressSpace": "0x5b",
|
||||||
|
"svcUnmapDeviceAddressSpace": "0x5c",
|
||||||
|
"svcInvalidateProcessDataCache": "0x5d",
|
||||||
|
"svcStoreProcessDataCache": "0x5e",
|
||||||
|
"svcFlushProcessDataCache": "0x5f",
|
||||||
|
"svcDebugActiveProcess": "0x60",
|
||||||
|
"svcBreakDebugProcess": "0x61",
|
||||||
|
"svcTerminateDebugProcess": "0x62",
|
||||||
|
"svcGetDebugEvent": "0x63",
|
||||||
|
"svcContinueDebugEvent": "0x64",
|
||||||
|
"svcGetProcessList": "0x65",
|
||||||
|
"svcGetThreadList": "0x66",
|
||||||
|
"svcGetDebugThreadContext": "0x67",
|
||||||
|
"svcSetDebugThreadContext": "0x68",
|
||||||
|
"svcQueryDebugProcessMemory": "0x69",
|
||||||
|
"svcReadDebugProcessMemory": "0x6a",
|
||||||
|
"svcWriteDebugProcessMemory": "0x6b",
|
||||||
|
"svcSetHardwareBreakPoint": "0x6c",
|
||||||
|
"svcGetDebugThreadParam": "0x6d",
|
||||||
|
"svcUnknown": "0x6e",
|
||||||
|
"svcGetSystemInfo": "0x6f",
|
||||||
|
"svcCreatePort": "0x70",
|
||||||
|
"svcManageNamedPort": "0x71",
|
||||||
|
"svcConnectToPort": "0x72",
|
||||||
|
"svcSetProcessMemoryPermission": "0x73",
|
||||||
|
"svcMapProcessMemory": "0x74",
|
||||||
|
"svcUnmapProcessMemory": "0x75",
|
||||||
|
"svcQueryProcessMemory": "0x76",
|
||||||
|
"svcMapProcessCodeMemory": "0x77",
|
||||||
|
"svcUnmapProcessCodeMemory": "0x78",
|
||||||
|
"svcCreateProcess": "0x79",
|
||||||
|
"svcStartProcess": "0x7a",
|
||||||
|
"svcTerminateProcess": "0x7b",
|
||||||
|
"svcGetProcessInfo": "0x7c",
|
||||||
|
"svcCreateResourceLimit": "0x7d",
|
||||||
|
"svcSetResourceLimitLimitValue": "0x7e",
|
||||||
|
"svcCallSecureMonitor": "0x7f"
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
"type": "min_kernel_version",
|
"type": "min_kernel_version",
|
||||||
"value": "0x0060"
|
"value": "0x0060"
|
||||||
@@ -129,9 +198,9 @@
|
|||||||
}, {
|
}, {
|
||||||
"type": "debug_flags",
|
"type": "debug_flags",
|
||||||
"value": {
|
"value": {
|
||||||
"allow_debug": true,
|
"allow_debug": false,
|
||||||
"force_debug_prod": false,
|
"force_debug_prod": false,
|
||||||
"force_debug": false
|
"force_debug": true
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
"type": "map",
|
"type": "map",
|
||||||
|
|||||||
@@ -36,6 +36,20 @@
|
|||||||
#include <battery.h>
|
#include <battery.h>
|
||||||
#include <pwm.h>
|
#include <pwm.h>
|
||||||
#include <display_refresh_rate.h>
|
#include <display_refresh_rate.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#define FUSE_CPU_SPEEDO_0_CALIB 0x114
|
||||||
|
//#define FUSE_CPU_SPEEDO_1_CALIB 0x12C
|
||||||
|
#define FUSE_CPU_SPEEDO_2_CALIB 0x130
|
||||||
|
|
||||||
|
#define FUSE_SOC_SPEEDO_0_CALIB 0x134
|
||||||
|
//#define FUSE_SOC_SPEEDO_1_CALIB 0x138
|
||||||
|
//#define FUSE_SOC_SPEEDO_2_CALIB 0x13C
|
||||||
|
|
||||||
|
#define FUSE_CPU_IDDQ_CALIB 0x118
|
||||||
|
#define FUSE_SOC_IDDQ_CALIB 0x140
|
||||||
|
#define FUSE_GPU_IDDQ_CALIB 0x228
|
||||||
|
|
||||||
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0))
|
#define HOSSVC_HAS_CLKRST (hosversionAtLeast(8,0,0))
|
||||||
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))
|
#define HOSSVC_HAS_TC (hosversionAtLeast(5,0,0))
|
||||||
@@ -71,6 +85,9 @@ std::atomic<uint64_t> idletick1{systemtickfrequency};
|
|||||||
std::atomic<uint64_t> idletick2{systemtickfrequency};
|
std::atomic<uint64_t> idletick2{systemtickfrequency};
|
||||||
std::atomic<uint64_t> idletick3{systemtickfrequency};
|
std::atomic<uint64_t> idletick3{systemtickfrequency};
|
||||||
u32 cpu0, cpu1, cpu2, cpu3, cpuAvg;
|
u32 cpu0, cpu1, cpu2, cpu3, cpuAvg;
|
||||||
|
u16 cpuSpeedo0, cpuSpeedo2, socSpeedo0; // CPU, GPU, SOC
|
||||||
|
u16 cpuIDDQ, gpuIDDQ, socIDDQ;
|
||||||
|
|
||||||
|
|
||||||
const char* Board::GetModuleName(SysClkModule module, bool pretty)
|
const char* Board::GetModuleName(SysClkModule module, bool pretty)
|
||||||
{
|
{
|
||||||
@@ -167,7 +184,6 @@ void miscThreadFunc(void*) {
|
|||||||
void Board::Initialize()
|
void Board::Initialize()
|
||||||
{
|
{
|
||||||
Result rc = 0;
|
Result rc = 0;
|
||||||
|
|
||||||
if(HOSSVC_HAS_CLKRST)
|
if(HOSSVC_HAS_CLKRST)
|
||||||
{
|
{
|
||||||
rc = clkrstInitialize();
|
rc = clkrstInitialize();
|
||||||
@@ -207,6 +223,8 @@ void Board::Initialize()
|
|||||||
// else fanCheck = fanOpenController(&fanController, 1);
|
// else fanCheck = fanOpenController(&fanController, 1);
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
rc = pmdmntInitialize();
|
||||||
|
ASSERT_RESULT_OK(rc, "pmdmntInitialize");
|
||||||
|
|
||||||
threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2);
|
threadCreate(&gpuLThread, gpuLoadThread, NULL, NULL, 0x1000, 0x3F, -2);
|
||||||
threadStart(&gpuLThread);
|
threadStart(&gpuLThread);
|
||||||
@@ -240,6 +258,71 @@ void Board::Initialize()
|
|||||||
FetchHardwareInfos();
|
FetchHardwareInfos();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Board::fuseReadSpeedos() {
|
||||||
|
|
||||||
|
u64 pid = 0;
|
||||||
|
if (R_FAILED(pmdmntGetProcessId(&pid, 0x0100000000000006))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Handle debug;
|
||||||
|
if (R_FAILED(svcDebugActiveProcess(&debug, pid))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MemoryInfo mem_info = {0};
|
||||||
|
u32 pageinfo = 0;
|
||||||
|
u64 addr = 0;
|
||||||
|
|
||||||
|
char stack[0x10] = {0};
|
||||||
|
const char compare[0x10] = {0};
|
||||||
|
char dump[0x400] = {0};
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (R_FAILED(svcQueryDebugProcessMemory(&mem_info, &pageinfo, debug, addr)) || mem_info.addr < addr) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mem_info.type == MemType_Io && mem_info.size == 0x1000) {
|
||||||
|
if (R_FAILED(svcReadDebugProcessMemory(stack, debug, mem_info.addr, sizeof(stack)))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(stack, compare, sizeof(stack)) == 0) {
|
||||||
|
if (R_FAILED(svcReadDebugProcessMemory(dump, debug, mem_info.addr + 0x800, sizeof(dump)))) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
cpuSpeedo0 = *reinterpret_cast<const u16*>(dump + FUSE_CPU_SPEEDO_0_CALIB);
|
||||||
|
cpuSpeedo2 = *reinterpret_cast<const u16*>(dump + FUSE_CPU_SPEEDO_2_CALIB);
|
||||||
|
socSpeedo0 = *reinterpret_cast<const u16*>(dump + FUSE_SOC_SPEEDO_0_CALIB);
|
||||||
|
cpuIDDQ = *reinterpret_cast<const u16*>(dump + FUSE_CPU_IDDQ_CALIB);
|
||||||
|
gpuIDDQ = *reinterpret_cast<const u16*>(dump + FUSE_SOC_IDDQ_CALIB);
|
||||||
|
socIDDQ = *reinterpret_cast<const u16*>(dump + FUSE_GPU_IDDQ_CALIB);
|
||||||
|
|
||||||
|
svcCloseHandle(debug);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = mem_info.addr + mem_info.size;
|
||||||
|
}
|
||||||
|
|
||||||
|
svcCloseHandle(debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 Board::getCPUSpeedo() {
|
||||||
|
return cpuSpeedo0;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 Board::getGPUSpeedo() {
|
||||||
|
return cpuSpeedo2;
|
||||||
|
}
|
||||||
|
|
||||||
|
u16 Board::getSOCSpeedo() {
|
||||||
|
return socSpeedo0;
|
||||||
|
}
|
||||||
|
|
||||||
void Board::Exit()
|
void Board::Exit()
|
||||||
{
|
{
|
||||||
if(HOSSVC_HAS_CLKRST)
|
if(HOSSVC_HAS_CLKRST)
|
||||||
@@ -273,6 +356,7 @@ void Board::Exit()
|
|||||||
pwmExit();
|
pwmExit();
|
||||||
rgltrExit();
|
rgltrExit();
|
||||||
batteryInfoExit();
|
batteryInfoExit();
|
||||||
|
pmdmntExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
SysClkProfile Board::GetProfile()
|
SysClkProfile Board::GetProfile()
|
||||||
@@ -662,6 +746,7 @@ HorizonOCConsoleType Board::GetConsoleType() {
|
|||||||
|
|
||||||
void Board::FetchHardwareInfos()
|
void Board::FetchHardwareInfos()
|
||||||
{
|
{
|
||||||
|
fuseReadSpeedos();
|
||||||
u64 sku = 0;
|
u64 sku = 0;
|
||||||
Result rc = splInitialize();
|
Result rc = splInitialize();
|
||||||
ASSERT_RESULT_OK(rc, "splInitialize");
|
ASSERT_RESULT_OK(rc, "splInitialize");
|
||||||
|
|||||||
@@ -33,6 +33,10 @@
|
|||||||
class Board
|
class Board
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
static void fuseReadSpeedos();
|
||||||
|
static u16 getCPUSpeedo();
|
||||||
|
static u16 getGPUSpeedo();
|
||||||
|
static u16 getSOCSpeedo();
|
||||||
static const char* GetProfileName(SysClkProfile profile, bool pretty);
|
static const char* GetProfileName(SysClkProfile profile, bool pretty);
|
||||||
static const char* GetModuleName(SysClkModule module, bool pretty);
|
static const char* GetModuleName(SysClkModule module, bool pretty);
|
||||||
static const char* GetThermalSensorName(SysClkThermalSensor sensor, bool pretty);
|
static const char* GetThermalSensorName(SysClkThermalSensor sensor, bool pretty);
|
||||||
|
|||||||
@@ -102,6 +102,10 @@ ClockManager::ClockManager()
|
|||||||
|
|
||||||
threadStart(&governorTHREAD);
|
threadStart(&governorTHREAD);
|
||||||
|
|
||||||
|
this->context->speedos[HorizonOCSpeedo_CPU] = Board::getCPUSpeedo();
|
||||||
|
this->context->speedos[HorizonOCSpeedo_GPU] = Board::getGPUSpeedo();
|
||||||
|
this->context->speedos[HorizonOCSpeedo_SOC] = Board::getSOCSpeedo();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ClockManager::~ClockManager()
|
ClockManager::~ClockManager()
|
||||||
|
|||||||
Reference in New Issue
Block a user