Add mcu::HWC service (#373)
This commit is contained in:
parent
aaa92f619c
commit
d6a628b7d3
@ -65,6 +65,7 @@ extern "C" {
|
||||
#include <3ds/services/srvpm.h>
|
||||
#include <3ds/services/loader.h>
|
||||
#include <3ds/services/y2r.h>
|
||||
#include <3ds/services/mcuhwc.h>
|
||||
#include <3ds/services/hb.h>
|
||||
|
||||
#include <3ds/gpu/gx.h>
|
||||
@ -77,8 +78,9 @@ extern "C" {
|
||||
|
||||
#include <3ds/applets/swkbd.h>
|
||||
#include <3ds/applets/error.h>
|
||||
|
||||
#include <3ds/applets/miiselector.h>
|
||||
|
||||
|
||||
#include <3ds/sdmc.h>
|
||||
#include <3ds/romfs.h>
|
||||
#include <3ds/font.h>
|
||||
|
45
libctru/include/3ds/services/mcuhwc.h
Normal file
45
libctru/include/3ds/services/mcuhwc.h
Normal file
@ -0,0 +1,45 @@
|
||||
/**
|
||||
* @file mcuHwc.h
|
||||
* @brief mcuHwc service.
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
/// Initializes mcuHwc.
|
||||
Result mcuHwcInit(void);
|
||||
|
||||
/// Exits mcuHwc.
|
||||
void mcuHwcExit(void);
|
||||
|
||||
/**
|
||||
* @brief Reads data from a mcuHwc Register
|
||||
* @param reg Register number. See https://www.3dbrew.org/wiki/I2C_Registers#Device_3 for more info
|
||||
* @param data Pointer to write the data to.
|
||||
* @param size Size of data to be read
|
||||
*/
|
||||
Result mcuHwcReadRegister(u8 reg, void *data, u32 size);
|
||||
|
||||
/**
|
||||
* @brief Writes data to a mcuHwc Register
|
||||
* @param reg Register number. See https://www.3dbrew.org/wiki/I2C_Registers#Device_3 for more info
|
||||
* @param data Pointer to write the data to.
|
||||
* @param size Size of data to be written
|
||||
*/
|
||||
Result mcuHwcWriteRegister(u8 reg, const void *data, u32 size);
|
||||
|
||||
/**
|
||||
* @brief Gets the battery voltage
|
||||
* @param voltage Pointer to write the battery voltage to.
|
||||
*/
|
||||
Result mcuHwcGetBatteryVoltage(u8 *voltage);
|
||||
|
||||
/**
|
||||
* @brief Gets the battery level
|
||||
* @param level Pointer to write the current battery level to.
|
||||
*/
|
||||
Result mcuHwcGetBatteryLevel(u8 *level);
|
||||
|
||||
/**
|
||||
* @brief Gets the sound slider level
|
||||
* @param level Pointer to write the slider level to.
|
||||
*/
|
||||
Result mcuHwcGetSoundSliderLevel(u8 *level);
|
93
libctru/source/services/mcuhwc.c
Normal file
93
libctru/source/services/mcuhwc.c
Normal file
@ -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 mcuHwcReadRegister(u8 reg, void* data, u32 size)
|
||||
{
|
||||
Result ret = 0;
|
||||
u32 *cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(0x1,2,2); // 0x10082
|
||||
cmdbuf[1] = reg;
|
||||
cmdbuf[2] = size;
|
||||
cmdbuf[3] = IPC_Desc_Buffer (size, IPC_BUFFER_W);
|
||||
cmdbuf[4] = (u32)data;
|
||||
|
||||
if(R_FAILED(ret = svcSendSyncRequest(mcuHwcHandle)))return ret;
|
||||
|
||||
return (Result)cmdbuf[1];
|
||||
}
|
||||
|
||||
Result mcuHwcWriteRegister(u8 reg, const void *data, u32 size)
|
||||
{
|
||||
Result ret = 0;
|
||||
u32 *cmdbuf = getThreadCommandBuffer();
|
||||
|
||||
cmdbuf[0] = IPC_MakeHeader(0x2,2,2); // 0x20082
|
||||
cmdbuf[1] = reg;
|
||||
cmdbuf[2] = size;
|
||||
cmdbuf[3] = IPC_Desc_Buffer (size, IPC_BUFFER_R);
|
||||
cmdbuf[4] = (u32)data;
|
||||
|
||||
if(R_FAILED(ret = svcSendSyncRequest(mcuHwcHandle)))return ret;
|
||||
|
||||
return (Result)cmdbuf[1];
|
||||
}
|
||||
|
||||
Result mcuHwcGetBatteryVoltage(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 mcuHwcGetBatteryLevel(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 mcuHwcGetSoundSliderLevel(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];
|
||||
}
|
Loading…
Reference in New Issue
Block a user