#ifndef OS_H
#define OS_H
-
#define SYSTEM_VERSION(major, minor, revision) \
- (((major)<<24)|((minor)<<16)|((revision)<<8))
+ (((major)<<24)|((minor)<<16)|((revision)<<8))
u32 osConvertVirtToPhys(u32 vaddr);
const char* osStrError(u32 error);
#ifndef SVC_H
#define SVC_H
-
typedef enum {
- MEMOP_FREE =1, // Free heap
- MEMOP_ALLOC=3, // Allocate heap
- MEMOP_MAP =4, // Mirror mapping
- MEMOP_UNMAP=5, // Mirror unmapping
- MEMOP_PROT =6, // Change protection
-
- MEMOP_FREE_LINEAR =0x10001, // Free linear heap
- MEMOP_ALLOC_LINEAR=0x10003 // Allocate linear heap
+ MEMOP_FREE =1, // Free heap
+ MEMOP_ALLOC=3, // Allocate heap
+ MEMOP_MAP =4, // Mirror mapping
+ MEMOP_UNMAP=5, // Mirror unmapping
+ MEMOP_PROT =6, // Change protection
+
+ MEMOP_FREE_LINEAR =0x10001, // Free linear heap
+ MEMOP_ALLOC_LINEAR=0x10003 // Allocate linear heap
} MemOp;
typedef enum {
- MEMPERM_READ =1,
- MEMPERM_WRITE =2,
- MEMPERM_EXECUTE=4,
- MEMPERM_MAX =0xFFFFFFFF //force 4-byte
+ MEMPERM_READ =1,
+ MEMPERM_WRITE =2,
+ MEMPERM_EXECUTE=4,
+ MEMPERM_MAX =0xFFFFFFFF //force 4-byte
} MemPerm;
u32* getThreadCommandBuffer(void);
s32 svcSendSyncRequest(Handle session);
s32 svcGetProcessId(u32 *out, Handle handle);
-
#endif
#define NETDB_H
struct hostent {
- char * h_name;
- char ** h_aliases;
- int h_addrtype;
- int h_length;
- char ** h_addr_list;
+ char * h_name;
+ char ** h_aliases;
+ int h_addrtype;
+ int h_length;
+ char ** h_addr_list;
};
u32 osConvertVirtToPhys(u32 vaddr)
{
- if(vaddr >= 0x14000000 && vaddr < 0x1c000000)
- return vaddr + 0x0c000000; // LINEAR heap
- if(vaddr >= 0x1F000000 && vaddr < 0x1F600000)
- return vaddr - 0x07000000; // VRAM
- if(vaddr >= 0x1FF00000 && vaddr < 0x1FF80000)
- return vaddr + 0x00000000; // DSP memory
- if(vaddr >= 0x30000000 && vaddr < 0x40000000)
- return vaddr - 0x10000000; // Only available under FIRM v8+ for certain processes.
- return 0;
+ if(vaddr >= 0x14000000 && vaddr < 0x1c000000)
+ return vaddr + 0x0c000000; // LINEAR heap
+ if(vaddr >= 0x1F000000 && vaddr < 0x1F600000)
+ return vaddr - 0x07000000; // VRAM
+ if(vaddr >= 0x1FF00000 && vaddr < 0x1FF80000)
+ return vaddr + 0x00000000; // DSP memory
+ if(vaddr >= 0x30000000 && vaddr < 0x40000000)
+ return vaddr - 0x10000000; // Only available under FIRM v8+ for certain processes.
+ return 0;
}
u32 osGetFirmVersion() {
- return (*(u32*)0x1FF80000) & ~0xFF;
+ return (*(u32*)0x1FF80000) & ~0xFF;
}
u32 osGetKernelVersion() {
- return (*(u32*)0x1FF80060) & ~0xFF;
+ return (*(u32*)0x1FF80060) & ~0xFF;
}
const char* osStrError(u32 error) {
- switch((error>>26) & 0x3F) {
- case 0:
- return "Success.";
- case 1:
- return "Nothing happened.";
- case 2:
- return "Would block.";
- case 3:
- return "Not enough resources.";
- case 4:
- return "Not found.";
- case 5:
- return "Invalid state.";
- case 6:
- return "Unsupported.";
- case 7:
- return "Invalid argument.";
- case 8:
- return "Wrong argument.";
- case 9:
- return "Interrupted.";
- case 10:
- return "Internal error.";
- default:
- return "Unknown.";
- }
+ switch((error>>26) & 0x3F) {
+ case 0:
+ return "Success.";
+ case 1:
+ return "Nothing happened.";
+ case 2:
+ return "Would block.";
+ case 3:
+ return "Not enough resources.";
+ case 4:
+ return "Not found.";
+ case 5:
+ return "Invalid state.";
+ case 6:
+ return "Unsupported.";
+ case 7:
+ return "Invalid argument.";
+ case 8:
+ return "Wrong argument.";
+ case 9:
+ return "Interrupted.";
+ case 10:
+ return "Internal error.";
+ default:
+ return "Unknown.";
+ }
}
Result hidInit(u32* sharedMem)
{
- if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
- Result ret=0;
+ if(!sharedMem)sharedMem=(u32*)HID_SHAREDMEM_DEFAULT;
+ Result ret=0;
- // Request service.
- if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
+ // Request service.
+ if((ret=srvGetServiceHandle(&hidHandle, "hid:USER")))return ret;
- // Get sharedmem handle.
- if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
+ // Get sharedmem handle.
+ if((ret=HIDUSER_GetSharedMem(&hidMemHandle))) goto cleanup1;
- // Map HID shared memory at addr "sharedMem".
- hidSharedMem=sharedMem;
- if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
+ // Map HID shared memory at addr "sharedMem".
+ hidSharedMem=sharedMem;
+ if((ret=svcMapMemoryBlock(hidMemHandle, (u32)hidSharedMem, MEMPERM_READ, 0x10000000)))goto cleanup2;
- // Reset internal state.
- kOld = kHeld = kDown = kUp = 0;
- return 0;
+ // Reset internal state.
+ kOld = kHeld = kDown = kUp = 0;
+ return 0;
cleanup2:
- svcCloseHandle(hidMemHandle);
+ svcCloseHandle(hidMemHandle);
cleanup1:
- svcCloseHandle(hidHandle);
- return ret;
+ svcCloseHandle(hidHandle);
+ return ret;
}
void hidExit()
{
- // Unmap HID sharedmem and close handles.
- svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
- svcCloseHandle(hidMemHandle);
- svcCloseHandle(hidHandle);
+ // Unmap HID sharedmem and close handles.
+ svcUnmapMemoryBlock(hidMemHandle, (u32)hidSharedMem);
+ svcCloseHandle(hidMemHandle);
+ svcCloseHandle(hidHandle);
}
void hidScanInput()
{
- kOld = kHeld;
+ kOld = kHeld;
- int padId = hidSharedMem[4];
- kHeld = hidSharedMem[10 + padId*4];
- cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
+ int padId = hidSharedMem[4];
+ kHeld = hidSharedMem[10 + padId*4];
+ cPos = *(circlePosition*)&hidSharedMem[10 + padId*4 + 3];
- int touchId = hidSharedMem[42 + 4];
- tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
- if (hidSharedMem[42 + 8 + touchId*2 + 1])
- kHeld |= KEY_TOUCH;
+ int touchId = hidSharedMem[42 + 4];
+ tPos = *(touchPosition*)&hidSharedMem[42 + 8 + touchId*2];
+ if (hidSharedMem[42 + 8 + touchId*2 + 1])
+ kHeld |= KEY_TOUCH;
- kDown = (~kOld) & kHeld;
- kUp = kOld & (~kHeld);
+ kDown = (~kOld) & kHeld;
+ kUp = kOld & (~kHeld);
}
u32 hidKeysHeld()
{
- return kHeld;
+ return kHeld;
}
u32 hidKeysDown()
{
- return kDown;
+ return kDown;
}
u32 hidKeysUp()
{
- return kUp;
+ return kUp;
}
void hidTouchRead(touchPosition* pos)
{
- if (pos) *pos = tPos;
+ if (pos) *pos = tPos;
}
void hidCircleRead(circlePosition* pos)
{
- if (pos) *pos = cPos;
+ if (pos) *pos = cPos;
}
Result HIDUSER_GetSharedMem(Handle* outMemHandle)
{
- u32* cmdbuf=getThreadCommandBuffer();
- cmdbuf[0]=0xa0000; //request header code
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0xa0000; //request header code
- Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(hidHandle)))return ret;
- if(outMemHandle)*outMemHandle=cmdbuf[3];
+ if(outMemHandle)*outMemHandle=cmdbuf[3];
- return cmdbuf[1];
+ return cmdbuf[1];
}
Result HIDUSER_EnableAccelerometer()
{
- u32* cmdbuf=getThreadCommandBuffer();
- cmdbuf[0]=0x110000; //request header code
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0x110000; //request header code
- Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(hidHandle)))return ret;
- return cmdbuf[1];
+ return cmdbuf[1];
}
Result HIDUSER_DisableAccelerometer()
{
- u32* cmdbuf=getThreadCommandBuffer();
- cmdbuf[0]=0x120000; //request header code
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0x120000; //request header code
- Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(hidHandle)))return ret;
- return cmdbuf[1];
+ return cmdbuf[1];
}
Result HIDUSER_EnableGyroscope()
{
- u32* cmdbuf=getThreadCommandBuffer();
- cmdbuf[0]=0x130000; //request header code
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0x130000; //request header code
- Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(hidHandle)))return ret;
- return cmdbuf[1];
+ return cmdbuf[1];
}
Result HIDUSER_DisableGyroscope()
{
- u32* cmdbuf=getThreadCommandBuffer();
- cmdbuf[0]=0x140000; //request header code
+ u32* cmdbuf=getThreadCommandBuffer();
+ cmdbuf[0]=0x140000; //request header code
- Result ret=0;
- if((ret=svcSendSyncRequest(hidHandle)))return ret;
+ Result ret=0;
+ if((ret=svcSendSyncRequest(hidHandle)))return ret;
- return cmdbuf[1];
+ return cmdbuf[1];
}
*/
typedef struct {
- u32 num;
+ u32 num;
- struct {
- char name[8];
- Handle handle;
- } services[];
+ struct {
+ char name[8];
+ Handle handle;
+ } services[];
} service_list_t;
extern service_list_t* __service_ptr;
static int __name_cmp(const char* a, const char* b) {
- u32 i;
+ u32 i;
- for(i=0; i<8; i++) {
- if(a[i] != b[i])
- return 1;
- if(a[i] == '\0')
- return 0;
- }
+ for(i=0; i<8; i++) {
+ if(a[i] != b[i])
+ return 1;
+ if(a[i] == '\0')
+ return 0;
+ }
- return 0;
+ return 0;
}
static Handle __get_handle_from_list(char* name) {
- if((u32)__service_ptr == 0)
- return 0;
+ if((u32)__service_ptr == 0)
+ return 0;
- u32 i, num = __service_ptr->num;
+ u32 i, num = __service_ptr->num;
- for(i=0; i<num; i++) {
- if(__name_cmp(__service_ptr->services[i].name, name) == 0)
- return __service_ptr->services[i].handle;
- }
+ for(i=0; i<num; i++) {
+ if(__name_cmp(__service_ptr->services[i].name, name) == 0)
+ return __service_ptr->services[i].handle;
+ }
- return 0;
+ return 0;
}
Result srvInit()
{
- Result rc = 0;
+ Result rc = 0;
- if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
+ if((rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc;
- if((rc = srvRegisterClient())) {
- svcCloseHandle(g_srv_handle);
- g_srv_handle = 0;
- }
+ if((rc = srvRegisterClient())) {
+ svcCloseHandle(g_srv_handle);
+ g_srv_handle = 0;
+ }
- return rc;
+ return rc;
}
Result srvExit()
{
- if(g_srv_handle != 0)svcCloseHandle(g_srv_handle);
+ if(g_srv_handle != 0)svcCloseHandle(g_srv_handle);
- g_srv_handle = 0;
- return 0;
+ g_srv_handle = 0;
+ return 0;
}
Result srvRegisterClient()
{
- u32* cmdbuf = getThreadCommandBuffer();
- cmdbuf[0] = 0x10002;
- cmdbuf[1] = 0x20;
+ u32* cmdbuf = getThreadCommandBuffer();
+ cmdbuf[0] = 0x10002;
+ cmdbuf[1] = 0x20;
- Result rc;
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+ Result rc;
+ if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
- return cmdbuf[1];
+ return cmdbuf[1];
}
Result srvGetServiceHandle(Handle* out, char* name)
{
- /* Look in service-list given to us by loader. If we find find a match,
- we return it. */
- Handle h = __get_handle_from_list(name);
-
- if(h != 0) {
- return svcDuplicateHandle(out, h);
- }
-
- /* Normal request to service manager. */
- u32* cmdbuf = getThreadCommandBuffer();
- cmdbuf[0] = 0x50100;
- strcpy((char*) &cmdbuf[1], name);
- cmdbuf[3] = strlen(name);
- cmdbuf[4] = 0x0;
-
- Result rc;
- if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
-
- *out = cmdbuf[3];
- return cmdbuf[1];
+ /* Look in service-list given to us by loader. If we find find a match,
+ we return it. */
+ Handle h = __get_handle_from_list(name);
+
+ if(h != 0) {
+ return svcDuplicateHandle(out, h);
+ }
+
+ /* Normal request to service manager. */
+ u32* cmdbuf = getThreadCommandBuffer();
+ cmdbuf[0] = 0x50100;
+ strcpy((char*) &cmdbuf[1], name);
+ cmdbuf[3] = strlen(name);
+ cmdbuf[4] = 0x0;
+
+ Result rc;
+ if((rc = svcSendSyncRequest(g_srv_handle)))return rc;
+
+ *out = cmdbuf[3];
+ return cmdbuf[1];
}