Revolution WPAD work (#3078)

* WPAD mostly matching, likely equivalent

* Implement WPADEncrypt (mostly taken from SMG1 decomp)

* Implement WPADHidParser

* Add wpad_debug_msg stub

* Fix WUD file paths in splits

* Fix WPAD regressions in Shield/ShieldD
This commit is contained in:
Max Roncace
2026-02-01 20:33:08 -05:00
committed by GitHub
parent 21de544196
commit f5dbf1d827
42 changed files with 5328 additions and 680 deletions
+3 -3
View File
@@ -8,7 +8,7 @@ extern "C" {
#endif
typedef void (*DSPCallback)(void* task);
typedef struct STRUCT_DSP_TASK DSPTaskInfo;
struct STRUCT_DSP_TASK;
typedef struct STRUCT_DSP_TASK {
/* 0x00 */ volatile u32 state;
@@ -26,8 +26,8 @@ typedef struct STRUCT_DSP_TASK {
/* 0x2C */ DSPCallback res_cb;
/* 0x30 */ DSPCallback done_cb;
/* 0x34 */ DSPCallback req_cb;
/* 0x38 */ DSPTaskInfo* next;
/* 0x3C */ DSPTaskInfo* prev;
/* 0x38 */ struct STRUCT_DSP_TASK* next;
/* 0x3C */ struct STRUCT_DSP_TASK* prev;
/* 0x40 */ OSTime t_context;
/* 0x48 */ OSTime t_task;
} DSPTaskInfo;
+10
View File
@@ -12,6 +12,7 @@ volatile u32 __DIRegs[] AT_ADDRESS(0xCD006000);
volatile u32 __SIRegs[0x100] AT_ADDRESS(0xCD006400);
volatile u32 __EXIRegs[0x40] AT_ADDRESS(0xCD006800);
volatile u32 __AIRegs[8] AT_ADDRESS(0xCD006C00);
volatile u32 __ACRRegs[89] AT_ADDRESS(0xCD000000);
volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#else
#define __VIRegs ((volatile u16 *)0xCC002000)
@@ -22,6 +23,7 @@ volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#define __SIRegs ((volatile u32 *)0xCD006400)
#define __EXIRegs ((volatile u32 *)0xCD006800)
#define __AIRegs ((volatile u32 *)0xCD006C00)
#define __ACRRegs ((volatile u32 *)0xCD000000)
#define __IPCRegs ((volatile u32 *)0xCD000000)
#endif
@@ -115,4 +117,12 @@ volatile u32 __IPCRegs[4] AT_ADDRESS(0xCD000000);
#define DSP_DMA_START_FLAG (0x8000) // set to start DSP
inline void ACRWriteReg(u32 offset, u32 val) {
__ACRRegs[offset >> 2] = val;
}
inline u32 ACRReadReg(u32 offset) {
return __ACRRegs[offset >> 2];
}
#endif
+1
View File
@@ -109,6 +109,7 @@ u8 __gUnknown800030E3 AT_ADDRESS(OS_BASE_CACHED | 0x30E3);
u32 OSGetConsoleType(void);
void OSInit(void);
void OSRegisterVersion(const char* id);
const char* OSGetAppGamename(void);
void* OSGetArenaHi(void);
void* OSGetArenaLo(void);
+9
View File
@@ -3,6 +3,7 @@
#include <revolution/os.h>
#include <revolution/nand.h>
#include <revolution/wpad/bte.h>
#ifdef __cplusplus
extern "C" {
@@ -128,6 +129,12 @@ u8 SCGetProgressiveMode(void);
u8 SCGetScreenSaverMode(void);
u8 SCGetSoundMode(void);
u32 SCGetCounterBias(void);
u8 SCGetWpadSensorBarPosition(void);
u8 SCGetWpadMotorMode(void);
u8 SCGetWpadSpeakerVolume(void);
u8 SCGetBtDpdSensibility(void);
BOOL SCSetWpadSpeakerVolume(u8 volume);
BOOL SCSetWpadMotorMode(u8 mode);
// scapi_prdinfo
BOOL SCGetProductAreaString(char* buf, u32 bufSize);
@@ -144,6 +151,8 @@ BOOL SCFindU8Item(u8* data, SCItemID id);
BOOL SCFindS8Item(s8* data, SCItemID id);
BOOL SCFindU32Item(u32* data, SCItemID id);
BOOL SCReplaceU8Item(u8 data, SCItemID id);
void SCFlushAsync(SCFlushCallback callback);
BOOL SCSetBtDeviceInfoArray(const SCBtDeviceInfoArray*);
u32 SCCheckStatus(void);
s32 SCReloadConfFileAsync(u8* bufp, u32 bufSize, SCReloadConfFileCallback callback);
+3
View File
@@ -35,6 +35,9 @@ void VISetGamma(VIGamma);
void VISetRGBModeImm(void);
BOOL VIEnableDVDStopMotor(BOOL enable);
BOOL VIResetDimmingCount(void);
BOOL VIResetRFIdle(void);
#ifdef __cplusplus
}
#endif
+202 -139
View File
@@ -1,98 +1,58 @@
#ifndef _REVOLUTION_WPAD_H_
#define _REVOLUTION_WPAD_H_
#include <revolution/os.h>
#include <revolution/types.h>
#include <revolution/sc.h>
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WPAD_BUTTON_LEFT 0x0001
#define WPAD_BUTTON_RIGHT 0x0002
#define WPAD_BUTTON_DOWN 0x0004
#define WPAD_BUTTON_UP 0x0008
#define WPAD_BUTTON_PLUS 0x0010
#define WPAD_BUTTON_2 0x0100
#define WPAD_BUTTON_1 0x0200
#define WPAD_BUTTON_B 0x0400
#define WPAD_BUTTON_A 0x0800
#define WPAD_BUTTON_MINUS 0x1000
#define WPAD_BUTTON_Z 0x2000
#define WPAD_BUTTON_C 0x4000
#define WPAD_BUTTON_HOME 0x8000
#define WPAD_BUTTON_LEFT (1 << 0)
#define WPAD_BUTTON_RIGHT (1 << 1)
#define WPAD_BUTTON_DOWN (1 << 2)
#define WPAD_BUTTON_UP (1 << 3)
#define WPAD_BUTTON_PLUS (1 << 4)
#define WPAD_BUTTON_2 (1 << 8)
#define WPAD_BUTTON_1 (1 << 9)
#define WPAD_BUTTON_B (1 << 10)
#define WPAD_BUTTON_A (1 << 11)
#define WPAD_BUTTON_MINUS (1 << 12)
#define WPAD_BUTTON_Z (1 << 13)
#define WPAD_BUTTON_C (1 << 14)
#define WPAD_BUTTON_HOME (1 << 15)
#define WPAD_BUTTON_CL_UP (1 << 0)
#define WPAD_BUTTON_CL_LEFT (1 << 1)
#define WPAD_BUTTON_CL_ZR (1 << 2)
#define WPAD_BUTTON_CL_X (1 << 3)
#define WPAD_BUTTON_CL_A (1 << 4)
#define WPAD_BUTTON_CL_Y (1 << 5)
#define WPAD_BUTTON_CL_B (1 << 6)
#define WPAD_BUTTON_CL_ZL (1 << 7)
#define WPAD_BUTTON_CL_FULL_R (1 << 9)
#define WPAD_BUTTON_CL_PLUS (1 << 10)
#define WPAD_BUTTON_CL_HOME (1 << 11)
#define WPAD_BUTTON_CL_MINUS (1 << 12)
#define WPAD_BUTTON_CL_FULL_L (1 << 13)
#define WPAD_BUTTON_CL_DOWN (1 << 14)
#define WPAD_BUTTON_CL_RIGHT (1 << 15)
#define WPAD_CL_BUTTON_UP (1 << 0)
#define WPAD_CL_BUTTON_LEFT (1 << 1)
#define WPAD_CL_TRIGGER_ZR (1 << 2)
#define WPAD_CL_BUTTON_X (1 << 3)
#define WPAD_CL_BUTTON_A (1 << 4)
#define WPAD_CL_BUTTON_Y (1 << 5)
#define WPAD_CL_BUTTON_B (1 << 6)
#define WPAD_CL_TRIGGER_ZL (1 << 7)
#define WPAD_CL_RESERVED (1 << 8)
#define WPAD_CL_TRIGGER_R (1 << 9)
#define WPAD_CL_BUTTON_PLUS (1 << 10)
#define WPAD_CL_BUTTON_HOME (1 << 11)
#define WPAD_CL_BUTTON_MINUS (1 << 12)
#define WPAD_CL_TRIGGER_L (1 << 13)
#define WPAD_CL_BUTTON_DOWN (1 << 14)
#define WPAD_CL_BUTTON_RIGHT (1 << 15)
#define WPAD_MAX_DPD_OBJECTS 4
#define WPAD_CHAN0 0
#define WPAD_CHAN1 1
#define WPAD_CHAN2 2
#define WPAD_CHAN3 3
#define WPAD_CHAN_INVALID -1
#define WPAD_MAX_CONTROLLERS 4
enum WPADResult_et {
WPAD_ERR_OK = 0,
WPAD_ERR_NO_CONTROLLER = -1,
WPAD_ERR_BUSY = -2,
WPAD_ERR_TRANSFER = -3,
WPAD_ERR_INVALID = -4,
WPAD_ERR_5 = -5,
WPAD_ERR_6 = -6,
WPAD_ERR_CORRUPTED = -7,
};
#define WPAD_ESUCCESS WPAD_ERR_OK
#define WPAD_ENODEV WPAD_ERR_NO_CONTROLLER
#define WPAD_EBUSY WPAD_ERR_BUSY
#define WPAD_ETRANSFER WPAD_ERR_TRANSFER // I don't know what the POSIX equivalent is
#define WPAD_EINVAL WPAD_ERR_INVALID
#define WPAD_E5 WPAD_ERR_5
#define WPAD_E6 WPAD_ERR_6
#define WPAD_EBADE WPAD_ERR_CORRUPTED
// apparently enum vs constant is a thing. cool
#define WPAD_CESUCCESS (WPAD_ESUCCESS + 0)
#define WPAD_CENODEV (WPAD_ENODEV + 0)
#define WPAD_CEBUSY (WPAD_EBUSY + 0)
#define WPAD_CETRANSFER (WPAD_ETRANSFER + 0)
#define WPAD_CEINVAL (WPAD_EINVAL + 0)
#define WPAD_CE5 (WPAD_E5 + 0)
#define WPAD_CE6 (WPAD_E6 + 0)
#define WPAD_CEBADE (WPAD_EBADE + 0)
#define WPAD_DEV_CORE 0
#define WPAD_DEV_FS 1
#define WPAD_DEV_CLASSIC 2
#define WPAD_DEV_BALANCE_CHECKER 3
#define WPAD_DEV_VSM 4
#define WPAD_DEV_MOTION_PLUS 5
#define WPAD_DEV_MPLS_PT_FS 6
#define WPAD_DEV_MPLS_PT_CLASSIC 7
#define WPAD_DEV_TRAIN 16
#define WPAD_DEV_GUITAR 17
#define WPAD_DEV_DRUM 18
#define WPAD_DEV_TAIKO 19
#define WPAD_DEV_TURNTABLE 20
#define WPAD_DEV_CORE 0
#define WPAD_DEV_FS 1
#define WPAD_DEV_CLASSIC 2
#define WPAD_DEV_BALANCE_CHECKER 3
#define WPAD_DEV_VSM 4
#define WPAD_DEV_MOTION_PLUS 5
#define WPAD_DEV_MPLS_PT_FS 6
#define WPAD_DEV_MPLS_PT_CLASSIC 7
#define WPAD_DEV_TRAIN 16
#define WPAD_DEV_GUITAR 17
#define WPAD_DEV_DRUM 18
#define WPAD_DEV_TAIKO 19
#define WPAD_DEV_TURNTABLE 20
// seems to be like maybe general purpose non-specific device types
// maybe this was for testing or something? idk
@@ -105,18 +65,103 @@ enum WPADResult_et {
#define WPAD_DEV_BULK_7 27
#define WPAD_DEV_BULK_8 28
#define WPAD_DEV_MPLS_PT_UNKNOWN 250
#define WPAD_DEV_251 251
#define WPAD_DEV_252 252 // invalid device mode?
#define WPAD_DEV_NONE 253 // sort of like WPAD_ENODEV (see __wpadAbortInitExtension in WPADHIDParser.c)
#define WPAD_DEV_INITIALIZING 255 // see __a1_20_status_report
#define WPAD_DEV_MPLS_PT_FUTURE 250
#define WPAD_DEV_FUTURE 251
#define WPAD_DEV_NOT_SUPPORTED 252 // invalid device mode?
#define WPAD_DEV_NONE 253 // sort of like WPAD_ENODEV (see __wpadAbortInitExtension in WPADHIDParser.c)
#define WPAD_DEV_INITIALIZING 255 // see __a1_20_status_report
enum WPADResult_et {
WPAD_ERR_OK = 0,
WPAD_ERR_NO_CONTROLLER = -1,
WPAD_ERR_BUSY = -2,
WPAD_ERR_TRANSFER = -3,
WPAD_ERR_INVALID = -4,
WPAD_ERR_NOPERM = -5,
WPAD_ERR_BROKEN = -6,
WPAD_ERR_CORRUPTED = -7,
};
#define WPAD_ESUCCESS WPAD_ERR_OK
#define WPAD_ENODEV WPAD_ERR_NO_CONTROLLER
#define WPAD_EBUSY WPAD_ERR_BUSY
#define WPAD_ETRANSFER WPAD_ERR_TRANSFER // I don't know what the POSIX equivalent is
#define WPAD_EINVAL WPAD_ERR_INVALID
#define WPAD_ENOPERM WPAD_ERR_NOPERM
#define WPAD_EBROKEN WPAD_ERR_BROKEN
#define WPAD_EBADE WPAD_ERR_CORRUPTED
// apparently enum vs constant is a thing. cool
#define WPAD_CESUCCESS (WPAD_ESUCCESS + 0)
#define WPAD_CENODEV (WPAD_ENODEV + 0)
#define WPAD_CEBUSY (WPAD_EBUSY + 0)
#define WPAD_CETRANSFER (WPAD_ETRANSFER + 0)
#define WPAD_CEINVAL (WPAD_EINVAL + 0)
#define WPAD_CENOPERM (WPAD_ENOPERM + 0)
#define WPAD_CEBROKEN (WPAD_EBROKEN + 0)
#define WPAD_CEBADE (WPAD_EBADE + 0)
#define WPAD_DPD_MAX_OBJECTS 4
#define WPAD_CHAN0 0
#define WPAD_CHAN1 1
#define WPAD_CHAN2 2
#define WPAD_CHAN3 3
#define WPAD_CHAN_INVALID -1
#define WPAD_MAX_CONTROLLERS 4
#define WPAD_HIDREP_BASE 0x10
#define WPAD_HIDREP_VIBRATOR 0x10
#define WPAD_HIDREP_PORT 0x11
#define WPAD_HIDREP_REPTYPE 0x12
#define WPAD_HIDREP_ENDPD 0x13
#define WPAD_HIDREP_ENSPK 0x14
#define WPAD_HIDREP_GETSTAT 0x15
#define WPAD_HIDREP_WRDATA 0x16
#define WPAD_HIDREP_RDDATA 0x17
#define WPAD_HIDREP_STRM 0x18
#define WPAD_HIDREP_MUTE 0x19
#define WPAD_HIDREP_DPDCSB 0x1A
#define WPAD_HIDREP_WAIT 0xFF
#define WPAD_BTN_HCURSOR_MASK (WPAD_BUTTON_LEFT | WPAD_BUTTON_RIGHT)
#define WPAD_BTN_VCURSOR_MASK (WPAD_BUTTON_UP | WPAD_BUTTON_DOWN)
#define WPAD_CLB_HCURSOR_MASK (WPAD_CL_BUTTON_LEFT | WPAD_CL_BUTTON_RIGHT)
#define WPAD_CLB_VCURSOR_MASK (WPAD_CL_BUTTON_UP | WPAD_CL_BUTTON_DOWN)
typedef void (*WPADInitFunc)(void);
typedef void (*WPADCallback)(s32 chan, s32 result);
typedef void (*WPADExtensionCallback)(s32 chan, s32 devType);
typedef void* (*WPADAlloc)(u32 size);
typedef u8 (*WPADFree)(void* ptr);
typedef void (*WPADSyncDeviceCallback)(s32 result, s32 num);
typedef void (*WPADSamplingCallback)(s32 chan);
typedef void (*WPADConnectCallback)(s32 chan, s32 result);
typedef void (*WPADSimpleSyncCallback)(s32 result, s32 num);
typedef void (*WPADFlushCallback)(u32 result);
typedef u32 WPADDeviceType;
typedef s32 WPADChannel;
typedef struct WPADInfo {
/* 0x00 */ BOOL dpd;
/* 0x04 */ BOOL speaker;
/* 0x08 */ BOOL attach;
/* 0x0C */ BOOL lowBat;
/* 0x10 */ BOOL nearempty;
/* 0x14 */ u8 battery;
/* 0x15 */ u8 led;
/* 0x16 */ u8 protocol;
/* 0x17 */ u8 firmware;
} WPADInfo;
typedef struct WPADAcc {
/* 0x00 */ s16 x;
/* 0x02 */ s16 y;
/* 0x04 */ s16 z;
} WPADAcc;
typedef struct DPDObject {
/* 0x00 */ s16 x;
@@ -130,7 +175,7 @@ typedef struct WPADStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
} WPADStatus;
@@ -145,54 +190,37 @@ typedef struct DPDObjEx {
} DPDObjEx;
typedef struct WPADStatusEx {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ DPDObjEx exp[WPAD_MAX_DPD_OBJECTS];
/* 0x00 */ WPADStatus base;
/* 0x2A */ DPDObjEx exp[WPAD_DPD_MAX_OBJECTS];
} WPADStatusEx;
typedef struct WPADFSStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ s16 fsAccX;
/* 0x2c */ s16 fsAccY;
/* 0x2e */ s16 fsAccZ;
/* 0x00 */ WPADStatus base;
/* 0x2A */ s16 fsAccX;
/* 0x2C */ s16 fsAccY;
/* 0x2E */ s16 fsAccZ;
/* 0x30 */ s8 fsStickX;
/* 0x31 */ s8 fsStickY;
} WPADFSStatus;
typedef struct WPADCLStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 clButton;
/* 0x2c */ s16 clLStickX;
/* 0x2e */ s16 clLStickY;
/* 0x00 */ WPADStatus base;
/* 0x2A */ u16 clButton;
/* 0x2C */ s16 clLStickX;
/* 0x2E */ s16 clLStickY;
/* 0x30 */ s16 clRStickX;
/* 0x32 */ s16 clRStickY;
/* 0x34 */ u8 clTriggerL;
/* 0x35 */ u8 clTriggerR;
} WPADCLStatus;
#if SDK_AUG2010
typedef struct WPADBKStatus {
/* 0x00 */ u16 button;
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u8 bulk[21];
@@ -204,7 +232,7 @@ typedef struct WPADTRStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 trButton;
@@ -217,7 +245,7 @@ typedef struct WPADVSStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 at_0x2a[5];
@@ -233,7 +261,7 @@ typedef struct WPADMPStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
union {
@@ -255,7 +283,6 @@ typedef struct WPADMPStatus {
} cl;
} ext;
/* 0x36 */ u8 stat;
/* 0x37 */ u8 reserved;
/* 0x38 */ s16 pitch;
/* 0x3a */ s16 yaw;
/* 0x3c */ s16 roll;
@@ -266,25 +293,14 @@ typedef struct WPADBLStatus {
/* 0x02 */ s16 accX;
/* 0x04 */ s16 accY;
/* 0x06 */ s16 accZ;
/* 0x08 */ DPDObject obj[WPAD_MAX_DPD_OBJECTS];
/* 0x08 */ DPDObject obj[WPAD_DPD_MAX_OBJECTS];
/* 0x28 */ u8 dev;
/* 0x29 */ s8 err;
/* 0x2a */ u16 press[4];
/* 0x32 */ s8 temp;
/* 0x33 */ u8 battery;
} WPADBLStatus;
typedef struct WPADInfo {
/* 0x00 */ BOOL dpd;
/* 0x04 */ BOOL speaker;
/* 0x08 */ BOOL attach;
/* 0x0C */ BOOL lowBat;
/* 0x10 */ BOOL nearempty;
/* 0x14 */ u8 battery;
/* 0x15 */ u8 led;
/* 0x16 */ u8 protocol;
/* 0x17 */ u8 firmware;
} WPADInfo;
#endif
#define WPAD_FMT_CORE_BTN 0
#define WPAD_FMT_CORE_BTN_ACC 1
@@ -306,6 +322,7 @@ typedef struct WPADInfo {
#define WPAD_FMT_TAIKO 17
#define WPAD_FMT_TURNTABLE 18
#define WPAD_FMT_BULK 19
#define WPAD_FMT_UNK_20 20
#define WPAD_SPEAKER_DISABLE 0
#define WPAD_SPEAKER_ENABLE 1 // might be ON? see HBMRemoteSpk.cpp
@@ -317,8 +334,21 @@ typedef struct WPADInfo {
#define WPAD_MOTOR_STOP 0
#define WPAD_MOTOR_RUMBLE 1
typedef u32 WPADDpdCommand;
enum WPADDpdCommand_et
{
WPAD_DPD_DISABLE = 0x00,
// the command here is actually the data format
WPAD_DPD_BASIC = 0x01,
WPAD_DPD_STANDARD = 0x03,
WPAD_DPD_EXTENDED = 0x05,
};
s32 WPADProbe(s32 chan, u32* devType);
u8 WPADGetRadioSensitivity(s32 chan);
BOOL WPADSetAcceptConnection(u8 accept);
BOOL WPADGetAcceptConnection(void);
void WPADRead(s32 chan, WPADStatus* status);
BOOL WPADIsSpeakerEnabled(s32 chan);
s32 WPADControlSpeaker(s32 chan, u32 command, WPADCallback cb);
@@ -327,20 +357,53 @@ s32 WPADSendStreamData(s32 chan, void* p_buf, u16 len);
WPADConnectCallback WPADSetConnectCallback(s32 chan, WPADConnectCallback cb);
WPADExtensionCallback WPADSetExtensionCallback(s32 chan, WPADExtensionCallback cb);
WPADSimpleSyncCallback WPADSetSimpleSyncCallback(WPADSimpleSyncCallback cb);
WPADSamplingCallback WPADSetSamplingCallback(s32 chan, WPADSamplingCallback cb);
BOOL WPADIsUsedCallbackByKPAD(void);
void WPADSetCallbackByKPAD(BOOL isKPAD);
s32 WPADGetInfoAsync(s32 chan, WPADInfo* info, WPADCallback cb);
s32 WPADGetInfoAsync(s32 chan, WPADInfo* info, WPADCallback callback);
void WPADControlMotor(s32 chan, u32 command);
BOOL WPADCanSendStreamData(s32 chan);
BOOL WPADStopSimpleSync(void);
void WPADDisconnect(s32 chan);
BOOL WPADStartSimpleSync();
BOOL WPADStartFastSimpleSync(void);
BOOL WPADSaveConfig(SCFlushCallback* cb);
void WPADSetSpeakerVolume(u8 volume);
BOOL WPADSaveConfig(WPADFlushCallback cb);
u8 WPADGetSpeakerVolume(void);
void WPADSetSpeakerVolume(u8 volume);
void WPADEnableMotor(BOOL enabled);
BOOL WPADIsMotorEnabled(void);
BOOL IsBusyStream(s32 chan);
void WPADRegisterAllocator(WPADAlloc alloc, WPADFree free);
u32 WPADGetWorkMemorySize(void);
void WPADGetAccGravityUnit(s32 chan, u32 type, WPADAcc* acc);
BOOL WPADIsDpdEnabled(s32 chan);
s32 WPADControlDpd(s32 chan, u32 command, WPADCallback callback);
u32 WPADGetDataFormat(s32 chan);
s32 WPADSetDataFormat(s32 chan, u32 fmt);
void WPADSetAutoSleepTime(u8 minute);
u8 WPADGetSensorBarPosition(void);
s32 WPADGetStatus(void);
void WPADInit(void);
BOOL OnShutdown(BOOL final, u32 event);
u8 WPADGetDpdSensitivity(void);
void __WPADShutdown(void);
void __WPADReconnect(BOOL);
BOOL WPADCancelSyncDevice();
void WPADSetAutoSamplingBuf(s32 chan, void* buf, u32);
s32 WPADControlLed(s32 chan, u8 pattern, WPADCallback callback);
void WPADGetAddress(s32 chan, u8* addr);
#define WPADStartMotor(chan) WPADControlMotor((chan), WPAD_MOTOR_RUMBLE)
#define WPADStopMotor(chan) WPADControlMotor((chan), WPAD_MOTOR_STOP)
#ifdef __cplusplus
}
+22
View File
@@ -2,6 +2,7 @@
#define CONTEXT_BTE_H
#include <stdint.h>
#include "types.h"
// taken from https://github.com/doldecomp/sdk_2009-12-11/blob/main/include/context_bte.h
@@ -1041,4 +1042,25 @@ struct small_dev_info
char __pad1[0x10];
}; // size 0x40
typedef struct {
BD_ADDR bd_addr;
u8 bd_name[64];
u8 link_key[16];
} SCBtCmpDevInfoSingle;
typedef struct {
BD_ADDR bd_addr;
u8 bd_name[64];
} SCBtDeviceInfoSingle;
typedef struct {
u8 num;
SCBtCmpDevInfoSingle info[6];
} SCBtCmpDevInfoArray;
typedef struct {
u8 num;
SCBtDeviceInfoSingle info[16];
} SCBtDeviceInfoArray;
#endif // CONTEXT_BTE_H
+256
View File
@@ -0,0 +1,256 @@
#ifndef _REVOLUTION_WUD_WUD_H_
#define _REVOLUTION_WUD_WUD_H_
#include <revolution/wpad/bte.h>
#include <revolution.h>
#ifdef __cplusplus
extern "C" {
#endif
#define WUD_CHAN0 0
#define WUD_CHAN1 1
#define WUD_CHAN2 2
#define WUD_CHAN3 3
#define WUD_MAX_CHANNELS 4
#define WUD_CHAN_INVALID -1
typedef void* WUDAllocFunc(u32 size);
typedef int WUDFreeFunc(void* ptr); // signature from petari. not sure what the int is, though
typedef struct WUDDevInfo {
/* 0x00 */ struct small_dev_info small;
/* 0x40 */ BD_ADDR devAddr;
/* 0x46 */ LINK_KEY linkKey;
/* 0x56 */ u8 devHandle;
/* 0x57 */ u8 subclass;
/* 0x58 */ u8 appID;
/* 0x59 */ u8 at_0x59;
/* 0x5a */ u8 at_0x5a; /* unknown */
/* 0x5b */ u8 at_0x5b;
/* 0x5c */ u8 at_0x5c;
u8 at_0x5d[1]; // padding?
/* 0x5e */ tBTA_HH_ATTR_MASK hhAttrMask;
} WUDDevInfo; // size 0x60
typedef void WUDHidConnectCallback(WUDDevInfo* devInfo, u8 isOpenEvent);
typedef void WUDHidReceiveCallback(u8 dev_handle, u8* p_rpt, u16 len);
u8 WUDGetBufferStatus(void);
u8 _WUDGetLinkNumber(void);
u16 _WUDGetQueuedSize(s8 dev_handle);
u16 _WUDGetNotAckedSize(s8 dev_handle);
typedef u8 BTD_NAME[64];
typedef u8 BTD_ADDR[6];
typedef u8 LINKKEY[16];
typedef enum {
WUD_STATE_SYNC_START = 0,
WUD_STATE_SYNC_PREPARE_SEARCH = 1,
WUD_STATE_SYNC_START_SEARCH = 2,
WUD_STATE_SYNC_WAIT_FOR_SEARCH_RESULT = 3,
WUD_STATE_SYNC_CHECK_SEARCH_RESULT = 4,
WUD_STATE_SYNC_IS_EXISTED_DEVICE = 5,
WUD_STATE_SYNC_6 = 6,
WUD_STATE_SYNC_STORED_LINK_KEY_TO_EEPROM = 7,
WUD_STATE_SYNC_WAIT_FOR_STORING = 8,
WUD_STATE_SYNC_WAIT_FOR_READING = 10,
WUD_STATE_SYNC_11 = 11,
WUD_STATE_SYNC_12 = 12,
WUD_STATE_SYNC_13 = 13,
WUD_STATE_SYNC_DONE = 14,
WUD_STATE_SYNC_TRY_CONNECT = 15,
WUD_STATE_SYNC_PREPARE_FOR_EXISTED_DEVICE = 16,
WUD_STATE_SYNC_PREPARE_FOR_UNKNOWN_DEVICE = 17,
WUD_STATE_SYNC_REGISTER_DEVICE = 18,
WUD_STATE_SYNC_VIRGIN_SIMPLE = 19,
WUD_STATE_SYNC_VIRGIN_STANDARD = 20,
WUD_STATE_SYNC_CHANGE_SIMPLE_TO_STANDARD = 21,
WUD_STATE_SYNC_STORED_DEV_INFO_TO_NAND = 22,
WUD_STATE_SYNC_COMPLETE = 23,
WUD_STATE_SYNC_WAIT_FOR_INCOMING = 24,
WUD_STATE_SYNC_SC_FLUSH = 25,
WUD_STATE_SYNC_CANCEL_SEARCH = 26,
WUD_STATE_SYNC_WAIT_FOR_START_SEARCH = 29,
WUD_STATE_SYNC_ERROR = 255,
} WUDSyncState;
typedef enum {
WUD_STATE_DELETE_START = 0,
WUD_STATE_DELETE_DISALLOW_INCOMING = 1,
WUD_STATE_DELETE_DISCONNECT_ALL = 2,
WUD_STATE_DELETE_CLEANUP_DATABASE = 3,
WUD_STATE_DELETE_CLEANUP_SETTING = 5,
WUD_STATE_DELETE_6 = 6,
WUD_STATE_DELETE_7 = 7,
WUD_STATE_DELETE_DONE = 8
} WUDDeleteState;
typedef enum {
WUD_RESULT_DELETE_BUSY = -1,
WUD_RESULT_DELETE_WAITING,
WUD_RESULT_DELETE_COMPLETE,
} WUDDeleteResult;
typedef enum {
WUD_STATE_LINK_KEY_START = 0,
WUD_STATE_LINK_KEY_READING = 1,
WUD_STATE_LINK_KEY_WRITING = 2,
WUD_STATE_LINK_KEY_DELETING = 3,
WUD_STATE_LINK_KEY_ERROR = 255,
} WUDLinkKeyState;
typedef enum {
WUD_STATE_STACK_START = 0,
WUD_STATE_STACK_GET_STORED_LINK_KEY = 1,
WUD_STATE_STACK_CHECK_DEVICE_INFO = 2,
WUD_STATE_STACK_DONE = 3,
WUD_STATE_STACK_INITIALIZED = 4,
WUD_STATE_STACK_ERROR = 255,
} WUDStackState;
typedef enum {
WUD_STATE_INIT_START = 0,
WUD_STATE_INIT_WAIT_FOR_INITIALIZATION = 1,
WUD_STATE_INIT_GET_DEV_INFO = 2,
WUD_STATE_INIT_DONE = 3,
WUD_STATE_INIT_INITIALIZED = 4,
WUD_STATE_INIT_ERROR = 255,
} WUDInitState;
typedef enum {
WUD_STATE_SHUTDOWN_START = 0,
WUD_STATE_SHUTDOWN_STORE_SETTINGS = 1,
WUD_STATE_SHUTDOWN_FLUSH_SETTINGS = 2,
WUD_STATE_SHUTDOWN_DONE = 3,
WUD_STATE_SHUTDOWN_ERROR = 255,
} WUDShutdownState;
typedef enum {
WUD_VSE_INITIATE_PAIRING = 8,
WUD_VSE_DELETE_ALL_KEYS,
WUD_VSE_SI_PORT_STATUS,
WUD_VSE_WATCH_DOG_RESET_HW = 16,
} WUDVendorSpecificEvent;
typedef struct WUDDeviceInfo {
BTD_NAME bd_name;
BTD_ADDR bd_addr;
LINKKEY link_key;
u8 handle;
u8 sub_class;
u8 app_id;
u8 status;
u8 overwrite;
u8 sync_type;
u8 reg;
u16 attr_mask;
} WUDDeviceInfo;
typedef void* (*WUDAlloc)(u32);
typedef u8 (*WUDFree)(void*);
typedef void (*WUDSyncDeviceCallback)(s32 result, s32 num); // what is result?
typedef void (*WUDClearDeviceCallback)(s32);
typedef void (*WUDHidRecvCallback)(u8, u8*, u16);
typedef void (*WUDHidConnCallback)(u8, u8);
typedef void (*WUDStoredCallback)(void*);
typedef struct DeviceList {
WUDDeviceInfo* info;
void* prev;
void* next;
} DeviceList;
typedef struct WUDControlBlock {
WUDSyncDeviceCallback syncCallback;
WUDSyncDeviceCallback syncSmpCallback;
WUDClearDeviceCallback clearCallback;
u8 syncStatus;
u8 delStatus;
u8 keyStatus;
u8 profStatus;
u8 initStatus;
u8 shutStatus;
u8 devNums;
u8 devSmpNums;
DeviceList* smpListHead;
DeviceList* smpListTail;
DeviceList smpList[6];
DeviceList* stdListHead;
DeviceList* stdListTail;
DeviceList stdList[10];
WUDDeviceInfo devInfo[10];
WUDDeviceInfo devSmpInfo[6];
u8 connNums;
u8 linkNums;
u8 pairNums;
u8 syncFast;
s8 syncLoop;
u8 syncMode;
u8 connectable;
u8 discoverable;
WUDHidRecvCallback hidRecvCallback;
WUDHidConnCallback hidConnCallback;
WUDAlloc alloc;
WUDFree free;
BTD_ADDR lastAddr;
BTD_ADDR hostAddr;
s8 status;
u8 siStatus;
u8 pmId;
s8 rssi;
OSAlarm evtAlarm;
u32 profileMask;
u16 aclAvailBufSize;
u16 aclMaxBufSize;
s16 delayCnt;
s16 incomeCnt;
} WUDControlBlock;
BOOL WUDInit();
BOOL WUDStartSyncSimple(void);
BOOL WUDStartFastSyncSimple(void);
u32 WUDGetAllocatedMemSize(void);
WUDSyncDeviceCallback WUDSetSyncSimpleCallback(WUDSyncDeviceCallback);
void WUDiMoveTopSmpDevInfoPtr(WUDDeviceInfo*);
void WUDiMoveTopStdDevInfoPtr(WUDDeviceInfo*);
void WUDSetSniffMode(BTD_ADDR, s32);
void WUDiRemoveDevice(BTD_ADDR);
void WUDiMoveBottomSmpDevInfoPtr(WUDDeviceInfo*);
void WUDiMoveTopSmpDevInfoPtr(WUDDeviceInfo*);
void WUDiMoveBottomStdDevInfoPtr(WUDDeviceInfo*);
void WUDiMoveTopOfDisconnectedSmpDevice(WUDDeviceInfo*);
void WUDiMoveTopOfDisconnectedStdDevice(WUDDeviceInfo*);
WUDDeviceInfo* WUDiGetDevInfo(BTD_ADDR);
BOOL WUDCancelSyncDevice(void);
BOOL WUDStopSyncSimple(void);
s32 WUDGetStatus(void);
void WUDShutdown();
void WUDSetVisibility(u8, u8);
u8 WUDGetConnectable(void);
BOOL WUDIsBusy(void);
WUDHidRecvCallback WUDSetHidRecvCallback(WUDHidRecvCallback);
WUDHidConnCallback WUDSetHidConnCallback(WUDHidConnCallback);
void WUDRegisterAllocator(WUDAlloc, WUDFree);
u8* _WUDGetDevAddr(u8);
BOOL WUDSetDisableChannel(s8);
u8 WUDGetBufferStatus(void);
u8 _WUDGetLinkNumber(void);
u16 _WUDGetQueuedSize(s8);
u16 _WUDGetNotAckedSize(s8);
extern WUDControlBlock _wcb;
extern WUDDeviceInfo _work;
extern u8* _dev_handle_to_bda[16];
extern u16 _dev_handle_queue_size[16];
extern u16 _dev_handle_notack_num[16];
extern SCBtDeviceInfoArray _scArray;
#ifdef __cplusplus
}
#endif
#endif /* _REVOLUTION_WUD_WUD_H_ */
+14
View File
@@ -0,0 +1,14 @@
#ifndef _REVOLUTION_WUD_DEBUG_MSG_H_
#define _REVOLUTION_WUD_DEBUG_MSG_H_
#ifdef __cplusplus
extern "C" {
#endif
void WUD_DEBUGPrint(const char*, ...);
#ifdef __cplusplus
}
#endif
#endif /* _REVOLUTION_WUD_DEBUG_MSG_H_ */