From 7bad79e8b4ce8ab751684043e18d8f7f028aac7d Mon Sep 17 00:00:00 2001 From: thedax Date: Wed, 30 Sep 2015 17:41:27 -0400 Subject: [PATCH 1/4] Implement some services from gsp::Lcd. http://www.3dbrew.org/wiki/GSP_Services --- libctru/include/3ds/services/gsp.h | 7 ++++++ libctru/source/services/gsp.c | 35 ++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/libctru/include/3ds/services/gsp.h b/libctru/include/3ds/services/gsp.h index e65245d..e80effc 100644 --- a/libctru/include/3ds/services/gsp.h +++ b/libctru/include/3ds/services/gsp.h @@ -51,6 +51,9 @@ typedef enum Result gspInit(); void gspExit(); +Result gspLcdInit(); +void gspLcdExit(); + Result gspInitEventHandler(Handle gspEvent, vu8* gspSharedMem, u8 gspThreadId); void gspExitEventHandler(); void gspWaitForEvent(GSP_Event id, bool nextEvent); @@ -79,3 +82,7 @@ Result GSPGPU_RegisterInterruptRelayQueue(Handle *handle, Handle eventHandle, u3 Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle); Result GSPGPU_TriggerCmdReqQueue(Handle *handle); Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* handle); + +// 1 = top, 2 = bottom, 3 = both +Result GSPLCD_PowerOffBacklight(u32 screen); +Result GSPLCD_PowerOnBacklight(u32 screen); diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index 4dcfadf..881a8ef 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -12,6 +12,7 @@ #define GSP_EVENT_STACK_SIZE 0x1000 Handle gspGpuHandle=0; +Handle gspLcdHandle=0; Handle gspEvents[GSPEVENT_MAX]; vu32 gspEventCounts[GSPEVENT_MAX]; u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned @@ -431,3 +432,37 @@ Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* if(totalCommands==1)return GSPGPU_TriggerCmdReqQueue(handle); return 0; } + +Result gspLcdInit() +{ + return srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd"); +} + +void gspLcdExit() +{ + if(gspLcdHandle)svcCloseHandle(gspLcdHandle); +} + +Result GSPLCD_PowerOffBacklight(u32 screen) +{ + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00120040; + cmdbuf[1] = screen; + + Result ret = svcSendSyncRequest(gspLcdHandle); + + return ret; +} + +Result GSPLCD_PowerOnBacklight(u32 screen) +{ + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00110040; + cmdbuf[1] = screen; + + Result ret = svcSendSyncRequest(gspLcdHandle); + + return ret; +} From 5426fba7428fcb5554dbbea1dbd3383c2cdac5f3 Mon Sep 17 00:00:00 2001 From: thedax Date: Wed, 30 Sep 2015 20:14:10 -0400 Subject: [PATCH 2/4] Add an enum to make using the gsp::Lcd service a little nicer. --- libctru/include/3ds/services/gsp.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libctru/include/3ds/services/gsp.h b/libctru/include/3ds/services/gsp.h index e80effc..dfd8794 100644 --- a/libctru/include/3ds/services/gsp.h +++ b/libctru/include/3ds/services/gsp.h @@ -48,6 +48,13 @@ typedef enum GSPEVENT_MAX, // used to know how many events there are } GSP_Event; +typedef enum +{ + GSPLCD_TOP=1, + GSPLCD_BOTTOM=2, + GSPLCD_BOTH=3, +}GSPLCD_Screens; + Result gspInit(); void gspExit(); From 861c0a10b5cc96f4bb880d61c655bf3efff9e765 Mon Sep 17 00:00:00 2001 From: thedax Date: Thu, 1 Oct 2015 13:00:38 -0400 Subject: [PATCH 3/4] Change the enum to use BIT and replace u32 with the enum type. --- libctru/include/3ds/services/gsp.h | 11 +++++------ libctru/source/services/gsp.c | 4 ++-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libctru/include/3ds/services/gsp.h b/libctru/include/3ds/services/gsp.h index dfd8794..a0d8bed 100644 --- a/libctru/include/3ds/services/gsp.h +++ b/libctru/include/3ds/services/gsp.h @@ -50,9 +50,9 @@ typedef enum typedef enum { - GSPLCD_TOP=1, - GSPLCD_BOTTOM=2, - GSPLCD_BOTH=3, + GSPLCD_TOP = BIT(0), + GSPLCD_BOTTOM = BIT(1), + GSPLCD_BOTH = GSPLCD_TOP | GSPLCD_BOTTOM, }GSPLCD_Screens; Result gspInit(); @@ -90,6 +90,5 @@ Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle); Result GSPGPU_TriggerCmdReqQueue(Handle *handle); Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* handle); -// 1 = top, 2 = bottom, 3 = both -Result GSPLCD_PowerOffBacklight(u32 screen); -Result GSPLCD_PowerOnBacklight(u32 screen); +Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen); +Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen); diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index 881a8ef..2d24156 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -443,7 +443,7 @@ void gspLcdExit() if(gspLcdHandle)svcCloseHandle(gspLcdHandle); } -Result GSPLCD_PowerOffBacklight(u32 screen) +Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen) { u32 *cmdbuf = getThreadCommandBuffer(); @@ -455,7 +455,7 @@ Result GSPLCD_PowerOffBacklight(u32 screen) return ret; } -Result GSPLCD_PowerOnBacklight(u32 screen) +Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen) { u32 *cmdbuf = getThreadCommandBuffer(); From 04ddaff8cdd40208d00841f2ab9fa6c8853651f9 Mon Sep 17 00:00:00 2001 From: thedax Date: Fri, 2 Oct 2015 21:01:19 -0400 Subject: [PATCH 4/4] Return the svcSendSyncRquest value if not equal to zero. Otherwise, return cmdbuf[1]. --- libctru/source/services/gsp.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index 2d24156..c3a4461 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -450,9 +450,10 @@ Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen) cmdbuf[0] = 0x00120040; cmdbuf[1] = screen; - Result ret = svcSendSyncRequest(gspLcdHandle); - - return ret; + Result ret=0; + if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret; + + return cmdbuf[1]; } Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen) @@ -462,7 +463,8 @@ Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen) cmdbuf[0] = 0x00110040; cmdbuf[1] = screen; - Result ret = svcSendSyncRequest(gspLcdHandle); - - return ret; + Result ret=0; + if ((ret = svcSendSyncRequest(gspLcdHandle)))return ret; + + return cmdbuf[1]; }