From ab33169116622ac2bd761adc2eca4de35a8a3efd Mon Sep 17 00:00:00 2001 From: XorTroll <33005497+XorTroll@users.noreply.github.com> Date: Thu, 6 Sep 2018 18:59:07 +0200 Subject: [PATCH] Create psm.c --- nx/source/services/psm.c | 67 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 nx/source/services/psm.c diff --git a/nx/source/services/psm.c b/nx/source/services/psm.c new file mode 100644 index 00000000..26b302cb --- /dev/null +++ b/nx/source/services/psm.c @@ -0,0 +1,67 @@ +#include "types.h" +#include "result.h" +#include "arm/atomics.h" +#include "kernel/ipc.h" +#include "kernel/detect.h" +#include "services/psm.h" +#include "services/sm.h" + +static Service g_psmSrv; +static u64 g_refCnt; + +Result psmInitialize(void) +{ + Result rc = 0; + + atomicIncrement64(&g_refCnt); + + if (serviceIsActive(&g_psmSrv)) + return 0; + + rc = smGetService(&g_psmSrv, "psm"); + + return rc; +} + +void psmExit(void) +{ + if (atomicDecrement64(&g_refCnt) == 0) + serviceClose(&g_psmSrv); +} + +Result psmGetBatteryChargePercentage(u32 *out) +{ + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = ipcPrepareHeader(&c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 0; + + Result rc = serviceIpcDispatch(&g_psmSrv); + + if(R_SUCCEEDED(rc)) { + IpcParsedCommand r; + ipcParse(&r); + + struct { + u64 magic; + u64 result; + u32 percentage; + } *resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + *out = resp->percentage; + } + } + + return rc; +}