summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMax Roncace <me@caseif.net>2026-02-01 20:33:08 -0500
committerGitHub <noreply@github.com>2026-02-01 17:33:08 -0800
commitf5dbf1d8276b249b114b2ed08f0f7b095911e97c (patch)
tree8bec854a5c2f0e57fb15839bcf822a12cb296d75 /include
parent21de544196bdc235b75fc1e51a1c395b806a7c59 (diff)
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
Diffstat (limited to 'include')
-rw-r--r--include/revolution/dsp.h6
-rw-r--r--include/revolution/hw_regs.h10
-rw-r--r--include/revolution/os.h1
-rw-r--r--include/revolution/sc.h9
-rw-r--r--include/revolution/vi/vifuncs.h3
-rw-r--r--include/revolution/wpad.h345
-rw-r--r--include/revolution/wpad/bte.h22
-rw-r--r--include/revolution/wud/WUD.h256
-rw-r--r--include/revolution/wud/debug_msg.h14
9 files changed, 522 insertions, 144 deletions
diff --git a/include/revolution/dsp.h b/include/revolution/dsp.h
index b78b870474..43061f5ab1 100644
--- a/include/revolution/dsp.h
+++ b/include/revolution/dsp.h
@@ -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;
diff --git a/include/revolution/hw_regs.h b/include/revolution/hw_regs.h
index b1f8a2c4e5..bab143f1ee 100644
--- a/include/revolution/hw_regs.h
+++ b/include/revolution/hw_regs.h
@@ -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
diff --git a/include/revolution/os.h b/include/revolution/os.h
index 703891f29b..7fcffb8f5f 100644
--- a/include/revolution/os.h
+++ b/include/revolution/os.h
@@ -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);
diff --git a/include/revolution/sc.h b/include/revolution/sc.h
index 35bf4c639f..89b205cec4 100644
--- a/include/revolution/sc.h
+++ b/include/revolution/sc.h
@@ -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);
diff --git a/include/revolution/vi/vifuncs.h b/include/revolution/vi/vifuncs.h
index b3cea5622d..e4c4239226 100644
--- a/include/revolution/vi/vifuncs.h
+++ b/include/revolution/vi/vifuncs.h
@@ -35,6 +35,9 @@ void VISetGamma(VIGamma);
void VISetRGBModeImm(void);
BOOL VIEnableDVDStopMotor(BOOL enable);
+BOOL VIResetDimmingCount(void);
+BOOL VIResetRFIdle(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/revolution/wpad.h b/include/revolution/wpad.h
index 82f259b95b..c2b23c436a 100644
--- a/include/revolution/wpad.h
+++ b/include/revolution/wpad.h
@@ -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_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_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_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_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_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
}
diff --git a/include/revolution/wpad/bte.h b/include/revolution/wpad/bte.h
index 1751d8998b..a09000a254 100644
--- a/include/revolution/wpad/bte.h
+++ b/include/revolution/wpad/bte.h
@@ -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
diff --git a/include/revolution/wud/WUD.h b/include/revolution/wud/WUD.h
new file mode 100644
index 0000000000..138733f1f0
--- /dev/null
+++ b/include/revolution/wud/WUD.h
@@ -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_ */
diff --git a/include/revolution/wud/debug_msg.h b/include/revolution/wud/debug_msg.h
new file mode 100644
index 0000000000..550bf9a0ba
--- /dev/null
+++ b/include/revolution/wud/debug_msg.h
@@ -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_ */