1#ifndef RVL_SDK_WPAD_INTERNAL_H
2#define RVL_SDK_WPAD_INTERNAL_H
6#include <revolution/WPAD/WPAD.h>
7#include <revolution/WPAD/WPADHIDParser.h>
8#include <revolution/WPAD/WPADMem.h>
13#define RX_BUFFER_SIZE ROUND_UP(sizeof(WPADStatusEx), 32)
15#define WPAD_CONFIG_BLOCK_CHECKSUM_BIAS 0x55
16#define WPAD_MAX_CONFIG_BLOCKS 2
18#define WPAD_DPD_CONFIG_BLOCK_CHECKSUM 10
19#define WPAD_DPD_CONFIG_BLOCK_SIZE 11
21#define WPAD_DEV_CONFIG_BLOCK_CHECKSUM 9
22#define WPAD_DEV_CONFIG_BLOCK_SIZE 10
24#define DPD_CFG_OBJ_BL 0
25#define DPD_CFG_OBJ_BR 1
26#define DPD_CFG_OBJ_TR 2
27#define DPD_CFG_OBJ_TL 3
33#define WM_ADDR_MEM_DEV_CONFIG_0 WM_MEM_ADDR(0x0000)
34#define WM_ADDR_MEM_GAME_INFO_0 WM_MEM_ADDR(0x002A)
35#define WM_ADDR_MEM_GAME_INFO_1 WM_MEM_ADDR(0x0062)
36#define WM_ADDR_MEM_176C WM_MEM_ADDR(0x176C)
37#define WM_ADDR_MEM_1770 WM_MEM_ADDR(0x1770)
45#define WM_REG_SPEAKER_01 WM_EXT_REG_ADDR(SPEAKER, 0x01)
46#define WM_REG_SPEAKER_08 WM_EXT_REG_ADDR(SPEAKER, 0x08)
47#define WM_REG_SPEAKER_09 WM_EXT_REG_ADDR(SPEAKER, 0x09)
50#define WM_REG_EXTENSION_CONFIG WM_EXT_REG_ADDR(EXTENSION, 0x20)
51#define WM_REG_EXTENSION_40 WM_EXT_REG_ADDR(EXTENSION, 0x40)
52#define WM_REG_EXTENSION_CERT_PARAM WM_EXT_REG_ADDR(EXTENSION, 0x50)
53#define WM_REG_EXTENSION_F0 WM_EXT_REG_ADDR(EXTENSION, 0xF0)
54#define WM_REG_EXTENSION_CERT_CHALLENGE WM_EXT_REG_ADDR(EXTENSION, 0xF1)
55#define WM_REG_EXTENSION_F2 WM_EXT_REG_ADDR(EXTENSION, 0xF2)
56#define WM_REG_EXTENSION_F3 WM_EXT_REG_ADDR(EXTENSION, 0xF3)
57#define WM_REG_EXTENSION_EXT_TYPE_2 WM_EXT_REG_ADDR(EXTENSION, 0xF6)
58#define WM_REG_EXTENSION_CERT_PROBE WM_EXT_REG_ADDR(EXTENSION, 0xF7)
59#define WM_REG_EXTENSION_FA WM_EXT_REG_ADDR(EXTENSION, 0xFA)
60#define WM_REG_EXTENSION_FB WM_EXT_REG_ADDR(EXTENSION, 0xFB)
61#define WM_REG_EXTENSION_DEV_MODE WM_EXT_REG_ADDR(EXTENSION, 0xFE)
62#define WM_REG_EXTENSION_ID_BYTE WM_EXT_REG_ADDR(EXTENSION, 0xFF)
65#define WM_REG_DPD_CONFIG_BLOCK_1 WM_EXT_REG_ADDR(DPD, 0x00)
66#define WM_REG_DPD_CONFIG_BLOCK_2 WM_EXT_REG_ADDR(DPD, 0x1A)
67#define WM_REG_DPD_30 WM_EXT_REG_ADDR(DPD, 0x30)
68#define WM_REG_DPD_DATA_FORMAT WM_EXT_REG_ADDR(DPD, 0x33)
71#define WM_EXTENSION_CONFIG_SIZE 0x20
74 WPAD_STATE_EXT_UNINITIALIZED,
75 WPAD_STATE_EXT_INITIALIZED,
76 WPAD_STATE_EXT_ENCRYPTED,
77 WPAD_STATE_EXT_ENCRYPTED_3RD,
81 WPAD_RADIO_QUALITY_GOOD,
82 WPAD_RADIO_QUALITY_BAD
89 WPAD_ILBUF_BUF3E = (1 << 0),
90 WPAD_ILBUF_BUF3F = (1 << 1),
92 WPAD_ILBUF_ALL = WPAD_ILBUF_BUF3E | WPAD_ILBUF_BUF3F,
93} WPADInterleaveBufferFlags;
97 u8 dataBuf[RPT_MAX_SIZE];
171 u8 rxBufMain[RX_BUFFER_SIZE];
172 u8 rxBufs[2][RX_BUFFER_SIZE];
181 WPADCallback cmdBlkCB;
182 WPADExtensionCallback extensionCB;
183 WPADConnectCallback connectCB;
184 WPADSamplingCallback samplingCB;
191 u32 samplingBufIndex;
203 u8 currentDpdCommand;
204 u8 pendingDpdCommand;
211 BOOL handshakeFinished;
214 s64 lastControllerDataUpdate;
221 s64 lastReportSendTime;
225 u8 encryptionKey[16];
226 u8 decryptAddTable[8];
227 u8 decryptXorTable[8];
228 u8 wmReadDataBuf[64];
238 WPADCallback getInfoCB;
240 u8 UNK_0x98F[0x9A0 - 0x990];
243extern WPADCB _wpd[WPAD_MAX_CONTROLLERS];
244extern WPADCB* _wpdcb[WPAD_MAX_CONTROLLERS];
246void WPADiInitSub(
void);
248void WPADiExcludeButton(s32 chan);
249void WPADiCopyOut(s32 chan);
252 WPADCallback pCallback);
254 WPADCallback pCallback);
256 WPADCallback pCallback);
258 WPADCallback pCallback);
260 WPADCallback pCallback);
262 WPADCallback pCallback);
264 u32 addr, WPADCallback pCallback);
265BOOL WPADiSendReadData(
WPADCommandQueue* pQueue,
void* pDst, u16 len, u32 addr,
266 WPADCallback pCallback);
267BOOL WPADiSendStreamData(
WPADCommandQueue* pQueue,
const void* pData, u16 len);
269 WPADCallback pCallback);
271 WPADCallback pCallback);
278u16 _WPADGetStackBufferStatus(s32 chan);
279u16 _WPADGetModuleBufferStatus(s32 chan);
281void __WPADShutdown(
void);
282void __WPADReconnect(
void);