diff --git a/arm11u/source/main.c b/arm11u/source/main.c index 74fe520..355651d 100644 --- a/arm11u/source/main.c +++ b/arm11u/source/main.c @@ -119,25 +119,6 @@ void renderEffect() cnt++; } -Handle hidHandle; -Handle hidMemHandle; - -void hidInit() -{ - srv_getServiceHandle(NULL, &hidHandle, "hid:USER"); - HIDUSER_GetInfo(hidHandle, &hidMemHandle); - svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000); - - HIDUSER_Init(hidHandle); -} - -void hidExit() -{ - svc_unmapMemoryBlock(hidMemHandle, 0x10000000); - svc_closeHandle(hidMemHandle); - svc_closeHandle(hidHandle); -} - int main() { initSrv(); @@ -146,7 +127,7 @@ int main() gspGpuInit(); - hidInit(); + hidInit(NULL); aptSetupEventHandler(); @@ -155,7 +136,7 @@ int main() { if(status==APP_RUNNING) { - u32 PAD=((u32*)0x10000000)[7]; + u32 PAD=hidSharedMem[7]; u32 regData=PAD|0x01000000; GSPGPU_WriteHWRegs(NULL, 0x202A04, (u8*)®Data, 4); diff --git a/libctru/include/ctr/HID.h b/libctru/include/ctr/HID.h index b22ac97..7487651 100644 --- a/libctru/include/ctr/HID.h +++ b/libctru/include/ctr/HID.h @@ -1,6 +1,8 @@ #ifndef HID_H #define HID_H +#define HID_SHAREDMEM_DEFAULT (0x10000000) + #define CPAD_X(v) ((s16)((v)&0xFFFF)) #define CPAD_Y(v) ((s16)(((v>>16))&0xFFFF)) @@ -23,7 +25,13 @@ typedef enum PAD_Y = (1<<11) }PAD_KEY; -Result HIDUSER_GetInfo(Handle handle, Handle* outMemHandle); -Result HIDUSER_Init(Handle handle); +extern Handle hidMemHandle; +extern vu32* hidSharedMem; + +void hidInit(u32* sharedMem); +void hidExit(); + +Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle); +Result HIDUSER_Init(Handle* handle); #endif diff --git a/libctru/source/HID.c b/libctru/source/HID.c index fa8fd0e..58eaf5f 100644 --- a/libctru/source/HID.c +++ b/libctru/source/HID.c @@ -3,28 +3,56 @@ #include #include #include +#include #include -Result HIDUSER_GetInfo(Handle handle, Handle* outMemHandle) +Handle hidHandle; +Handle hidMemHandle; + +vu32* hidSharedMem; + +void hidInit(u32* sharedMem) { + if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT; + + srv_getServiceHandle(NULL, &hidHandle, "hid:USER"); + + HIDUSER_GetInfo(NULL, &hidMemHandle); + hidSharedMem=sharedMem; + svc_mapMemoryBlock(hidMemHandle, (u32)hidSharedMem, 0x1, 0x10000000); + + HIDUSER_Init(NULL); +} + +void hidExit() +{ + svc_unmapMemoryBlock(hidMemHandle, (u32)hidSharedMem); + svc_closeHandle(hidMemHandle); + svc_closeHandle(hidHandle); +} + +Result HIDUSER_GetInfo(Handle* handle, Handle* outMemHandle) +{ + if(!handle)handle=&hidHandle; u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0xa0000; //request header code Result ret=0; - if((ret=svc_sendSyncRequest(handle)))return ret; + if((ret=svc_sendSyncRequest(*handle)))return ret; if(outMemHandle)*outMemHandle=cmdbuf[3]; return cmdbuf[1]; } -Result HIDUSER_Init(Handle handle) +Result HIDUSER_Init(Handle* handle) { + if(!handle)handle=&hidHandle; u32* cmdbuf=getThreadCommandBuffer(); cmdbuf[0]=0x110000; //request header code Result ret=0; - if((ret=svc_sendSyncRequest(handle)))return ret; + if((ret=svc_sendSyncRequest(*handle)))return ret; return cmdbuf[1]; } diff --git a/sdmc/source/main.c b/sdmc/source/main.c index 4d8d95f..c845177 100644 --- a/sdmc/source/main.c +++ b/sdmc/source/main.c @@ -119,25 +119,6 @@ void renderEffect() } } -Handle hidHandle; -Handle hidMemHandle; - -void hidInit() -{ - srv_getServiceHandle(NULL, &hidHandle, "hid:USER"); - HIDUSER_GetInfo(hidHandle, &hidMemHandle); - svc_mapMemoryBlock(hidMemHandle, 0x10000000, 0x1, 0x10000000); - - HIDUSER_Init(hidHandle); -} - -void hidExit() -{ - svc_unmapMemoryBlock(hidMemHandle, 0x10000000); - svc_closeHandle(hidMemHandle); - svc_closeHandle(hidHandle); -} - int main() { initSrv(); @@ -146,7 +127,7 @@ int main() gspGpuInit(); - hidInit(); + hidInit(NULL); Handle fsuHandle; srv_getServiceHandle(NULL, &fsuHandle, "fs:USER"); @@ -164,7 +145,7 @@ int main() while(!aptGetStatus()) { - u32 PAD=((u32*)0x10000000)[7]; + u32 PAD=hidSharedMem[7]; renderEffect(); swapBuffers(); copyBuffer();