]> Chaos Git - corbenik/ctrulib.git/commitdiff
APT : added some stuff, plus proper lock handle use in arm11u example.
authorsmea <smealum@gmail.com>
Mon, 20 Jan 2014 19:57:54 +0000 (20:57 +0100)
committersmea <smealum@gmail.com>
Mon, 20 Jan 2014 19:57:54 +0000 (20:57 +0100)
arm11u/source/main.c
libctru/include/ctr/APT.h
libctru/include/ctr/svc.h
libctru/include/ctr/types.h
libctru/source/APT.c
libctru/source/svc.s

index 709ebfe5967b3a6e2e3a32fe414262ddba66bc0d..0e17dedf857672f4563b5c8421a7b952a8e35335 100644 (file)
@@ -11,6 +11,7 @@
 
 Handle srvHandle;
 Handle APTevents[2];
+Handle aptLockHandle;
 
 void aptInit()
 {
@@ -18,19 +19,20 @@ void aptInit()
        
        //initialize APT stuff, escape load screen
        srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
-       APT_GetLockHandle(aptuHandle, 0x0, NULL);
+       APT_GetLockHandle(aptuHandle, 0x0, &aptLockHandle);
        svc_closeHandle(aptuHandle);
-       svc_sleepThread(0x50000);
-       
-       srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
-       APT_Initialize(aptuHandle, 0x300, &APTevents[0], &APTevents[1]);
-       svc_closeHandle(aptuHandle);
-       svc_sleepThread(0x50000);
+
+       svc_waitSynchronization1(aptLockHandle, U64_MAX); //APT lock handle is used because we need to wait for NS to be ready for us
+               srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
+                       APT_Initialize(aptuHandle, 0x300, &APTevents[0], &APTevents[1]);
+               svc_closeHandle(aptuHandle);
+       svc_releaseMutex(aptLockHandle); //release the lock
        
-       srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
-       APT_Enable(aptuHandle, 0x0);
-       svc_closeHandle(aptuHandle);
-       svc_sleepThread(0x50000);
+       svc_waitSynchronization1(aptLockHandle, U64_MAX);
+               srv_getServiceHandle(srvHandle, &aptuHandle, "APT:U");
+                       APT_Enable(aptuHandle, 0x0);
+               svc_closeHandle(aptuHandle);
+       svc_releaseMutex(aptLockHandle);
 }
 
 u8* gspHeap;
index 1516bc0ba50ced29a2b4fb4c4f620ff6fe075324..03705d0c358b458e2ec6f1873bd8a29d466e16db 100644 (file)
@@ -7,5 +7,6 @@ Result APT_Enable(Handle handle, u32 a);
 Result APT_PrepareToJumpToHomeMenu(Handle handle);
 Result APT_JumpToHomeMenu(Handle handle, u32 a, u32 b, u32 c);
 u8 APT_InquireNotification(Handle handle, u32 appID);
+Result APT_NotifyToWait(Handle handle, u32 a);
 
 #endif
index c9afe0325d41629b0d1a11f1d00aaa13769254ba..a68a716d54b72751bc194efb32ba3b73a008dfbd 100644 (file)
@@ -4,8 +4,10 @@
        u32* svc_getData(void);
        void svc_exitProcess(void);
        void svc_sleepThread(s64 ns);
+       Result svc_releaseMutex(Handle handle);
        Result svc_controlMemory(u32* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions); //(outaddr is usually the same as the input addr0)
        Result svc_createEvent(Handle* event, u8 resettype);
+       Result svc_clearEvent(Handle handle);
        Result svc_mapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission);
        Result svc_waitSynchronization1(Handle handle, s64 nanoseconds);
        Result svc_waitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds);
index b69887c87bc270b84759a0bcad50045e981bd115..951bbb4b6c290e45c64fb6182d22d0f4c4e24f08 100644 (file)
@@ -4,6 +4,8 @@
        #include <stdint.h>
        #include <stdbool.h>
 
+       #define U64_MAX (0xFFFFFFFFFFFFFFFF)
+
        typedef unsigned char u8;
        typedef unsigned short u16;
        typedef unsigned int u32;
index 4beceb8a9692e048b44fc9a46ad5e80731b4bc88..ed5a2edbad58687625ce7acae0a598e69cf6db5c 100644 (file)
@@ -11,7 +11,7 @@ void APT_GetLockHandle(Handle handle, u16 flags, Handle* lockHandle)
        svcData[0]=0x10040; //request header code
        svcData[1]=flags;
        svc_sendSyncRequest(handle); //check return value...
-       if(lockHandle)*lockHandle=svcData[1];
+       if(lockHandle)*lockHandle=svcData[5];
 }
 
 void APT_Initialize(Handle handle, u32 a, Handle* eventHandle1, Handle* eventHandle2)
@@ -62,3 +62,12 @@ Result APT_JumpToHomeMenu(Handle handle, u32 a, u32 b, u32 c)
        svc_sendSyncRequest(handle); //check return value...
        return svcData[1];
 }
+
+Result APT_NotifyToWait(Handle handle, u32 a)
+{
+       u32* svcData=svc_getData();
+       svcData[0]=0x430040; //request header code
+       svcData[1]=a;
+       svc_sendSyncRequest(handle); //check return value...
+       return svcData[1];
+}
index eb3d6e3436efd49da7db75a54dabcd19d67fc11d..6e6b556458e1949ce6aa91d666333aea70ac98a5 100644 (file)
@@ -35,6 +35,12 @@ svc_sleepThread:
        svc 0x0A
        bx lr
 
+.global svc_releaseMutex
+.type svc_releaseMutex, %function
+svc_releaseMutex:
+       svc 0x14
+       bx lr
+
 .global svc_createEvent
 .type svc_createEvent, %function
 svc_createEvent:
@@ -44,6 +50,12 @@ svc_createEvent:
        str r1, [r2]
        bx lr
 
+.global svc_clearEvent
+.type svc_clearEvent, %function
+svc_clearEvent:
+       svc 0x19
+       bx lr
+
 .global svc_mapMemoryBlock
 .type svc_mapMemoryBlock, %function
 svc_mapMemoryBlock: