mirror of
https://github.com/zeldaret/tp
synced 2026-05-23 06:54:28 -04:00
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:
@@ -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() {
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -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_ */
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user