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:
masken 2008-09-03 06:50:38 +00:00
parent 53cdd29228
commit f96d19a1fb
3 changed files with 140 additions and 92 deletions

Binary file not shown.

View File

@ -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++)

View File

@ -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;