From 80b647d65e6974f659752eef19d8027b54bbdeb6 Mon Sep 17 00:00:00 2001 From: smea Date: Mon, 20 Jan 2014 20:57:54 +0100 Subject: [PATCH] APT : added some stuff, plus proper lock handle use in arm11u example. --- arm11u/source/main.c | 24 +++++++++++++----------- libctru/include/ctr/APT.h | 1 + libctru/include/ctr/svc.h | 2 ++ libctru/include/ctr/types.h | 2 ++ libctru/source/APT.c | 11 ++++++++++- libctru/source/svc.s | 12 ++++++++++++ 6 files changed, 40 insertions(+), 12 deletions(-) diff --git a/arm11u/source/main.c b/arm11u/source/main.c index 709ebfe..0e17ded 100644 --- a/arm11u/source/main.c +++ b/arm11u/source/main.c @@ -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); + + 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_Initialize(aptuHandle, 0x300, &APTevents[0], &APTevents[1]); - svc_closeHandle(aptuHandle); - svc_sleepThread(0x50000); - - 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; diff --git a/libctru/include/ctr/APT.h b/libctru/include/ctr/APT.h index 1516bc0..03705d0 100644 --- a/libctru/include/ctr/APT.h +++ b/libctru/include/ctr/APT.h @@ -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 diff --git a/libctru/include/ctr/svc.h b/libctru/include/ctr/svc.h index c9afe03..a68a716 100644 --- a/libctru/include/ctr/svc.h +++ b/libctru/include/ctr/svc.h @@ -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); diff --git a/libctru/include/ctr/types.h b/libctru/include/ctr/types.h index b69887c..951bbb4 100644 --- a/libctru/include/ctr/types.h +++ b/libctru/include/ctr/types.h @@ -4,6 +4,8 @@ #include #include + #define U64_MAX (0xFFFFFFFFFFFFFFFF) + typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; diff --git a/libctru/source/APT.c b/libctru/source/APT.c index 4beceb8..ed5a2ed 100644 --- a/libctru/source/APT.c +++ b/libctru/source/APT.c @@ -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]; +} diff --git a/libctru/source/svc.s b/libctru/source/svc.s index eb3d6e3..6e6b556 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -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: