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
+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;
}