mirror of
https://github.com/zeldaret/tp
synced 2026-07-07 06:04:58 -04:00
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:
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_ */
|
||||
@@ -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_ */
|
||||
Reference in New Issue
Block a user