mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #4408 from leoetlino/usb
IOS: USB support (OH0, USB_VEN, USB_HID)
This commit is contained in:
+2
-2
@@ -52,7 +52,7 @@
|
||||
<ClCompile Include="libusb\sync.c" />
|
||||
<ClCompile Include="libusb\os\threads_windows.c" />
|
||||
<ClCompile Include="libusb\os\windows_nt_common.c" />
|
||||
<ClCompile Include="libusb\os\windows_winusb.c" />
|
||||
<ClCompile Include="libusb\os\windows_usbdk.c" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="msvc\config.h" />
|
||||
@@ -65,7 +65,7 @@
|
||||
<ClInclude Include="libusb\version_nano.h" />
|
||||
<ClInclude Include="libusb\os\windows_common.h" />
|
||||
<ClInclude Include="libusb\os\windows_nt_common.h" />
|
||||
<ClInclude Include="libusb\os\windows_winusb.h" />
|
||||
<ClInclude Include="libusb\os\windows_usbdk.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
|
||||
+1
-1
@@ -159,4 +159,4 @@
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -34,6 +34,11 @@ set(SRCS Analytics.cpp
|
||||
Crypto/ec.cpp
|
||||
Logging/LogManager.cpp)
|
||||
|
||||
if(LIBUSB_FOUND)
|
||||
set(LIBS ${LIBS} ${LIBUSB_LIBRARIES})
|
||||
set(SRCS ${SRCS} LibusbContext.cpp)
|
||||
endif(LIBUSB_FOUND)
|
||||
|
||||
if(ANDROID)
|
||||
set(SRCS ${SRCS}
|
||||
Logging/ConsoleListenerDroid.cpp)
|
||||
|
||||
@@ -113,6 +113,7 @@
|
||||
<ClInclude Include="Hash.h" />
|
||||
<ClInclude Include="IniFile.h" />
|
||||
<ClInclude Include="JitRegister.h" />
|
||||
<ClInclude Include="LibusbContext.h" />
|
||||
<ClInclude Include="LinearDiskCache.h" />
|
||||
<ClInclude Include="MathUtil.h" />
|
||||
<ClInclude Include="MD5.h" />
|
||||
@@ -159,6 +160,9 @@
|
||||
<ClCompile Include="Hash.cpp" />
|
||||
<ClCompile Include="IniFile.cpp" />
|
||||
<ClCompile Include="JitRegister.cpp" />
|
||||
<ClCompile Include="LibusbContext.cpp">
|
||||
<DisableSpecificWarnings>4200;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Logging\ConsoleListenerWin.cpp" />
|
||||
<ClCompile Include="MathUtil.cpp" />
|
||||
<ClCompile Include="MD5.cpp" />
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
<ClInclude Include="FPURoundMode.h" />
|
||||
<ClInclude Include="Hash.h" />
|
||||
<ClInclude Include="IniFile.h" />
|
||||
<ClInclude Include="LibusbContext.h" />
|
||||
<ClInclude Include="LinearDiskCache.h" />
|
||||
<ClInclude Include="MathUtil.h" />
|
||||
<ClInclude Include="MemArena.h" />
|
||||
@@ -236,6 +237,7 @@
|
||||
<ClCompile Include="FileUtil.cpp" />
|
||||
<ClCompile Include="Hash.cpp" />
|
||||
<ClCompile Include="IniFile.cpp" />
|
||||
<ClCompile Include="LibusbContext.cpp" />
|
||||
<ClCompile Include="MathUtil.cpp" />
|
||||
<ClCompile Include="MemArena.cpp" />
|
||||
<ClCompile Include="MemoryUtil.cpp" />
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <libusb.h>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
#include "Common/LibusbContext.h"
|
||||
#include "Common/MsgHandler.h"
|
||||
|
||||
namespace LibusbContext
|
||||
{
|
||||
static std::shared_ptr<libusb_context> s_libusb_context;
|
||||
static std::once_flag s_context_initialized;
|
||||
|
||||
static libusb_context* Create()
|
||||
{
|
||||
libusb_context* context;
|
||||
const int ret = libusb_init(&context);
|
||||
if (ret < LIBUSB_SUCCESS)
|
||||
{
|
||||
bool is_windows = false;
|
||||
#ifdef _WIN32
|
||||
is_windows = true;
|
||||
#endif
|
||||
if (is_windows && ret == LIBUSB_ERROR_NOT_FOUND)
|
||||
PanicAlertT("Failed to initialize libusb because usbdk is not installed.");
|
||||
else
|
||||
PanicAlertT("Failed to initialize libusb: %s", libusb_error_name(ret));
|
||||
return nullptr;
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
std::shared_ptr<libusb_context> Get()
|
||||
{
|
||||
std::call_once(s_context_initialized, []() {
|
||||
s_libusb_context.reset(Create(), [](auto* context) {
|
||||
if (context != nullptr)
|
||||
libusb_exit(context);
|
||||
});
|
||||
});
|
||||
return s_libusb_context;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// Copyright 2017 Dolphin Emulator Project
|
||||
// Licensed under GPLv2+
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#include <memory>
|
||||
|
||||
struct libusb_context;
|
||||
|
||||
namespace LibusbContext
|
||||
{
|
||||
// libusb on Windows is limited to only a single context. Trying to open more
|
||||
// than one can cause issues with device enumerations.
|
||||
// libusb is thread-safe so this context can be safely used from different threads.
|
||||
std::shared_ptr<libusb_context> Get();
|
||||
}
|
||||
@@ -31,7 +31,6 @@ enum LOG_TYPE
|
||||
IOS_DI,
|
||||
IOS_ES,
|
||||
IOS_FILEIO,
|
||||
IOS_HID,
|
||||
IOS_NET,
|
||||
IOS_SD,
|
||||
IOS_SSL,
|
||||
|
||||
@@ -65,7 +65,6 @@ LogManager::LogManager()
|
||||
m_Log[LogTypes::IOS_DI] = new LogContainer("IOS_DI", "IOS - Drive Interface");
|
||||
m_Log[LogTypes::IOS_ES] = new LogContainer("IOS_ES", "IOS - ETicket Services");
|
||||
m_Log[LogTypes::IOS_FILEIO] = new LogContainer("IOS_FILEIO", "IOS - FileIO");
|
||||
m_Log[LogTypes::IOS_HID] = new LogContainer("IOS_HID", "IOS - USB_HID");
|
||||
m_Log[LogTypes::IOS_SD] = new LogContainer("IOS_SD", "IOS - SDIO");
|
||||
m_Log[LogTypes::IOS_SSL] = new LogContainer("IOS_SSL", "IOS - SSL");
|
||||
m_Log[LogTypes::IOS_STM] = new LogContainer("IOS_STM", "IOS - State Transition Manager");
|
||||
|
||||
@@ -154,9 +154,15 @@ set(SRCS ActionReplay.cpp
|
||||
IOS/SDIO/SDIOSlot0.cpp
|
||||
IOS/STM/STM.cpp
|
||||
IOS/USB/Common.cpp
|
||||
IOS/USB/Host.cpp
|
||||
IOS/USB/OH0/OH0.cpp
|
||||
IOS/USB/OH0/OH0Device.cpp
|
||||
IOS/USB/USB_HID/HIDv4.cpp
|
||||
IOS/USB/USB_VEN/VEN.cpp
|
||||
IOS/USB/USBV0.cpp
|
||||
IOS/USB/USBV4.cpp
|
||||
IOS/USB/USBV5.cpp
|
||||
IOS/USB/USB_KBD.cpp
|
||||
IOS/USB/USB_VEN.cpp
|
||||
IOS/USB/Bluetooth/BTBase.cpp
|
||||
IOS/USB/Bluetooth/BTEmu.cpp
|
||||
IOS/USB/Bluetooth/BTStub.cpp
|
||||
@@ -264,7 +270,7 @@ set(LIBS
|
||||
if(LIBUSB_FOUND)
|
||||
# Using shared LibUSB
|
||||
set(LIBS ${LIBS} ${LIBUSB_LIBRARIES})
|
||||
set(SRCS ${SRCS} IOS/USB/USB_HIDv4.cpp
|
||||
set(SRCS ${SRCS} IOS/USB/LibusbDevice.cpp
|
||||
IOS/USB/Bluetooth/BTReal.cpp)
|
||||
endif()
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ void SConfig::SaveSettings()
|
||||
SaveAnalyticsSettings(ini);
|
||||
SaveNetworkSettings(ini);
|
||||
SaveBluetoothPassthroughSettings(ini);
|
||||
SaveUSBPassthroughSettings(ini);
|
||||
SaveSysconfSettings(ini);
|
||||
|
||||
ini.Save(File::GetUserPath(F_DOLPHINCONFIG_IDX));
|
||||
@@ -343,6 +344,20 @@ void SConfig::SaveBluetoothPassthroughSettings(IniFile& ini)
|
||||
section->Set("LinkKeys", m_bt_passthrough_link_keys);
|
||||
}
|
||||
|
||||
void SConfig::SaveUSBPassthroughSettings(IniFile& ini)
|
||||
{
|
||||
IniFile::Section* section = ini.GetOrCreateSection("USBPassthrough");
|
||||
|
||||
std::ostringstream oss;
|
||||
for (const auto& device : m_usb_passthrough_devices)
|
||||
oss << StringFromFormat("%04x:%04x", device.first, device.second) << ',';
|
||||
std::string devices_string = oss.str();
|
||||
if (!devices_string.empty())
|
||||
devices_string.pop_back();
|
||||
|
||||
section->Set("Devices", devices_string);
|
||||
}
|
||||
|
||||
void SConfig::SaveSysconfSettings(IniFile& ini)
|
||||
{
|
||||
IniFile::Section* section = ini.GetOrCreateSection("Sysconf");
|
||||
@@ -400,6 +415,7 @@ void SConfig::LoadSettings()
|
||||
LoadNetworkSettings(ini);
|
||||
LoadAnalyticsSettings(ini);
|
||||
LoadBluetoothPassthroughSettings(ini);
|
||||
LoadUSBPassthroughSettings(ini);
|
||||
LoadSysconfSettings(ini);
|
||||
}
|
||||
|
||||
@@ -666,6 +682,27 @@ void SConfig::LoadBluetoothPassthroughSettings(IniFile& ini)
|
||||
section->Get("LinkKeys", &m_bt_passthrough_link_keys, "");
|
||||
}
|
||||
|
||||
void SConfig::LoadUSBPassthroughSettings(IniFile& ini)
|
||||
{
|
||||
IniFile::Section* section = ini.GetOrCreateSection("USBPassthrough");
|
||||
m_usb_passthrough_devices.clear();
|
||||
std::string devices_string;
|
||||
std::vector<std::string> pairs;
|
||||
section->Get("Devices", &devices_string, "");
|
||||
SplitString(devices_string, ',', pairs);
|
||||
for (const auto& pair : pairs)
|
||||
{
|
||||
const auto index = pair.find(':');
|
||||
if (index == std::string::npos)
|
||||
continue;
|
||||
|
||||
const u16 vid = static_cast<u16>(strtol(pair.substr(0, index).c_str(), nullptr, 16));
|
||||
const u16 pid = static_cast<u16>(strtol(pair.substr(index + 1).c_str(), nullptr, 16));
|
||||
if (vid && pid)
|
||||
m_usb_passthrough_devices.emplace(vid, pid);
|
||||
}
|
||||
}
|
||||
|
||||
void SConfig::LoadSysconfSettings(IniFile& ini)
|
||||
{
|
||||
IniFile::Section* section = ini.GetOrCreateSection("Sysconf");
|
||||
@@ -757,6 +794,11 @@ void SConfig::LoadDefaults()
|
||||
m_revision = 0;
|
||||
}
|
||||
|
||||
bool SConfig::IsUSBDeviceWhitelisted(const std::pair<u16, u16> vid_pid) const
|
||||
{
|
||||
return m_usb_passthrough_devices.find(vid_pid) != m_usb_passthrough_devices.end();
|
||||
}
|
||||
|
||||
const char* SConfig::GetDirectoryForRegion(DiscIO::Region region)
|
||||
{
|
||||
switch (region)
|
||||
|
||||
@@ -5,7 +5,9 @@
|
||||
#pragma once
|
||||
|
||||
#include <limits>
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
#include "Common/IniFile.h"
|
||||
@@ -151,6 +153,10 @@ struct SConfig : NonCopyable
|
||||
int m_bt_passthrough_vid = -1;
|
||||
std::string m_bt_passthrough_link_keys;
|
||||
|
||||
// USB passthrough settings
|
||||
std::set<std::pair<u16, u16>> m_usb_passthrough_devices;
|
||||
bool IsUSBDeviceWhitelisted(std::pair<u16, u16> vid_pid) const;
|
||||
|
||||
// SYSCONF settings
|
||||
int m_sensor_bar_position = 0x01;
|
||||
int m_sensor_bar_sensitivity = 0x03;
|
||||
@@ -351,6 +357,7 @@ private:
|
||||
void SaveNetworkSettings(IniFile& ini);
|
||||
void SaveAnalyticsSettings(IniFile& ini);
|
||||
void SaveBluetoothPassthroughSettings(IniFile& ini);
|
||||
void SaveUSBPassthroughSettings(IniFile& ini);
|
||||
void SaveSysconfSettings(IniFile& ini);
|
||||
|
||||
void LoadGeneralSettings(IniFile& ini);
|
||||
@@ -365,6 +372,7 @@ private:
|
||||
void LoadNetworkSettings(IniFile& ini);
|
||||
void LoadAnalyticsSettings(IniFile& ini);
|
||||
void LoadBluetoothPassthroughSettings(IniFile& ini);
|
||||
void LoadUSBPassthroughSettings(IniFile& ini);
|
||||
void LoadSysconfSettings(IniFile& ini);
|
||||
|
||||
bool SetRegion(DiscIO::Region region, std::string* directory_name);
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
#include "Core/HW/SystemTimers.h"
|
||||
#include "Core/HW/VideoInterface.h"
|
||||
#include "Core/HW/Wiimote.h"
|
||||
#include "Core/IOS/Network/Socket.h"
|
||||
#include "Core/IOS/IPC.h"
|
||||
#include "Core/IOS/USB/Bluetooth/BTEmu.h"
|
||||
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
|
||||
#include "Core/Movie.h"
|
||||
@@ -975,7 +975,7 @@ void UpdateWantDeterminism(bool initial)
|
||||
bool was_unpaused = Core::PauseAndLock(true);
|
||||
|
||||
g_want_determinism = new_want_determinism;
|
||||
IOS::HLE::WiiSockMan::GetInstance().UpdateWantDeterminism(new_want_determinism);
|
||||
IOS::HLE::UpdateWantDeterminism(new_want_determinism);
|
||||
Fifo::UpdateWantDeterminism(new_want_determinism);
|
||||
// We need to clear the cache because some parts of the JIT depend on want_determinism, e.g. use
|
||||
// of FMA.
|
||||
|
||||
@@ -186,16 +186,20 @@
|
||||
<ClCompile Include="IOS\SDIO\SDIOSlot0.cpp" />
|
||||
<ClCompile Include="IOS\STM\STM.cpp" />
|
||||
<ClCompile Include="IOS\USB\Common.cpp" />
|
||||
<ClCompile Include="IOS\USB\USBV0.cpp" />
|
||||
<ClCompile Include="IOS\USB\USB_HIDv4.cpp">
|
||||
<!--
|
||||
Disable "nonstandard extension used : zero-sized array in struct/union" warning,
|
||||
which is hit in libusb.h.
|
||||
-->
|
||||
<ClCompile Include="IOS\USB\LibusbDevice.cpp">
|
||||
<DisableSpecificWarnings>4200;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\Host.cpp">
|
||||
<DisableSpecificWarnings>4200;%(DisableSpecificWarnings)</DisableSpecificWarnings>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\OH0\OH0.cpp" />
|
||||
<ClCompile Include="IOS\USB\OH0\OH0Device.cpp" />
|
||||
<ClCompile Include="IOS\USB\USB_HID\HIDv4.cpp" />
|
||||
<ClCompile Include="IOS\USB\USB_VEN\VEN.cpp" />
|
||||
<ClCompile Include="IOS\USB\USBV0.cpp" />
|
||||
<ClCompile Include="IOS\USB\USBV4.cpp" />
|
||||
<ClCompile Include="IOS\USB\USBV5.cpp" />
|
||||
<ClCompile Include="IOS\USB\USB_KBD.cpp" />
|
||||
<ClCompile Include="IOS\USB\USB_VEN.cpp" />
|
||||
<ClCompile Include="IOS\USB\Bluetooth\BTBase.cpp" />
|
||||
<ClCompile Include="IOS\USB\Bluetooth\BTEmu.cpp" />
|
||||
<ClCompile Include="IOS\USB\Bluetooth\BTStub.cpp" />
|
||||
@@ -419,10 +423,16 @@
|
||||
<ClInclude Include="IOS\SDIO\SDIOSlot0.h" />
|
||||
<ClInclude Include="IOS\STM\STM.h" />
|
||||
<ClInclude Include="IOS\USB\Common.h" />
|
||||
<ClInclude Include="IOS\USB\LibusbDevice.h" />
|
||||
<ClInclude Include="IOS\USB\Host.h" />
|
||||
<ClInclude Include="IOS\USB\OH0\OH0.h" />
|
||||
<ClInclude Include="IOS\USB\OH0\OH0Device.h" />
|
||||
<ClInclude Include="IOS\USB\USB_HID\HIDv4.h" />
|
||||
<ClInclude Include="IOS\USB\USB_VEN\VEN.h" />
|
||||
<ClInclude Include="IOS\USB\USBV0.h" />
|
||||
<ClInclude Include="IOS\USB\USB_HIDv4.h" />
|
||||
<ClInclude Include="IOS\USB\USBV4.h" />
|
||||
<ClInclude Include="IOS\USB\USBV5.h" />
|
||||
<ClInclude Include="IOS\USB\USB_KBD.h" />
|
||||
<ClInclude Include="IOS\USB\USB_VEN.h" />
|
||||
<ClInclude Include="IOS\USB\Bluetooth\BTBase.h" />
|
||||
<ClInclude Include="IOS\USB\Bluetooth\BTEmu.h" />
|
||||
<ClInclude Include="IOS\USB\Bluetooth\BTStub.h" />
|
||||
|
||||
@@ -773,18 +773,36 @@
|
||||
<ClCompile Include="IOS\USB\Common.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\LibusbDevice.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\Host.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\OH0\OH0.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\OH0\OH0Device.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USB_HID\HIDv4.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USB_VEN\VEN.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USBV0.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USB_HIDv4.cpp">
|
||||
<ClCompile Include="IOS\USB\USBV4.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USBV5.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USB_KBD.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\USB\USB_VEN.cpp">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="IOS\WFS\WFSI.cpp">
|
||||
<Filter>IOS\WFS</Filter>
|
||||
</ClCompile>
|
||||
@@ -1353,18 +1371,36 @@
|
||||
<ClInclude Include="IOS\USB\Common.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\LibusbDevice.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\Host.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\OH0\OH0.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\OH0\OH0Device.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USB_HID\HIDv4.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USB_VEN\VEN.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USBV0.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USB_HIDv4.h">
|
||||
<ClInclude Include="IOS\USB\USBV4.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USBV5.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USB_KBD.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\USB\USB_VEN.h">
|
||||
<Filter>IOS\USB</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="IOS\WFS\WFSI.h">
|
||||
<Filter>IOS\WFS</Filter>
|
||||
</ClInclude>
|
||||
|
||||
@@ -76,6 +76,16 @@ bool IOCtlVRequest::HasInputVectorWithAddress(const u32 vector_address) const
|
||||
[&](const auto& in_vector) { return in_vector.address == vector_address; });
|
||||
}
|
||||
|
||||
bool IOCtlVRequest::HasNumberOfValidVectors(const size_t in_count, const size_t io_count) const
|
||||
{
|
||||
if (in_vectors.size() != in_count || io_vectors.size() != io_count)
|
||||
return false;
|
||||
|
||||
auto IsValidVector = [](const auto& vector) { return vector.size == 0 || vector.address != 0; };
|
||||
return std::all_of(in_vectors.begin(), in_vectors.end(), IsValidVector) &&
|
||||
std::all_of(io_vectors.begin(), io_vectors.end(), IsValidVector);
|
||||
}
|
||||
|
||||
void IOCtlRequest::Log(const std::string& device_name, LogTypes::LOG_TYPE type,
|
||||
LogTypes::LOG_LEVELS verbosity) const
|
||||
{
|
||||
|
||||
@@ -42,6 +42,7 @@ enum ReturnCode : s32
|
||||
FS_EDIRDEPTH = -116, // Max directory depth exceeded
|
||||
FS_EBUSY = -118, // Resource busy
|
||||
IPC_EESEXHAUSTED = -1016, // Max of 2 ES handles exceeded
|
||||
USB_ECANCELED = -7022, // USB OH0 insertion hook cancelled
|
||||
};
|
||||
|
||||
struct Request
|
||||
@@ -122,6 +123,7 @@ struct IOCtlVRequest final : Request
|
||||
std::vector<IOVector> io_vectors;
|
||||
explicit IOCtlVRequest(u32 address);
|
||||
bool HasInputVectorWithAddress(u32 vector_address) const;
|
||||
bool HasNumberOfValidVectors(size_t in_count, size_t io_count) const;
|
||||
void Dump(const std::string& description, LogTypes::LOG_TYPE type = LogTypes::IOS,
|
||||
LogTypes::LOG_LEVELS level = LogTypes::LINFO) const;
|
||||
void DumpUnknown(const std::string& description, LogTypes::LOG_TYPE type = LogTypes::IOS,
|
||||
@@ -137,6 +139,7 @@ public:
|
||||
{
|
||||
Static, // Devices which appear in s_device_map.
|
||||
FileIO, // FileIO devices which are created dynamically.
|
||||
OH0, // OH0 child devices which are created dynamically.
|
||||
};
|
||||
|
||||
Device(u32 device_id, const std::string& device_name, DeviceType type = DeviceType::Static);
|
||||
@@ -159,6 +162,7 @@ public:
|
||||
virtual IPCCommandResult IOCtl(const IOCtlRequest& ioctl) { return Unsupported(ioctl); }
|
||||
virtual IPCCommandResult IOCtlV(const IOCtlVRequest& ioctlv) { return Unsupported(ioctlv); }
|
||||
virtual void Update() {}
|
||||
virtual void UpdateWantDeterminism(bool new_want_determinism) {}
|
||||
virtual DeviceType GetDeviceType() const { return m_device_type; }
|
||||
virtual bool IsOpened() const { return m_is_active; }
|
||||
static IPCCommandResult GetDefaultReply(s32 return_value);
|
||||
|
||||
@@ -44,12 +44,16 @@
|
||||
#include "Core/IOS/IPC.h"
|
||||
#include "Core/IOS/Network/Net.h"
|
||||
#include "Core/IOS/Network/SSL.h"
|
||||
#include "Core/IOS/Network/Socket.h"
|
||||
#include "Core/IOS/SDIO/SDIOSlot0.h"
|
||||
#include "Core/IOS/STM/STM.h"
|
||||
#include "Core/IOS/USB/Bluetooth/BTEmu.h"
|
||||
#include "Core/IOS/USB/Bluetooth/BTReal.h"
|
||||
#include "Core/IOS/USB/OH0/OH0.h"
|
||||
#include "Core/IOS/USB/OH0/OH0Device.h"
|
||||
#include "Core/IOS/USB/USB_HID/HIDv4.h"
|
||||
#include "Core/IOS/USB/USB_KBD.h"
|
||||
#include "Core/IOS/USB/USB_VEN.h"
|
||||
#include "Core/IOS/USB/USB_VEN/VEN.h"
|
||||
#include "Core/IOS/WFS/WFSI.h"
|
||||
#include "Core/IOS/WFS/WFSSRV.h"
|
||||
|
||||
@@ -58,10 +62,6 @@ namespace CoreTiming
|
||||
struct EventType;
|
||||
} // namespace CoreTiming
|
||||
|
||||
#if defined(__LIBUSB__)
|
||||
#include "Core/IOS/USB/USB_HIDv4.h"
|
||||
#endif
|
||||
|
||||
namespace IOS
|
||||
{
|
||||
namespace HLE
|
||||
@@ -85,6 +85,8 @@ static CoreTiming::EventType* s_event_sdio_notify;
|
||||
|
||||
static u64 s_last_reply_time;
|
||||
|
||||
static u64 s_active_title_id;
|
||||
|
||||
static constexpr u64 ENQUEUE_REQUEST_FLAG = 0x100000000ULL;
|
||||
static constexpr u64 ENQUEUE_ACKNOWLEDGEMENT_FLAG = 0x200000000ULL;
|
||||
|
||||
@@ -411,6 +413,14 @@ static void SDIO_EventNotify_CPUThread(u64 userdata, s64 cycles_late)
|
||||
device->EventNotify();
|
||||
}
|
||||
|
||||
// The title ID is a u64 where the first 32 bits are used for the title type.
|
||||
// For IOS title IDs, the type will always be 00000001 (system), and the lower 32 bits
|
||||
// are used for the IOS major version -- which is what we want here.
|
||||
u32 GetVersion()
|
||||
{
|
||||
return static_cast<u32>(s_active_title_id);
|
||||
}
|
||||
|
||||
bool SetupMemory(u64 ios_title_id)
|
||||
{
|
||||
auto target_imv = std::find_if(
|
||||
@@ -423,6 +433,8 @@ bool SetupMemory(u64 ios_title_id)
|
||||
return false;
|
||||
}
|
||||
|
||||
s_active_title_id = ios_title_id;
|
||||
|
||||
Memory::Write_U32(target_imv->mem1_physical_size, ADDR_MEM1_SIZE);
|
||||
Memory::Write_U32(target_imv->mem1_simulated_size, ADDR_MEM1_SIM_SIZE);
|
||||
Memory::Write_U32(target_imv->mem1_end, ADDR_MEM1_END);
|
||||
@@ -495,15 +507,12 @@ void Reinit()
|
||||
AddDevice<Device::NetIPTop>("/dev/net/ip/top");
|
||||
AddDevice<Device::NetSSL>("/dev/net/ssl");
|
||||
AddDevice<Device::USB_KBD>("/dev/usb/kbd");
|
||||
AddDevice<Device::USB_VEN>("/dev/usb/ven");
|
||||
AddDevice<Device::SDIOSlot0>("/dev/sdio/slot0");
|
||||
AddDevice<Device::Stub>("/dev/sdio/slot1");
|
||||
#if defined(__LIBUSB__)
|
||||
AddDevice<Device::USB_HIDv4>("/dev/usb/hid");
|
||||
#else
|
||||
AddDevice<Device::Stub>("/dev/usb/hid");
|
||||
#endif
|
||||
AddDevice<Device::OH0>("/dev/usb/oh0");
|
||||
AddDevice<Device::Stub>("/dev/usb/oh1");
|
||||
AddDevice<Device::USB_VEN>("/dev/usb/ven");
|
||||
AddDevice<Device::WFSSRV>("/dev/usb/wfssrv");
|
||||
AddDevice<Device::WFSI>("/dev/wfsi");
|
||||
}
|
||||
@@ -644,6 +653,10 @@ void DoState(PointerWrap& p)
|
||||
s_fdmap[i] = std::make_shared<Device::FileIO>(i, "");
|
||||
s_fdmap[i]->DoState(p);
|
||||
break;
|
||||
case Device::Device::DeviceType::OH0:
|
||||
s_fdmap[i] = std::make_shared<Device::OH0Device>(i, "");
|
||||
s_fdmap[i]->DoState(p);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -710,6 +723,10 @@ static s32 OpenDevice(const OpenRequest& request)
|
||||
if (!device)
|
||||
return IPC_EESEXHAUSTED;
|
||||
}
|
||||
else if (request.path.find("/dev/usb/oh0/") == 0 && !GetDeviceByName(request.path))
|
||||
{
|
||||
device = std::make_shared<Device::OH0Device>(new_fd, request.path);
|
||||
}
|
||||
else if (request.path.find("/dev/") == 0)
|
||||
{
|
||||
device = GetDeviceByName(request.path);
|
||||
@@ -851,5 +868,12 @@ void UpdateDevices()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateWantDeterminism(const bool new_want_determinism)
|
||||
{
|
||||
WiiSockMan::GetInstance().UpdateWantDeterminism(new_want_determinism);
|
||||
for (const auto& device : s_device_map)
|
||||
device.second->UpdateWantDeterminism(new_want_determinism);
|
||||
}
|
||||
} // namespace HLE
|
||||
} // namespace IOS
|
||||
|
||||
@@ -51,6 +51,8 @@ void Init();
|
||||
// Needs to be called after Reset(true) to recreate the device tree
|
||||
void Reinit();
|
||||
|
||||
u32 GetVersion();
|
||||
|
||||
bool SetupMemory(u64 ios_title_id);
|
||||
|
||||
// Shutdown
|
||||
@@ -77,6 +79,8 @@ void Update();
|
||||
// Update Devices
|
||||
void UpdateDevices();
|
||||
|
||||
void UpdateWantDeterminism(bool new_want_determinism);
|
||||
|
||||
void ExecuteCommand(u32 address);
|
||||
|
||||
void EnqueueRequest(u32 address);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "Common/Assert.h"
|
||||
#include "Common/ChunkFile.h"
|
||||
#include "Common/CommonFuncs.h"
|
||||
#include "Common/LibusbContext.h"
|
||||
#include "Common/Logging/Log.h"
|
||||
#include "Common/MsgHandler.h"
|
||||
#include "Common/Network.h"
|
||||
@@ -59,8 +60,8 @@ namespace Device
|
||||
BluetoothReal::BluetoothReal(u32 device_id, const std::string& device_name)
|
||||
: BluetoothBase(device_id, device_name)
|
||||
{
|
||||
const int ret = libusb_init(&m_libusb_context);
|
||||
_assert_msg_(IOS_WIIMOTE, ret == 0, "Failed to init libusb.");
|
||||
m_libusb_context = LibusbContext::Get();
|
||||
_assert_msg_(IOS_WIIMOTE, m_libusb_context, "Failed to init libusb.");
|
||||
|
||||
LoadLinkKeys();
|
||||
}
|
||||
@@ -78,15 +79,13 @@ BluetoothReal::~BluetoothReal()
|
||||
libusb_unref_device(m_device);
|
||||
}
|
||||
|
||||
libusb_exit(m_libusb_context);
|
||||
|
||||
SaveLinkKeys();
|
||||
}
|
||||
|
||||
ReturnCode BluetoothReal::Open(const OpenRequest& request)
|
||||
{
|
||||
libusb_device** list;
|
||||
const ssize_t cnt = libusb_get_device_list(m_libusb_context, &list);
|
||||
const ssize_t cnt = libusb_get_device_list(m_libusb_context.get(), &list);
|
||||
_dbg_assert_msg_(IOS, cnt > 0, "Couldn't get device list");
|
||||
for (ssize_t i = 0; i < cnt; ++i)
|
||||
{
|
||||
@@ -601,7 +600,7 @@ void BluetoothReal::TransferThread()
|
||||
Common::SetCurrentThreadName("BT USB Thread");
|
||||
while (m_thread_running.IsSet())
|
||||
{
|
||||
libusb_handle_events_completed(m_libusb_context, nullptr);
|
||||
libusb_handle_events_completed(m_libusb_context.get(), nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user