Wiimote: added ACL connection setup.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@438 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
53cdd29228
commit
f96d19a1fb
Binary file not shown.
|
@ -313,11 +313,18 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update()
|
||||||
return Addr;
|
return Addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(scan_enable && m_pHCIBuffer) {
|
if(m_DelayedEvent != EVENT_NONE && m_pHCIBuffer) {
|
||||||
//by now, the emulatee should be listening for incoming L2CAP packets.
|
switch(m_DelayedEvent) {
|
||||||
//let's send a few.
|
case EVENT_REQUEST_CONNECTION:
|
||||||
SendEventRequestConnection();
|
SendEventRequestConnection();
|
||||||
scan_enable = 0;
|
break;
|
||||||
|
case EVENT_CONNECTION_COMPLETE:
|
||||||
|
SendEventConnectionComplete();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PanicAlert("Unknown Event in USBDev");
|
||||||
|
}
|
||||||
|
m_DelayedEvent = EVENT_NONE;
|
||||||
|
|
||||||
u32 Addr = m_pHCIBuffer->m_Address;
|
u32 Addr = m_pHCIBuffer->m_Address;
|
||||||
delete m_pHCIBuffer;
|
delete m_pHCIBuffer;
|
||||||
|
@ -727,6 +734,10 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::ExecuteHCICommandMessage(const SHCICom
|
||||||
case HCI_CMD_READ_REMOTE_FEATURES:
|
case HCI_CMD_READ_REMOTE_FEATURES:
|
||||||
CommandReadRemoteFeatures(pInput);
|
CommandReadRemoteFeatures(pInput);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case HCI_CMD_WRITE_LINK_POLICY_SETTINGS:
|
||||||
|
CommandWriteLinkPolicy(pInput);
|
||||||
|
break;
|
||||||
|
|
||||||
//
|
//
|
||||||
// --- default ---
|
// --- default ---
|
||||||
|
@ -984,6 +995,7 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteScanEnable(u8* _Input)
|
||||||
LOG(WIIMOTE, "write:");
|
LOG(WIIMOTE, "write:");
|
||||||
LOG(WIIMOTE, " scan_enable: %s", Scanning[pWriteScanEnable->scan_enable]);
|
LOG(WIIMOTE, " scan_enable: %s", Scanning[pWriteScanEnable->scan_enable]);
|
||||||
|
|
||||||
|
SetDelayedEvent(EVENT_REQUEST_CONNECTION);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteInquiryMode(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteInquiryMode(u8* _Input)
|
||||||
|
@ -1190,19 +1202,30 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandCreateCon(u8* _Input)
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandAcceptCon(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandAcceptCon(u8* _Input)
|
||||||
{
|
{
|
||||||
#ifdef LOGGING
|
|
||||||
// command parameters
|
// command parameters
|
||||||
hci_accept_con_cp* pAcceptCon = (hci_accept_con_cp*)_Input;
|
hci_accept_con_cp* pAcceptCon = (hci_accept_con_cp*)_Input;
|
||||||
#endif
|
|
||||||
|
_dbg_assert_msg_(WIIMOTE, m_State == STATE_NONE, "m_State != NONE");
|
||||||
|
m_State = STATE_CONNECTION_COMPLETE_EVENT;
|
||||||
|
m_StateTempBD = pAcceptCon->bdaddr;
|
||||||
|
SendEventCommandStatus(HCI_CMD_ACCEPT_CON);
|
||||||
|
|
||||||
LOG(WIIMOTE, "Command: HCI_CMD_ACCEPT_CON");
|
LOG(WIIMOTE, "Command: HCI_CMD_ACCEPT_CON");
|
||||||
LOG(WIIMOTE, "Input:");
|
LOG(WIIMOTE, "Input:");
|
||||||
LOG(WIIMOTE, " bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
LOG(WIIMOTE, " bd: %02x:%02x:%02x:%02x:%02x:%02x",
|
||||||
pAcceptCon->bdaddr.b[0], pAcceptCon->bdaddr.b[1], pAcceptCon->bdaddr.b[2],
|
pAcceptCon->bdaddr.b[0], pAcceptCon->bdaddr.b[1], pAcceptCon->bdaddr.b[2],
|
||||||
pAcceptCon->bdaddr.b[3], pAcceptCon->bdaddr.b[4], pAcceptCon->bdaddr.b[5]);
|
pAcceptCon->bdaddr.b[3], pAcceptCon->bdaddr.b[4], pAcceptCon->bdaddr.b[5]);
|
||||||
LOG(WIIMOTE, " role: %i", pAcceptCon->role);
|
LOG(WIIMOTE, " role: %i", pAcceptCon->role);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::SetDelayedEvent(EDelayedEvent e)
|
||||||
|
{
|
||||||
|
if(m_DelayedEvent != EVENT_NONE) {
|
||||||
|
PanicAlert("WIIMOTE: Double delayed events!");
|
||||||
|
}
|
||||||
|
m_DelayedEvent = e;
|
||||||
|
}
|
||||||
|
|
||||||
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadClockOffset(u8* _Input)
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadClockOffset(u8* _Input)
|
||||||
{
|
{
|
||||||
// command parameters
|
// command parameters
|
||||||
|
@ -1245,9 +1268,23 @@ void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandReadRemoteFeatures(u8* _Input)
|
||||||
|
|
||||||
LOG(WIIMOTE, "Command: HCI_CMD_READ_REMOTE_FEATURES");
|
LOG(WIIMOTE, "Command: HCI_CMD_READ_REMOTE_FEATURES");
|
||||||
LOG(WIIMOTE, "Input:");
|
LOG(WIIMOTE, "Input:");
|
||||||
LOG(WIIMOTE, " ConnectionHandle: 0x%02x", pReadRemoteFeatures->con_handle);
|
LOG(WIIMOTE, " ConnectionHandle: 0x%04x", pReadRemoteFeatures->con_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CWII_IPC_HLE_Device_usb_oh1_57e_305::CommandWriteLinkPolicy(u8* _Input)
|
||||||
|
{
|
||||||
|
// command parameters
|
||||||
|
hci_write_link_policy_settings_cp* pLinkPolicy = (hci_write_link_policy_settings_cp*)_Input;
|
||||||
|
|
||||||
|
SendEventCommandStatus(HCI_CMD_WRITE_LINK_POLICY_SETTINGS);
|
||||||
|
|
||||||
|
LOG(WIIMOTE, "Command: HCI_CMD_WRITE_LINK_POLICY_SETTINGS");
|
||||||
|
LOG(WIIMOTE, "Input:");
|
||||||
|
LOG(WIIMOTE, " ConnectionHandle: 0x%04x", pLinkPolicy->con_handle);
|
||||||
|
LOG(WIIMOTE, " Policy: 0x%04x", pLinkPolicy->settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CWII_IPC_HLE_WiiMote* CWII_IPC_HLE_Device_usb_oh1_57e_305::AccessWiiMote(const bdaddr_t& _rAddr)
|
CWII_IPC_HLE_WiiMote* CWII_IPC_HLE_Device_usb_oh1_57e_305::AccessWiiMote(const bdaddr_t& _rAddr)
|
||||||
{
|
{
|
||||||
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
for (size_t i=0; i<m_WiiMotes.size(); i++)
|
||||||
|
|
|
@ -31,32 +31,32 @@ struct usb_ctrl_setup;
|
||||||
|
|
||||||
union UACLHeader
|
union UACLHeader
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned ConnectionHandle : 12;
|
unsigned ConnectionHandle : 12;
|
||||||
unsigned PBFlag : 2;
|
unsigned PBFlag : 2;
|
||||||
unsigned BCFlag : 2;
|
unsigned BCFlag : 2;
|
||||||
unsigned Size : 16;
|
unsigned Size : 16;
|
||||||
};
|
};
|
||||||
u32 Hex;
|
u32 Hex;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CWII_IPC_HLE_Device_usb_oh1_57e_305 : public IWII_IPC_HLE_Device
|
class CWII_IPC_HLE_Device_usb_oh1_57e_305 : public IWII_IPC_HLE_Device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
CWII_IPC_HLE_Device_usb_oh1_57e_305(u32 _DeviceID, const std::string& _rDeviceName);
|
CWII_IPC_HLE_Device_usb_oh1_57e_305(u32 _DeviceID, const std::string& _rDeviceName);
|
||||||
|
|
||||||
virtual ~CWII_IPC_HLE_Device_usb_oh1_57e_305();
|
virtual ~CWII_IPC_HLE_Device_usb_oh1_57e_305();
|
||||||
|
|
||||||
virtual bool Open(u32 _CommandAddress);
|
virtual bool Open(u32 _CommandAddress);
|
||||||
|
|
||||||
virtual bool IOCtlV(u32 _CommandAddress);
|
virtual bool IOCtlV(u32 _CommandAddress);
|
||||||
virtual bool IOCtl(u32 _CommandAddress);
|
virtual bool IOCtl(u32 _CommandAddress);
|
||||||
|
|
||||||
virtual u32 Update();
|
virtual u32 Update();
|
||||||
|
|
||||||
void SendACLFrame(u16 _ConnectionHandle, u8* _pData, u32 _Size);
|
void SendACLFrame(u16 _ConnectionHandle, u8* _pData, u32 _Size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -75,107 +75,118 @@ private:
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
HCI_EVENT_ENDPOINT = 0x81,
|
HCI_EVENT_ENDPOINT = 0x81,
|
||||||
ACL_DATA_ENDPOINT_READ = 0x02,
|
ACL_DATA_ENDPOINT_READ = 0x02,
|
||||||
ACL_DATA_ENDPOINT = 0x82,
|
ACL_DATA_ENDPOINT = 0x82,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct SHCICommandMessage
|
struct SHCICommandMessage
|
||||||
{
|
{
|
||||||
u8 bRequestType;
|
u8 bRequestType;
|
||||||
u8 bRequest;
|
u8 bRequest;
|
||||||
u16 wValue;
|
u16 wValue;
|
||||||
u16 wIndex;
|
u16 wIndex;
|
||||||
u16 wLength;
|
u16 wLength;
|
||||||
|
|
||||||
|
u32 m_PayLoadAddr;
|
||||||
|
u32 m_PayLoadSize;
|
||||||
|
};
|
||||||
|
|
||||||
u32 m_PayLoadAddr;
|
|
||||||
u32 m_PayLoadSize;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// STATE_TO_SAVE
|
// STATE_TO_SAVE
|
||||||
std::queue<SHCICommandMessage> m_HCICommandMessageQueue;
|
std::queue<SHCICommandMessage> m_HCICommandMessageQueue;
|
||||||
|
|
||||||
bool m_ACLAnswer;
|
bool m_ACLAnswer;
|
||||||
SIOCtlVBuffer* m_pACLBuffer;
|
SIOCtlVBuffer* m_pACLBuffer;
|
||||||
|
|
||||||
SIOCtlVBuffer* m_pHCIBuffer;
|
SIOCtlVBuffer* m_pHCIBuffer;
|
||||||
|
|
||||||
bool SendEventCommandStatus(u16 _Opcode);
|
bool SendEventCommandStatus(u16 _Opcode);
|
||||||
void SendEventCommandComplete(u16 _OpCode, void* _pData, u32 _DataSize);
|
void SendEventCommandComplete(u16 _OpCode, void* _pData, u32 _DataSize);
|
||||||
|
|
||||||
bool SendEventInquiryResponse();
|
bool SendEventInquiryResponse();
|
||||||
bool SendEventInquiryComplete();
|
bool SendEventInquiryComplete();
|
||||||
|
|
||||||
bool SendEventRemoteNameReq();
|
bool SendEventRemoteNameReq();
|
||||||
bool SendEventRequestConnection();
|
bool SendEventRequestConnection();
|
||||||
bool SendEventConnectionComplete();
|
bool SendEventConnectionComplete();
|
||||||
bool SendEventReadClockOffsetComplete();
|
bool SendEventReadClockOffsetComplete();
|
||||||
bool SendEventReadRemoteVerInfo();
|
bool SendEventReadRemoteVerInfo();
|
||||||
bool SendEventReadRemoteFeatures();
|
bool SendEventReadRemoteFeatures();
|
||||||
|
|
||||||
void ExecuteHCICommandMessage(const SHCICommandMessage& _rCtrlMessage);
|
void ExecuteHCICommandMessage(const SHCICommandMessage& _rCtrlMessage);
|
||||||
|
|
||||||
// commands
|
// commands
|
||||||
void CommandReset(u8* _Input);
|
void CommandReset(u8* _Input);
|
||||||
void CommandReadBufferSize(u8* _Input);
|
void CommandReadBufferSize(u8* _Input);
|
||||||
void CommandReadLocalVer(u8* _Input);
|
void CommandReadLocalVer(u8* _Input);
|
||||||
void CommandReadBDAdrr(u8* _Input);
|
void CommandReadBDAdrr(u8* _Input);
|
||||||
void CommandReadLocalFeatures(u8* _Input);
|
void CommandReadLocalFeatures(u8* _Input);
|
||||||
void CommandReadStoredLinkKey(u8* _Input);
|
void CommandReadStoredLinkKey(u8* _Input);
|
||||||
void CommandWriteUnitClass(u8* _Input);
|
void CommandWriteUnitClass(u8* _Input);
|
||||||
void CommandWriteLocalName(u8* _Input);
|
void CommandWriteLocalName(u8* _Input);
|
||||||
void CommandWritePinType(u8* _Input);
|
void CommandWritePinType(u8* _Input);
|
||||||
void CommandHostBufferSize(u8* _Input);
|
void CommandHostBufferSize(u8* _Input);
|
||||||
void CommandWritePageTimeOut(u8* _Input);
|
void CommandWritePageTimeOut(u8* _Input);
|
||||||
void CommandWriteScanEnable(u8* _Input);
|
void CommandWriteScanEnable(u8* _Input);
|
||||||
void CommandWriteInquiryMode(u8* _Input);
|
void CommandWriteInquiryMode(u8* _Input);
|
||||||
void CommandWritePageScanType(u8* _Input);
|
void CommandWritePageScanType(u8* _Input);
|
||||||
void CommandSetEventFilter(u8* _Input);
|
void CommandSetEventFilter(u8* _Input);
|
||||||
void CommandInquiry(u8* _Input);
|
void CommandInquiry(u8* _Input);
|
||||||
void CommandWriteInquiryScanType(u8* _Input);
|
void CommandWriteInquiryScanType(u8* _Input);
|
||||||
void CommandVendorSpecific_FC4C(u8* _Input, u32 _Size);
|
void CommandVendorSpecific_FC4C(u8* _Input, u32 _Size);
|
||||||
void CommandVendorSpecific_FC4F(u8* _Input, u32 _Size);
|
void CommandVendorSpecific_FC4F(u8* _Input, u32 _Size);
|
||||||
void CommandInquiryCancel(u8* _Input);
|
void CommandInquiryCancel(u8* _Input);
|
||||||
void CommandRemoteNameReq(u8* _Input);
|
void CommandRemoteNameReq(u8* _Input);
|
||||||
void CommandCreateCon(u8* _Input);
|
void CommandCreateCon(u8* _Input);
|
||||||
void CommandAcceptCon(u8* _Input);
|
void CommandAcceptCon(u8* _Input);
|
||||||
void CommandReadClockOffset(u8* _Input);
|
void CommandReadClockOffset(u8* _Input);
|
||||||
void CommandReadRemoteVerInfo(u8* _Input);
|
void CommandReadRemoteVerInfo(u8* _Input);
|
||||||
void CommandReadRemoteFeatures(u8* _Input);
|
void CommandReadRemoteFeatures(u8* _Input);
|
||||||
|
void CommandWriteLinkPolicy(u8* _Input);
|
||||||
|
|
||||||
void SendToDevice(u16 _ConnectionHandle, u8* _pData, u32 _Size);
|
void SendToDevice(u16 _ConnectionHandle, u8* _pData, u32 _Size);
|
||||||
|
|
||||||
enum EState
|
enum EState
|
||||||
{
|
{
|
||||||
STATE_NONE,
|
STATE_NONE,
|
||||||
STATE_INQUIRY_RESPONSE,
|
STATE_INQUIRY_RESPONSE,
|
||||||
STATE_INQUIRY_COMPLETE,
|
STATE_INQUIRY_COMPLETE,
|
||||||
STATE_START_REMOTE_NAME_REQ,
|
STATE_START_REMOTE_NAME_REQ,
|
||||||
STATE_REMOTE_NAME_REQ,
|
STATE_REMOTE_NAME_REQ,
|
||||||
STATE_CONNECTION_COMPLETE_EVENT,
|
STATE_CONNECTION_COMPLETE_EVENT,
|
||||||
STATE_READ_CLOCK_OFFSET,
|
STATE_READ_CLOCK_OFFSET,
|
||||||
STATE_READ_REMOTE_VER_INFO,
|
STATE_READ_REMOTE_VER_INFO,
|
||||||
STATE_READ_REMOTE_FEATURES
|
STATE_READ_REMOTE_FEATURES
|
||||||
};
|
};
|
||||||
|
|
||||||
EState m_State;
|
EState m_State;
|
||||||
bdaddr_t m_StateTempBD;
|
bdaddr_t m_StateTempBD;
|
||||||
u16 m_StateTempConnectionHandle;
|
u16 m_StateTempConnectionHandle;
|
||||||
|
|
||||||
bdaddr_t m_ControllerBD;
|
enum EDelayedEvent
|
||||||
u8 m_ClassOfDevice[HCI_CLASS_SIZE];
|
{
|
||||||
char m_LocalName[HCI_UNIT_NAME_SIZE];
|
EVENT_NONE,
|
||||||
u8 m_PINType;
|
EVENT_REQUEST_CONNECTION,
|
||||||
u8 filter_type;
|
EVENT_CONNECTION_COMPLETE
|
||||||
u8 filter_condition_type;
|
};
|
||||||
u8 scan_enable;
|
|
||||||
|
|
||||||
u16 Host_max_acl_size; /* Max. size of ACL packet (bytes) */
|
EDelayedEvent m_DelayedEvent;
|
||||||
u8 Host_max_sco_size; /* Max. size of SCO packet (bytes) */
|
|
||||||
u16 Host_num_acl_pkts; /* Max. number of ACL packets */
|
void SetDelayedEvent(EDelayedEvent e);
|
||||||
u16 Host_num_sco_pkts; /* Max. number of SCO packets */
|
|
||||||
|
bdaddr_t m_ControllerBD;
|
||||||
|
u8 m_ClassOfDevice[HCI_CLASS_SIZE];
|
||||||
|
char m_LocalName[HCI_UNIT_NAME_SIZE];
|
||||||
|
u8 m_PINType;
|
||||||
|
u8 filter_type;
|
||||||
|
u8 filter_condition_type;
|
||||||
|
u8 scan_enable;
|
||||||
|
|
||||||
|
u16 Host_max_acl_size; /* Max. size of ACL packet (bytes) */
|
||||||
|
u8 Host_max_sco_size; /* Max. size of SCO packet (bytes) */
|
||||||
|
u16 Host_num_acl_pkts; /* Max. number of ACL packets */
|
||||||
|
u16 Host_num_sco_pkts; /* Max. number of SCO packets */
|
||||||
|
|
||||||
|
|
||||||
std::vector<CWII_IPC_HLE_WiiMote> m_WiiMotes;
|
std::vector<CWII_IPC_HLE_WiiMote> m_WiiMotes;
|
||||||
|
|
Loading…
Reference in New Issue