some more wpad work...
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@973 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
f1db84a999
commit
c9a8672987
|
@ -1143,10 +1143,6 @@
|
|||
RelativePath=".\Src\IPC_HLE\WII_IPC_HLE_WiiMote.h"
|
||||
>
|
||||
</File>
|
||||
<File
|
||||
RelativePath=".\Src\IPC_HLE\wiimote_hid.h"
|
||||
>
|
||||
</File>
|
||||
</Filter>
|
||||
<Filter
|
||||
Name="Boot"
|
||||
|
|
|
@ -134,4 +134,24 @@ void PrintCallstack(LogTypes::LOG_TYPE _Log)
|
|||
}
|
||||
}
|
||||
|
||||
void PrintDataBuffer(LogTypes::LOG_TYPE _Log, u8* _pData, size_t _Size, const char* _title)
|
||||
{
|
||||
__Log(_Log, _title);
|
||||
for (u32 j=0; j<_Size;)
|
||||
{
|
||||
std::string Temp;
|
||||
for (int i=0; i<16; i++)
|
||||
{
|
||||
char Buffer[128];
|
||||
sprintf(Buffer, "%02x ", _pData[j++]);
|
||||
Temp.append(Buffer);
|
||||
|
||||
if (j >= _Size)
|
||||
break;
|
||||
}
|
||||
|
||||
__Log(_Log, " Data: %s", Temp.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
} // end of namespace Debugger
|
||||
|
|
|
@ -35,6 +35,7 @@ struct CallstackEntry
|
|||
bool GetCallstack(std::vector<CallstackEntry> &output);
|
||||
void PrintCallstack();
|
||||
void PrintCallstack(LogTypes::LOG_TYPE _Log);
|
||||
void PrintDataBuffer(LogTypes::LOG_TYPE _Log, u8* _pData, size_t _Size, const char* _title);
|
||||
|
||||
} // end of namespace Debugger
|
||||
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
#include "WII_IPC_HLE_Device_usb.h"
|
||||
#include "../Plugins/Plugin_Wiimote.h"
|
||||
|
||||
#include "../Debugger/Debugger_SymbolMap.h"
|
||||
|
||||
// ugly hacks for "SendEventNumberOfCompletedPackets"
|
||||
int g_HCICount = 0;
|
||||
int g_GlobalHandle = 0;
|
||||
|
@ -67,9 +69,17 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtl(u32 _CommandAddress)
|
|||
|
||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::IOCtlV(u32 _CommandAddress)
|
||||
{
|
||||
// wpadsampled.elf - patch so the USB_LOG will print somehting
|
||||
|
||||
Memory::Write_U8(255, 0x80149950); // BTM LOG
|
||||
// 3 logs L2Cap
|
||||
// 4 logs l2_csm$
|
||||
|
||||
Memory::Write_U8(255, 0x80149949); // HID
|
||||
|
||||
Memory::Write_U8(255, 0x80152058); // low ??
|
||||
|
||||
// even it it wasn't very useful yet...
|
||||
Memory::Write_U8(1, 0x80151488); // DebugLog
|
||||
// Memory::Write_U8(1, 0x80151488); // WPAD_LOG
|
||||
// Memory::Write_U8(1, 0x801514A8); // USB_LOG
|
||||
// Memory::Write_U8(1, 0x801514D8); // WUD_DEBUGPrint
|
||||
// Memory::Write_U8(1, 0x80148E09); // HID LOG
|
||||
|
@ -210,7 +220,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::SendToDevice(u16 _ConnectionHandle, u8
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_ConnectionHandle);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by connection handle: %02x", _ConnectionHandle);
|
||||
PanicAlert("SendToDevice: Cant find WiiMote by connection handle: %02x", _ConnectionHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -293,7 +303,31 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
|||
g_HCICount = 0;
|
||||
}
|
||||
|
||||
PluginWiimote::Wiimote_Update();
|
||||
if (m_AclFrameQue.empty())
|
||||
{
|
||||
PluginWiimote::Wiimote_Update();
|
||||
}
|
||||
|
||||
|
||||
static bool test = true;
|
||||
if (GetAsyncKeyState(VK_LBUTTON) && GetAsyncKeyState(VK_RBUTTON))
|
||||
{
|
||||
if (test)
|
||||
{
|
||||
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
||||
{
|
||||
// if (m_WiiMotes[i].EventPagingChanged(2))
|
||||
{
|
||||
SendEventRequestConnection(m_WiiMotes[i].GetBD());
|
||||
}
|
||||
}
|
||||
test = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
test = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -368,6 +402,9 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventInquiryResponse()
|
|||
|
||||
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
||||
{
|
||||
if (m_WiiMotes[i].IsConnected())
|
||||
continue;
|
||||
|
||||
u8* pBuffer = Event.m_buffer + sizeof(SHCIEventInquiryResult) + i*sizeof(hci_inquiry_response);
|
||||
hci_inquiry_response* pResponse = (hci_inquiry_response*)pBuffer;
|
||||
|
||||
|
@ -413,7 +450,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRemoteNameReq(bdaddr_t _bd)
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_bd);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
PanicAlert("SendEventRemoteNameReq: Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
_bd.b[0], _bd.b[1], _bd.b[2],
|
||||
_bd.b[3], _bd.b[4], _bd.b[5]);
|
||||
return false;
|
||||
|
@ -440,9 +477,9 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRemoteNameReq(bdaddr_t _bd)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRequestConnection()
|
||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRequestConnection(bdaddr_t _bd)
|
||||
{
|
||||
const CWII_IPC_HLE_WiiMote rWiiMote = m_WiiMotes[0];
|
||||
const CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_bd);
|
||||
|
||||
SQueuedEvent Event(sizeof(SHCIEventRequestConnection), 0);
|
||||
|
||||
|
@ -450,10 +487,10 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRequestConnection()
|
|||
|
||||
pEventRequestConnection->EventType = 0x04;
|
||||
pEventRequestConnection->PayloadLength = sizeof(SHCIEventRequestConnection) - 2;
|
||||
pEventRequestConnection->bdaddr = rWiiMote.GetBD(); // BD_ADDR of the device that requests the connection
|
||||
pEventRequestConnection->uclass[0] = rWiiMote.GetClass()[0];
|
||||
pEventRequestConnection->uclass[1] = rWiiMote.GetClass()[1];
|
||||
pEventRequestConnection->uclass[2] = rWiiMote.GetClass()[2];
|
||||
pEventRequestConnection->bdaddr = pWiiMote->GetBD(); // BD_ADDR of the device that requests the connection
|
||||
pEventRequestConnection->uclass[0] = pWiiMote->GetClass()[0];
|
||||
pEventRequestConnection->uclass[1] = pWiiMote->GetClass()[1];
|
||||
pEventRequestConnection->uclass[2] = pWiiMote->GetClass()[2];
|
||||
pEventRequestConnection->LinkType = 0x01;
|
||||
|
||||
AddEventToQueue(Event);
|
||||
|
@ -480,12 +517,36 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRequestConnection()
|
|||
return true;
|
||||
};
|
||||
|
||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRequestLinkKey(bdaddr_t _bd)
|
||||
{
|
||||
const CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_bd);
|
||||
|
||||
SQueuedEvent Event(sizeof(SHCIEventRequestLinkKey), 0);
|
||||
|
||||
SHCIEventRequestLinkKey* pEventRequestLinkKey = (SHCIEventRequestLinkKey*)Event.m_buffer;
|
||||
|
||||
pEventRequestLinkKey->EventType = 0x17;
|
||||
pEventRequestLinkKey->PayloadLength = sizeof(SHCIEventRequestLinkKey) - 2;
|
||||
pEventRequestLinkKey->bdaddr = _bd;
|
||||
|
||||
AddEventToQueue(Event);
|
||||
|
||||
|
||||
LOG(WIIMOTE, "Event: SendEventRequestLinkKey");
|
||||
LOG(WIIMOTE, " bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
pEventRequestLinkKey->bdaddr.b[0], pEventRequestLinkKey->bdaddr.b[1], pEventRequestLinkKey->bdaddr.b[2],
|
||||
pEventRequestLinkKey->bdaddr.b[3], pEventRequestLinkKey->bdaddr.b[4], pEventRequestLinkKey->bdaddr.b[5]);
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventConnectionComplete(bdaddr_t _bd)
|
||||
{
|
||||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_bd);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
PanicAlert("SendEventConnectionComplete: Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
_bd.b[0], _bd.b[1], _bd.b[2],
|
||||
_bd.b[3], _bd.b[4], _bd.b[5]);
|
||||
return false;
|
||||
|
@ -532,7 +593,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRoleChange(bdaddr_t _bd)
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_bd);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
PanicAlert("SendEventRoleChange: Cant find WiiMote by bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
_bd.b[0], _bd.b[1], _bd.b[2],
|
||||
_bd.b[3], _bd.b[4], _bd.b[5]);
|
||||
return false;
|
||||
|
@ -542,7 +603,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventRoleChange(bdaddr_t _bd)
|
|||
|
||||
SHCIEventRoleChange* pRoleChange = (SHCIEventRoleChange*)Event.m_buffer;
|
||||
|
||||
pRoleChange->EventType = 0x03;
|
||||
pRoleChange->EventType = 0x12;
|
||||
pRoleChange->PayloadLength = sizeof(SHCIEventRoleChange) - 2;
|
||||
pRoleChange->Status = 0x00;
|
||||
pRoleChange->bdaddr = pWiiMote->GetBD();
|
||||
|
@ -566,7 +627,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventReadClockOffsetComplete(u16 _
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_connectionHandle);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
PanicAlert("SendEventReadClockOffsetComplete: Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -594,7 +655,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventReadRemoteVerInfo(u16 _connec
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_connectionHandle);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
PanicAlert("SendEventReadRemoteVerInfo: Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -626,7 +687,7 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventReadRemoteFeatures(u16 _conne
|
|||
CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(_connectionHandle);
|
||||
if (pWiiMote == NULL)
|
||||
{
|
||||
PanicAlert("Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
PanicAlert("SendEventReadRemoteFeatures: Cant find WiiMote by connection handle: %02x", _connectionHandle);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -771,9 +832,6 @@ bool CWII_IPC_HLE_Device_usb_oh1_57e_305::SendEventDisconnect(u16 _connectionHan
|
|||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
//
|
||||
|
@ -787,7 +845,10 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::ExecuteHCICommandMessage(const SHCICom
|
|||
u8* pInput = Memory::GetPointer(_rHCICommandMessage.m_PayLoadAddr + 3);
|
||||
SCommandMessage* pMsg = (SCommandMessage*)Memory::GetPointer(_rHCICommandMessage.m_PayLoadAddr);
|
||||
|
||||
LOG(WIIMOTE, "****************************** ExecuteHCICommandMessage(0x%04x)", pMsg->Opcode);
|
||||
u16 ocf = HCI_OCF(pMsg->Opcode);
|
||||
u16 ogf = HCI_OGF(pMsg->Opcode);
|
||||
LOG(WIIMOTE, "****************************** ExecuteHCICommandMessage(0x%04x)"
|
||||
"(ocf: 0x%02x, ogf: 0x%02x)", pMsg->Opcode, ocf, ogf);
|
||||
|
||||
switch(pMsg->Opcode)
|
||||
{
|
||||
|
@ -914,6 +975,15 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::ExecuteHCICommandMessage(const SHCICom
|
|||
case HCI_CMD_DISCONNECT:
|
||||
CommandDisconnect(pInput);
|
||||
break;
|
||||
|
||||
case HCI_CMD_WRITE_LINK_SUPERVISION_TIMEOUT:
|
||||
CommandWriteLinkSupervisionTimeout(pInput);
|
||||
break;
|
||||
|
||||
case HCI_CMD_LINK_KEY_NEG_REP:
|
||||
CommandLinkKeyNegRep(pInput);
|
||||
break;
|
||||
|
||||
//
|
||||
// --- default ---
|
||||
//
|
||||
|
@ -1191,15 +1261,15 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteScanEnable(u8* _Input)
|
|||
|
||||
SendEventCommandComplete(HCI_CMD_WRITE_SCAN_ENABLE, &Reply, sizeof(hci_write_scan_enable_rp));
|
||||
|
||||
return;
|
||||
|
||||
// TODO: fix this ugly request connection hack :)
|
||||
//for homebrew works this
|
||||
if (pWriteScanEnable->scan_enable & 2) // check if page scan is enable
|
||||
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
||||
{
|
||||
static bool first = true;
|
||||
if (first)
|
||||
if (m_WiiMotes[i].EventPagingChanged(pWriteScanEnable->scan_enable))
|
||||
{
|
||||
first = false;
|
||||
// SendEventRequestConnection();
|
||||
SendEventRequestConnection(m_WiiMotes[i].GetBD());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1292,13 +1362,8 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandInquiry(u8* _Input)
|
|||
LOG(WIIMOTE, " num_responses: %i (N x 1.28) sec", pInquiry->num_responses);
|
||||
|
||||
SendEventCommandStatus(HCI_CMD_INQUIRY);
|
||||
|
||||
if (g_GlobalHandle == 0)
|
||||
{
|
||||
SendEventInquiryResponse();
|
||||
}
|
||||
/*
|
||||
SendEventInquiryComplete(); */
|
||||
SendEventInquiryResponse();
|
||||
SendEventInquiryComplete();
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteInquiryScanType(u8* _Input)
|
||||
|
@ -1331,12 +1396,10 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandVendorSpecific_FC4F(u8* _Input,
|
|||
hci_status_rp Reply;
|
||||
Reply.status = 0x00;
|
||||
|
||||
LOG(WIIMOTE, "Command: CommandVendorSpecific_FC4F:");
|
||||
LOG(WIIMOTE, "Command: CommandVendorSpecific_FC4F: (callstack WUDiRemovePatch)");
|
||||
LOG(WIIMOTE, "input (size 0x%x):", _Size);
|
||||
for (u32 i=0; i<_Size; i++)
|
||||
LOG(WIIMOTE, " Data: 0x%02x", _Input[i]);
|
||||
LOG(WIIMOTE, "write:");
|
||||
LOG(WIIMOTE, " callstack WUDiRemovePatch");
|
||||
|
||||
Debugger::PrintDataBuffer(LogTypes::WIIMOTE, _Input, _Size, "Data: ");
|
||||
|
||||
SendEventCommandComplete(0xFC4F, &Reply, sizeof(hci_status_rp));
|
||||
}
|
||||
|
@ -1349,10 +1412,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandVendorSpecific_FC4C(u8* _Input,
|
|||
|
||||
LOG(WIIMOTE, "Command: CommandVendorSpecific_FC4C:");
|
||||
LOG(WIIMOTE, "input (size 0x%x):", _Size);
|
||||
for (u32 i=0; i<_Size; i++)
|
||||
LOG(WIIMOTE, " Data: 0x%02x", _Input[i]);
|
||||
LOG(WIIMOTE, "write:");
|
||||
LOG(WIIMOTE, " perhaps append patch?");
|
||||
Debugger::PrintDataBuffer(LogTypes::WIIMOTE, _Input, _Size, "Data: ");
|
||||
|
||||
SendEventCommandComplete(0xFC4C, &Reply, sizeof(hci_status_rp));
|
||||
}
|
||||
|
@ -1428,6 +1488,13 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandAcceptCon(u8* _Input)
|
|||
LOG(WIIMOTE, " role: %s", s_szRole[pAcceptCon->role]);
|
||||
|
||||
SendEventCommandStatus(HCI_CMD_ACCEPT_CON);
|
||||
|
||||
CWII_IPC_HLE_WiiMote* pWiimote = AccessWiiMote(pAcceptCon->bdaddr);
|
||||
if (pWiimote)
|
||||
{
|
||||
pWiimote->EventConnectionAccepted();
|
||||
}
|
||||
|
||||
SendEventConnectionComplete(pAcceptCon->bdaddr);
|
||||
}
|
||||
|
||||
|
@ -1442,6 +1509,9 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadClockOffset(u8* _Input)
|
|||
|
||||
SendEventCommandStatus(HCI_CMD_READ_CLOCK_OFFSET);
|
||||
SendEventReadClockOffsetComplete(pReadClockOffset->con_handle);
|
||||
|
||||
//CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(pReadClockOffset->con_handle);
|
||||
// pWiiMote->Connect();
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadRemoteVerInfo(u8* _Input)
|
||||
|
@ -1455,10 +1525,6 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadRemoteVerInfo(u8* _Input)
|
|||
|
||||
SendEventCommandStatus(HCI_CMD_READ_REMOTE_VER_INFO);
|
||||
SendEventReadRemoteVerInfo(pReadRemoteVerInfo->con_handle);
|
||||
|
||||
// connect
|
||||
// CWII_IPC_HLE_WiiMote* pWiimote = AccessWiiMote(pReadRemoteVerInfo->con_handle);
|
||||
// pWiimote->Connect();
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadRemoteFeatures(u8* _Input)
|
||||
|
@ -1472,6 +1538,10 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadRemoteFeatures(u8* _Input)
|
|||
|
||||
SendEventCommandStatus(HCI_CMD_READ_REMOTE_FEATURES);
|
||||
SendEventReadRemoteFeatures(pReadRemoteFeatures->con_handle);
|
||||
|
||||
// connect
|
||||
// CWII_IPC_HLE_WiiMote* pWiimote = AccessWiiMote(pReadRemoteFeatures->con_handle);
|
||||
// pWiimote->Connect();
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteLinkPolicy(u8* _Input)
|
||||
|
@ -1485,12 +1555,6 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteLinkPolicy(u8* _Input)
|
|||
LOG(WIIMOTE, " Policy: 0x%04x", pLinkPolicy->settings);
|
||||
|
||||
SendEventCommandStatus(HCI_CMD_WRITE_LINK_POLICY_SETTINGS);
|
||||
|
||||
PanicAlert("The connect should be send after the command status... check it");
|
||||
|
||||
// for homebrew works this
|
||||
// CWII_IPC_HLE_WiiMote* pWiimote = AccessWiiMote(pLinkPolicy->con_handle);
|
||||
// pWiimote->Connect();
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandAuthenticationRequested(u8* _Input)
|
||||
|
@ -1535,8 +1599,52 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandDisconnect(u8* _Input)
|
|||
|
||||
SendEventCommandStatus(HCI_CMD_DISCONNECT);
|
||||
SendEventDisconnect(pDiscon->con_handle, pDiscon->reason);
|
||||
|
||||
CWII_IPC_HLE_WiiMote* pWiimote = AccessWiiMote(pDiscon->con_handle);
|
||||
if (pWiimote)
|
||||
{
|
||||
pWiimote->EventDisconnect();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteLinkSupervisionTimeout(u8* _Input)
|
||||
{
|
||||
// command parameters
|
||||
hci_write_link_supervision_timeout_cp* pSuperVision = (hci_write_link_supervision_timeout_cp*)_Input;
|
||||
|
||||
LOG(WIIMOTE, "Command: HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT");
|
||||
LOG(WIIMOTE, "Input:");
|
||||
LOG(WIIMOTE, " con_handle: 0x%04x", pSuperVision->con_handle);
|
||||
LOG(WIIMOTE, " timeout: 0x%02x", pSuperVision->timeout);
|
||||
|
||||
hci_write_link_supervision_timeout_rp Reply;
|
||||
Reply.status = 0x00;
|
||||
Reply.con_handle = pSuperVision->con_handle;
|
||||
|
||||
SendEventCommandComplete(HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT, &Reply, sizeof(hci_write_link_supervision_timeout_rp));
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandLinkKeyNegRep(u8* _Input)
|
||||
{
|
||||
// command parameters
|
||||
hci_link_key_neg_rep_cp* pKeyNeg = (hci_link_key_neg_rep_cp*)_Input;
|
||||
|
||||
LOG(WIIMOTE, "Command: HCI_CMD_LINK_KEY_NEG_REP");
|
||||
LOG(WIIMOTE, "Input:");
|
||||
LOG(WIIMOTE, " bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||
pKeyNeg->bdaddr.b[0], pKeyNeg->bdaddr.b[1], pKeyNeg->bdaddr.b[2],
|
||||
pKeyNeg->bdaddr.b[3], pKeyNeg->bdaddr.b[4], pKeyNeg->bdaddr.b[5]);
|
||||
|
||||
hci_link_key_neg_rep_rp Reply;
|
||||
Reply.status = 0x00;
|
||||
Reply.bdaddr = pKeyNeg->bdaddr;
|
||||
|
||||
SendEventCommandComplete(HCI_OCF_WRITE_LINK_SUPERVISION_TIMEOUT, &Reply, sizeof(hci_link_key_neg_rep_rp));
|
||||
|
||||
// CWII_IPC_HLE_WiiMote* pWiiMote = AccessWiiMote(pKeyNeg->bdaddr);
|
||||
// pWiiMote->Connect();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -152,7 +152,7 @@ private:
|
|||
bool SendEventInquiryResponse();
|
||||
bool SendEventInquiryComplete();
|
||||
bool SendEventRemoteNameReq(bdaddr_t _bd);
|
||||
bool SendEventRequestConnection();
|
||||
bool SendEventRequestConnection(bdaddr_t _bd);
|
||||
bool SendEventConnectionComplete(bdaddr_t _bd);
|
||||
bool SendEventReadClockOffsetComplete(u16 _connectionHandle);
|
||||
bool SendEventReadRemoteVerInfo(u16 _connectionHandle);
|
||||
|
@ -162,6 +162,7 @@ private:
|
|||
bool SendEventAuthenticationCompleted(u16 _connectionHandle);
|
||||
bool SendEventModeChange(u16 _connectionHandle, u8 _mode, u16 _value);
|
||||
bool SendEventDisconnect(u16 _connectionHandle, u8 _Reason);
|
||||
bool SendEventRequestLinkKey(bdaddr_t _bd);
|
||||
|
||||
// Execute HCI Message
|
||||
void ExecuteHCICommandMessage(const SHCICommandMessage& _rCtrlMessage);
|
||||
|
@ -180,6 +181,7 @@ private:
|
|||
void CommandAuthenticationRequested(u8* _Input);
|
||||
void CommandInquiry(u8* _Input);
|
||||
void CommandDisconnect(u8* _Input);
|
||||
void CommandLinkKeyNegRep(u8* _Input);
|
||||
|
||||
// OGF 0x02 Link policy commands and return parameters
|
||||
void CommandWriteLinkPolicy(u8* _Input);
|
||||
|
@ -195,6 +197,7 @@ private:
|
|||
void CommandWritePinType(u8* _Input);
|
||||
void CommandSetEventFilter(u8* _Input);
|
||||
void CommandWriteInquiryScanType(u8* _Input);
|
||||
void CommandWriteLinkSupervisionTimeout(u8* _Input);
|
||||
|
||||
// OGF 0x04 Informational commands and return parameters
|
||||
void CommandReadBufferSize(u8* _Input);
|
||||
|
|
|
@ -135,13 +135,27 @@ static CWII_IPC_HLE_Device_usb_oh1_57e_305* s_Usb;
|
|||
namespace Core {
|
||||
void Callback_WiimoteInput(u16 _channelID, const void* _pData, u32 _Size)
|
||||
{
|
||||
const u8* pData = (const u8*)_pData;
|
||||
LOG(WIIMOTE, "Callback_WiimoteInput: 0x%x", _channelID);
|
||||
std::string Temp;
|
||||
for (u32 j=0; j<_Size; j++)
|
||||
{
|
||||
char Buffer[128];
|
||||
sprintf(Buffer, "%02x ", pData[j]);
|
||||
Temp.append(Buffer);
|
||||
}
|
||||
LOG(WIIMOTE, " Data: %s", Temp.c_str());
|
||||
|
||||
s_Usb->m_WiiMotes[0].SendL2capData(_channelID, _pData, _Size);
|
||||
|
||||
// CCPU::Break();
|
||||
}
|
||||
}
|
||||
|
||||
CWII_IPC_HLE_WiiMote::CWII_IPC_HLE_WiiMote(CWII_IPC_HLE_Device_usb_oh1_57e_305* _pHost, int _Number)
|
||||
: m_Name("Nintendo RVL-CNT-01")
|
||||
, m_pHost(_pHost)
|
||||
, m_Connected(false)
|
||||
{
|
||||
s_Usb = _pHost;
|
||||
LOG(WIIMOTE, "Wiimote %i constructed", _Number);
|
||||
|
@ -172,21 +186,33 @@ CWII_IPC_HLE_WiiMote::CWII_IPC_HLE_WiiMote(CWII_IPC_HLE_Device_usb_oh1_57e_305*
|
|||
lmp_subversion = 0x229;
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::EventConnectionAccepted()
|
||||
{
|
||||
m_Connected = true;
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::EventDisconnect()
|
||||
{
|
||||
m_Connected = false;
|
||||
}
|
||||
|
||||
bool CWII_IPC_HLE_WiiMote::EventPagingChanged(u8 _pageMode)
|
||||
{
|
||||
if (m_Connected)
|
||||
return false;
|
||||
|
||||
if ((_pageMode & 2) == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::SendACLFrame(u8* _pData, u32 _Size)
|
||||
{
|
||||
/* // dump raw data
|
||||
{
|
||||
LOG(WIIMOTE, "SendToDevice: 0x%x", GetConnectionHandle());
|
||||
std::string Temp;
|
||||
for (u32 j=0; j<_Size; j++)
|
||||
{
|
||||
char Buffer[128];
|
||||
sprintf(Buffer, "%02x ", _pData[j]);
|
||||
Temp.append(Buffer);
|
||||
}
|
||||
LOG(WIIMOTE, " Data: %s", Temp.c_str());
|
||||
}
|
||||
*/
|
||||
// Debugger::PrintDataBuffer(LogTypes::WIIMOTE, _pData, _Size, "SendACLFrame: ");
|
||||
|
||||
// parse the command
|
||||
SL2CAP_Header* pHeader = (SL2CAP_Header*)_pData;
|
||||
u8* pData = _pData + sizeof(SL2CAP_Header);
|
||||
|
@ -296,8 +322,10 @@ void CWII_IPC_HLE_WiiMote::SendCommandToACL(u8 _Ident, u8 _Code, u8 _CommandLeng
|
|||
|
||||
void CWII_IPC_HLE_WiiMote::Connect()
|
||||
{
|
||||
SendConnectionRequest(0x0040, HIDP_OUTPUT_CHANNEL);
|
||||
SendConnectionRequest(0x0041, HIDP_INPUT_CHANNEL);
|
||||
SendConnectionRequest(0x0040, 1);
|
||||
|
||||
// SendConnectionRequest(0x0041, HIDP_OUTPUT_CHANNEL);
|
||||
// SendConnectionRequest(0x0042, HIDP_INPUT_CHANNEL);
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::SendConnectionRequest(u16 scid, u16 psm)
|
||||
|
@ -318,6 +346,22 @@ void CWII_IPC_HLE_WiiMote::SendConnectionRequest(u16 scid, u16 psm)
|
|||
SendCommandToACL(L2CAP_CONN_REQ, L2CAP_CONN_REQ, sizeof(l2cap_conn_req), (u8*)&cr);
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::SendDisconnectRequest(u16 scid)
|
||||
{
|
||||
// create the channel
|
||||
SChannel& rChannel = m_Channel[scid];
|
||||
|
||||
l2cap_disconn_req cr;
|
||||
cr.dcid = rChannel.DCID;
|
||||
cr.scid = rChannel.SCID;
|
||||
|
||||
LOG(WIIMOTE, " SendDisconnectionRequest()");
|
||||
LOG(WIIMOTE, " Dcid: 0x%04x", cr.dcid);
|
||||
LOG(WIIMOTE, " Scid: 0x%04x", cr.scid);
|
||||
|
||||
SendCommandToACL(L2CAP_DISCONN_REQ, L2CAP_DISCONN_REQ, sizeof(l2cap_disconn_req), (u8*)&cr);
|
||||
}
|
||||
|
||||
void CWII_IPC_HLE_WiiMote::SendConfigurationRequest(u16 scid, u16* MTU, u16* FlushTimeOut)
|
||||
{
|
||||
_dbg_assert_(WIIMOTE, DoesChannelExist(scid));
|
||||
|
|
|
@ -80,6 +80,17 @@ public:
|
|||
virtual ~CWII_IPC_HLE_WiiMote()
|
||||
{}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
// ugly Host handling....
|
||||
// we really have to clean all this code
|
||||
|
||||
bool IsConnected() const { return m_Connected; }
|
||||
|
||||
|
||||
void EventConnectionAccepted();
|
||||
void EventDisconnect();
|
||||
bool EventPagingChanged(u8 _pageMode);
|
||||
|
||||
const bdaddr_t& GetBD() const { return m_BD; }
|
||||
|
||||
const uint8_t* GetClass() const { return uclass; }
|
||||
|
@ -104,6 +115,8 @@ public:
|
|||
|
||||
private:
|
||||
|
||||
bool m_Connected;
|
||||
|
||||
// STATE_TO_SAVE
|
||||
bdaddr_t m_BD;
|
||||
|
||||
|
@ -146,6 +159,7 @@ private:
|
|||
|
||||
void SendConnectionRequest(u16 scid, u16 psm);
|
||||
void SendConfigurationRequest(u16 scid, u16* MTU, u16* FlushTimeOut);
|
||||
void SendDisconnectRequest(u16 scid);
|
||||
|
||||
void CommandConnectionReq(u8 _Ident, u8* _pData, u32 _Size);
|
||||
void CommandCofigurationReq(u8 _Ident, u8* _pData, u32 _Size);
|
||||
|
|
|
@ -2534,6 +2534,12 @@ struct SHCIEventDisconnectCompleted
|
|||
u8 Reason;
|
||||
};
|
||||
|
||||
struct SHCIEventRequestLinkKey
|
||||
{
|
||||
u8 EventType;
|
||||
u8 PayloadLength;
|
||||
bdaddr_t bdaddr;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -212,6 +212,69 @@ struct l2cap_info_rsp {
|
|||
#pragma pack(pop)
|
||||
#endif
|
||||
|
||||
struct value_string
|
||||
{
|
||||
u32 value;
|
||||
char* string;
|
||||
};
|
||||
|
||||
static const value_string command_code_vals[] = {
|
||||
{ 0x01, "Command Reject" },
|
||||
{ 0x02, "Connection Request" },
|
||||
{ 0x03, "Connection Response" },
|
||||
{ 0x04, "Configure Request" },
|
||||
{ 0x05, "Configure Response" },
|
||||
{ 0x06, "Disconnect Request" },
|
||||
{ 0x07, "Disconnect Response" },
|
||||
{ 0x08, "Echo Request" },
|
||||
{ 0x09, "Echo Response" },
|
||||
{ 0x0A, "Information Request" },
|
||||
{ 0x0B, "Information Response" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
|
||||
static const value_string psm_vals[] = {
|
||||
{ 0x0001, "SDP" },
|
||||
{ 0x0003, "RFCOMM" },
|
||||
{ 0x0005, "TCS-BIN" },
|
||||
{ 0x0007, "TCS-BIN-CORDLESS" },
|
||||
{ 0x000F, "BNEP" },
|
||||
{ 0x0011, "HID_CONTROL" },
|
||||
{ 0x0013, "HID_INTERRUPT" },
|
||||
{ 0x0015, "UPnP" },
|
||||
{ 0x0017, "AVCTP" },
|
||||
{ 0x0019, "AVDTP" },
|
||||
{ 0x001D, "UDI_C-Plane" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
static const value_string result_vals[] = {
|
||||
{ 0x0000, "Connection successful" },
|
||||
{ 0x0001, "Connection pending" },
|
||||
{ 0x0002, "Connection Refused - PSM not supported" },
|
||||
{ 0x0003, "Connection refused - security block" },
|
||||
{ 0x0004, "Connection refused - no resources available" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
static const value_string status_vals[] = {
|
||||
{ 0x0000, "No further information available" },
|
||||
{ 0x0001, "Authentication panding" },
|
||||
{ 0x0002, "Authorization pending" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef NOT_DOLPHIN
|
||||
|
||||
/* ----- L2CAP connections ----- */
|
||||
|
|
|
@ -67,12 +67,12 @@ void WmRequestStatus(u16 _channelID, wm_request_status* rs);
|
|||
void WmDataReporting(u16 _channelID, wm_data_reporting* dr);
|
||||
|
||||
void SendReadDataReply(u16 _channelID, void* _Base, u16 _Address, u8 _Size);
|
||||
void SendWriteDataReply(u16 _channelID);
|
||||
void SendReportCoreAccel(u16 _channelID);
|
||||
void SendReportCoreAccelIr12(u16 _channelID);
|
||||
void SendReportCore(u16 _channelID);
|
||||
|
||||
int WriteWmReport(u16 _channelID, u8* dst, u8 channel);
|
||||
int WriteWmReport(u8* dst, u8 channel);
|
||||
void WmSendAck(u16 _channelID, u8 _reportID);
|
||||
|
||||
static u32 convert24bit(const u8* src) {
|
||||
return (src[0] << 16) | (src[1] << 8) | src[2];
|
||||
|
@ -202,7 +202,11 @@ extern "C" void Wiimote_Input(u16 _channelID, const void* _pData, u32 _Size)
|
|||
switch(hidp->param)
|
||||
{
|
||||
case HID_PARAM_OUTPUT:
|
||||
HidOutputReport(_channelID, (wm_report*)hidp->data);
|
||||
{
|
||||
wm_report* sr = (wm_report*)hidp->data;
|
||||
WmSendAck(_channelID, sr->channel);
|
||||
HidOutputReport(_channelID, sr);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -278,7 +282,7 @@ extern "C" void Wiimote_Update() {
|
|||
switch(g_ReportingMode) {
|
||||
case 0:
|
||||
break;
|
||||
case WM_REPORT_CORE: SendReportCoreAccel(g_ReportingChannel); break;
|
||||
case WM_REPORT_CORE: SendReportCore(g_ReportingChannel); break;
|
||||
case WM_REPORT_CORE_ACCEL: SendReportCoreAccel(g_ReportingChannel); break;
|
||||
case WM_REPORT_CORE_ACCEL_IR12: SendReportCoreAccelIr12(g_ReportingChannel);break;
|
||||
}
|
||||
|
@ -299,6 +303,7 @@ void HidOutputReport(u16 _channelID, wm_report* sr) {
|
|||
{
|
||||
case WM_LEDS:
|
||||
WmLeds(_channelID, (wm_leds*)sr->data);
|
||||
// WmSendAck(_channelID, WM_LEDS);
|
||||
break;
|
||||
case WM_READ_DATA:
|
||||
WmReadData(_channelID, (wm_read_data*)sr->data);
|
||||
|
@ -309,6 +314,7 @@ void HidOutputReport(u16 _channelID, wm_report* sr) {
|
|||
case WM_IR_PIXEL_CLOCK:
|
||||
case WM_IR_LOGIC:
|
||||
LOG(WIIMOTE, " IR Enable 0x%02x 0x%02x", sr->channel, sr->data[0]);
|
||||
// WmSendAck(_channelID, WM_IR_LOGIC);
|
||||
break;
|
||||
case WM_WRITE_DATA:
|
||||
WmWriteData(_channelID, (wm_write_data*)sr->data);
|
||||
|
@ -330,8 +336,36 @@ void WmLeds(u16 _channelID, wm_leds* leds) {
|
|||
|
||||
g_Leds = leds->leds;
|
||||
}
|
||||
void WmSendAck(u16 _channelID, u8 _reportID)
|
||||
{
|
||||
|
||||
void WmDataReporting(u16 _channelID, wm_data_reporting* dr) {
|
||||
u8 DataFrame[1024];
|
||||
|
||||
u32 Offset = 0;
|
||||
|
||||
// header
|
||||
hid_packet* pHidHeader = (hid_packet*)(DataFrame + Offset);
|
||||
pHidHeader->type = HID_TYPE_DATA;
|
||||
pHidHeader->param = HID_PARAM_INPUT;
|
||||
Offset += sizeof(hid_packet);
|
||||
|
||||
wm_acknowledge* pData = (wm_acknowledge*)(DataFrame + Offset);
|
||||
pData->Channel = WM_WRITE_DATA_REPLY;
|
||||
pData->unk0 = 0;
|
||||
pData->unk1 = 0;
|
||||
pData->reportID = _reportID;
|
||||
pData->errorID = 0;
|
||||
Offset += sizeof(wm_acknowledge);
|
||||
|
||||
|
||||
LOG(WIIMOTE, " WMSendAck()");
|
||||
|
||||
g_WiimoteInitialize.pWiimoteInput(_channelID, DataFrame, Offset);
|
||||
}
|
||||
|
||||
|
||||
void WmDataReporting(u16 _channelID, wm_data_reporting* dr)
|
||||
{
|
||||
LOG(WIIMOTE, " Set Data reporting mode");
|
||||
LOG(WIIMOTE, " Rumble: %x", dr->rumble);
|
||||
LOG(WIIMOTE, " Continuous: %x", dr->continuous);
|
||||
|
@ -341,7 +375,7 @@ void WmDataReporting(u16 _channelID, wm_data_reporting* dr) {
|
|||
|
||||
g_ReportingMode = dr->mode;
|
||||
g_ReportingChannel = _channelID;
|
||||
switch(g_ReportingMode) { //see Wiimote_Update()
|
||||
switch(dr->mode) { //see Wiimote_Update()
|
||||
case 0x30:
|
||||
case 0x31:
|
||||
case 0x33:
|
||||
|
@ -349,26 +383,30 @@ void WmDataReporting(u16 _channelID, wm_data_reporting* dr) {
|
|||
default:
|
||||
PanicAlert("Wiimote: Unknown reporting mode 0x%x", dr->mode);
|
||||
}
|
||||
|
||||
// WmSendAck(_channelID, WM_DATA_REPORTING);
|
||||
}
|
||||
|
||||
|
||||
void FillReportInfo(wm_report_core& _reportCore)
|
||||
void FillReportInfo(wm_core& _core)
|
||||
{
|
||||
static bool bb = true;
|
||||
bb = !bb;
|
||||
_reportCore.c.a = bb ? 1 : 0;
|
||||
_core.a = GetAsyncKeyState(VK_LBUTTON) ? 1 : 0;
|
||||
_core.b = GetAsyncKeyState(VK_RBUTTON) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
void SendReportCore(u16 _channelID) {
|
||||
void SendReportCore(u16 _channelID)
|
||||
{
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_REPORT_CORE);
|
||||
u32 Offset = WriteWmReport(DataFrame, WM_REPORT_CORE);
|
||||
|
||||
wm_report_core* pReport = (wm_report_core*)(DataFrame + Offset);
|
||||
Offset += sizeof(wm_report_core);
|
||||
memset(pReport, 0, sizeof(wm_report_core));
|
||||
|
||||
FillReportInfo(*pReport);
|
||||
FillReportInfo(pReport->c);
|
||||
|
||||
LOG(WIIMOTE, " SendReportCore()");
|
||||
|
||||
|
@ -378,7 +416,7 @@ void SendReportCore(u16 _channelID) {
|
|||
|
||||
void SendReportCoreAccelIr12(u16 _channelID) {
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_REPORT_CORE_ACCEL_IR12);
|
||||
u32 Offset = WriteWmReport(DataFrame, WM_REPORT_CORE_ACCEL_IR12);
|
||||
|
||||
wm_report_core_accel_ir12* pReport = (wm_report_core_accel_ir12*)(DataFrame + Offset);
|
||||
Offset += sizeof(wm_report_core_accel_ir12);
|
||||
|
@ -437,7 +475,7 @@ void SendReportCoreAccelIr12(u16 _channelID) {
|
|||
|
||||
void SendReportCoreAccel(u16 _channelID) {
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_REPORT_CORE_ACCEL);
|
||||
u32 Offset = WriteWmReport(DataFrame, WM_REPORT_CORE_ACCEL);
|
||||
|
||||
wm_report_core_accel* pReport = (wm_report_core_accel*)(DataFrame + Offset);
|
||||
Offset += sizeof(wm_report_core_accel);
|
||||
|
@ -462,10 +500,12 @@ void WmReadData(u16 _channelID, wm_read_data* rd) {
|
|||
LOG(WIIMOTE, " Size: 0x%04x", size);
|
||||
LOG(WIIMOTE, " Rumble: %x", rd->rumble);
|
||||
|
||||
if(size <= 16 && rd->space == 0) {
|
||||
if(size <= 100 && rd->space == 0) {
|
||||
SendReadDataReply(_channelID, g_Eeprom, address, (u8)size);
|
||||
} else {
|
||||
PanicAlert("WmReadData: unimplemented parameters!");
|
||||
}
|
||||
else
|
||||
{
|
||||
PanicAlert("WmReadData: unimplemented parameters (size: %i, addr: 0x%x!", size, rd->space);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -484,7 +524,8 @@ void WmWriteData(u16 _channelID, wm_write_data* wd) {
|
|||
return;
|
||||
}
|
||||
memcpy(g_Eeprom + address, wd->data, wd->size);
|
||||
SendWriteDataReply(_channelID);
|
||||
|
||||
// WmSendAck(_channelID, WM_WRITE_DATA);
|
||||
}
|
||||
else if(wd->size <= 16 && (wd->space == WM_SPACE_REGS1 || wd->space == WM_SPACE_REGS2))
|
||||
{
|
||||
|
@ -513,22 +554,14 @@ void WmWriteData(u16 _channelID, wm_write_data* wd) {
|
|||
return;
|
||||
}
|
||||
memcpy(block + address, wd->data, wd->size);
|
||||
SendWriteDataReply(_channelID);
|
||||
|
||||
// WmSendAck(_channelID, WM_WRITE_DATA);
|
||||
} else {
|
||||
PanicAlert("WmWriteData: unimplemented parameters!");
|
||||
}
|
||||
}
|
||||
|
||||
void SendWriteDataReply(u16 _channelID) {
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_WRITE_DATA_REPLY);
|
||||
|
||||
LOG(WIIMOTE, " SendWriteDataReply()");
|
||||
|
||||
g_WiimoteInitialize.pWiimoteInput(_channelID, DataFrame, Offset);
|
||||
}
|
||||
|
||||
int WriteWmReport(u16 _channelID, u8* dst, u8 channel) {
|
||||
int WriteWmReport(u8* dst, u8 channel) {
|
||||
u32 Offset = 0;
|
||||
hid_packet* pHidHeader = (hid_packet*)(dst + Offset);
|
||||
Offset += sizeof(hid_packet);
|
||||
|
@ -547,7 +580,7 @@ void WmRequestStatus(u16 _channelID, wm_request_status* rs) {
|
|||
|
||||
//SendStatusReport();
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_STATUS_REPORT);
|
||||
u32 Offset = WriteWmReport(DataFrame, WM_STATUS_REPORT);
|
||||
|
||||
wm_status_report* pStatus = (wm_status_report*)(DataFrame + Offset);
|
||||
Offset += sizeof(wm_status_report);
|
||||
|
@ -566,7 +599,7 @@ void WmRequestStatus(u16 _channelID, wm_request_status* rs) {
|
|||
void SendReadDataReply(u16 _channelID, void* _Base, u16 _Address, u8 _Size)
|
||||
{
|
||||
u8 DataFrame[1024];
|
||||
u32 Offset = WriteWmReport(_channelID, DataFrame, WM_READ_DATA_REPLY);
|
||||
u32 Offset = WriteWmReport(DataFrame, WM_READ_DATA_REPLY);
|
||||
|
||||
_dbg_assert_(WIIMOTE, _Size <= 16);
|
||||
|
||||
|
|
|
@ -80,6 +80,15 @@ struct wm_write_data {
|
|||
};
|
||||
|
||||
#define WM_WRITE_DATA_REPLY 0x22 //empty, afaik
|
||||
struct wm_acknowledge
|
||||
{
|
||||
u8 Channel;
|
||||
u8 unk0;
|
||||
u8 unk1;
|
||||
u8 reportID;
|
||||
u8 errorID;
|
||||
};
|
||||
|
||||
|
||||
#define WM_READ_DATA 0x17
|
||||
struct wm_read_data {
|
||||
|
|
Loading…
Reference in New Issue