diff options
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Common/Src/Log.h | 5 | ||||
| -rw-r--r-- | Source/Core/Common/Src/LogManager.cpp | 1 | ||||
| -rw-r--r-- | Source/Core/Core/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | Source/Core/Core/Core.vcxproj | 14 | ||||
| -rw-r--r-- | Source/Core/Core/Core.vcxproj.filters | 11 | ||||
| -rw-r--r-- | Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp | 35 | ||||
| -rw-r--r-- | Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp | 612 | ||||
| -rw-r--r-- | Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h | 154 | ||||
| -rw-r--r-- | Source/VSProps/Dolphin.Win32.props | 4 | ||||
| -rw-r--r-- | Source/VSProps/Dolphin.x64.props | 4 |
10 files changed, 829 insertions, 22 deletions
diff --git a/Source/Core/Common/Src/Log.h b/Source/Core/Common/Src/Log.h index 766887d5aa..df208b31db 100644 --- a/Source/Core/Common/Src/Log.h +++ b/Source/Core/Common/Src/Log.h @@ -65,6 +65,7 @@ enum LOG_TYPE { WII_IPC_DVD, WII_IPC_ES, WII_IPC_FILEIO, + WII_IPC_HID, WII_IPC_HLE, WII_IPC_NET, WII_IPC_WC24, @@ -100,10 +101,10 @@ void GenericLog(LOGTYPES_LEVELS level, LOGTYPES_TYPE type, ; #if defined LOGGING || defined _DEBUG || defined DEBUGFAST -#define MAX_LOGLEVEL DEBUG_LEVEL +#define MAX_LOGLEVEL WARNING_LEVEL #else #ifndef MAX_LOGLEVEL - #define MAX_LOGLEVEL DEBUG_LEVEL +#define MAX_LOGLEVEL DEBUG_LEVEL #endif // loglevel #endif // logging diff --git a/Source/Core/Common/Src/LogManager.cpp b/Source/Core/Common/Src/LogManager.cpp index 8c73910895..26db5cbfc1 100644 --- a/Source/Core/Common/Src/LogManager.cpp +++ b/Source/Core/Common/Src/LogManager.cpp @@ -72,6 +72,7 @@ LogManager::LogManager() m_Log[LogTypes::WIIMOTE] = new LogContainer("Wiimote", "Wiimote"); m_Log[LogTypes::WII_IOB] = new LogContainer("WII_IOB", "WII IO Bridge"); m_Log[LogTypes::WII_IPC] = new LogContainer("WII_IPC", "WII IPC"); + m_Log[LogTypes::WII_IPC_HID] = new LogContainer("WII_IPC_HID", "WII IPC HID"); m_Log[LogTypes::WII_IPC_HLE] = new LogContainer("WII_IPC_HLE", "WII IPC HLE"); m_Log[LogTypes::WII_IPC_DVD] = new LogContainer("WII_IPC_DVD", "WII IPC DVD"); m_Log[LogTypes::WII_IPC_ES] = new LogContainer("WII_IPC_ES", "WII IPC ES"); diff --git a/Source/Core/Core/CMakeLists.txt b/Source/Core/Core/CMakeLists.txt index 2b16579ac5..ca304c18af 100644 --- a/Source/Core/Core/CMakeLists.txt +++ b/Source/Core/Core/CMakeLists.txt @@ -70,8 +70,8 @@ set(SRCS Src/ActionReplay.cpp Src/HW/CPU.cpp Src/HW/DSP.cpp Src/HW/DSPHLE/UCodes/UCode_AX.cpp - Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp - Src/HW/DSPHLE/UCodes/UCode_NewAXWii.cpp + Src/HW/DSPHLE/UCodes/UCode_AXWii.cpp + Src/HW/DSPHLE/UCodes/UCode_NewAXWii.cpp Src/HW/DSPHLE/UCodes/UCode_CARD.cpp Src/HW/DSPHLE/UCodes/UCode_InitAudioSystem.cpp Src/HW/DSPHLE/UCodes/UCode_ROM.cpp @@ -201,6 +201,13 @@ if(NOT USE_GLES) set(LIBS ${LIBS} videoogl) endif() + +if(LIBUSB_FOUND) + # Using shared LibUSB + set(LIBS ${LIBS} ${LIBUSB_LIBRARIES}) + set(SRCS ${SRCS} Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp) +endif(LIBUSB_FOUND) + if(WIN32) set(SRCS ${SRCS} Src/HW/BBA-TAP/TAP_Win32.cpp Src/stdafx.cpp Src/HW/WiimoteReal/IOWin.cpp) diff --git a/Source/Core/Core/Core.vcxproj b/Source/Core/Core/Core.vcxproj index e539cfaa68..7c50276e87 100644 --- a/Source/Core/Core/Core.vcxproj +++ b/Source/Core/Core/Core.vcxproj @@ -115,7 +115,7 @@ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|x64'" /> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -127,7 +127,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -139,7 +139,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -153,7 +153,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|Win32'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -167,7 +167,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -181,7 +181,7 @@ </ItemDefinitionGroup> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugFast|x64'"> <ClCompile> - <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <AdditionalIncludeDirectories>.\Src;..\Common\Src;..\VideoCommon\Src;..\AudioCommon\Src;..\DiscIO\Src;..\InputCommon\Src;..\wiiuse\Src;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\SFML\include;..\..\..\Externals\LZO;..\..\..\Externals\portaudio\include;..\..\..\Externals\zlib;..\..\..\Externals\openssl;..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> </ClCompile> <Link> <GenerateDebugInformation>true</GenerateDebugInformation> @@ -328,6 +328,7 @@ <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_es.cpp" /> <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_FileIO.cpp" /> <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_fs.cpp" /> + <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_hid.cpp" /> <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_net.cpp" /> <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_net_ssl.cpp" /> <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_sdio_slot0.cpp" /> @@ -538,6 +539,7 @@ <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_es.h" /> <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_FileIO.h" /> <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_fs.h" /> + <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_hid.h" /> <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_net.h" /> <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_sdio_slot0.h" /> <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_net_ssl.h" /> diff --git a/Source/Core/Core/Core.vcxproj.filters b/Source/Core/Core/Core.vcxproj.filters index c315f46904..ad7ff5a17d 100644 --- a/Source/Core/Core/Core.vcxproj.filters +++ b/Source/Core/Core/Core.vcxproj.filters @@ -566,7 +566,10 @@ <Filter>HW %28Flipper/Hollywood%29\GCMemcard</Filter> </ClCompile> <ClCompile Include="Src\IPC_HLE\ICMPWin.cpp"> - <Filter>IPC HLE %28IOS/Starlet%29\Net</Filter> + <Filter>IPC HLE %28IOS/Starlet%29\Net</Filter> + </ClCompile> + <ClCompile Include="Src\IPC_HLE\WII_IPC_HLE_Device_hid.cpp"> + <Filter>IPC HLE %28IOS/Starlet%29\USB</Filter> </ClCompile> </ItemGroup> <ItemGroup> @@ -1063,6 +1066,9 @@ <ClInclude Include="Src\IPC_HLE\ICMP.h"> <Filter>IPC HLE %28IOS/Starlet%29\Net</Filter> </ClInclude> + <ClInclude Include="Src\IPC_HLE\WII_IPC_HLE_Device_hid.h"> + <Filter>IPC HLE %28IOS/Starlet%29\USB</Filter> + </ClInclude> </ItemGroup> <ItemGroup> <None Include="CMakeLists.txt" /> @@ -1203,5 +1209,8 @@ <Filter Include="HW %28Flipper/Hollywood%29\GCMemcard"> <UniqueIdentifier>{3e9e6e83-c1bf-45f9-aeff-231f98f60d29}</UniqueIdentifier> </Filter> + <Filter Include="IPC HLE %28IOS/Starlet%29\USB"> + <UniqueIdentifier>{321a9af5-9b3d-4620-888c-fe9d02e9559e}</UniqueIdentifier> + </Filter> </ItemGroup> </Project> diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp index e85797b8f8..076404ce18 100644 --- a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE.cpp @@ -52,6 +52,10 @@ They will also generate a true or false return for UpdateInterrupts() in WII_IPC #include "WII_IPC_HLE_Device_usb_kbd.h" #include "WII_IPC_HLE_Device_sdio_slot0.h" +#if defined(__LIBUSB__) || defined (_WIN32) + #include "WII_IPC_HLE_Device_hid.h" +#endif + #include "FileUtil.h" // For Copy #include "../ConfigManager.h" #include "../HW/CPU.h" @@ -80,6 +84,7 @@ IWII_IPC_HLE_Device* es_handles[ES_MAX_COUNT]; typedef std::deque<u32> ipc_msg_queue; static ipc_msg_queue request_queue; // ppc -> arm static ipc_msg_queue reply_queue; // arm -> ppc +static std::mutex s_reply_queue; void Init() { @@ -116,7 +121,11 @@ void Init() g_DeviceMap[i] = new CWII_IPC_HLE_Device_usb_kbd(i, std::string("/dev/usb/kbd")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_sdio_slot0(i, std::string("/dev/sdio/slot0")); i++; g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/sdio/slot1")); i++; - g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/hid")); i++; + #if defined(__LIBUSB__) || defined(_WIN32) + g_DeviceMap[i] = new CWII_IPC_HLE_Device_hid(i, std::string("/dev/usb/hid")); i++; + #else + g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/hid")); i++; + #endif g_DeviceMap[i] = new CWII_IPC_HLE_Device_stub(i, std::string("/dev/usb/oh1")); i++; g_DeviceMap[i] = new IWII_IPC_HLE_Device(i, std::string("_Unimplemented_Device_")); i++; } @@ -154,7 +163,12 @@ void Reset(bool _bHard) g_DeviceMap.erase(g_DeviceMap.begin(), g_DeviceMap.end()); } request_queue.clear(); - reply_queue.clear(); + + // lock due to using reply_queue + { + std::lock_guard<std::mutex> lk(s_reply_queue); + reply_queue.clear(); + } } void Shutdown() @@ -236,6 +250,8 @@ IWII_IPC_HLE_Device* CreateFileIO(u32 _DeviceID, const std::string& _rDeviceName void DoState(PointerWrap &p) { + std::lock_guard<std::mutex> lk(s_reply_queue); + p.Do(request_queue); p.Do(reply_queue); @@ -531,6 +547,7 @@ void EnqRequest(u32 _Address) // Called when IOS module has some reply void EnqReply(u32 _Address) { + std::lock_guard<std::mutex> lk(s_reply_queue); reply_queue.push_back(_Address); } @@ -555,12 +572,16 @@ void Update() Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_HLE, LogTypes::LDEBUG); #endif } - - if (reply_queue.size()) + + // lock due to using reply_queue { - WII_IPCInterface::GenerateReply(reply_queue.front()); - INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); - reply_queue.pop_front(); + std::lock_guard<std::mutex> lk(s_reply_queue); + if (reply_queue.size()) + { + WII_IPCInterface::GenerateReply(reply_queue.front()); + INFO_LOG(WII_IPC_HLE, "<<-- Reply to IPC Request @ 0x%08x", reply_queue.front()); + reply_queue.pop_front(); + } } } diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp new file mode 100644 index 0000000000..2996cdf563 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.cpp @@ -0,0 +1,612 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#include "../Core.h" +#include "../Debugger/Debugger_SymbolMap.h" +#include "../HW/WII_IPC.h" +#include "WII_IPC_HLE.h" +#include "WII_IPC_HLE_Device_hid.h" +#include "errno.h" + +#if defined(_MSC_VER) || defined(__MINGW32__) +# include <time.h> +#ifndef _TIMEVAL_DEFINED /* also in winsock[2].h */ +#define _TIMEVAL_DEFINED +struct timeval { + long tv_sec; + long tv_usec; +}; +#endif /* _TIMEVAL_DEFINED */ +#else +# include <sys/time.h> +#endif + +#define MAX_DEVICE_DEVNUM 256 +static u64 hidDeviceAliases[MAX_DEVICE_DEVNUM]; + +// Regular thread +void CWII_IPC_HLE_Device_hid::checkUsbUpdates(CWII_IPC_HLE_Device_hid* hid) +{ + timeval tv; + tv.tv_sec = 0; + tv.tv_usec = 500; + while (hid->usb_thread_running) + { + + static u16 timeToFill = 0; + if (timeToFill == 0) + { + if (hid->deviceCommandAddress != 0){ + hid->FillOutDevices(Memory::Read_U32(hid->deviceCommandAddress + 0x18), Memory::Read_U32(hid->deviceCommandAddress + 0x1C)); + + Memory::Write_U32(8, hid->deviceCommandAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(/*COMMAND_IOCTL*/ 6, hid->deviceCommandAddress + 8); + + // Return value + Memory::Write_U32(0, hid->deviceCommandAddress + 4); + + WII_IPC_HLE_Interface::EnqReply(hid->deviceCommandAddress); + hid->deviceCommandAddress = 0; + } + } + timeToFill+=8; + libusb_handle_events_timeout(NULL, &tv); + } + + return; +} + +void CWII_IPC_HLE_Device_hid::handleUsbUpdates(struct libusb_transfer *transfer) +{ + int ret = HIDERR_NO_DEVICE_FOUND; + u32 replyAddress = (u32)(size_t)transfer->user_data; + if (transfer->status == LIBUSB_TRANSFER_COMPLETED) + { + ret = transfer->length; + } + + Memory::Write_U32(8, replyAddress); + // IOS seems to write back the command that was responded to + Memory::Write_U32(/*COMMAND_IOCTL*/ 6, replyAddress + 8); + + // Return value + Memory::Write_U32(ret, replyAddress + 4); + + WII_IPC_HLE_Interface::EnqReply(replyAddress); + //DEBUG_LOG(WII_IPC_HID, "OMG OMG OMG I GOT A CALLBACK, IMMA BE FAMOUS %d %d %d", transfer->actual_length, transfer->length, transfer->status); +} + + +CWII_IPC_HLE_Device_hid::CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName) + : IWII_IPC_HLE_Device(_DeviceID, _rDeviceName) +{ + deviceCommandAddress = 0; + memset(hidDeviceAliases, 0, sizeof(hidDeviceAliases)); + libusb_init(NULL); + + usb_thread_running = true; + usb_thread = std::thread(checkUsbUpdates, this); +} + +CWII_IPC_HLE_Device_hid::~CWII_IPC_HLE_Device_hid() +{ + usb_thread_running = false; + usb_thread.join(); + + for ( std::map<u32,libusb_device_handle*>::const_iterator iter = open_devices.begin(); iter != open_devices.end(); ++iter ) + { + libusb_close(iter->second); + } + open_devices.clear(); + + + libusb_exit(NULL); +} + +bool CWII_IPC_HLE_Device_hid::Open(u32 _CommandAddress, u32 _Mode) +{ + DEBUG_LOG(WII_IPC_HID, "HID::Open"); + m_Active = true; + Memory::Write_U32(GetDeviceID(), _CommandAddress + 4); + return true; +} + +bool CWII_IPC_HLE_Device_hid::Close(u32 _CommandAddress, bool _bForce) +{ + DEBUG_LOG(WII_IPC_HID, "HID::Close"); + m_Active = false; + if (!_bForce) + Memory::Write_U32(0, _CommandAddress + 4); + return true; +} + +u32 CWII_IPC_HLE_Device_hid::Update() +{ + + u32 work_done = 0; + return work_done; +} + +bool CWII_IPC_HLE_Device_hid::IOCtl(u32 _CommandAddress) +{ + u32 Parameter = Memory::Read_U32(_CommandAddress + 0xC); + u32 BufferIn = Memory::Read_U32(_CommandAddress + 0x10); + u32 BufferInSize = Memory::Read_U32(_CommandAddress + 0x14); + u32 BufferOut = Memory::Read_U32(_CommandAddress + 0x18); + u32 BufferOutSize = Memory::Read_U32(_CommandAddress + 0x1C); + + u32 ReturnValue = 0; + switch (Parameter) + { + case IOCTL_HID_GET_ATTACHED: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Get Attached) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + deviceCommandAddress = _CommandAddress; + return false; + break; + } + case IOCTL_HID_OPEN: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Open) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + + //hid version, apparently + ReturnValue = 0x40001; + break; + } + case IOCTL_HID_SET_SUSPEND: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Set Suspend) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + // not actually implemented in IOS + ReturnValue = 0; + break; + } + case IOCTL_HID_CANCEL_INTERRUPT: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Cancel Interrupt) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + BufferIn, BufferInSize, BufferOut, BufferOutSize); + ReturnValue = 0; + break; + } + case IOCTL_HID_CONTROL: + { + /* + ERROR CODES: + -4 Cant find device specified + */ + + u32 dev_num = Memory::Read_U32(BufferIn+0x10); + u8 bmRequestType = Memory::Read_U8(BufferIn+0x14); + u8 bRequest = Memory::Read_U8(BufferIn+0x15); + u16 wValue = Memory::Read_U16(BufferIn+0x16); + u16 wIndex = Memory::Read_U16(BufferIn+0x18); + u16 wLength = Memory::Read_U16(BufferIn+0x1A); + u32 data = Memory::Read_U32(BufferIn+0x1C); + + ReturnValue = HIDERR_NO_DEVICE_FOUND; + + libusb_device_handle * dev_handle = GetDeviceByDevNum(dev_num); + + if (dev_handle == NULL) + { + DEBUG_LOG(WII_IPC_HID, "Could not find handle: %X", dev_num); + break; + } + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + transfer->flags |= LIBUSB_TRANSFER_FREE_BUFFER | LIBUSB_TRANSFER_FREE_TRANSFER; + + u8 * buffer = (u8*)malloc(wLength + LIBUSB_CONTROL_SETUP_SIZE); + libusb_fill_control_setup(buffer, bmRequestType, bRequest, wValue, wIndex, wLength); + memcpy(buffer + LIBUSB_CONTROL_SETUP_SIZE, Memory::GetPointer(data), wLength); + libusb_fill_control_transfer(transfer, dev_handle, buffer, handleUsbUpdates, (void*)(size_t)_CommandAddress, /* no timeout */ 0); + libusb_submit_transfer(transfer); + + //DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Control)(%02X, %02X) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + // bmRequestType, bRequest, BufferIn, BufferInSize, BufferOut, BufferOutSize); + + // It's the async way! + return false; + break; + } + case IOCTL_HID_INTERRUPT_OUT: + case IOCTL_HID_INTERRUPT_IN: + { + u32 dev_num = Memory::Read_U32(BufferIn+0x10); + u32 endpoint = Memory::Read_U32(BufferIn+0x14); + u32 length = Memory::Read_U32(BufferIn+0x18); + + u32 data = Memory::Read_U32(BufferIn+0x1C); + + ReturnValue = HIDERR_NO_DEVICE_FOUND; + + libusb_device_handle * dev_handle = GetDeviceByDevNum(dev_num); + + if (dev_handle == NULL) + { + DEBUG_LOG(WII_IPC_HID, "Could not find handle: %X", dev_num); + break; + } + + struct libusb_transfer *transfer = libusb_alloc_transfer(0); + transfer->flags |= LIBUSB_TRANSFER_FREE_TRANSFER; + libusb_fill_interrupt_transfer(transfer, dev_handle, endpoint, Memory::GetPointer(data), length, + handleUsbUpdates, (void*)(size_t)_CommandAddress, 0); + libusb_submit_transfer(transfer); + + //DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(Interrupt %s)(%d,%d,%X) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + // Parameter == IOCTL_HID_INTERRUPT_IN ? "In" : "Out", endpoint, length, data, BufferIn, BufferInSize, BufferOut, BufferOutSize); + + // It's the async way! + return false; + break; + } + default: + { + DEBUG_LOG(WII_IPC_HID, "HID::IOCtl(0x%x) (BufferIn: (%08x, %i), BufferOut: (%08x, %i)", + Parameter, BufferIn, BufferInSize, BufferOut, BufferOutSize); + break; + } + } + + Memory::Write_U32(ReturnValue, _CommandAddress + 4); + + return true; +} + + +bool CWII_IPC_HLE_Device_hid::ClaimDevice(libusb_device_handle * dev) +{ + int ret = 0; + if ((ret = libusb_kernel_driver_active(dev, 0)) == 1) + { + if ((ret = libusb_detach_kernel_driver(dev, 0)) && ret != LIBUSB_ERROR_NOT_SUPPORTED) + { + DEBUG_LOG(WII_IPC_HID, "libusb_detach_kernel_driver failed with error: %d", ret); + return false; + } + } + else if (ret != 0 && ret != LIBUSB_ERROR_NOT_SUPPORTED) + { + DEBUG_LOG(WII_IPC_HID, "libusb_kernel_driver_active error ret = %d", ret); + return false; + } + + if ((ret = libusb_claim_interface(dev, 0))) + { + DEBUG_LOG(WII_IPC_HID, "libusb_claim_interface failed with error: %d", ret); + return false; + } + + return true; +} + +bool CWII_IPC_HLE_Device_hid::IOCtlV(u32 _CommandAddress) +{ + + Dolphin_Debugger::PrintCallstack(LogTypes::WII_IPC_HID, LogTypes::LWARNING); + u32 ReturnValue = 0; + SIOCtlVBuffer CommandBuffer(_CommandAddress); + + DEBUG_LOG(WII_IPC_HID, "%s - IOCtlV:", GetDeviceName().c_str()); + DEBUG_LOG(WII_IPC_HID, " Parameter: 0x%x", CommandBuffer.Parameter); + DEBUG_LOG(WII_IPC_HID, " NumberIn: 0x%08x", CommandBuffer.NumberInBuffer); + DEBUG_LOG(WII_IPC_HID, " NumberOut: 0x%08x", CommandBuffer.NumberPayloadBuffer); + DEBUG_LOG(WII_IPC_HID, " BufferVector: 0x%08x", CommandBuffer.BufferVector); + DEBUG_LOG(WII_IPC_HID, " PayloadAddr: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Address); + DEBUG_LOG(WII_IPC_HID, " PayloadSize: 0x%08x", CommandBuffer.PayloadBuffer[0].m_Size); + #if defined(_DEBUG) || defined(DEBUGFAST) + DumpAsync(CommandBuffer.BufferVector, CommandBuffer.NumberInBuffer, CommandBuffer.NumberPayloadBuffer); + #endif + + Memory::Write_U32(ReturnValue, _CommandAddress + 4); + return true; +} + + + +void CWII_IPC_HLE_Device_hid::ConvertDeviceToWii(WiiHIDDeviceDescriptor *dest, const struct libusb_device_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDDeviceDescriptor)); + dest->bcdUSB = Common::swap16(dest->bcdUSB); + dest->idVendor = Common::swap16(dest->idVendor); + dest->idProduct = Common::swap16(dest->idProduct); + dest->bcdDevice = Common::swap16(dest->bcdDevice); +} + +void CWII_IPC_HLE_Device_hid::ConvertConfigToWii(WiiHIDConfigDescriptor *dest, const struct libusb_config_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDConfigDescriptor)); + dest->wTotalLength = Common::swap16(dest->wTotalLength); +} + +void CWII_IPC_HLE_Device_hid::ConvertInterfaceToWii(WiiHIDInterfaceDescriptor *dest, const struct libusb_interface_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDInterfaceDescriptor)); +} + +void CWII_IPC_HLE_Device_hid::ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, const struct libusb_endpoint_descriptor *src) +{ + memcpy(dest,src,sizeof(WiiHIDEndpointDescriptor)); + dest->wMaxPacketSize = Common::swap16(dest->wMaxPacketSize); +} + +void CWII_IPC_HLE_Device_hid::FillOutDevices(u32 BufferOut, u32 BufferOutSize) +{ + static u16 check = 1; + int OffsetBuffer = BufferOut; + int OffsetStart = 0; + //int OffsetDevice = 0; + int d,c,ic,i,e; /* config, interface container, interface, endpoint */ + + libusb_device **list; + //libusb_device *found = NULL; + ssize_t cnt = libusb_get_device_list(NULL, &list); + DEBUG_LOG(WII_IPC_HID, "Found %ld viable USB devices.", cnt); + for (d = 0; d < cnt; d++) + { + libusb_device *device = list[d]; + struct libusb_device_descriptor desc; + int dRet = libusb_get_device_descriptor (device, &desc); + if (dRet) + { + // could not aquire the descriptor, no point in trying to use it. + DEBUG_LOG(WII_IPC_HID, "libusb_get_device_descriptor failed with error: %d", dRet); + continue; + } + OffsetStart = OffsetBuffer; + OffsetBuffer += 4; // skip length for now, fill at end + + OffsetBuffer += 4; // skip devNum for now + + WiiHIDDeviceDescriptor wii_device; + ConvertDeviceToWii(&wii_device, &desc); + Memory::WriteBigEData((const u8*)&wii_device, OffsetBuffer, Align(wii_device.bLength, 4)); + OffsetBuffer += Align(wii_device.bLength, 4); + bool deviceValid = true; + + for (c = 0; deviceValid && c < desc.bNumConfigurations; c++) + { + struct libusb_config_descriptor *config = NULL; + int cRet = libusb_get_config_descriptor(device, c, &config); + + // do not try to use usb devices with more than one interface, games can crash + if(cRet == 0 && config->bNumInterfaces <= MAX_HID_INTERFACES) + { + WiiHIDConfigDescriptor wii_config; + ConvertConfigToWii(&wii_config, config); + Memory::WriteBigEData((const u8*)&wii_config, OffsetBuffer, Align(wii_config.bLength, 4)); + OffsetBuffer += Align(wii_config.bLength, 4); + + for (ic = 0; ic < config->bNumInterfaces; ic++) + { + const struct libusb_interface *interfaceContainer = &config->interface[ic]; + for (i = 0; i < interfaceContainer->num_altsetting; i++) + { + const struct libusb_interface_descriptor *interface = &interfaceContainer->altsetting[i]; + + WiiHIDInterfaceDescriptor wii_interface; + ConvertInterfaceToWii(&wii_interface, interface); + Memory::WriteBigEData((const u8*)&wii_interface, OffsetBuffer, Align(wii_interface.bLength, 4)); + OffsetBuffer += Align(wii_interface.bLength, 4); + + for (e = 0; e < interface->bNumEndpoints; e++) + { + const struct libusb_endpoint_descriptor *endpoint = &interface->endpoint[e]; + + WiiHIDEndpointDescriptor wii_endpoint; + ConvertEndpointToWii(&wii_endpoint, endpoint); + Memory::WriteBigEData((const u8*)&wii_endpoint, OffsetBuffer, Align(wii_endpoint.bLength, 4)); + OffsetBuffer += Align(wii_endpoint.bLength, 4); + + } //endpoints + } // interfaces + } // interface containters + libusb_free_config_descriptor(config); + config = NULL; + } + else + { + if(cRet) + DEBUG_LOG(WII_IPC_HID, "libusb_get_config_descriptor failed with: %d", cRet); + deviceValid = false; + OffsetBuffer = OffsetStart; + } + } // configs + + if (deviceValid) + { + Memory::Write_U32(OffsetBuffer-OffsetStart, OffsetStart); // fill in length + + int devNum = GetAvaiableDevNum(desc.idVendor, + desc.idProduct, + libusb_get_bus_number (device), + libusb_get_device_address (device), + check); + if (devNum < 0 ) + { + // too many devices to handle. + ERROR_LOG(WII_IPC_HID, "Exhausted device list, you have way too many usb devices plugged in." + "Or it might be our fault. Let us know at https://code.google.com/p/dolphin-emu/issues/entry?template=Defect%%20report"); + OffsetBuffer = OffsetStart; + continue; + } + + DEBUG_LOG(WII_IPC_HID, "Found device with Vendor: %X Product: %X Devnum: %d", desc.idVendor, desc.idProduct, devNum); + + Memory::Write_U32(devNum , OffsetStart+4); //write device num + } + } + + // Find devices that no longer exists and free them + for (i=0; i<MAX_DEVICE_DEVNUM; i++) + { + u16 check_cur = (u16)(hidDeviceAliases[i] >> 48); + if(hidDeviceAliases[i] != 0 && check_cur != check) + { + DEBUG_LOG(WII_IPC_HID, "Removing: device %d %hX %hX", i, check, check_cur); + std::lock_guard<std::mutex> lk(s_open_devices); + if (open_devices.find(i) != open_devices.end()) + { + libusb_device_handle *handle = open_devices[i]; + libusb_close(handle); + open_devices.erase(i); + } + hidDeviceAliases[i] = 0; + } + } + check++; + + + libusb_free_device_list(list, 1); + + Memory::Write_U32(0xFFFFFFFF, OffsetBuffer); // no more devices + +} + +int CWII_IPC_HLE_Device_hid::Align(int num, int alignment) +{ + return (num + (alignment-1)) & ~(alignment-1); +} + + +libusb_device_handle * CWII_IPC_HLE_Device_hid::GetDeviceByDevNum(u32 devNum) +{ + u32 i; + libusb_device **list; + libusb_device_handle *handle = NULL; + ssize_t cnt; + + if(devNum >= MAX_DEVICE_DEVNUM) + return NULL; + + + std::lock_guard<std::mutex> lk(s_open_devices); + + if (open_devices.find(devNum) != open_devices.end()) + { + handle = open_devices[devNum]; + if(libusb_kernel_driver_active(handle, 0) != LIBUSB_ERROR_NO_DEVICE) + { + return handle; + } + else + { + libusb_close(handle); + open_devices.erase(devNum); + } + } + + cnt = libusb_get_device_list(NULL, &list); + + if (cnt < 0) + return NULL; + + for (i = 0; i < cnt; i++) { + libusb_device *device = list[i]; + struct libusb_device_descriptor desc; + int dRet = libusb_get_device_descriptor (device, &desc); + u8 bus = libusb_get_bus_number (device); + u8 port = libusb_get_device_address (device); + u64 unique_id = ((u64)desc.idVendor << 32) | ((u64)desc.idProduct << 16) | ((u64)bus << 8) | (u64)port; + if ((hidDeviceAliases[devNum] & HID_ID_MASK) == unique_id) + { + int ret = libusb_open(device, &handle); + if (ret) + { + if (ret == LIBUSB_ERROR_ACCESS) + { + if( dRet ) + { + ERROR_LOG(WII_IPC_HID, "Dolphin does not have access to this device: Bus %03d Device %03d: ID ????:???? (couldn't get id).", + bus, + port + ); + } + else{ + ERROR_LOG(WII_IPC_HID, "Dolphin does not have access to this device: Bus %03d Device %03d: ID %04X:%04X.", + bus, + port, + desc.idVendor, + desc.idProduct + ); + } + } +#ifdef _WIN32 + else if (ret == LIBUSB_ERROR_NOT_SUPPORTED) + { + WARN_LOG(WII_IPC_HID, "Please install the libusb drivers for the device %04X:%04X", desc.idVendor, desc.idProduct); + } +#endif + else + { + ERROR_LOG(WII_IPC_HID, "libusb_open failed to open device with error = %d", ret); + } + continue; + } + + + if (!ClaimDevice(handle)) + { + ERROR_LOG(WII_IPC_HID, "Could not claim the device for handle: %X", devNum); + libusb_close(handle); + continue; + } + + open_devices[devNum] = handle; + break; + } + else + { + handle = NULL; + } + } + + libusb_free_device_list(list, 1); + + + return handle; +} + + +int CWII_IPC_HLE_Device_hid::GetAvaiableDevNum(u16 idVendor, u16 idProduct, u8 bus, u8 port, u16 check) +{ + int i; + int pos = -1; + u64 unique_id = ((u64)idVendor << 32) | ((u64)idProduct << 16) | ((u64)bus << 8) | (u64)port; + for (i=0; i<MAX_DEVICE_DEVNUM; i++) + { + u64 id = hidDeviceAliases[i] & HID_ID_MASK; + if(id == 0 && pos == -1) + { + pos = i; + } + else if (id == unique_id) + { + hidDeviceAliases[i] = id | ((u64)check << 48); + return i; + } + } + if(pos != -1) + { + hidDeviceAliases[pos] = unique_id | ((u64)check << 48); + return pos; + } + return -1; +} diff --git a/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h new file mode 100644 index 0000000000..3cf9d9add2 --- /dev/null +++ b/Source/Core/Core/Src/IPC_HLE/WII_IPC_HLE_Device_hid.h @@ -0,0 +1,154 @@ +// Copyright (C) 2003 Dolphin Project. + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 2.0. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License 2.0 for more details. + +// A copy of the GPL 2.0 should have been included with the program. +// If not, see http://www.gnu.org/licenses/ + +// Official SVN repository and contact information can be found at +// http://code.google.com/p/dolphin-emu/ + +#pragma once + +#include "WII_IPC_HLE.h" +#include "WII_IPC_HLE_Device.h" +#include "libusb.h" +#include "Thread.h" +#include <list> + +#define HID_ID_MASK 0x0000FFFFFFFFFFFF +#define MAX_HID_INTERFACES 1 + +#define HIDERR_NO_DEVICE_FOUND -4 + +/* Connection timed out */ + +class CWII_IPC_HLE_Device_hid : public IWII_IPC_HLE_Device +{ +public: + CWII_IPC_HLE_Device_hid(u32 _DeviceID, const std::string& _rDeviceName); + + virtual ~CWII_IPC_HLE_Device_hid(); + + virtual bool Open(u32 _CommandAddress, u32 _Mode); + virtual bool Close(u32 _CommandAddress, bool _bForce); + virtual u32 Update(); + + virtual bool IOCtlV(u32 _CommandAddress); + virtual bool IOCtl(u32 _CommandAddress); +private: + + + enum + { + IOCTL_HID_GET_ATTACHED = 0x00, + IOCTL_HID_SET_SUSPEND = 0x01, + IOCTL_HID_CONTROL = 0x02, + IOCTL_HID_INTERRUPT_IN = 0x03, + IOCTL_HID_INTERRUPT_OUT = 0x04, + IOCTL_HID_GET_US_STRING = 0x05, + IOCTL_HID_OPEN = 0x06, + IOCTL_HID_SHUTDOWN = 0x07, + IOCTL_HID_CANCEL_INTERRUPT = 0x08, + }; + + /* Device descriptor */ + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u16 bcdUSB; + u8 bDeviceClass; + u8 bDeviceSubClass; + u8 bDeviceProtocol; + u8 bMaxPacketSize0; + u16 idVendor; + u16 idProduct; + u16 bcdDevice; + u8 iManufacturer; + u8 iProduct; + u8 iSerialNumber; + u8 bNumConfigurations; + u8 pad[2]; + } WiiHIDDeviceDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u16 wTotalLength; + u8 bNumInterfaces; + u8 bConfigurationValue; + u8 iConfiguration; + u8 bmAttributes; + u8 MaxPower; + u8 pad[3]; + } WiiHIDConfigDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u8 bInterfaceNumber; + u8 bAlternateSetting; + u8 bNumEndpoints; + u8 bInterfaceClass; + u8 bInterfaceSubClass; + u8 bInterfaceProtocol; + u8 iInterface; + u8 pad[3]; + } WiiHIDInterfaceDescriptor; + + typedef struct + { + u8 bLength; + u8 bDescriptorType; + u8 bEndpointAddress; + u8 bmAttributes; + u16 wMaxPacketSize; + u8 bInterval; + u8 bRefresh; + u8 bSynchAddress; + u8 pad[1]; + } WiiHIDEndpointDescriptor; + + + u32 deviceCommandAddress; + void FillOutDevices(u32 BufferOut, u32 BufferOutSize); + int GetAvaiableDevNum(u16 idVendor, u16 idProduct, u8 bus, u8 port, u16 check); + + bool ClaimDevice(libusb_device_handle * dev); + + void ConvertDeviceToWii(WiiHIDDeviceDescriptor *dest, const struct libusb_device_descriptor *src); + void ConvertConfigToWii(WiiHIDConfigDescriptor *dest, const struct libusb_config_descriptor *src); + void ConvertInterfaceToWii(WiiHIDInterfaceDescriptor *dest, const struct libusb_interface_descriptor *src); + void ConvertEndpointToWii(WiiHIDEndpointDescriptor *dest, const struct libusb_endpoint_descriptor *src); + + int Align(int num, int alignment); + static void checkUsbUpdates(CWII_IPC_HLE_Device_hid* hid); + static void LIBUSB_CALL handleUsbUpdates(struct libusb_transfer *transfer); + + struct libusb_device_handle * GetDeviceByDevNum(u32 devNum); + std::map<u32,libusb_device_handle*> open_devices; + std::mutex s_open_devices; + std::map<std::string,int> device_identifiers; + + std::thread usb_thread; + bool usb_thread_running; + + typedef struct + { + u32 enq_address; + u32 type; + void * context; + } _hidevent; + + std::list<_hidevent> event_list; +}; diff --git a/Source/VSProps/Dolphin.Win32.props b/Source/VSProps/Dolphin.Win32.props index c3edb136b6..7ffd5a3037 100644 --- a/Source/VSProps/Dolphin.Win32.props +++ b/Source/VSProps/Dolphin.Win32.props @@ -7,8 +7,8 @@ </PropertyGroup> <ItemDefinitionGroup> <Link> - <AdditionalLibraryDirectories>..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName);..\..\..\Externals\openssl\$(PlatformName)</AdditionalLibraryDirectories> - <AdditionalDependencies>portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName);..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\$(PlatformName)</AdditionalLibraryDirectories> + <AdditionalDependencies>libusb-1.0.lib;portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew32s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup /> diff --git a/Source/VSProps/Dolphin.x64.props b/Source/VSProps/Dolphin.x64.props index b7ad7e5f09..e9591c4fdb 100644 --- a/Source/VSProps/Dolphin.x64.props +++ b/Source/VSProps/Dolphin.x64.props @@ -8,8 +8,8 @@ </PropertyGroup> <ItemDefinitionGroup> <Link> - <AdditionalLibraryDirectories>..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg64;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName);..\..\..\Externals\openssl\$(PlatformName)</AdditionalLibraryDirectories> - <AdditionalDependencies>portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies> + <AdditionalLibraryDirectories>..\..\..\Externals\SDL\$(PlatformName);..\..\..\Externals\GLew;..\..\..\Externals\Cg64;..\..\..\Externals\portaudio\$(PlatformName)\$(ConfigurationName);..\..\..\Externals\openssl\$(PlatformName);..\..\..\Externals\libusb\$(PlatformName)</AdditionalLibraryDirectories> + <AdditionalDependencies>libusb-1.0.lib;portaudio.lib;dsound.lib;dxerr.lib;iphlpapi.lib;winmm.lib;setupapi.lib;xinput.lib;vfw32.lib;cg.lib;cgGL.lib;opengl32.lib;glew64s.lib;glu32.lib;rpcrt4.lib;comctl32.lib;libeay32.lib;ssleay32.lib;%(AdditionalDependencies)</AdditionalDependencies> </Link> </ItemDefinitionGroup> <ItemGroup /> |
