nfpu: fix typedef oversight, switch order of arguments of static functions, get rid of dynamic allocation

This commit is contained in:
averne 2019-01-26 21:57:36 +01:00 committed by fincs
parent f5f5214427
commit fea5cf13b0
2 changed files with 24 additions and 25 deletions

View File

@ -33,7 +33,7 @@ typedef struct {
u8 reserved[0x38]; u8 reserved[0x38];
} PACKED NfpuModelInfo; } PACKED NfpuModelInfo;
typedef struct NfpuMiiCharInfo { typedef struct {
u8 unk_x0[0x10]; // Hash? u8 unk_x0[0x10]; // Hash?
u8 mii_name[2*(10+1)]; ///< utf-16be, null-terminated u8 mii_name[2*(10+1)]; ///< utf-16be, null-terminated
u8 unk_x26; u8 unk_x26;
@ -85,7 +85,7 @@ typedef struct NfpuMiiCharInfo {
u8 mii_mole_pos_x; u8 mii_mole_pos_x;
u8 mii_mole_pos_y; u8 mii_mole_pos_y;
u8 unk_x57; u8 unk_x57;
} PACKED; } PACKED NfpuMiiCharInfo;
typedef struct { typedef struct {
NfpuMiiCharInfo mii_char_info; NfpuMiiCharInfo mii_char_info;

View File

@ -1,5 +1,3 @@
#include <stdlib.h>
#include "types.h" #include "types.h"
#include "arm/atomics.h" #include "arm/atomics.h"
#include "services/hid.h" #include "services/hid.h"
@ -15,14 +13,13 @@ static Result _nfpuInterfaceInitialize(u64 aruid, const NfpuInitConfig *config);
static Result _nfpuInterfaceFinalize(void); static Result _nfpuInterfaceFinalize(void);
static Result _nfpuInterfaceCmdNoInOut(u64 cmd_id); static Result _nfpuInterfaceCmdNoInOut(u64 cmd_id);
static Result _nfpuInterfaceCmdInIdNoOut(HidControllerID id, u64 cmd_id); static Result _nfpuInterfaceCmdInIdNoOut(u64 cmd_id, HidControllerID id);
static Result _nfpuInterfaceCmdInIdOutEvent(HidControllerID id, Event *out, u64 cmd_id); static Result _nfpuInterfaceCmdInIdOutEvent(u64 cmd_id, HidControllerID id, Event *out);
static Result _nfpuInterfaceCmdInIdOutBuffer(HidControllerID id, void *buf, size_t buf_size, u64 cmd_id); static Result _nfpuInterfaceCmdInIdOutBuffer(u64 cmd_id, HidControllerID id, void *buf, size_t buf_size);
static Result _nfpuInterfaceInitialize(u64 aruid, const NfpuInitConfig *config); static Result _nfpuInterfaceInitialize(u64 aruid, const NfpuInitConfig *config);
static Result _nfpuInterfaceFinalize(void); static Result _nfpuInterfaceFinalize(void);
// This is the data passed by every application this was tested with // This is the data passed by every application this was tested with
static const NfpuInitConfig g_nfpuDefaultInitConfig = { static const NfpuInitConfig g_nfpuDefaultInitConfig = {
.unk1 = 0x00000001000a0003, .unk1 = 0x00000001000a0003,
@ -153,7 +150,7 @@ static Result _nfpuInterfaceCmdNoInOut(u64 cmd_id) {
return rc; return rc;
} }
static Result _nfpuInterfaceCmdInIdNoOut(HidControllerID id, u64 cmd_id) { static Result _nfpuInterfaceCmdInIdNoOut(u64 cmd_id, HidControllerID id) {
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
@ -187,7 +184,7 @@ static Result _nfpuInterfaceCmdInIdNoOut(HidControllerID id, u64 cmd_id) {
return rc; return rc;
} }
static Result _nfpuInterfaceCmdInIdOutEvent(HidControllerID id, Event *out, u64 cmd_id) { static Result _nfpuInterfaceCmdInIdOutEvent(u64 cmd_id, HidControllerID id, Event *out) {
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
@ -224,7 +221,7 @@ static Result _nfpuInterfaceCmdInIdOutEvent(HidControllerID id, Event *out, u64
return rc; return rc;
} }
static Result _nfpuInterfaceCmdInIdOutBuffer(HidControllerID id, void *buf, size_t buf_size, u64 cmd_id) { static Result _nfpuInterfaceCmdInIdOutBuffer(u64 cmd_id, HidControllerID id, void *buf, size_t buf_size) {
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
@ -304,19 +301,19 @@ static inline Result _nfpuInterfaceFinalize(void) {
} }
inline Result nfpuStartDetection(HidControllerID id) { inline Result nfpuStartDetection(HidControllerID id) {
return _nfpuInterfaceCmdInIdNoOut(id, 3); return _nfpuInterfaceCmdInIdNoOut(3, id);
} }
inline Result nfpuStopDetection(HidControllerID id) { inline Result nfpuStopDetection(HidControllerID id) {
return _nfpuInterfaceCmdInIdNoOut(id, 4); return _nfpuInterfaceCmdInIdNoOut(4, id);
} }
inline Result nfpuAttachActivateEvent(HidControllerID id, Event *out) { inline Result nfpuAttachActivateEvent(HidControllerID id, Event *out) {
return _nfpuInterfaceCmdInIdOutEvent(id, out, 17); return _nfpuInterfaceCmdInIdOutEvent(17, id, out);
} }
inline Result nfpuAttachDeactivateEvent(HidControllerID id, Event *out) { inline Result nfpuAttachDeactivateEvent(HidControllerID id, Event *out) {
return _nfpuInterfaceCmdInIdOutEvent(id, out, 18); return _nfpuInterfaceCmdInIdOutEvent(18, id, out);
} }
Result nfpuAttachAvailabilityChangeEvent(Event *out) { Result nfpuAttachAvailabilityChangeEvent(Event *out) {
@ -429,12 +426,15 @@ Result nfpuGetDeviceState(HidControllerID id, NfpuDeviceState *out) {
} }
Result nfpuListDevices(u32 *count, HidControllerID *out, size_t num_elements) { Result nfpuListDevices(u32 *count, HidControllerID *out, size_t num_elements) {
// This is the maximum number of controllers that can be connected to a console at a time
// Incidentally, this is the biggest value official software (SSBU) was observed using
#define MAX_CONTROLLERS 9
IpcCommand c; IpcCommand c;
ipcInitialize(&c); ipcInitialize(&c);
size_t buf_size = num_elements * sizeof(u64); u64 buf[MAX_CONTROLLERS] = {0};
u64 *buf = malloc(buf_size); ipcAddRecvStatic(&c, buf, MAX_CONTROLLERS * sizeof(u64), 0);
ipcAddRecvStatic(&c, buf, buf_size, 0);
struct { struct {
u64 magic; u64 magic;
@ -462,12 +462,11 @@ Result nfpuListDevices(u32 *count, HidControllerID *out, size_t num_elements) {
rc = resp->result; rc = resp->result;
if (R_SUCCEEDED(rc) && count && out) { if (R_SUCCEEDED(rc) && count && out) {
*count = resp->count; *count = resp->count;
for (u32 i=0; i<resp->count; i++) for (u32 i=0; i<((num_elements>MAX_CONTROLLERS) ? MAX_CONTROLLERS:num_elements); i++)
out[i] = _hidOfficialToControllerID(buf[i]); out[i] = _hidOfficialToControllerID(buf[i]);
} }
} }
free(buf);
return rc; return rc;
} }
@ -548,21 +547,21 @@ Result nfpuMount(HidControllerID id, NfpuDeviceType device_type, NfpuMountTarget
} }
inline Result nfpuUnmount(HidControllerID id) { inline Result nfpuUnmount(HidControllerID id) {
return _nfpuInterfaceCmdInIdNoOut(id, 6); return _nfpuInterfaceCmdInIdNoOut(6, id);
} }
inline Result nfpuGetTagInfo(HidControllerID id, NfpuTagInfo *out) { inline Result nfpuGetTagInfo(HidControllerID id, NfpuTagInfo *out) {
return _nfpuInterfaceCmdInIdOutBuffer(id, out, sizeof(NfpuTagInfo), 13); return _nfpuInterfaceCmdInIdOutBuffer(13, id, out, sizeof(NfpuTagInfo));
} }
inline Result nfpuGetRegisterInfo(HidControllerID id, NfpuRegisterInfo *out) { inline Result nfpuGetRegisterInfo(HidControllerID id, NfpuRegisterInfo *out) {
return _nfpuInterfaceCmdInIdOutBuffer(id, out, sizeof(NfpuRegisterInfo), 14); return _nfpuInterfaceCmdInIdOutBuffer(14, id, out, sizeof(NfpuRegisterInfo));
} }
inline Result nfpuGetCommonInfo(HidControllerID id, NfpuCommonInfo *out) { inline Result nfpuGetCommonInfo(HidControllerID id, NfpuCommonInfo *out) {
return _nfpuInterfaceCmdInIdOutBuffer(id, out, sizeof(NfpuCommonInfo), 15); return _nfpuInterfaceCmdInIdOutBuffer(15, id, out, sizeof(NfpuCommonInfo));
} }
inline Result nfpuGetModelInfo(HidControllerID id, NfpuModelInfo *out) { inline Result nfpuGetModelInfo(HidControllerID id, NfpuModelInfo *out) {
return _nfpuInterfaceCmdInIdOutBuffer(id, out, sizeof(NfpuModelInfo), 16); return _nfpuInterfaceCmdInIdOutBuffer(16, id, out, sizeof(NfpuModelInfo));
} }