]> Chaos Git - corbenik/ctrulib.git/commitdiff
Add code to manage New 3DS CPU speedup
authorfincs <fincs.alt1@gmail.com>
Sun, 11 Oct 2015 21:47:23 +0000 (23:47 +0200)
committerfincs <fincs.alt1@gmail.com>
Sun, 11 Oct 2015 21:47:23 +0000 (23:47 +0200)
# Conflicts:
# libctru/include/3ds/os.h
# libctru/include/3ds/services/ptm.h

libctru/include/3ds/os.h
libctru/include/3ds/services/ptm.h
libctru/source/os.c
libctru/source/services/apt.c
libctru/source/services/ptm.c

index ec9c1d007d1a15620085496f41b1b93f79f73995..f36fb917e6dbb7dc6c30a7772c9f9594a19902d5 100644 (file)
@@ -73,3 +73,9 @@ u64 osGetTime();
  * @return the Wifi signal strength
  */
 u8 osGetWifiStrength();
+
+/**
+ * @brief Configures the New 3DS speedup.
+ * @param enable Specifies whether to enable or disable the speedup.
+ */
+void osSetSpeedupEnable(bool enable);
index 586b4564e28a030011b23793a73145a4ea96347f..034271d2aafddc21c19c07fe433deaed80c859cf 100644 (file)
@@ -3,8 +3,13 @@
 Result ptmInit();
 Result ptmExit();
 
+Result ptmSysmInit(void);
+Result ptmSysmExit(void);
+
 Result PTMU_GetShellState(Handle* servhandle, u8 *out);
 Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out);
 Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out);
 Result PTMU_GetPedometerState(Handle* servhandle, u8 *out);
 Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps);
+
+Result PTMSYSM_ConfigureNew3DSCPU(u8 value);
index 99b8c5b1ba2cb05ac050cc939cc96a9c15887169..3e21df454dc69ac0567760d15a13bb5dbcf892b9 100644 (file)
@@ -1,6 +1,7 @@
 #include <3ds/types.h>
 #include <3ds/os.h>
 #include <3ds/svc.h>
+#include <3ds/services/ptm.h>
 
 #include <sys/time.h>
 #include <reent.h>
@@ -26,6 +27,7 @@ static volatile datetime_t* __datetime0 =
 static volatile datetime_t* __datetime1 =
        (datetime_t*) 0x1FF81040;
 
+__attribute__((weak)) bool __ctru_speedup = false;
 
 //---------------------------------------------------------------------------------
 u32 osConvertVirtToPhys(u32 vaddr) {
@@ -155,3 +157,18 @@ u8 osGetWifiStrength(void) {
 //---------------------------------------------------------------------------------
        return *((u8*)0x1FF81066);
 }
+
+void __ctru_speedup_config(void)
+{
+       if (ptmSysmInit()==0)
+       {
+               PTMSYSM_ConfigureNew3DSCPU(__ctru_speedup ? 3 : 0);
+               ptmSysmExit();
+       }
+}
+
+void osSetSpeedupEnable(bool enable)
+{
+       __ctru_speedup = enable;
+       __ctru_speedup_config();
+}
index 95283bd07e64abc8f5fa4497ef43d5882b2d150d..3b2b921f8d63a680c8e5ace3c1c37b8a9a989169 100644 (file)
@@ -62,6 +62,8 @@ __attribute__((weak)) void _aptDebug(int a, int b)
 {
 }
 
+void __ctru_speedup_config(void);
+
 static void aptAppStarted(void);
 
 static bool aptIsReinit(void)
@@ -395,7 +397,7 @@ static bool __handle_incoming_parameter() {
                aptSetStatus(APP_APPLETCLOSED);
                return true;
        case 0xB: // Just returned from menu.
-               if (aptStatusMutex)
+               if (aptGetStatus() != APP_NOTINITIALIZED)
                {
                        GSPGPU_AcquireRight(NULL, 0x0);
                        GSPGPU_RestoreVramSysArea(NULL);
@@ -462,6 +464,8 @@ Result aptInit(void)
 
        svcCreateEvent(&aptStatusEvent, 0);
        svcCreateEvent(&aptSleepSync, 0);
+       svcCreateMutex(&aptStatusMutex, false);
+       aptStatus=0;
 
        if(!aptIsCrippled())
        {
@@ -626,10 +630,6 @@ void aptAppStarted()
 {
        u8 buf1[4], buf2[4];
 
-       svcCreateMutex(&aptStatusMutex, true);
-       aptStatus=0;
-       svcReleaseMutex(aptStatusMutex);
-
        aptSetStatus(APP_RUNNING);
 
        if(!aptIsCrippled())
@@ -669,6 +669,8 @@ void aptSetStatus(APP_STATUS status)
 
        //if(prevstatus != APP_NOTINITIALIZED)
        //{
+               if(status == APP_RUNNING)
+                       __ctru_speedup_config();
                if(status == APP_RUNNING || status == APP_EXITING || status == APP_APPLETSTARTED || status == APP_APPLETCLOSED)
                        svcSignalEvent(aptStatusEvent);
        //}
index 1c30206aaccc5106c02d833e3f02ca175c6c2067..7655830d57b7707b1853ab85308f12b02fa4e9e9 100644 (file)
@@ -5,11 +5,11 @@
 #include <3ds/services/ptm.h>
 
 
-static Handle ptmHandle;
+static Handle ptmHandle, ptmSysmHandle;
 
 Result ptmInit()
 {
-       return srvGetServiceHandle(&ptmHandle, "ptm:u");        
+       return srvGetServiceHandle(&ptmHandle, "ptm:u");
 }
 
 Result ptmExit()
@@ -17,6 +17,16 @@ Result ptmExit()
        return svcCloseHandle(ptmHandle);
 }
 
+Result ptmSysmInit(void)
+{
+       return srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
+}
+
+Result ptmSysmExit(void)
+{
+       return svcCloseHandle(ptmSysmHandle);
+}
+
 Result PTMU_GetShellState(Handle* servhandle, u8 *out)
 {
        if(!servhandle)servhandle=&ptmHandle;
@@ -91,3 +101,16 @@ Result PTMU_GetTotalStepCount(Handle* servhandle, u32 *steps)
 
        return (Result)cmdbuf[1];
 }
+
+Result PTMSYSM_ConfigureNew3DSCPU(u8 value)
+{
+       Result ret;
+       u32 *cmdbuf = getThreadCommandBuffer();
+
+       cmdbuf[0] = 0x08180040;
+       cmdbuf[1] = value;
+
+       if((ret = svcSendSyncRequest(ptmSysmHandle))!=0)return ret;
+
+       return (Result)cmdbuf[1];
+}