From 345b7208cd0bb1bfa105ad6a361930025ffeef63 Mon Sep 17 00:00:00 2001 From: smea Date: Sun, 19 Jan 2014 13:33:28 +0100 Subject: [PATCH] basic HID implementation --- libctru/include/ctr/GSP.h | 1 + libctru/include/ctr/HID.h | 29 +++++++++++++++++++++++++++++ libctru/include/ctr/svc.h | 1 + libctru/source/GSP.c | 11 +++++++++++ libctru/source/HID.c | 21 +++++++++++++++++++++ libctru/source/svc.s | 6 ++++++ 6 files changed, 69 insertions(+) create mode 100644 libctru/include/ctr/HID.h create mode 100644 libctru/source/HID.c diff --git a/libctru/include/ctr/GSP.h b/libctru/include/ctr/GSP.h index b3bae75..8f71224 100644 --- a/libctru/include/ctr/GSP.h +++ b/libctru/include/ctr/GSP.h @@ -3,6 +3,7 @@ void GSPGPU_AcquireRight(Handle handle, u8 flags); void GSPGPU_SetLcdForceBlack(Handle handle, u8 flags); +void GSPGPU_FlushDataCache(Handle handle, u8* adr, u32 size); void GSPGPU_WriteHWRegs(Handle handle, u32 regAddr, u8* data, u8 size); void GSPGPU_ReadHWRegs(Handle handle, u32 regAddr, u8* data, u8 size); void GSPGPU_RegisterInterruptRelayQueue(Handle handle, Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID); diff --git a/libctru/include/ctr/HID.h b/libctru/include/ctr/HID.h new file mode 100644 index 0000000..1dae35b --- /dev/null +++ b/libctru/include/ctr/HID.h @@ -0,0 +1,29 @@ +#ifndef HID_H +#define HID_H + +#define CPAD_X(v) ((s16)((v)&0xFFFF)) +#define CPAD_Y(v) ((s16)(((v>>16))&0xFFFF)) + +#define TOUCH_X(v) ((u16)((v)&0xFFFF)) +#define TOUCH_Y(v) ((u16)(((v>>16))&0xFFFF)) + +typedef enum +{ + PAD_A = (1<<0), + PAD_B = (1<<1), + PAD_SELECT = (1<<2), + PAD_START = (1<<3), + PAD_RIGHT = (1<<4), + PAD_LEFT = (1<<5), + PAD_UP = (1<<6), + PAD_DOWN = (1<<7), + PAD_R = (1<<8), + PAD_L = (1<<9), + PAD_X = (1<<10), + PAD_Y = (1<<11) +}PAD_KEY; + +void HIDUSER_GetInfo(Handle handle, Handle* outMemHandle); +void HIDUSER_Init(Handle handle); + +#endif diff --git a/libctru/include/ctr/svc.h b/libctru/include/ctr/svc.h index a692bef..cbf109e 100644 --- a/libctru/include/ctr/svc.h +++ b/libctru/include/ctr/svc.h @@ -2,6 +2,7 @@ #define SVC_H u32* svc_getData(void); + void svc_exitProcess(void); void svc_sleepThread(s64 ns); 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); diff --git a/libctru/source/GSP.c b/libctru/source/GSP.c index 9413f2d..3e6656a 100644 --- a/libctru/source/GSP.c +++ b/libctru/source/GSP.c @@ -24,6 +24,17 @@ void GSPGPU_SetLcdForceBlack(Handle handle, u8 flags) svc_sendSyncRequest(handle); //check return value... } +void GSPGPU_FlushDataCache(Handle handle, u8* adr, u32 size) +{ + u32* svcData=svc_getData(); + svcData[0]=0x80082; //request header code + svcData[1]=(u32)adr; + svcData[2]=size; + svcData[3]=0x0; + svcData[4]=0xffff8001; + svc_sendSyncRequest(handle); //check return value... +} + void GSPGPU_WriteHWRegs(Handle handle, u32 regAddr, u8* data, u8 size) { if(size>0x80 || !data)return; diff --git a/libctru/source/HID.c b/libctru/source/HID.c new file mode 100644 index 0000000..45e8c4d --- /dev/null +++ b/libctru/source/HID.c @@ -0,0 +1,21 @@ +#include +#include +#include +#include +#include +#include + +void HIDUSER_GetInfo(Handle handle, Handle* outMemHandle) +{ + u32* svcData=svc_getData(); + svcData[0]=0xa0000; //request header code + svc_sendSyncRequest(handle); //check return value... + if(outMemHandle)*outMemHandle=svcData[3]; +} + +void HIDUSER_Init(Handle handle) +{ + u32* svcData=svc_getData(); + svcData[0]=0x110000; //request header code + svc_sendSyncRequest(handle); //check return value... +} diff --git a/libctru/source/svc.s b/libctru/source/svc.s index a7cca5d..c0e821a 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -23,6 +23,12 @@ svc_controlMemory: add sp, sp, #4 bx lr +.global svc_exitProcess +.type svc_exitProcess, %function +svc_exitProcess: + svc 0x03 + bx lr + .global svc_sleepThread .type svc_sleepThread, %function svc_sleepThread: