Add bpcGetSleepButtonState

This commit is contained in:
Michael Scire 2018-11-10 01:31:57 -08:00 committed by yellows8
parent ee55b63f79
commit 94dc8f75f9
2 changed files with 63 additions and 20 deletions

View File

@ -1,14 +1,20 @@
/** /**
* @file bpc.h * @file bpc.h
* @brief Board power control (bpc) service IPC wrapper. * @brief Board power control (bpc) service IPC wrapper.
* @author XorTroll * @author XorTroll, SciresM
* @copyright libnx Authors * @copyright libnx Authors
*/ */
#pragma once #pragma once
#include "../types.h" #include "../types.h"
typedef enum {
BpcSleepButtonState_Held = 0,
BpcSleepButtonState_Released = 1,
} BpcSleepButtonState;
Result bpcInitialize(void); Result bpcInitialize(void);
void bpcExit(void); void bpcExit(void);
Result bpcShutdownSystem(void); Result bpcShutdownSystem(void);
Result bpcRebootSystem(void); Result bpcRebootSystem(void);
Result bpcGetSleepButtonState(BpcSleepButtonState *out);

View File

@ -39,8 +39,7 @@ Result bpcShutdownSystem(void)
u64 cmd_id; u64 cmd_id;
} *raw; } *raw;
raw = ipcPrepareHeader(&c, sizeof(*raw)); raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw));
raw->magic = SFCI_MAGIC; raw->magic = SFCI_MAGIC;
raw->cmd_id = 0; raw->cmd_id = 0;
@ -48,12 +47,13 @@ Result bpcShutdownSystem(void)
if(R_SUCCEEDED(rc)) { if(R_SUCCEEDED(rc)) {
IpcParsedCommand r; IpcParsedCommand r;
ipcParse(&r);
struct { struct {
u64 magic; u64 magic;
u64 result; u64 result;
} *resp = r.Raw; } *resp;
serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp));
resp = r.Raw;
rc = resp->result; rc = resp->result;
} }
@ -71,7 +71,7 @@ Result bpcRebootSystem(void)
u64 cmd_id; u64 cmd_id;
} *raw; } *raw;
raw = ipcPrepareHeader(&c, sizeof(*raw)); raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw));
raw->magic = SFCI_MAGIC; raw->magic = SFCI_MAGIC;
raw->cmd_id = 1; raw->cmd_id = 1;
@ -79,15 +79,52 @@ Result bpcRebootSystem(void)
if(R_SUCCEEDED(rc)) { if(R_SUCCEEDED(rc)) {
IpcParsedCommand r; IpcParsedCommand r;
ipcParse(&r);
struct { struct {
u64 magic; u64 magic;
u64 result; u64 result;
} *resp = r.Raw; } *resp;
serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp));
resp = r.Raw;
rc = resp->result; rc = resp->result;
} }
return rc; return rc;
} }
Result bpcGetSleepButtonState(BpcSleepButtonState *out) {
IpcCommand c;
ipcInitialize(&c);
struct {
u64 magic;
u64 cmd_id;
} *raw;
raw = serviceIpcPrepareHeader(&g_bpcSrv, &c, sizeof(*raw));
raw->magic = SFCI_MAGIC;
raw->cmd_id = 6;
Result rc = serviceIpcDispatch(&g_bpcSrv);
if(R_SUCCEEDED(rc)) {
IpcParsedCommand r;
struct {
u64 magic;
u64 result;
u8 state;
} *resp;
serviceIpcParse(&g_bpcSrv, &r, sizeof(*resp));
resp = r.Raw;
rc = resp->result;
if (R_SUCCEEDED(rc)) {
*out = (BpcSleepButtonState)resp->state;
}
}
return rc;
}