From d117b438ae8bc798c57b601d43404432da2c761f Mon Sep 17 00:00:00 2001 From: ayuanx Date: Sat, 5 Dec 2009 20:01:48 +0000 Subject: [PATCH] 1) Added current core button status for all REPORT_IN, so now you can hold a tire and walk in "Mad World". 2) Commented out "SendEventNumberOfCompletedPackets()", I intend to have wider tests on this, if **this revision** causes frequent wiimote de-sync, please report. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4647 8ced0084-cf51-0410-be5f-012b33b47a6e --- .../Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp | 5 +- Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp | 31 +-- .../Plugin_Wiimote/Src/EmuSubroutines.cpp | 14 +- .../Plugins/Plugin_Wiimote/Src/wiimote_hid.h | 178 +++++++++--------- 4 files changed, 108 insertions(+), 120 deletions(-) diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp index c70ca6f5aa..475fb330db 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_usb.cpp @@ -468,11 +468,13 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() } } +// This seems not necessary at all or at least not helping to avoid de-sync at all??? +/* // AyuanX: This event should be sent periodically after ACL connection is accepted // or CPU will disconnect WiiMote automatically // but don't send too many or it will jam the bus and cost extra CPU time // - if (m_HCIBuffer.m_address && m_WiiMotes[0].IsConnected()) + if (m_HCIBuffer.m_address && !WII_IPCInterface::GetAddress() && m_WiiMotes[0].IsConnected()) { m_FreqDividerSync++; if ((m_PacketCount > 0) || (m_FreqDividerSync > 60)) // Feel free to tweak it @@ -483,6 +485,7 @@ u32 CWII_IPC_HLE_Device_usb_oh1_57e_305::Update() return true; } } +*/ // AyuanX: If we let this Wiimote_Update function running freely // it will exaust all the HLE time slots and block further CPU commands diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp index fea287002a..8e3a39963f 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuMain.cpp @@ -553,37 +553,14 @@ void InterruptChannel(u16 _channelID, const void* _pData, u32 _Size) wm_report* sr = (wm_report*)hidp->data; HidOutputReport(_channelID, sr); - /* This is the 0x22 answer to all Inputs. In most games it - didn't matter if it was written before or after - HidOutputReport(), but Wii Sports and Mario Galaxy would - stop working if it was placed before - HidOutputReport(). Zelda - TP is even more sensitive and - require a delay after the Input for the Nunchuck to - work. It seemed to be enough to delay only the Nunchuck - registry reads and writes but for now I'm delaying all - inputs. Both for status changes and Eeprom and registry - reads and writes. */ + /* This is the 0x22 answer to all Inputs.*/ // There are no 0x22 replys to these report from the real // wiimote from what I could see Report 0x10 that seems to // be only used for rumble, and we don't need to answer - // that, also if we do *we should update the 0x22 to have - // the core keys* otherwise the game will think we release - // the key every time it rumbles - - // AyuanX: Since I've rewritten the whole WII_IPC & WII_IPC_HLE & USB & BT - // finally we can get rid of this AckDelay issue, HAHA! - // - /* - const u8* data = (const u8*)_pData; - if(!(data[1] == WM_READ_DATA && data[2] == 0x00) - && !(data[1] == WM_REQUEST_STATUS) - && !(data[1] == WM_WRITE_SPEAKER_DATA) - && !(data[1] == WM_RUMBLE)) - if (!g_Config.bUseRealWiimote || !g_RealWiiMotePresent) - CreateAckDelay((u8)_channelID, (u16)sr->wm); - */ - + // that + + // The rumble report still needs more investigation } break; diff --git a/Source/Plugins/Plugin_Wiimote/Src/EmuSubroutines.cpp b/Source/Plugins/Plugin_Wiimote/Src/EmuSubroutines.cpp index 37d736fd31..38d64709c5 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/EmuSubroutines.cpp +++ b/Source/Plugins/Plugin_Wiimote/Src/EmuSubroutines.cpp @@ -55,6 +55,10 @@ namespace WiiMoteEmu 1. Wiimote_InterruptChannel > InterruptChannel > HidOutputReport 2. Wiimote_ControlChannel > ControlChannel > HidOutputReport + + The IR lights and speaker enable/disable and mute/unmute values are + 0x2 = Disable + 0x6 = Enable */ void HidOutputReport(u16 _channelID, wm_report* sr) { @@ -62,8 +66,8 @@ void HidOutputReport(u16 _channelID, wm_report* sr) switch(sr->wm) { - case 0x10: - // Unknown + case WM_RUMBLE: // 0x10 + // TODO: Implement rumble break; case WM_LEDS: // 0x11 @@ -104,6 +108,7 @@ void HidOutputReport(u16 _channelID, wm_report* sr) break; case WM_WRITE_SPEAKER_DATA: // 0x18 + // TODO: Does this need an ack? break; case WM_SPEAKER_MUTE: // 0x19 @@ -170,7 +175,7 @@ void WmSendAck(u16 _channelID, u8 _reportID) u32 Offset = WriteWmReportHdr(DataFrame, WM_ACK_DATA); wm_acknowledge* pData = (wm_acknowledge*)(DataFrame + Offset); - pData->buttons = 0; + FillReportInfo(pData->buttons); pData->reportID = _reportID; pData->errorID = 0; Offset += sizeof(wm_acknowledge); @@ -311,7 +316,7 @@ void SendReadDataReply(u16 _channelID, void* _Base, u16 _Address, int _Size) wm_read_data_reply* pReply = (wm_read_data_reply*)(DataFrame + Offset); Offset += sizeof(wm_read_data_reply); - pReply->buttons = 0; + FillReportInfo(pReply->buttons); pReply->error = 0; // 0x1 means two bytes, 0xf means 16 bytes pReply->size = copySize - 1; @@ -465,6 +470,7 @@ void WmRequestStatus(u16 _channelID, wm_request_status* rs, int Extension) memset(pStatus, 0, sizeof(wm_status_report)); // fill the status report with zeroes // Status values + FillReportInfo(pStatus->buttons); pStatus->leds = g_Leds; // leds are 4 bit pStatus->ir = g_IR; // 1 bit pStatus->speaker = g_Speaker; // 1 bit diff --git a/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h b/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h index 073a2ead6c..8374e889a3 100644 --- a/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h +++ b/Source/Plugins/Plugin_Wiimote/Src/wiimote_hid.h @@ -44,93 +44,6 @@ struct hid_packet { //source: http://wiibrew.org/wiki/Wiimote -struct wm_report { - u8 wm; - u8 data[0]; -}; - -#define WM_LEDS 0x11 -struct wm_leds { - u8 rumble : 1; - u8 : 3; - u8 leds : 4; -}; - -#define WM_REPORT_MODE 0x12 -struct wm_report_mode { - u8 rumble : 1; - u8 continuous : 1; - u8 all_the_time : 1; - u8 : 5; - u8 mode; -}; - -#define WM_IR_PIXEL_CLOCK 0x13 -#define WM_IR_LOGIC 0x1A - -#define WM_REQUEST_STATUS 0x15 -struct wm_request_status { - u8 rumble : 1; - u8 : 7; -}; - -#define WM_STATUS_REPORT 0x20 -struct wm_status_report { - u8 padding1[2]; // two 00 - u8 battery_low : 1; - u8 extension : 1; - u8 speaker : 1; - u8 ir : 1; - u8 leds : 4; - u8 padding2[2]; // two 00 - u8 battery; -}; - -#define WM_WRITE_DATA 0x16 -struct wm_write_data -{ - u8 rumble : 1; - u8 space : 2; //see WM_SPACE_* - u8 : 5; - u8 address[3]; - u8 size; - u8 data[16]; -}; - -#define WM_ACK_DATA 0x22 -struct wm_acknowledge -{ - u16 buttons; - u8 reportID; - u8 errorID; -}; - -#define WM_READ_DATA 0x17 -struct wm_read_data { - u8 rumble : 1; - u8 space : 2; //see WM_SPACE_* - u8 : 5; - u8 address[3]; - u8 size[2]; -}; - -#define WM_SPACE_EEPROM 0 -#define WM_SPACE_REGS1 1 -#define WM_SPACE_REGS2 2 -#define WM_SPACE_INVALID 3 - -#define WM_READ_DATA_REPLY 0x21 -struct wm_read_data_reply { - u16 buttons; - u8 error : 4; //see WM_RDERR_* - u8 size : 4; - u16 address; - u8 data[16]; -}; - -#define WM_RDERR_WOREG 7 -#define WM_RDERR_NOMEM 8 - struct wm_core { u8 left : 1; u8 right : 1; @@ -254,7 +167,96 @@ struct wm_GH3_extension u8 Orange : 1; }; - + +struct wm_report { + u8 wm; + u8 data[0]; +}; + +#define WM_RUMBLE 0x10 + +#define WM_LEDS 0x11 +struct wm_leds { + u8 rumble : 1; + u8 : 3; + u8 leds : 4; +}; + +#define WM_REPORT_MODE 0x12 +struct wm_report_mode { + u8 rumble : 1; + u8 continuous : 1; + u8 all_the_time : 1; + u8 : 5; + u8 mode; +}; + +#define WM_IR_PIXEL_CLOCK 0x13 +#define WM_IR_LOGIC 0x1A + +#define WM_REQUEST_STATUS 0x15 +struct wm_request_status { + u8 rumble : 1; + u8 : 7; +}; + +#define WM_STATUS_REPORT 0x20 +struct wm_status_report { + wm_core buttons; + u8 battery_low : 1; + u8 extension : 1; + u8 speaker : 1; + u8 ir : 1; + u8 leds : 4; + u8 padding2[2]; // two 00, TODO: this needs more investigation + u8 battery; +}; + +#define WM_WRITE_DATA 0x16 +struct wm_write_data +{ + u8 rumble : 1; + u8 space : 2; //see WM_SPACE_* + u8 : 5; + u8 address[3]; + u8 size; + u8 data[16]; +}; + +#define WM_ACK_DATA 0x22 +struct wm_acknowledge +{ + wm_core buttons; + u8 reportID; + u8 errorID; +}; + +#define WM_READ_DATA 0x17 +struct wm_read_data { + u8 rumble : 1; + u8 space : 2; //see WM_SPACE_* + u8 : 5; + u8 address[3]; + u8 size[2]; +}; + +#define WM_SPACE_EEPROM 0 +#define WM_SPACE_REGS1 1 +#define WM_SPACE_REGS2 2 +#define WM_SPACE_INVALID 3 + +#define WM_READ_DATA_REPLY 0x21 +struct wm_read_data_reply { + wm_core buttons; + u8 error : 4; //see WM_RDERR_* + u8 size : 4; + u16 address; + u8 data[16]; +}; + +#define WM_RDERR_WOREG 7 +#define WM_RDERR_NOMEM 8 + // Data reports