libctru/libctru/source/services/ptmsysm.c
2020-05-17 22:24:15 +02:00

179 lines
4.3 KiB
C

#include <string.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/ptmsysm.h>
#include <3ds/ipc.h>
static Handle ptmSysmHandle;
static int ptmSysmRefCount;
Result ptmSysmInit(void)
{
if (AtomicPostIncrement(&ptmSysmRefCount)) return 0;
Result res = srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
if (R_FAILED(res)) AtomicDecrement(&ptmSysmRefCount);
return res;
}
void ptmSysmExit(void)
{
if (AtomicDecrement(&ptmSysmRefCount)) return;
svcCloseHandle(ptmSysmHandle);
}
Result PTMSYSM_RequestSleep(void)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0406,0,0); // 0x04060000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_ReplyToSleepQuery(bool deny)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0402,1,2); // 0x04020042
cmdbuf[1] = (u32)deny;
cmdbuf[2] = IPC_Desc_CurProcessId();
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_NotifySleepPreparationComplete(s32 ackValue)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0403,1,2); // 0x04030042
cmdbuf[1] = (u32)ackValue;
cmdbuf[2] = IPC_Desc_CurProcessId();
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_SetWakeEvents(const PtmSleepConfig *sleepConfig)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0404,4,2); // 0x04040102
memcpy(&cmdbuf[1], sleepConfig, sizeof(PtmSleepConfig));
cmdbuf[5] = IPC_Desc_CurProcessId();
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_GetWakeReason(PtmSleepConfig *outSleepConfig)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0405,0,0); // 0x04050000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
memcpy(outSleepConfig, &cmdbuf[2], sizeof(PtmSleepConfig));
return (Result)cmdbuf[1];
}
Result PTMSYSM_Awaken(void)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0408,0,0); // 0x04080000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_CheckNew3DS(void)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x040A,0,0); // 0x040A0000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return 0;
return (Result)cmdbuf[1];
}
Result PTMSYSM_ConfigureNew3DSCPU(u8 value)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x818,1,0); // 0x08180040
cmdbuf[1] = value;
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_ShutdownAsync(u64 timeout)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x407,3,0); // 0x040700C0
cmdbuf[1] = 0;
cmdbuf[2] = timeout & 0xffffffff;
cmdbuf[3] = (timeout >> 32) & 0xffffffff;
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_RebootAsync(u64 timeout)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x409,2,0); // 0x04090080
cmdbuf[1] = timeout & 0xffffffff;
cmdbuf[2] = (timeout >> 32) & 0xffffffff;
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_InvalidateSystemTime(void)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x080D,0,0); // 0x080D0000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}
Result PTMSYSM_GetRtcTime(s64 *outMsY2k)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0816,0,0); // 0x08160000
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
memcpy(outMsY2k, &cmdbuf[2], 8);
return (Result)cmdbuf[1];
}
Result PTMSYSM_SetRtcTime(s64 msY2k)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0817,2,0); // 0x08170080
memcpy(&cmdbuf[1], &msY2k, 8);
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}