Revolution WUD work (mostly matching) (#3080)

* WUD mostly matching for Wii

Mostly copied from Petari with small modifications, Shield match is
still pretty bad.

* Implement WUDHidHost

* Fix WUD regressions in Shield/ShieldD
This commit is contained in:
Max Roncace
2026-02-03 02:17:29 -05:00
committed by GitHub
parent 67f179161f
commit 3bc0670b91
24 changed files with 3644 additions and 469 deletions
+2 -2
View File
@@ -3411,7 +3411,7 @@ revolution/wud/WUD.c:
.data start:0x80403678 end:0x80404440
.bss start:0x804BE680 end:0x804C03E0
.sdata start:0x804FA7E8 end:0x804FA7F0
.sbss start:0x804FBA38 end:0x804FBA5C
.sbss start:0x804FBA38 end:0x804FBA58
.sdata2 start:0x805005B8 end:0x805005C0
revolution/wud/WUDHidHost.c:
@@ -3444,7 +3444,7 @@ revolution/bte/uusb_ppc.c:
.data start:0x80404878 end:0x804055C0
.bss start:0x804E8F00 end:0x804EAF60
.sdata start:0x804FA7F0 end:0x804FA810
.sbss start:0x804FBA5C end:0x804FBA70
.sbss start:0x804FBA58 end:0x804FBA70
revolution/bte/bta_dm_cfg.c:
.rodata start:0x803BB9B0 end:0x803BBA40
+5 -5
View File
@@ -27888,15 +27888,15 @@ lo = .sbss:0x804FBA28; // type:object size:0x4 scope:global align:4 data:4byte
hi = .sbss:0x804FBA2C; // type:object size:0x4 scope:global align:4 data:4byte
lbl_804FBA30 = .sbss:0x804FBA30; // type:object size:0x1 data:byte
_initialized = .sbss:0x804FBA38; // type:object size:0x4 scope:global align:4 data:4byte
lbl_804FBA3C = .sbss:0x804FBA3C; // type:object size:0x1 data:byte
__bte_trace_level = .sbss:0x804FBA3C; // type:object size:0x1 data:byte
remove_patch = .sbss:0x804FBA40; // type:object size:0x1 scope:global align:4
lbl_804FBA41 = .sbss:0x804FBA41; // type:object size:0x1 data:byte
lbl_804FBA42 = .sbss:0x804FBA42; // type:object size:0x1 data:byte
install_num = .sbss:0x804FBA41; // type:object size:0x1 data:byte
patch_num = .sbss:0x804FBA42; // type:object size:0x1 data:byte
addr = .sbss:0x804FBA44; // type:object size:0x4 scope:global align:4 data:4byte
offset = .sbss:0x804FBA48; // type:object size:0x4 scope:global align:4 data:4byte
size = .sbss:0x804FBA4C; // type:object size:0x4 scope:global align:4 data:4byte
lbl_804FBA50 = .sbss:0x804FBA50; // type:object size:0x1 data:byte
lbl_804FBA51 = .sbss:0x804FBA51; // type:object size:0x7 data:byte
_discRssi = .sbss:0x804FBA50; // type:object size:0x1 data:byte
_discNumResps = .sbss:0x804FBA51; // type:object size:0x7 data:byte
lbl_804FBA58 = .sbss:0x804FBA58; // type:object size:0x1 data:byte
lbl_804FBA59 = .sbss:0x804FBA59; // type:object size:0x1 data:byte
__ntd_ohci = .sbss:0x804FBA5C; // type:object size:0x4 scope:global align:4 data:4byte
+2 -2
View File
@@ -3663,7 +3663,7 @@ revolution/wud/WUD.c:
.data start:0x80441D20 end:0x80442AE8
.bss start:0x804FE3E0 end:0x80500140
.sdata start:0x8053A630 end:0x8053A638
.sbss start:0x8053B910 end:0x8053B934
.sbss start:0x8053B910 end:0x8053B930
.sdata2 start:0x80540648 end:0x80540650
revolution/wud/WUDHidHost.c:
@@ -3696,7 +3696,7 @@ revolution/bte/uusb_ppc.c:
.data start:0x80442F20 end:0x80443C68
.bss start:0x80528C60 end:0x8052ACC0
.sdata start:0x8053A638 end:0x8053A658
.sbss start:0x8053B934 end:0x8053B948
.sbss start:0x8053B930 end:0x8053B948
revolution/bte/bta_dm_cfg.c:
.rodata start:0x803F3F50 end:0x803F3FE0
+5 -5
View File
@@ -29071,15 +29071,15 @@ lo = .sbss:0x8053B900; // type:object size:0x4 scope:global align:4 data:4byte
hi = .sbss:0x8053B904; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8053B908 = .sbss:0x8053B908; // type:object size:0x1 data:byte
_initialized = .sbss:0x8053B910; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8053B914 = .sbss:0x8053B914; // type:object size:0x1 data:byte
__bte_trace_level = .sbss:0x8053B914; // type:object size:0x1 data:byte
remove_patch = .sbss:0x8053B918; // type:object size:0x1 scope:global align:4
lbl_8053B919 = .sbss:0x8053B919; // type:object size:0x1 data:byte
lbl_8053B91A = .sbss:0x8053B91A; // type:object size:0x1 data:byte
install_num = .sbss:0x8053B919; // type:object size:0x1 data:byte
patch_num = .sbss:0x8053B91A; // type:object size:0x1 data:byte
addr = .sbss:0x8053B91C; // type:object size:0x4 scope:global align:4 data:4byte
offset = .sbss:0x8053B920; // type:object size:0x4 scope:global align:4 data:4byte
size = .sbss:0x8053B924; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8053B928 = .sbss:0x8053B928; // type:object size:0x1 data:byte
lbl_8053B929 = .sbss:0x8053B929; // type:object size:0x7 data:byte
_discRssi = .sbss:0x8053B928; // type:object size:0x1 data:byte
_discNumResps = .sbss:0x8053B929; // type:object size:0x7 data:byte
lbl_8053B930 = .sbss:0x8053B930; // type:object size:0x1 data:byte
lbl_8053B931 = .sbss:0x8053B931; // type:object size:0x1 data:byte
__ntd_ohci = .sbss:0x8053B934; // type:object size:0x4 scope:global align:4 data:4byte
+2 -2
View File
@@ -3622,7 +3622,7 @@ revolution/wud/WUD.c:
.data start:0x80429200 end:0x80429FC8
.bss start:0x804E4460 end:0x804E61C0
.sdata start:0x80520640 end:0x80520648
.sbss start:0x80521908 end:0x8052192C
.sbss start:0x80521908 end:0x80521928
.sdata2 start:0x805266C8 end:0x805266D0
revolution/wud/WUDHidHost.c:
@@ -3655,7 +3655,7 @@ revolution/bte/uusb_ppc.c:
.data start:0x8042A400 end:0x8042B148
.bss start:0x8050ECE0 end:0x80510D40
.sdata start:0x80520648 end:0x80520668
.sbss start:0x8052192C end:0x80521940
.sbss start:0x80521928 end:0x80521940
revolution/bte/bta_dm_cfg.c:
.rodata start:0x803DF2BC end:0x803DF340
+5 -5
View File
@@ -28591,15 +28591,15 @@ lo = .sbss:0x805218F8; // type:object size:0x4 scope:global align:4 data:4byte
hi = .sbss:0x805218FC; // type:object size:0x4 scope:global align:4 data:4byte
lbl_80521900 = .sbss:0x80521900; // type:object size:0x1 data:byte
_initialized = .sbss:0x80521908; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8052190C = .sbss:0x8052190C; // type:object size:0x1 data:byte
__bte_trace_level = .sbss:0x8052190C; // type:object size:0x1 data:byte
remove_patch = .sbss:0x80521910; // type:object size:0x1 scope:global align:4
lbl_80521911 = .sbss:0x80521911; // type:object size:0x1 data:byte
lbl_80521912 = .sbss:0x80521912; // type:object size:0x1 data:byte
install_num = .sbss:0x80521911; // type:object size:0x1 data:byte
patch_num = .sbss:0x80521912; // type:object size:0x1 data:byte
addr = .sbss:0x80521914; // type:object size:0x4 scope:global align:4 data:4byte
offset = .sbss:0x80521918; // type:object size:0x4 scope:global align:4 data:4byte
size = .sbss:0x8052191C; // type:object size:0x4 scope:global align:4 data:4byte
lbl_80521920 = .sbss:0x80521920; // type:object size:0x1 data:byte
lbl_80521921 = .sbss:0x80521921; // type:object size:0x7 data:byte
_discRssi = .sbss:0x80521920; // type:object size:0x1 data:byte
_discNumResps = .sbss:0x80521921; // type:object size:0x1 data:byte
lbl_80521928 = .sbss:0x80521928; // type:object size:0x1 data:byte
lbl_80521929 = .sbss:0x80521929; // type:object size:0x1 data:byte
__ntd_ohci = .sbss:0x8052192C; // type:object size:0x4 scope:global align:4 data:4byte
+2 -2
View File
@@ -3618,7 +3618,7 @@ revolution/wud/WUD.c:
.data start:0x80427080 end:0x80427E48
.bss start:0x804E22E0 end:0x804E4040
.sdata start:0x8051E4B0 end:0x8051E4B8
.sbss start:0x8051F778 end:0x8051F79C
.sbss start:0x8051F778 end:0x8051F798
.sdata2 start:0x80524520 end:0x80524528
revolution/wud/WUDHidHost.c:
@@ -3651,7 +3651,7 @@ revolution/bte/uusb_ppc.c:
.data start:0x80428280 end:0x80428FC8
.bss start:0x8050CB60 end:0x8050EBC0
.sdata start:0x8051E4B8 end:0x8051E4D8
.sbss start:0x8051F79C end:0x8051F7B0
.sbss start:0x8051F798 end:0x8051F7B0
revolution/bte/bta_dm_cfg.c:
.rodata start:0x803DD270 end:0x803DD300
+5 -5
View File
@@ -28595,15 +28595,15 @@ lo = .sbss:0x8051F768; // type:object size:0x4 scope:global align:4 data:4byte
hi = .sbss:0x8051F76C; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8051F770 = .sbss:0x8051F770; // type:object size:0x1 data:byte
_initialized = .sbss:0x8051F778; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8051F77C = .sbss:0x8051F77C; // type:object size:0x1 data:byte
__bte_trace_level = .sbss:0x8051F77C; // type:object size:0x1 data:byte
remove_patch = .sbss:0x8051F780; // type:object size:0x1 scope:global align:4
lbl_8051F781 = .sbss:0x8051F781; // type:object size:0x1 data:byte
lbl_8051F782 = .sbss:0x8051F782; // type:object size:0x1 data:byte
install_num = .sbss:0x8051F781; // type:object size:0x1 data:byte
patch_num = .sbss:0x8051F782; // type:object size:0x1 data:byte
addr = .sbss:0x8051F784; // type:object size:0x4 scope:global align:4 data:4byte
offset = .sbss:0x8051F788; // type:object size:0x4 scope:global align:4 data:4byte
size = .sbss:0x8051F78C; // type:object size:0x4 scope:global align:4 data:4byte
lbl_8051F790 = .sbss:0x8051F790; // type:object size:0x1 data:byte
lbl_8051F791 = .sbss:0x8051F791; // type:object size:0x7 data:byte
_discRssi = .sbss:0x8051F790; // type:object size:0x1 data:byte
_discNumResps = .sbss:0x8051F791; // type:object size:0x7 data:byte
lbl_8051F798 = .sbss:0x8051F798; // type:object size:0x1 data:byte
lbl_8051F799 = .sbss:0x8051F799; // type:object size:0x1 data:byte
__ntd_ohci = .sbss:0x8051F79C; // type:object size:0x4 scope:global align:4 data:4byte
+2 -2
View File
@@ -3618,7 +3618,7 @@ revolution/wud/WUD.c:
.data start:0x80429B00 end:0x8042A8C8
.bss start:0x804E4D60 end:0x804E6AC0
.sdata start:0x80520DE8 end:0x80520DF0
.sbss start:0x805220C8 end:0x805220EC
.sbss start:0x805220C8 end:0x805220E8
.sdata2 start:0x80526E98 end:0x80526EA0
revolution/wud/WUDHidHost.c:
@@ -3651,7 +3651,7 @@ revolution/bte/uusb_ppc.c:
.data start:0x8042AD00 end:0x8042BA48
.bss start:0x8050F5E0 end:0x80511640
.sdata start:0x80520DF0 end:0x80520E10
.sbss start:0x805220EC end:0x80522100
.sbss start:0x805220E8 end:0x80522100
revolution/bte/bta_dm_cfg.c:
.rodata start:0x803DFFD0 end:0x803E0060
+5 -5
View File
@@ -28482,15 +28482,15 @@ lo = .sbss:0x805220B8; // type:object size:0x4 scope:global align:4 data:4byte
hi = .sbss:0x805220BC; // type:object size:0x4 scope:global align:4 data:4byte
lbl_805220C0 = .sbss:0x805220C0; // type:object size:0x1 data:byte
_initialized = .sbss:0x805220C8; // type:object size:0x4 scope:global align:4 data:4byte
lbl_805220CC = .sbss:0x805220CC; // type:object size:0x1 data:byte
__bte_trace_level = .sbss:0x805220CC; // type:object size:0x1 data:byte
remove_patch = .sbss:0x805220D0; // type:object size:0x1 scope:global align:4
lbl_805220D1 = .sbss:0x805220D1; // type:object size:0x1 data:byte
lbl_805220D2 = .sbss:0x805220D2; // type:object size:0x1 data:byte
install_num = .sbss:0x805220D1; // type:object size:0x1 data:byte
patch_num = .sbss:0x805220D2; // type:object size:0x1 data:byte
addr = .sbss:0x805220D4; // type:object size:0x4 scope:global align:4 data:4byte
offset = .sbss:0x805220D8; // type:object size:0x4 scope:global align:4 data:4byte
size = .sbss:0x805220DC; // type:object size:0x4 scope:global align:4 data:4byte
lbl_805220E0 = .sbss:0x805220E0; // type:object size:0x1 data:byte
lbl_805220E1 = .sbss:0x805220E1; // type:object size:0x7 data:byte
_discRssi = .sbss:0x805220E0; // type:object size:0x1 data:byte
_discNumResps = .sbss:0x805220E1; // type:object size:0x7 data:byte
lbl_805220E8 = .sbss:0x805220E8; // type:object size:0x1 data:byte
lbl_805220E9 = .sbss:0x805220E9; // type:object size:0x1 data:byte
__ntd_ohci = .sbss:0x805220EC; // type:object size:0x4 scope:global align:4 data:4byte
+2 -2
View File
@@ -1863,8 +1863,8 @@ config.libs = [
"wud",
[
Object(NonMatching, "revolution/wud/WUD.c"),
Object(NonMatching, "revolution/wud/WUDHidHost.c"),
Object(NonMatching, "revolution/wud/debug_msg.c"),
Object(MatchingFor(ALL_WII), "revolution/wud/WUDHidHost.c"),
Object(MatchingFor(ALL_WII), "revolution/wud/debug_msg.c"),
],
),
RevolutionLib(
+1
View File
@@ -105,6 +105,7 @@ u8 __gUnknown800030E3 AT_ADDRESS(OS_BASE_CACHED | 0x30E3);
#define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000))
#define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000)
#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8)
#define OSTicksDelta(x, y) ((s32)x, (s32)y)
u32 OSGetConsoleType(void);
void OSInit(void);
+59
View File
@@ -11,6 +11,13 @@ extern "C" {
typedef u8 SCType;
typedef enum {
SC_STATUS_OK,
SC_STATUS_BUSY,
SC_STATUS_FATAL,
SC_STATUS_PARSE,
} SCStatus;
typedef struct {
u8 mode;
u8 led;
@@ -108,6 +115,57 @@ typedef struct {
u32 flushSize;
} SCControl;
#define SC_MAX_DEV_ENTRY_FOR_STD 10
#define SC_MAX_DEV_ENTRY_FOR_SMP 6
#define SC_MAX_DEV_ENTRY (SC_MAX_DEV_ENTRY_FOR_STD + SC_MAX_DEV_ENTRY_FOR_SMP)
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 SCDevInfo {
char devName[20]; // at 0x0
char at_0x14[1];
char UNK_0x15[0xB];
LINK_KEY linkKey; // at 0x20
char UNK_0x30[0x10];
} SCDevInfo;
typedef struct SCBtDeviceInfo {
BD_ADDR addr; // at 0x0
SCDevInfo info; // at 0x6
} SCBtDeviceInfo;
typedef struct SCBtDeviceInfoArray {
/* 0x000 */ u8 num;
union {
struct {
#if SDK_AUG2010
/* 0x001 */ SCBtDeviceInfo regist[SC_MAX_DEV_ENTRY_FOR_STD];
/* 0x2BD */ SCBtDeviceInfo active[SC_MAX_DEV_ENTRY_FOR_SMP];
#else
/* 0x001 */ SCBtDeviceInfo regist[SC_MAX_DEV_ENTRY];
#endif
};
};
#if SDK_AUG2010
SCBtDeviceInfoSingle info[16];
#endif
} SCBtDeviceInfoArray;
#define SC_LANG_JAPANESE 0u
#define SC_LANG_ENGLISH 1u
#define SC_LANG_GERMAN 2u
@@ -152,6 +210,7 @@ BOOL SCFindS8Item(s8* data, SCItemID id);
BOOL SCFindU32Item(u32* data, SCItemID id);
BOOL SCReplaceU8Item(u8 data, SCItemID id);
void SCFlushAsync(SCFlushCallback callback);
BOOL SCGetBtDeviceInfoArray(SCBtDeviceInfoArray*);
BOOL SCSetBtDeviceInfoArray(const SCBtDeviceInfoArray*);
u32 SCCheckStatus(void);
s32 SCReloadConfFileAsync(u8* bufp, u32 bufSize, SCReloadConfFileCallback callback);
+1 -1
View File
@@ -135,7 +135,7 @@ 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 BOOL (*WPADFree)(void* ptr);
typedef void (*WPADSyncDeviceCallback)(s32 result, s32 num);
typedef void (*WPADSamplingCallback)(s32 chan);
typedef void (*WPADConnectCallback)(s32 chan, s32 result);
+13 -42
View File
@@ -596,13 +596,19 @@ typedef union
typedef void (tBTA_DM_SEC_CBACK)(tBTA_DM_SEC_EVT event, tBTA_DM_SEC *p_data);
/* Search callback events */
#define BTA_DM_INQ_RES_EVT 0 /* Inquiry result for a peer device. */
#define BTA_DM_INQ_CMPL_EVT 1 /* Inquiry complete. */
#define BTA_DM_DISC_RES_EVT 2 /* Discovery result for a peer device. */
#define BTA_DM_DISC_BLE_RES_EVT 3 /* Discovery result for BLE GATT based service on a peer device. */
#define BTA_DM_DISC_CMPL_EVT 4 /* Discovery complete. */
#define BTA_DM_DI_DISC_CMPL_EVT 5 /* Discovery complete. */
#define BTA_DM_SEARCH_CANCEL_CMPL_EVT 6 /* Search cancelled */
enum BTA_DM_State_e {
BTA_DM_INQ_RES_EVT, /* Inquiry result for a peer device. */
BTA_DM_INQ_CMPL_EVT, /* Inquiry complete. */
BTA_DM_DISC_RES_EVT, /* Discovery result for a peer device. */
#if SDK_AUG2010
BTA_DM_DISC_BLE_RES_EVT, /* Discovery result for BLE GATT based service on a peer device. */
#endif
BTA_DM_DISC_CMPL_EVT, /* Discovery complete. */
#if SDK_AUG2010
BTA_DM_DI_DISC_CMPL_EVT, /* Discovery complete. */
#endif
BTA_DM_SEARCH_CANCEL_CMPL_EVT, /* Search cancelled */
};
typedef UINT8 tBTA_DM_SEARCH_EVT;
@@ -1028,39 +1034,4 @@ void BTA_HhGetAclQueueInfo(void);
void BTA_Init(void);
void BTA_CleanUp(void (*p_cb)(tBTA_STATUS status)); // probably
// ---
/* muff1n: I wrote this definition myself
* TODO: would this be part of BLE or WUD?
*/
struct small_dev_info
{
char devName[20]; // size 0x14? offset 0x00 // might be 0x13?
char at_0x14[1]; // size 0x??, offset 0x14?
char __pad0[0x20 - (0x14 + 0x01)];
LINK_KEY linkKey; // size 0x10, offset 0x20
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
+150
View File
@@ -0,0 +1,150 @@
#ifndef RVL_SDK_WUD_H
#define RVL_SDK_WUD_H
#include <revolution/sc.h>
#include <revolution/wpad/bte.h>
#include "types.h"
#ifdef __cplusplus
extern "C" {
#endif
#define WUD_MAX_DEV_ENTRY_FOR_STD SC_MAX_DEV_ENTRY_FOR_STD
#define WUD_MAX_DEV_ENTRY_FOR_SMP SC_MAX_DEV_ENTRY_FOR_SMP
#define WUD_MAX_DEV_ENTRY SC_MAX_DEV_ENTRY
#define WUD_DEV_HANDLE_INVALID (-1)
#define WUD_ADDR_LEN BD_ADDR_LEN
// Forward declarations
typedef struct WUDDevInfo WUDDevInfo;
typedef enum {
WUD_LIB_STATUS_0,
WUD_LIB_STATUS_1,
WUD_LIB_STATUS_2,
WUD_LIB_STATUS_3,
WUD_LIB_STATUS_4,
WUD_LIB_STATUS_5,
} WUDLibStatus;
typedef enum {
WUD_CHAN0,
WUD_CHAN1,
WUD_CHAN2,
WUD_CHAN3,
WUD_MAX_CHANNELS,
WUD_CHAN_INVALID = -1
} WUDChannel;
typedef enum {
WUD_SYNC_TYPE_STANDARD,
WUD_SYNC_TYPE_SIMPLE,
} WUDSyncType;
typedef enum {
WUD_RESULT_SYNC_BUSY = -1,
WUD_RESULT_SYNC_WAITING,
WUD_RESULT_SYNC_DONE,
} WUDSyncResult;
typedef void* (*WUDAllocFunc)(u32 size);
typedef BOOL (*WUDFreeFunc)(void* pBlock);
typedef void (*WUDSyncDeviceCallback)(s32 result, s32 num);
typedef void (*WUDClearDeviceCallback)(s32 result);
typedef void (*WUDHidConnCallback)(u8, u8);
typedef void (*WUDHidRecvCallback)(UINT8 devHandle, UINT8* pReport, UINT16 len);
typedef struct WUDDevInfo {
SCDevInfo conf; // at 0x0
BD_ADDR devAddr; // at 0x40
LINK_KEY linkKey; // at 0x46
UINT8 devHandle; // at 0x56
UINT8 subclass; // at 0x57
UINT8 appID; // at 0x58
u8 status; // at 0x59
s8 UNK_0x5A; // at 0x5A
u8 sync_type; // at 0x5B
u8 UNK_0x5C; // at 0x5C
u8 UNK_0x5D[1];
tBTA_HH_ATTR_MASK hhAttrMask; // at 0x5E
} WUDDevInfo;
BOOL WUDInit(void);
BOOL WUDIsBusy(void);
void WUDRegisterAllocator(WUDAllocFunc pAllocFunc, WUDFreeFunc pFreeFunc);
u32 WUDGetAllocatedMemSize(void);
void WUDShutdown(void);
WUDLibStatus WUDGetStatus(void);
u8 WUDGetBufferStatus(void);
void WUDSetSniffMode(BD_ADDR addr, s32 interval);
// clang-format off
WUDSyncDeviceCallback
WUDSetSyncSimpleCallback(WUDSyncDeviceCallback pCallback);
WUDClearDeviceCallback
WUDSetClearDeviceCallback(WUDClearDeviceCallback pCallback);
// clang-format on
BOOL WUDStartSyncDevice(void);
BOOL WUDStartFastSyncSimple(void);
BOOL WUDStartSyncSimple(void);
BOOL WUDStopSyncSimple(void);
BOOL WUDCancelSyncDevice(void);
BOOL WUDStartClearDevice(void);
BOOL WUDSetDisableChannel(s8 afhChannel);
WUDHidRecvCallback WUDSetHidRecvCallback(WUDHidRecvCallback pCallback);
WUDHidConnCallback WUDSetHidConnCallback(WUDHidConnCallback pCallback);
void WUDSetVisibility(u8 disc, u8 conn);
u8 WUDGetConnectable(void);
void WUDiGetFirmwareVersion(void);
void WUDiInitSub(void);
void WUDiEnableStack(void);
void WUDiAutoSync(void);
void WUDiDeleteAllLinkKeys(void);
void WUDiRegisterDevice(BD_ADDR addr);
void WUDiRemoveDevice(BD_ADDR addr);
WUDDevInfo* WUDiGetDevInfo(BD_ADDR addr);
WUDDevInfo* WUDiGetDevInfoIndex(int idx);
WUDDevInfo* WUDiGetNewDevInfo(void);
void WUDiRemoveDevInfo(BD_ADDR addr);
void WUDiClearDevice(void);
u8 WUDiGetDevNumber(void);
u8 WUDiGetDevSmpNumber(void);
u8 WUDiGetConnNumber(void);
u8 WUDiGetLinkNum(void);
void WUDiMoveTopSmpDevInfoPtr(WUDDevInfo* pInfo);
void WUDiMoveBottomSmpDevInfoPtr(WUDDevInfo* pInfo);
WUDDevInfo* WUDiGetRemoveSmpDevice(void);
void WUDiMoveTopOfDisconnectedSmpDevice(WUDDevInfo* pInfo);
void WUDiMoveTopStdDevInfoPtr(WUDDevInfo* pInfo);
void WUDiMoveBottomStdDevInfoPtr(WUDDevInfo* pInfo);
WUDDevInfo* WUDiGetRemoveStdDevice(void);
void WUDiMoveTopOfDisconnectedStdDevice(WUDDevInfo* pInfo);
BD_ADDR_PTR _WUDGetDevAddr(UINT8 handle);
u16 _WUDGetQueuedSize(s8 dev_handle);
u16 _WUDGetNotAckedSize(s8 dev_handle);
u8 _WUDGetLinkNumber(void);
#ifdef __cplusplus
}
#endif
#endif
-256
View File
@@ -1,256 +0,0 @@
#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
@@ -1,14 +0,0 @@
#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_ */
+13 -9
View File
@@ -1,11 +1,12 @@
#include <revolution/wpad.h>
#include <revolution/wpad/__wpad.h>
#include <revolution/wud/WUD.h>
#include <revolution/wud.h>
#include <revolution/dvd.h>
#include <revolution/sc.h>
#include <revolution/vi.h>
#include <revolution/wpad/bte.h>
#include <revolution/wud/__wud.h>
#include <cstdio>
#include <cstring>
@@ -14,7 +15,11 @@ extern volatile BOOL __OSIsReturnToIdle;
//TODO: this apparently should be aligned to 32 bytes, but
// adding ATTRIBUTE_ALIGN breaks codegen in WPADInit
WPADControlBlock _wpd[WPAD_MAX_CONTROLLERS];
#if SDK_AUG2010
WPADControlBlock* __rvl_p_wpadcb[WPAD_MAX_CONTROLLERS];
#else
WPADControlBlock* _wpdcb[WPAD_MAX_CONTROLLERS];
#endif
u8 _sleepTime;
u8 _dpdSensitivity;
@@ -89,7 +94,7 @@ BOOL OnShutdown(BOOL final, u32 event) {
_shutdown = TRUE;
WUDSetVisibility(0, 0);
for (i = 10; i < 14; i++) {
memset(&_scArray.info[i], 0, sizeof(_scArray.info[i]));
memset(&_scArray.regist[i], 0, sizeof(_scArray.regist[i]));
}
OSCancelAlarm(&_managerAlarm);
WUDSetHidRecvCallback(NULL);
@@ -1030,7 +1035,7 @@ s32 WPADiRetrieveChannel(u8 dev_handle) {
devAddr = _WUDGetDevAddr(dev_handle);
for (i = 0; i < WPAD_MAX_CONTROLLERS; i++) {
if (!memcmp(_scArray.info[i + 10].bd_addr, devAddr, 6)) {
if (!memcmp(_scArray.regist[i + 10].addr, devAddr, 6)) {
if (_chan_active_state[i] == 0) {
_chan_active_state[i] = 1;
return i;
@@ -1040,7 +1045,7 @@ s32 WPADiRetrieveChannel(u8 dev_handle) {
for (i = 0; i < WPAD_MAX_CONTROLLERS; i++) {
if (_chan_active_state[i] == 0) {
_chan_active_state[i] = 1;
memcpy(_scArray.info[i + 10].bd_addr, devAddr, 6);
memcpy(_scArray.regist[i + 10].addr, devAddr, 6);
_scFlush = 1;
return i;
}
@@ -1319,8 +1324,7 @@ u8 WPADGetSensorBarPosition() {
}
void WPADDisconnect(s32 chan) {
WPADControlBlock* p_wpd = _wpdcb[chan];
memset(&_scArray.info[chan + 10], 0, sizeof(SCBtDeviceInfoSingle));
memset(&_scArray.regist[chan + 10], 0, sizeof(SCBtDeviceInfo));
_scFlush = 1;
WPADiDisconnect(chan, TRUE);
}
@@ -2523,17 +2527,17 @@ void __WPADShutdown() {
WUDSetVisibility(0, 0);
for (i = 10; i < 14; i++) {
memset(&_scArray.info[i], 0, sizeof(SCBtDeviceInfoSingle));
memset(&_scArray.regist[i], 0, sizeof(SCBtDeviceInfo));
}
WPADiShutdown(FALSE);
OSRestoreInterrupts(enable);
}
void WPADiShutdown(BOOL exec) {
void WPADiShutdown() {
OSCancelAlarm(&_managerAlarm);
WUDSetHidRecvCallback(NULL);
WUDShutdown(exec);
WUDShutdown();
}
BOOL WPADCancelSyncDevice() {
+41 -31
View File
@@ -380,7 +380,9 @@ typedef struct WPADDevConfig {
/* 0x26 */ WPADAcc acc_1g;
/* 0x2C */ u8 motor;
/* 0x2D */ u8 volume;
#if SDK_AUG2010
/* 0x2E */ u8 unk_0x2e[0x30 - 0x2e];
#endif
} WPADDevConfig;
typedef struct WPADStick {
@@ -419,7 +421,11 @@ typedef struct WPADExtConfig {
/* 0x00 */ union {
WPADFsConfig fs;
WPADClConfig cl;
#if SDK_AUG2010
u8 bytes[0x1c];
#else
u8 bytes[0x18];
#endif
};
#if SDK_AUG2010
struct WPADMplsConfig {
@@ -533,36 +539,40 @@ typedef struct WPADControlBlock {
/* 0x8C4 */ u16 packetCnt;
/* 0x8C6 */ u8 disconnect;
/* 0x8C7 */ u8 lastReportId;
/* 0xb80 */ WPADCallback getInfoCB;
/* 0xb84 */ u8 getInfoBusy;
/* 0xb85 */ u8 extState;
/* 0xb86 */ u8 savePower;
/* 0xb87 */ u8 blcBattery;
/* 0xb88 */ u8 savedDevType; // maybe?
/* 0xb89 */ u8 extWasDisconnected;
/* 0xb8a */ s16 reconnectExtMs;
/* 0xb8c */ WPADMemBlock memBlock;
/* 0xba0 */ WPADCallback controlMplsCB;
/* 0xba4 */ u8 parseMPBuf;
/* 0xba5 */ u8 certProbeByte;
/* 0xba6 */ u8 dpdBusy;
/* 0xba7 */ u8 interleaveFlags;
/* 0xba8 */ u32 mplsCBReadAddress;
/* 0xbac */ u8 mplsCBState;
/* 0xbad */ u8 mplsUptimeMs;
/* 0xbae */ s8 certMayVerifyByCalibBlock;
/* 0xbaf */ u8 unk_0xbaf[0xbb1 - 0xbaf]; /* unknown (can't be alignment) */
/* 0xbb1 */ u8 certProbeStartingValue;
/* 0xbb2 */ u16 lastMplsCalibID;
/* 0xbb4 */ u32 lastMplsCalibCRC;
/* 0xbb8 */ u8 noParseExtCount;
/* 0xbb9 */ s8 extErr;
/* 0xbba */ u8 extDataLength;
/* 0xbbb */ u8 extDevType;
/* 0xbbc */ u8 currPwmDuty;
/* 0xbbd */ u8 pendingPwmDuty;
/* 0xbbe */ u8 unk_0xbbe[0xbc0 - 0xbbe]; /* unknown (can't be alignment) */
/* 0xbc0 */ u8 extDataBuf[32];
#if SDK_AUG2010
/* 0xB80 */ WPADCallback getInfoCB;
/* 0xB84 */ u8 getInfoBusy;
/* 0xB85 */ u8 extState;
/* 0xB86 */ u8 savePower;
/* 0xB87 */ u8 blcBattery;
/* 0xB88 */ u8 savedDevType; // maybe?
/* 0xB89 */ u8 extWasDisconnected;
/* 0xB8A */ s16 reconnectExtMs;
/* 0xB8C */ WPADMemBlock memBlock;
/* 0xBA0 */ WPADCallback controlMplsCB;
/* 0xBA4 */ u8 parseMPBuf;
/* 0xBA5 */ u8 certProbeByte;
/* 0xBA6 */ u8 dpdBusy;
/* 0xBA7 */ u8 interleaveFlags;
/* 0xBA8 */ u32 mplsCBReadAddress;
/* 0xBAC */ u8 mplsCBState;
/* 0xBAD */ u8 mplsUptimeMs;
/* 0xBAE */ s8 certMayVerifyByCalibBlock;
/* 0xBAF */ u8 unk_0xbaf[0xbb1 - 0xbaf]; /* unknown (can't be alignment) */
/* 0xBB1 */ u8 certProbeStartingValue;
/* 0xBB2 */ u16 lastMplsCalibID;
/* 0xBB4 */ u32 lastMplsCalibCRC;
/* 0xBB8 */ u8 noParseExtCount;
/* 0xBB9 */ s8 extErr;
/* 0xBBA */ u8 extDataLength;
/* 0xBBB */ u8 extDevType;
/* 0xBBC */ u8 currPwmDuty;
/* 0xBBD */ u8 pendingPwmDuty;
/* 0xBBE */ u8 unk_0xbbe[0xbc0 - 0xbbe]; /* unknown (can't be alignment) */
/* 0xBC0 */ u8 extDataBuf[32];
#else
/* 0x8C8 */ u8 extDataBuf[0x8e0 - 0x8c8];
#endif
} WPADControlBlock;
typedef struct WPADMEMControlBlock {
@@ -609,7 +619,7 @@ u32 WPADGetLatestIndexInBuf(s32 chan, void* buf);
void WPADiExcludeButton(s32 chan);
s32 WPADiGetStatus(s32 chan);
void WPADiShutdown(BOOL exec);
void WPADiShutdown();
void WPADiDisconnect(s32 chan, BOOL polite);
BOOL WPADiSendSetPort(WPADCmdQueue* queue, u8 pattern, WPADCallback callback);
+2855 -28
View File
File diff suppressed because it is too large Load Diff
+261
View File
@@ -0,0 +1,261 @@
#include <revolution/wud.h>
#include <revolution/wud/__wud.h>
#include <revolution/wpad/bte.h>
#include <revolution/os/OSInterrupt.h>
#include <cstring>
#define DEBUGPrint WUD_DEBUGPrint
// TODO(kiwi) Is this from BTA?
#define WUD_HH_CUSTOM_EVT 15
typedef struct WUD_HH_EVT15 {
/* 0x00 */ u16 status0;
/* 0x02 */ u16 status1;
/* 0x04 */ u16 linkedNum;
/* 0x06 */ struct {
/* 0x00 */ UINT8 handle;
/* 0x02 */ UINT16 queueSize;
/* 0x04 */ UINT16 notAckNum;
} devices[];
} WUD_HH_EVT15;
void WUDHidHostCallback(tBTA_HH_EVT event, tBTA_HH* pData) {
WUDControlBlock* p = &_wcb;
WUDDevInfo* pInfo;
tBTA_HH_CONN* pConn;
tBTA_HH_CBDATA* pCbData;
WUD_HH_EVT15* pEvt15;
int i;
switch (event) {
case BTA_HH_ENABLE_EVT: {
DEBUGPrint("BTA_HH_ENABLE_EVT\n");
p->hhFlags |= 1;
break;
}
case BTA_HH_DISABLE_EVT: {
DEBUGPrint("BTA_HH_DISABLE_EVT\n");
break;
}
case BTA_HH_OPEN_EVT: {
pConn = &pData->conn;
DEBUGPrint("BTA_HH_OPEN_EVT\n");
DEBUGPrint("handle: %d, addr: %02x:%02x:%02x:%02x:%02x:%02x\n", pConn->handle, pConn->bda[0], pConn->bda[1], pConn->bda[2], pConn->bda[3],
pConn->bda[4], pConn->bda[5]);
if (pConn->status == BTA_HH_OK) {
pInfo = &_work;
if (WUD_BDCMP(pInfo->devAddr, pConn->bda) != 0) {
pInfo = WUDiGetDevInfo(pConn->bda);
}
switch (pInfo->status) {
case 12: {
p->syncState = WUD_STATE_SYNC_REGISTER_DEVICE;
break;
}
case 2: {
p->syncState = WUD_STATE_SYNC_COMPLETE;
break;
}
}
pInfo->status = 8;
pInfo->devHandle = pConn->handle;
p->connectedNum++;
pInfo = WUDiGetDevInfo(pConn->bda);
if (pInfo == NULL) {
pInfo = &_work;
}
_dev_handle_to_bda[pConn->handle] = pInfo->devAddr;
_dev_handle_queue_size[pConn->handle] = 0;
_dev_handle_notack_num[pConn->handle] = 0;
if (pInfo->sync_type == 3 || pInfo->sync_type == 1) {
WUDiMoveTopSmpDevInfoPtr(pInfo);
}
WUDSetSniffMode(pInfo->devAddr, 8);
if (p->hidConnCB != NULL) {
p->hidConnCB(pConn->handle, TRUE);
}
} else {
DEBUGPrint("error code: %d\n", pConn->status);
if (!memcmp(pConn->bda, _work.devAddr, 6)) {
if (p->syncState != 0) {
if (_work.status == 2) {
if (WUDiGetDevInfo(pConn->bda) && pConn->status == 12) {
WUDiRemoveDevice(pConn->bda);
p->linkedNum--;
}
p->syncState = 255;
}
}
}
}
}
break;
case BTA_HH_CLOSE_EVT: {
pCbData = &pData->dev_status;
DEBUGPrint("BTA_HH_CLOSE_EVT\n");
p->connectedNum--;
DEBUGPrint("device handle : %d status = %d\n", pCbData->handle, pCbData->status);
_dev_handle_to_bda[pCbData->handle] = NULL;
_dev_handle_queue_size[pCbData->handle] = 0;
_dev_handle_notack_num[pCbData->handle] = 0;
if (p->hidConnCB != NULL) {
p->hidConnCB(pCbData->handle, FALSE);
}
break;
}
case BTA_HH_SET_RPT_EVT: {
DEBUGPrint("BTA_HH_SET_RPT_EVT\n");
break;
}
case BTA_HH_GET_RPT_EVT: {
DEBUGPrint("BTA_HH_GET_RPT_EVT\n");
break;
}
case BTA_HH_SET_PROTO_EVT: {
DEBUGPrint("BTA_HH_SET_PROTO_EVT\n");
break;
}
case BTA_HH_GET_PROTO_EVT: {
DEBUGPrint("BTA_HH_GET_PROTO_EVT\n");
break;
}
case BTA_HH_SET_IDLE_EVT: {
DEBUGPrint("BTA_HH_SET_IDLE_EVT\n");
break;
}
case BTA_HH_GET_IDLE_EVT: {
DEBUGPrint("BTA_HH_GET_IDLE_EVT\n");
break;
}
case BTA_HH_GET_DSCP_EVT: {
DEBUGPrint("BTA_HH_GET_DCSP_EVT\n");
break;
}
case BTA_HH_ADD_DEV_EVT: {
pConn = &pData->dev_info;
DEBUGPrint("BTA_HH_ADD_DEV_EVT\n");
// clang-format off
DEBUGPrint("result: %d, handle: %d, addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
pConn->status, pConn->handle,
pConn->bda[0], pConn->bda[1], pConn->bda[2],
pConn->bda[3], pConn->bda[4], pConn->bda[5]);
// clang-format on
pInfo = WUDiGetDevInfo(pConn->bda);
pInfo->devHandle = pConn->handle;
break;
}
case BTA_HH_RMV_DEV_EVT: {
pConn = &pData->dev_info;
DEBUGPrint("BTA_HH_RMV_DEV_EVT\n");
// clang-format off
DEBUGPrint("result: %d, handle: %d, addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
pConn->status, pConn->handle,
pConn->bda[0], pConn->bda[1], pConn->bda[2],
pConn->bda[3], pConn->bda[4], pConn->bda[5]);
// clang-format on
break;
}
case BTA_HH_VC_UNPLUG_EVT: {
DEBUGPrint("BTA_HH_VS_UNPLUG_EVT\n");
break;
}
case WUD_HH_CUSTOM_EVT: {
pEvt15 = (WUD_HH_EVT15*)pData;
p->bufferStatus0 = pEvt15->status0;
p->bufferStatus1 = pEvt15->status1;
if (p->linkedNum < pEvt15->linkedNum) {
OSReport("WARNING: link num count is modified.\n");
p->linkedNum = pEvt15->linkedNum;
}
for (i = 0; i < pEvt15->linkedNum; i++) {
if (pEvt15->devices[i].handle < WUD_MAX_DEV_ENTRY) {
_dev_handle_queue_size[pEvt15->devices[i].handle] = pEvt15->devices[i].queueSize;
_dev_handle_notack_num[pEvt15->devices[i].handle] = pEvt15->devices[i].notAckNum;
}
}
break;
}
}
}
void bta_hh_co_data(UINT8 handle, UINT8* pReport, UINT16 len, tBTA_HH_PROTO_MODE mode, UINT8 subClass, UINT8 appId) {
#pragma unused(mode)
#pragma unused(subClass)
WUDControlBlock* p = &_wcb;
if (appId == 3) {
if (p->hidRecvCB != NULL) {
p->hidRecvCB(handle, pReport, len);
}
} else {
DEBUGPrint("Invalid app_id [%d]\n", appId);
}
}
void bta_hh_co_open(UINT8 handle, UINT8 subClass, UINT16 attrMask, UINT8 appId) {
#pragma unused(handle)
#pragma unused(subClass)
#pragma unused(attrMask)
#pragma unused(appId)
DEBUGPrint("bta_hh_co_open()\n");
}
void bta_hh_co_close(UINT8 handle, UINT8 appId) {
#pragma unused(handle)
#pragma unused(appId)
DEBUGPrint("bta_hh_co_close()\n");
}
BOOL bta_dm_co_get_compress_memory(tBTA_SYS_ID id, UINT8** ppMemory, UINT32* memorySize) {
#pragma unused(id)
#pragma unused(ppMemory)
#pragma unused(memorySize)
return FALSE;
}
+209 -49
View File
@@ -2,77 +2,237 @@
#define _REVOLUTION_WUD_PRIVATE_H_
#include <revolution/os.h>
#include <revolution/sc.h>
#include <revolution/wpad/bte.h>
#include <revolution/wud.h>
#ifdef __cplusplus
extern "C" {
#endif
#define WUD_MAX_DEV_ENTRY_FOR_STD 10
#define WUD_MAX_DEV_ENTRY_FOR_SMP 6
#define WUD_BDCMP(LHS, RHS) memcmp(LHS, RHS, BD_ADDR_LEN)
#define WUD_BDCPY(DST, SRC) memcpy(DST, SRC, BD_ADDR_LEN)
#define WUD_MAX_DEV_ENTRY 16
// clang-format off
#define WUD_DEV_NAME_IS(NAME, VALUE) \
(memcmp(NAME, VALUE, sizeof(VALUE) - 1) == 0)
#define WUD_DEV_HANDLE_INVALID (-1)
#define WUD_DEV_NAME_IS_CNT(NAME) \
WUD_DEV_NAME_IS(NAME, "Nintendo RVL-CNT")
struct WUDDevInfoList {
#define WUD_DEV_NAME_IS_CNT_01(NAME) \
WUD_DEV_NAME_IS(NAME, "Nintendo RVL-CNT-01")
// clang-format on
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 WUDDevInfoList {
/* 0x00 */ WUDDevInfo* devInfo;
/* 0x04 */ struct WUDDevInfoList* prev;
/* 0x08 */ struct WUDDevInfoList* next;
}; // size 0x0c
} WUDDevInfoList;
typedef struct /* possibly untagged, like kpad */ {
/* 0x000 */ WUDSyncDeviceCallback* syncStdCB;
/* 0x004 */ WUDSyncDeviceCallback* syncSmpCB;
/* 0x008 */ WUDClearDeviceCallback* clearDevCB;
/* 0x00c */ u8 syncState;
/* 0x00d */ u8 deleteState;
/* 0x00e */ u8 linkKeyState;
/* 0x00f */ u8 stackState;
typedef struct WUDDiscResp {
/* 0x000 */ BD_ADDR devAddr;
/* 0x006 */ char devName[64];
/* 0x046 */ u8 unk_0x46[0x100 - 0x46];
/* 0x100 */ tBTA_SERVICE_MASK services;
/* 0x104 */ u8 unk_0x104[0x104 - 0x100];
} WUDDiscResp;
typedef struct WUDPatchCmd {
/* 0x00 */ u8 data[13];
} WUDPatchCmd;
typedef struct WUDPatchList {
/* 0x00 */ u8 num;
/* 0x01 */ WUDPatchCmd cmds[];
} WUDPatchList;
#define WUD_PATCH_BUFFER_SIZE 0xFF
#define WUD_MAX_PATCHES (WUD_PATCH_BUFFER_SIZE / (s32)sizeof(WUDPatchCmd))
typedef struct WUDCB {
/* 0x000 */ WUDSyncDeviceCallback syncStdCB;
/* 0x004 */ WUDSyncDeviceCallback syncSmpCB;
/* 0x008 */ WUDClearDeviceCallback clearDevCB;
/* 0x00C */ u8 syncState;
/* 0x00D */ u8 deleteState;
/* 0x00E */ u8 linkKeyState;
/* 0x00F */ u8 stackState;
/* 0x010 */ u8 initState;
/* 0x011 */ u8 shutdownState;
/* 0x012 */ u8 devNums;
/* 0x013 */ u8 devSmpNums;
/* 0x014 */ struct WUDDevInfoList* smpListHead;
/* 0x018 */ struct WUDDevInfoList* smpListTail;
/* 0x01c */ struct WUDDevInfoList smpList[WUD_MAX_DEV_ENTRY_FOR_SMP];
/* 0x064 */ struct WUDDevInfoList* stdListHead;
/* 0x068 */ struct WUDDevInfoList* stdListTail;
/* 0x06c */ struct WUDDevInfoList stdList[WUD_MAX_DEV_ENTRY_FOR_STD];
/* 0x0e4 */ WUDDevInfo stdDevs[WUD_MAX_DEV_ENTRY_FOR_STD];
/* 0x4a4 */ WUDDevInfo smpDevs[WUD_MAX_DEV_ENTRY_FOR_SMP];
/* 0x6e4 */ u8 connectedNum;
/* 0x6e5 */ u8 linkedNum;
/* 0x6e6 */ u8 syncedNum;
/* 0x6e7 */ u8 syncSkipChecks;
/* 0x6e8 */ s8 syncLoopNum;
/* 0x6e9 */ u8 syncType;
/* 0x6ea */ u8 connectable;
/* 0x6eb */ u8 discoverable;
/* 0x6ec */ WUDHidReceiveCallback* hidRecvCB;
/* 0x6f0 */ WUDHidConnectCallback* hidConnCB;
/* 0x6f4 */ WUDAllocFunc* allocFunc;
/* 0x6f8 */ WUDFreeFunc* freeFunc;
/* 0x6fc */ BD_ADDR pairAddr;
/* 0x702 */ BD_ADDR hostAddr;
/* 0x708 */ s8 libStatus;
/* 0x709 */ u8 siPortStatus;
/* 0x70a */ u8 pmID;
/* 0x70b */ s8 syncRssi;
/* 0x710 */ OSAlarm alarm;
/* 0x740 */ u32 hhFlags; // some flags maybe?
/* 0x744 */ u16 bufferStatus0;
/* 0x746 */ u16 bufferStatus1;
/* 0x748 */ s8 initWaitDeviceUpFrames;
/* 0x749 */ s8 waitStartSearchFrames;
/* 0x74a */ s16 waitIncomingFrames;
} wud_cb_st; // size 0x750
/* 0x014 */ WUDDevInfoList* smpListHead;
/* 0x018 */ WUDDevInfoList* smpListTail;
/* 0x01C */ WUDDevInfoList smpList[WUD_MAX_DEV_ENTRY_FOR_SMP];
#if SDK_AUG2010
/* 0x064 */ WUDDevInfoList* stdListHead;
/* 0x068 */ WUDDevInfoList* stdListTail;
/* 0x06C */ WUDDevInfoList stdList[WUD_MAX_DEV_ENTRY_FOR_STD];
#endif
/* 0x064 */ WUDDevInfo stdDevs[WUD_MAX_DEV_ENTRY_FOR_STD];
/* 0x424 */ WUDDevInfo smpDevs[WUD_MAX_DEV_ENTRY_FOR_SMP];
/* 0x664 */ u8 connectedNum;
/* 0x665 */ u8 linkedNum;
/* 0x666 */ u8 syncedNum;
/* 0x667 */ u8 syncSkipChecks;
/* 0x668 */ s8 syncLoopNum;
/* 0x669 */ u8 syncType;
/* 0x66A */ u8 connectable;
/* 0x66B */ u8 discoverable;
/* 0x66C */ WUDHidRecvCallback hidRecvCB;
/* 0x670 */ WUDHidConnCallback hidConnCB;
/* 0x674 */ WUDAllocFunc allocFunc;
/* 0x678 */ WUDFreeFunc freeFunc;
/* 0x67C */ BD_ADDR pairAddr;
/* 0x682 */ BD_ADDR hostAddr;
/* 0x688 */ s8 libStatus;
/* 0x689 */ u8 serialPortStatus;
/* 0x68A */ UINT8 pmID;
/* 0x68B */ s8 syncRssi;
/* 0x670 */ OSAlarm alarm;
/* 0x6C0 */ u32 hhFlags;
/* 0x6C4 */ u16 bufferStatus0;
/* 0x6C6 */ u16 bufferStatus1;
#if SDK_AUG2010
/* 0x748 */ u8 unk_0x748[0x750 - 0x748];
#endif
} WUDControlBlock;
#if SDK_AUG2010
extern WUDControlBlock __rvl_wudcb;
#define _wcb __rvl_wudcb
#else
extern WUDControlBlock _wcb;
#endif
extern WUDDevInfo _work;
extern SCBtDeviceInfoArray _scArray;
extern BD_ADDR_PTR _dev_handle_to_bda[WUD_MAX_DEV_ENTRY];
extern u16 _dev_handle_queue_size[WUD_MAX_DEV_ENTRY];
extern u16 _dev_handle_notack_num[WUD_MAX_DEV_ENTRY];
#if SDK_AUG2010
u16 WUDiGetQueueSizeForHandle(u8 dev_handle);
u16 WUDiGetNotAckNumForHandle(u8 dev_handle);
#else
u16 WUDiGetQueueSizeForHandle(u32 dev_handle);
u16 WUDiGetNotAckNumForHandle(u32 dev_handle);
#endif
/* wud/WUDHidHost.c */
void WUDHidHostCallback(tBTA_HH_EVT event, tBTA_HH *p_data);
/* wud/debug_msg.c */
void WUD_DEBUGPrint(const char* fmt, ...);
#ifdef __cplusplus
}
#endif
#endif // _REVOLUTION_WUD_PRIVATE_H_
#endif /* _REVOLUTION_WUD_PRIVATE_H_ */
+4 -2
View File
@@ -1,6 +1,8 @@
#include <revolution/wud/debug_msg.h>
#include <revolution/wud.h>
#include <va_list>
void WUD_DEBUGPrint(const char* msg, ...) {
// NONMATCHING
va_list list;
}