libctru/libctru/source/services/gsplcd.c

110 lines
2.3 KiB
C

#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
#include <3ds/ipc.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/gsplcd.h>
Handle gspLcdHandle;
static int gspLcdRefCount;
Result gspLcdInit(void)
{
Result res=0;
if (AtomicPostIncrement(&gspLcdRefCount)) return 0;
res = srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
if (R_FAILED(res)) AtomicDecrement(&gspLcdRefCount);
return res;
}
void gspLcdExit(void)
{
if (AtomicDecrement(&gspLcdRefCount)) return;
svcCloseHandle(gspLcdHandle);
}
Result GSPLCD_PowerOnBacklight(u32 screen)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x11,1,0); // 0x110040
cmdbuf[1] = screen;
Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}
Result GSPLCD_PowerOffBacklight(u32 screen)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x12,1,0); // 0x120040
cmdbuf[1] = screen;
Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}
Result GSPLCD_GetVendors(u8 *vendors)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x14,0,0); // 0x140000
Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
if(vendors) *vendors = cmdbuf[2] & 0xFF;
return cmdbuf[1];
}
Result GSPLCD_GetBrightness(u32 screen, u32 *brightness)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x15,1,0); // 0x150040
cmdbuf[1] = screen;
Result ret = 0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
*brightness = cmdbuf[2];
return cmdbuf[2];
}
Result GSPLCD_SetBrightness(u32 screen, u32 brightness)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0B,2,0); // 0xB0080
cmdbuf[1] = screen;
cmdbuf[2] = brightness;
Result ret = 0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}
Result GSPLCD_SetBrightnessRaw(u32 screen, u32 brightness)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x0A,2,0); // 0xA0080
cmdbuf[1] = screen;
cmdbuf[2] = brightness;
Result ret = 0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}