diff options
| author | Max Roncace <me@caseif.net> | 2026-02-01 20:33:08 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-02-01 17:33:08 -0800 |
| commit | f5dbf1d8276b249b114b2ed08f0f7b095911e97c (patch) | |
| tree | 8bec854a5c2f0e57fb15839bcf822a12cb296d75 /include | |
| parent | 21de544196bdc235b75fc1e51a1c395b806a7c59 (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.h | 6 | ||||
| -rw-r--r-- | include/revolution/hw_regs.h | 10 | ||||
| -rw-r--r-- | include/revolution/os.h | 1 | ||||
| -rw-r--r-- | include/revolution/sc.h | 9 | ||||
| -rw-r--r-- | include/revolution/vi/vifuncs.h | 3 | ||||
| -rw-r--r-- | include/revolution/wpad.h | 345 | ||||
| -rw-r--r-- | include/revolution/wpad/bte.h | 22 | ||||
| -rw-r--r-- | include/revolution/wud/WUD.h | 256 | ||||
| -rw-r--r-- | include/revolution/wud/debug_msg.h | 14 |
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_ */ |
