diff --git a/libctru/source/services/mcuHWC.c b/libctru/source/services/mcuHWC.c new file mode 100644 index 0000000..e7a5849 --- /dev/null +++ b/libctru/source/services/mcuHWC.c @@ -0,0 +1,93 @@ +#include <3ds.h> +#include <3ds/services/mcuHWC.h> + +static Handle mcuHWCHandle; +static int mcuHWCRefCount; + +Result mcuHWCInit(void) +{ + if (AtomicPostIncrement(&mcuHWCRefCount)) return 0; + Result res = srvGetServiceHandle(&mcuHWCHandle, "mcu::HWC"); + if (R_FAILED(res)) AtomicDecrement(&mcuHWCRefCount); + return res; +} + +void mcuHWCExit(void) +{ + if (AtomicDecrement(&mcuHWCRefCount)) return; + svcCloseHandle(mcuHWCHandle); +} + +Result mcuReadRegister(u8 reg, u32 size, u8* data) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x1,2,2); // 0x10082 + cmdbuf[1] = reg; + cmdbuf[2] = size; + cmdbuf[3] = size << 4 | 0xC; + cmdbuf[4] = (u32)data; + + if(R_FAILED(ret = svcSendSyncRequest(mcuHWCHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result mcuWriteRegister(u8 reg, u32 size, u8* data) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x2,2,2); // 0x20082 + cmdbuf[1] = reg; + cmdbuf[2] = size; + cmdbuf[3] = size << 4 | 0xA; + cmdbuf[4] = (u32)data; + + if(R_FAILED(ret = svcSendSyncRequest(mcuHWCHandle)))return ret; + + return (Result)cmdbuf[1]; +} + +Result mcuGetBatteryVoltage(u8 *voltage) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000 + + if(R_FAILED(ret = svcSendSyncRequest(mcuHWCHandle)))return ret; + + *voltage = cmdbuf[2]; + + return (Result)cmdbuf[1]; +} + +Result mcuGetBatteryLevel(u8 *level) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000 + + if(R_FAILED(ret = svcSendSyncRequest(mcuHWCHandle)))return ret; + + *level = cmdbuf[2]; + + return (Result)cmdbuf[1]; +} + +Result mcuGetSoundSliderLevel(u8 *level) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0xB,0,0); // 0xB0000 + + if(R_FAILED(ret = svcSendSyncRequest(mcuHWCHandle)))return ret; + + *level = cmdbuf[2]; + + return (Result)cmdbuf[1]; +}