summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/am/am.cpp10
-rw-r--r--src/core/hle/service/hid/controllers/console_sixaxis.cpp14
-rw-r--r--src/core/hle/service/hid/controllers/console_sixaxis.h13
-rw-r--r--src/core/hle/service/hid/controllers/palma.cpp2
-rw-r--r--src/core/hle/service/hid/controllers/palma.h2
-rw-r--r--src/core/hle/service/hid/hid.cpp5
-rw-r--r--src/core/hle/service/hid/hid.h10
-rw-r--r--src/core/hle/service/hid/hidbus.cpp2
-rw-r--r--src/core/hle/service/hid/hidbus.h3
-rw-r--r--src/core/hle/service/hid/hidbus/hidbus_base.cpp7
-rw-r--r--src/core/hle/service/hid/hidbus/hidbus_base.h12
-rw-r--r--src/core/hle/service/hid/hidbus/ringcon.cpp13
-rw-r--r--src/core/hle/service/hid/hidbus/ringcon.h3
-rw-r--r--src/core/hle/service/hid/hidbus/starlink.cpp6
-rw-r--r--src/core/hle/service/hid/hidbus/starlink.h3
-rw-r--r--src/core/hle/service/hid/hidbus/stubbed.cpp7
-rw-r--r--src/core/hle/service/hid/hidbus/stubbed.h3
-rw-r--r--src/core/hle/service/hid/irs.cpp8
-rw-r--r--src/core/hle/service/hid/irs.h8
-rw-r--r--src/core/hle/service/hid/irsensor/image_transfer_processor.cpp27
-rw-r--r--src/core/hle/service/hid/irsensor/image_transfer_processor.h12
21 files changed, 95 insertions, 75 deletions
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 26af499d2..9a7316e27 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -1264,9 +1264,8 @@ void ILibraryAppletCreator::CreateTransferMemoryStorage(Kernel::HLERequestContex
1264 return; 1264 return;
1265 } 1265 }
1266 1266
1267 const u8* const mem_begin = system.Memory().GetPointer(transfer_mem->GetSourceAddress()); 1267 std::vector<u8> memory(transfer_mem->GetSize());
1268 const u8* const mem_end = mem_begin + transfer_mem->GetSize(); 1268 system.Memory().ReadBlock(transfer_mem->GetSourceAddress(), memory.data(), memory.size());
1269 std::vector<u8> memory{mem_begin, mem_end};
1270 1269
1271 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 1270 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
1272 rb.Push(ResultSuccess); 1271 rb.Push(ResultSuccess);
@@ -1298,9 +1297,8 @@ void ILibraryAppletCreator::CreateHandleStorage(Kernel::HLERequestContext& ctx)
1298 return; 1297 return;
1299 } 1298 }
1300 1299
1301 const u8* const mem_begin = system.Memory().GetPointer(transfer_mem->GetSourceAddress()); 1300 std::vector<u8> memory(transfer_mem->GetSize());
1302 const u8* const mem_end = mem_begin + transfer_mem->GetSize(); 1301 system.Memory().ReadBlock(transfer_mem->GetSourceAddress(), memory.data(), memory.size());
1303 std::vector<u8> memory{mem_begin, mem_end};
1304 1302
1305 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 1303 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
1306 rb.Push(ResultSuccess); 1304 rb.Push(ResultSuccess);
diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.cpp b/src/core/hle/service/hid/controllers/console_sixaxis.cpp
index bb3cba910..478d38590 100644
--- a/src/core/hle/service/hid/controllers/console_sixaxis.cpp
+++ b/src/core/hle/service/hid/controllers/console_sixaxis.cpp
@@ -1,17 +1,18 @@
1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/core.h"
4#include "core/core_timing.h" 5#include "core/core_timing.h"
5#include "core/hid/emulated_console.h" 6#include "core/hid/emulated_console.h"
6#include "core/hid/hid_core.h" 7#include "core/hid/hid_core.h"
7#include "core/hle/service/hid/controllers/console_sixaxis.h" 8#include "core/hle/service/hid/controllers/console_sixaxis.h"
9#include "core/memory.h"
8 10
9namespace Service::HID { 11namespace Service::HID {
10constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C200; 12constexpr std::size_t SHARED_MEMORY_OFFSET = 0x3C200;
11 13
12Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::HID::HIDCore& hid_core_, 14Controller_ConsoleSixAxis::Controller_ConsoleSixAxis(Core::System& system_, u8* raw_shared_memory_)
13 u8* raw_shared_memory_) 15 : ControllerBase{system_.HIDCore()}, system{system_} {
14 : ControllerBase{hid_core_} {
15 console = hid_core.GetEmulatedConsole(); 16 console = hid_core.GetEmulatedConsole();
16 static_assert(SHARED_MEMORY_OFFSET + sizeof(ConsoleSharedMemory) < shared_memory_size, 17 static_assert(SHARED_MEMORY_OFFSET + sizeof(ConsoleSharedMemory) < shared_memory_size,
17 "ConsoleSharedMemory is bigger than the shared memory"); 18 "ConsoleSharedMemory is bigger than the shared memory");
@@ -26,7 +27,7 @@ void Controller_ConsoleSixAxis::OnInit() {}
26void Controller_ConsoleSixAxis::OnRelease() {} 27void Controller_ConsoleSixAxis::OnRelease() {}
27 28
28void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) { 29void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_timing) {
29 if (!IsControllerActivated() || !is_transfer_memory_set) { 30 if (!IsControllerActivated() || transfer_memory == 0) {
30 seven_sixaxis_lifo.buffer_count = 0; 31 seven_sixaxis_lifo.buffer_count = 0;
31 seven_sixaxis_lifo.buffer_tail = 0; 32 seven_sixaxis_lifo.buffer_tail = 0;
32 return; 33 return;
@@ -59,11 +60,10 @@ void Controller_ConsoleSixAxis::OnUpdate(const Core::Timing::CoreTiming& core_ti
59 60
60 // Update seven six axis transfer memory 61 // Update seven six axis transfer memory
61 seven_sixaxis_lifo.WriteNextEntry(next_seven_sixaxis_state); 62 seven_sixaxis_lifo.WriteNextEntry(next_seven_sixaxis_state);
62 std::memcpy(transfer_memory, &seven_sixaxis_lifo, sizeof(seven_sixaxis_lifo)); 63 system.Memory().WriteBlock(transfer_memory, &seven_sixaxis_lifo, sizeof(seven_sixaxis_lifo));
63} 64}
64 65
65void Controller_ConsoleSixAxis::SetTransferMemoryPointer(u8* t_mem) { 66void Controller_ConsoleSixAxis::SetTransferMemoryAddress(VAddr t_mem) {
66 is_transfer_memory_set = true;
67 transfer_memory = t_mem; 67 transfer_memory = t_mem;
68} 68}
69 69
diff --git a/src/core/hle/service/hid/controllers/console_sixaxis.h b/src/core/hle/service/hid/controllers/console_sixaxis.h
index 2fd11538f..8d3e4081b 100644
--- a/src/core/hle/service/hid/controllers/console_sixaxis.h
+++ b/src/core/hle/service/hid/controllers/console_sixaxis.h
@@ -10,6 +10,10 @@
10#include "core/hle/service/hid/controllers/controller_base.h" 10#include "core/hle/service/hid/controllers/controller_base.h"
11#include "core/hle/service/hid/ring_lifo.h" 11#include "core/hle/service/hid/ring_lifo.h"
12 12
13namespace Core {
14class System;
15} // namespace Core
16
13namespace Core::HID { 17namespace Core::HID {
14class EmulatedConsole; 18class EmulatedConsole;
15} // namespace Core::HID 19} // namespace Core::HID
@@ -17,7 +21,7 @@ class EmulatedConsole;
17namespace Service::HID { 21namespace Service::HID {
18class Controller_ConsoleSixAxis final : public ControllerBase { 22class Controller_ConsoleSixAxis final : public ControllerBase {
19public: 23public:
20 explicit Controller_ConsoleSixAxis(Core::HID::HIDCore& hid_core_, u8* raw_shared_memory_); 24 explicit Controller_ConsoleSixAxis(Core::System& system_, u8* raw_shared_memory_);
21 ~Controller_ConsoleSixAxis() override; 25 ~Controller_ConsoleSixAxis() override;
22 26
23 // Called when the controller is initialized 27 // Called when the controller is initialized
@@ -30,7 +34,7 @@ public:
30 void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; 34 void OnUpdate(const Core::Timing::CoreTiming& core_timing) override;
31 35
32 // Called on InitializeSevenSixAxisSensor 36 // Called on InitializeSevenSixAxisSensor
33 void SetTransferMemoryPointer(u8* t_mem); 37 void SetTransferMemoryAddress(VAddr t_mem);
34 38
35 // Called on ResetSevenSixAxisSensorTimestamp 39 // Called on ResetSevenSixAxisSensorTimestamp
36 void ResetTimestamp(); 40 void ResetTimestamp();
@@ -62,12 +66,13 @@ private:
62 static_assert(sizeof(seven_sixaxis_lifo) == 0xA70, "SevenSixAxisState is an invalid size"); 66 static_assert(sizeof(seven_sixaxis_lifo) == 0xA70, "SevenSixAxisState is an invalid size");
63 67
64 SevenSixAxisState next_seven_sixaxis_state{}; 68 SevenSixAxisState next_seven_sixaxis_state{};
65 u8* transfer_memory = nullptr; 69 VAddr transfer_memory{};
66 ConsoleSharedMemory* shared_memory = nullptr; 70 ConsoleSharedMemory* shared_memory = nullptr;
67 Core::HID::EmulatedConsole* console = nullptr; 71 Core::HID::EmulatedConsole* console = nullptr;
68 72
69 bool is_transfer_memory_set = false;
70 u64 last_saved_timestamp{}; 73 u64 last_saved_timestamp{};
71 u64 last_global_timestamp{}; 74 u64 last_global_timestamp{};
75
76 Core::System& system;
72}; 77};
73} // namespace Service::HID 78} // namespace Service::HID
diff --git a/src/core/hle/service/hid/controllers/palma.cpp b/src/core/hle/service/hid/controllers/palma.cpp
index 4564ea1e2..bce51285c 100644
--- a/src/core/hle/service/hid/controllers/palma.cpp
+++ b/src/core/hle/service/hid/controllers/palma.cpp
@@ -152,7 +152,7 @@ Result Controller_Palma::WritePalmaRgbLedPatternEntry(const PalmaConnectionHandl
152} 152}
153 153
154Result Controller_Palma::WritePalmaWaveEntry(const PalmaConnectionHandle& handle, PalmaWaveSet wave, 154Result Controller_Palma::WritePalmaWaveEntry(const PalmaConnectionHandle& handle, PalmaWaveSet wave,
155 u8* t_mem, u64 size) { 155 VAddr t_mem, u64 size) {
156 if (handle.npad_id != active_handle.npad_id) { 156 if (handle.npad_id != active_handle.npad_id) {
157 return InvalidPalmaHandle; 157 return InvalidPalmaHandle;
158 } 158 }
diff --git a/src/core/hle/service/hid/controllers/palma.h b/src/core/hle/service/hid/controllers/palma.h
index 1d7fc94e1..cf62f0dbc 100644
--- a/src/core/hle/service/hid/controllers/palma.h
+++ b/src/core/hle/service/hid/controllers/palma.h
@@ -125,7 +125,7 @@ public:
125 Result ReadPalmaUniqueCode(const PalmaConnectionHandle& handle); 125 Result ReadPalmaUniqueCode(const PalmaConnectionHandle& handle);
126 Result SetPalmaUniqueCodeInvalid(const PalmaConnectionHandle& handle); 126 Result SetPalmaUniqueCodeInvalid(const PalmaConnectionHandle& handle);
127 Result WritePalmaRgbLedPatternEntry(const PalmaConnectionHandle& handle, u64 unknown); 127 Result WritePalmaRgbLedPatternEntry(const PalmaConnectionHandle& handle, u64 unknown);
128 Result WritePalmaWaveEntry(const PalmaConnectionHandle& handle, PalmaWaveSet wave, u8* t_mem, 128 Result WritePalmaWaveEntry(const PalmaConnectionHandle& handle, PalmaWaveSet wave, VAddr t_mem,
129 u64 size); 129 u64 size);
130 Result SetPalmaDataBaseIdentificationVersion(const PalmaConnectionHandle& handle, 130 Result SetPalmaDataBaseIdentificationVersion(const PalmaConnectionHandle& handle,
131 s32 database_id_version_); 131 s32 database_id_version_);
diff --git a/src/core/hle/service/hid/hid.cpp b/src/core/hle/service/hid/hid.cpp
index 8c99cec06..0da67235f 100644
--- a/src/core/hle/service/hid/hid.cpp
+++ b/src/core/hle/service/hid/hid.cpp
@@ -1861,7 +1861,7 @@ void Hid::InitializeSevenSixAxisSensor(Kernel::HLERequestContext& ctx) {
1861 .ActivateController(); 1861 .ActivateController();
1862 1862
1863 applet_resource->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor) 1863 applet_resource->GetController<Controller_ConsoleSixAxis>(HidController::ConsoleSixAxisSensor)
1864 .SetTransferMemoryPointer(system.Memory().GetPointer(t_mem_1->GetSourceAddress())); 1864 .SetTransferMemoryAddress(t_mem_1->GetSourceAddress());
1865 1865
1866 LOG_WARNING(Service_HID, 1866 LOG_WARNING(Service_HID,
1867 "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, " 1867 "called, t_mem_1_handle=0x{:08X}, t_mem_2_handle=0x{:08X}, "
@@ -2148,8 +2148,7 @@ void Hid::WritePalmaWaveEntry(Kernel::HLERequestContext& ctx) {
2148 connection_handle.npad_id, wave_set, unknown, t_mem_handle, t_mem_size, size); 2148 connection_handle.npad_id, wave_set, unknown, t_mem_handle, t_mem_size, size);
2149 2149
2150 applet_resource->GetController<Controller_Palma>(HidController::Palma) 2150 applet_resource->GetController<Controller_Palma>(HidController::Palma)
2151 .WritePalmaWaveEntry(connection_handle, wave_set, 2151 .WritePalmaWaveEntry(connection_handle, wave_set, t_mem->GetSourceAddress(), t_mem_size);
2152 system.Memory().GetPointer(t_mem->GetSourceAddress()), t_mem_size);
2153 2152
2154 IPC::ResponseBuilder rb{ctx, 2}; 2153 IPC::ResponseBuilder rb{ctx, 2};
2155 rb.Push(ResultSuccess); 2154 rb.Push(ResultSuccess);
diff --git a/src/core/hle/service/hid/hid.h b/src/core/hle/service/hid/hid.h
index 8fc9ed88a..9ace83129 100644
--- a/src/core/hle/service/hid/hid.h
+++ b/src/core/hle/service/hid/hid.h
@@ -61,9 +61,15 @@ public:
61private: 61private:
62 template <typename T> 62 template <typename T>
63 void MakeController(HidController controller, u8* shared_memory) { 63 void MakeController(HidController controller, u8* shared_memory) {
64 controllers[static_cast<std::size_t>(controller)] = 64 if constexpr (std::is_constructible_v<T, Core::System&, u8*>) {
65 std::make_unique<T>(system.HIDCore(), shared_memory); 65 controllers[static_cast<std::size_t>(controller)] =
66 std::make_unique<T>(system, shared_memory);
67 } else {
68 controllers[static_cast<std::size_t>(controller)] =
69 std::make_unique<T>(system.HIDCore(), shared_memory);
70 }
66 } 71 }
72
67 template <typename T> 73 template <typename T>
68 void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) { 74 void MakeControllerWithServiceContext(HidController controller, u8* shared_memory) {
69 controllers[static_cast<std::size_t>(controller)] = 75 controllers[static_cast<std::size_t>(controller)] =
diff --git a/src/core/hle/service/hid/hidbus.cpp b/src/core/hle/service/hid/hidbus.cpp
index 8dbb2cf50..07199d5d5 100644
--- a/src/core/hle/service/hid/hidbus.cpp
+++ b/src/core/hle/service/hid/hidbus.cpp
@@ -472,7 +472,7 @@ void HidBus::EnableJoyPollingReceiveMode(Kernel::HLERequestContext& ctx) {
472 if (device_index) { 472 if (device_index) {
473 auto& device = devices[device_index.value()].device; 473 auto& device = devices[device_index.value()].device;
474 device->SetPollingMode(polling_mode_); 474 device->SetPollingMode(polling_mode_);
475 device->SetTransferMemoryPointer(system.Memory().GetPointer(t_mem->GetSourceAddress())); 475 device->SetTransferMemoryAddress(t_mem->GetSourceAddress());
476 476
477 IPC::ResponseBuilder rb{ctx, 2}; 477 IPC::ResponseBuilder rb{ctx, 2};
478 rb.Push(ResultSuccess); 478 rb.Push(ResultSuccess);
diff --git a/src/core/hle/service/hid/hidbus.h b/src/core/hle/service/hid/hidbus.h
index 91c99b01f..85ed96e2e 100644
--- a/src/core/hle/service/hid/hidbus.h
+++ b/src/core/hle/service/hid/hidbus.h
@@ -115,8 +115,7 @@ private:
115 void MakeDevice(BusHandle handle) { 115 void MakeDevice(BusHandle handle) {
116 const auto device_index = GetDeviceIndexFromHandle(handle); 116 const auto device_index = GetDeviceIndexFromHandle(handle);
117 if (device_index) { 117 if (device_index) {
118 devices[device_index.value()].device = 118 devices[device_index.value()].device = std::make_unique<T>(system, service_context);
119 std::make_unique<T>(system.HIDCore(), service_context);
120 } 119 }
121 } 120 }
122 121
diff --git a/src/core/hle/service/hid/hidbus/hidbus_base.cpp b/src/core/hle/service/hid/hidbus/hidbus_base.cpp
index b569b3c20..dfd23ec04 100644
--- a/src/core/hle/service/hid/hidbus/hidbus_base.cpp
+++ b/src/core/hle/service/hid/hidbus/hidbus_base.cpp
@@ -9,8 +9,8 @@
9 9
10namespace Service::HID { 10namespace Service::HID {
11 11
12HidbusBase::HidbusBase(KernelHelpers::ServiceContext& service_context_) 12HidbusBase::HidbusBase(Core::System& system_, KernelHelpers::ServiceContext& service_context_)
13 : service_context(service_context_) { 13 : system(system_), service_context(service_context_) {
14 send_command_async_event = service_context.CreateEvent("hidbus:SendCommandAsyncEvent"); 14 send_command_async_event = service_context.CreateEvent("hidbus:SendCommandAsyncEvent");
15} 15}
16HidbusBase::~HidbusBase() = default; 16HidbusBase::~HidbusBase() = default;
@@ -59,8 +59,7 @@ void HidbusBase::DisablePollingMode() {
59 polling_mode_enabled = false; 59 polling_mode_enabled = false;
60} 60}
61 61
62void HidbusBase::SetTransferMemoryPointer(u8* t_mem) { 62void HidbusBase::SetTransferMemoryAddress(VAddr t_mem) {
63 is_transfer_memory_set = true;
64 transfer_memory = t_mem; 63 transfer_memory = t_mem;
65} 64}
66 65
diff --git a/src/core/hle/service/hid/hidbus/hidbus_base.h b/src/core/hle/service/hid/hidbus/hidbus_base.h
index 65e301137..26313264d 100644
--- a/src/core/hle/service/hid/hidbus/hidbus_base.h
+++ b/src/core/hle/service/hid/hidbus/hidbus_base.h
@@ -8,6 +8,10 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/hle/result.h" 9#include "core/hle/result.h"
10 10
11namespace Core {
12class System;
13}
14
11namespace Kernel { 15namespace Kernel {
12class KEvent; 16class KEvent;
13class KReadableEvent; 17class KReadableEvent;
@@ -106,7 +110,7 @@ static_assert(sizeof(ButtonOnlyPollingDataAccessor) == 0x2F0,
106 110
107class HidbusBase { 111class HidbusBase {
108public: 112public:
109 explicit HidbusBase(KernelHelpers::ServiceContext& service_context_); 113 explicit HidbusBase(Core::System& system_, KernelHelpers::ServiceContext& service_context_);
110 virtual ~HidbusBase(); 114 virtual ~HidbusBase();
111 115
112 void ActivateDevice(); 116 void ActivateDevice();
@@ -134,7 +138,7 @@ public:
134 void DisablePollingMode(); 138 void DisablePollingMode();
135 139
136 // Called on EnableJoyPollingReceiveMode 140 // Called on EnableJoyPollingReceiveMode
137 void SetTransferMemoryPointer(u8* t_mem); 141 void SetTransferMemoryAddress(VAddr t_mem);
138 142
139 Kernel::KReadableEvent& GetSendCommandAsycEvent() const; 143 Kernel::KReadableEvent& GetSendCommandAsycEvent() const;
140 144
@@ -170,9 +174,9 @@ protected:
170 JoyEnableSixAxisDataAccessor enable_sixaxis_data{}; 174 JoyEnableSixAxisDataAccessor enable_sixaxis_data{};
171 ButtonOnlyPollingDataAccessor button_only_data{}; 175 ButtonOnlyPollingDataAccessor button_only_data{};
172 176
173 u8* transfer_memory{nullptr}; 177 VAddr transfer_memory{};
174 bool is_transfer_memory_set{};
175 178
179 Core::System& system;
176 Kernel::KEvent* send_command_async_event; 180 Kernel::KEvent* send_command_async_event;
177 KernelHelpers::ServiceContext& service_context; 181 KernelHelpers::ServiceContext& service_context;
178}; 182};
diff --git a/src/core/hle/service/hid/hidbus/ringcon.cpp b/src/core/hle/service/hid/hidbus/ringcon.cpp
index 35847cbdd..65a2dd521 100644
--- a/src/core/hle/service/hid/hidbus/ringcon.cpp
+++ b/src/core/hle/service/hid/hidbus/ringcon.cpp
@@ -1,18 +1,20 @@
1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later 2// SPDX-License-Identifier: GPL-2.0-or-later
3 3
4#include "core/core.h"
4#include "core/hid/emulated_controller.h" 5#include "core/hid/emulated_controller.h"
5#include "core/hid/hid_core.h" 6#include "core/hid/hid_core.h"
6#include "core/hle/kernel/k_event.h" 7#include "core/hle/kernel/k_event.h"
7#include "core/hle/kernel/k_readable_event.h" 8#include "core/hle/kernel/k_readable_event.h"
8#include "core/hle/service/hid/hidbus/ringcon.h" 9#include "core/hle/service/hid/hidbus/ringcon.h"
10#include "core/memory.h"
9 11
10namespace Service::HID { 12namespace Service::HID {
11 13
12RingController::RingController(Core::HID::HIDCore& hid_core_, 14RingController::RingController(Core::System& system_,
13 KernelHelpers::ServiceContext& service_context_) 15 KernelHelpers::ServiceContext& service_context_)
14 : HidbusBase(service_context_) { 16 : HidbusBase(system_, service_context_) {
15 input = hid_core_.GetEmulatedController(Core::HID::NpadIdType::Player1); 17 input = system.HIDCore().GetEmulatedController(Core::HID::NpadIdType::Player1);
16} 18}
17 19
18RingController::~RingController() = default; 20RingController::~RingController() = default;
@@ -38,7 +40,7 @@ void RingController::OnUpdate() {
38 return; 40 return;
39 } 41 }
40 42
41 if (!polling_mode_enabled || !is_transfer_memory_set) { 43 if (!polling_mode_enabled || transfer_memory == 0) {
42 return; 44 return;
43 } 45 }
44 46
@@ -62,7 +64,8 @@ void RingController::OnUpdate() {
62 curr_entry.polling_data.out_size = sizeof(ringcon_value); 64 curr_entry.polling_data.out_size = sizeof(ringcon_value);
63 std::memcpy(curr_entry.polling_data.data.data(), &ringcon_value, sizeof(ringcon_value)); 65 std::memcpy(curr_entry.polling_data.data.data(), &ringcon_value, sizeof(ringcon_value));
64 66
65 std::memcpy(transfer_memory, &enable_sixaxis_data, sizeof(enable_sixaxis_data)); 67 system.Memory().WriteBlock(transfer_memory, &enable_sixaxis_data,
68 sizeof(enable_sixaxis_data));
66 break; 69 break;
67 } 70 }
68 default: 71 default:
diff --git a/src/core/hle/service/hid/hidbus/ringcon.h b/src/core/hle/service/hid/hidbus/ringcon.h
index c2fb386b1..f42f3ea41 100644
--- a/src/core/hle/service/hid/hidbus/ringcon.h
+++ b/src/core/hle/service/hid/hidbus/ringcon.h
@@ -17,8 +17,7 @@ namespace Service::HID {
17 17
18class RingController final : public HidbusBase { 18class RingController final : public HidbusBase {
19public: 19public:
20 explicit RingController(Core::HID::HIDCore& hid_core_, 20 explicit RingController(Core::System& system_, KernelHelpers::ServiceContext& service_context_);
21 KernelHelpers::ServiceContext& service_context_);
22 ~RingController() override; 21 ~RingController() override;
23 22
24 void OnInit() override; 23 void OnInit() override;
diff --git a/src/core/hle/service/hid/hidbus/starlink.cpp b/src/core/hle/service/hid/hidbus/starlink.cpp
index d0e760314..36573274e 100644
--- a/src/core/hle/service/hid/hidbus/starlink.cpp
+++ b/src/core/hle/service/hid/hidbus/starlink.cpp
@@ -8,8 +8,8 @@
8namespace Service::HID { 8namespace Service::HID {
9constexpr u8 DEVICE_ID = 0x28; 9constexpr u8 DEVICE_ID = 0x28;
10 10
11Starlink::Starlink(Core::HID::HIDCore& hid_core_, KernelHelpers::ServiceContext& service_context_) 11Starlink::Starlink(Core::System& system_, KernelHelpers::ServiceContext& service_context_)
12 : HidbusBase(service_context_) {} 12 : HidbusBase(system_, service_context_) {}
13Starlink::~Starlink() = default; 13Starlink::~Starlink() = default;
14 14
15void Starlink::OnInit() { 15void Starlink::OnInit() {
@@ -27,7 +27,7 @@ void Starlink::OnUpdate() {
27 if (!device_enabled) { 27 if (!device_enabled) {
28 return; 28 return;
29 } 29 }
30 if (!polling_mode_enabled || !is_transfer_memory_set) { 30 if (!polling_mode_enabled || transfer_memory == 0) {
31 return; 31 return;
32 } 32 }
33 33
diff --git a/src/core/hle/service/hid/hidbus/starlink.h b/src/core/hle/service/hid/hidbus/starlink.h
index 07c800e6e..a276aa88f 100644
--- a/src/core/hle/service/hid/hidbus/starlink.h
+++ b/src/core/hle/service/hid/hidbus/starlink.h
@@ -14,8 +14,7 @@ namespace Service::HID {
14 14
15class Starlink final : public HidbusBase { 15class Starlink final : public HidbusBase {
16public: 16public:
17 explicit Starlink(Core::HID::HIDCore& hid_core_, 17 explicit Starlink(Core::System& system_, KernelHelpers::ServiceContext& service_context_);
18 KernelHelpers::ServiceContext& service_context_);
19 ~Starlink() override; 18 ~Starlink() override;
20 19
21 void OnInit() override; 20 void OnInit() override;
diff --git a/src/core/hle/service/hid/hidbus/stubbed.cpp b/src/core/hle/service/hid/hidbus/stubbed.cpp
index 07632c872..8160b7218 100644
--- a/src/core/hle/service/hid/hidbus/stubbed.cpp
+++ b/src/core/hle/service/hid/hidbus/stubbed.cpp
@@ -8,9 +8,8 @@
8namespace Service::HID { 8namespace Service::HID {
9constexpr u8 DEVICE_ID = 0xFF; 9constexpr u8 DEVICE_ID = 0xFF;
10 10
11HidbusStubbed::HidbusStubbed(Core::HID::HIDCore& hid_core_, 11HidbusStubbed::HidbusStubbed(Core::System& system_, KernelHelpers::ServiceContext& service_context_)
12 KernelHelpers::ServiceContext& service_context_) 12 : HidbusBase(system_, service_context_) {}
13 : HidbusBase(service_context_) {}
14HidbusStubbed::~HidbusStubbed() = default; 13HidbusStubbed::~HidbusStubbed() = default;
15 14
16void HidbusStubbed::OnInit() { 15void HidbusStubbed::OnInit() {
@@ -28,7 +27,7 @@ void HidbusStubbed::OnUpdate() {
28 if (!device_enabled) { 27 if (!device_enabled) {
29 return; 28 return;
30 } 29 }
31 if (!polling_mode_enabled || !is_transfer_memory_set) { 30 if (!polling_mode_enabled || transfer_memory == 0) {
32 return; 31 return;
33 } 32 }
34 33
diff --git a/src/core/hle/service/hid/hidbus/stubbed.h b/src/core/hle/service/hid/hidbus/stubbed.h
index 38eaa0ecc..2e58d42fc 100644
--- a/src/core/hle/service/hid/hidbus/stubbed.h
+++ b/src/core/hle/service/hid/hidbus/stubbed.h
@@ -14,8 +14,7 @@ namespace Service::HID {
14 14
15class HidbusStubbed final : public HidbusBase { 15class HidbusStubbed final : public HidbusBase {
16public: 16public:
17 explicit HidbusStubbed(Core::HID::HIDCore& hid_core_, 17 explicit HidbusStubbed(Core::System& system_, KernelHelpers::ServiceContext& service_context_);
18 KernelHelpers::ServiceContext& service_context_);
19 ~HidbusStubbed() override; 18 ~HidbusStubbed() override;
20 19
21 void OnInit() override; 20 void OnInit() override;
diff --git a/src/core/hle/service/hid/irs.cpp b/src/core/hle/service/hid/irs.cpp
index 3bd418e92..a40f61fde 100644
--- a/src/core/hle/service/hid/irs.cpp
+++ b/src/core/hle/service/hid/irs.cpp
@@ -208,8 +208,6 @@ void IRS::RunImageTransferProcessor(Kernel::HLERequestContext& ctx) {
208 208
209 ASSERT_MSG(t_mem->GetSize() == parameters.transfer_memory_size, "t_mem has incorrect size"); 209 ASSERT_MSG(t_mem->GetSize() == parameters.transfer_memory_size, "t_mem has incorrect size");
210 210
211 u8* transfer_memory = system.Memory().GetPointer(t_mem->GetSourceAddress());
212
213 LOG_INFO(Service_IRS, 211 LOG_INFO(Service_IRS,
214 "called, npad_type={}, npad_id={}, transfer_memory_size={}, transfer_memory_size={}, " 212 "called, npad_type={}, npad_id={}, transfer_memory_size={}, transfer_memory_size={}, "
215 "applet_resource_user_id={}", 213 "applet_resource_user_id={}",
@@ -224,7 +222,7 @@ void IRS::RunImageTransferProcessor(Kernel::HLERequestContext& ctx) {
224 auto& image_transfer_processor = 222 auto& image_transfer_processor =
225 GetProcessor<ImageTransferProcessor>(parameters.camera_handle); 223 GetProcessor<ImageTransferProcessor>(parameters.camera_handle);
226 image_transfer_processor.SetConfig(parameters.processor_config); 224 image_transfer_processor.SetConfig(parameters.processor_config);
227 image_transfer_processor.SetTransferMemoryPointer(transfer_memory); 225 image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress());
228 npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, 226 npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex,
229 Common::Input::PollingMode::IR); 227 Common::Input::PollingMode::IR);
230 } 228 }
@@ -448,8 +446,6 @@ void IRS::RunImageTransferExProcessor(Kernel::HLERequestContext& ctx) {
448 auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>( 446 auto t_mem = system.ApplicationProcess()->GetHandleTable().GetObject<Kernel::KTransferMemory>(
449 t_mem_handle); 447 t_mem_handle);
450 448
451 u8* transfer_memory = system.Memory().GetPointer(t_mem->GetSourceAddress());
452
453 LOG_INFO(Service_IRS, 449 LOG_INFO(Service_IRS,
454 "called, npad_type={}, npad_id={}, transfer_memory_size={}, " 450 "called, npad_type={}, npad_id={}, transfer_memory_size={}, "
455 "applet_resource_user_id={}", 451 "applet_resource_user_id={}",
@@ -464,7 +460,7 @@ void IRS::RunImageTransferExProcessor(Kernel::HLERequestContext& ctx) {
464 auto& image_transfer_processor = 460 auto& image_transfer_processor =
465 GetProcessor<ImageTransferProcessor>(parameters.camera_handle); 461 GetProcessor<ImageTransferProcessor>(parameters.camera_handle);
466 image_transfer_processor.SetConfig(parameters.processor_config); 462 image_transfer_processor.SetConfig(parameters.processor_config);
467 image_transfer_processor.SetTransferMemoryPointer(transfer_memory); 463 image_transfer_processor.SetTransferMemoryAddress(t_mem->GetSourceAddress());
468 npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex, 464 npad_device->SetPollingMode(Core::HID::EmulatedDeviceIndex::RightIndex,
469 Common::Input::PollingMode::IR); 465 Common::Input::PollingMode::IR);
470 } 466 }
diff --git a/src/core/hle/service/hid/irs.h b/src/core/hle/service/hid/irs.h
index 2e6115c73..b76ad7854 100644
--- a/src/core/hle/service/hid/irs.h
+++ b/src/core/hle/service/hid/irs.h
@@ -80,7 +80,13 @@ private:
80 LOG_CRITICAL(Service_IRS, "Invalid index {}", index); 80 LOG_CRITICAL(Service_IRS, "Invalid index {}", index);
81 return; 81 return;
82 } 82 }
83 processors[index] = std::make_unique<T>(system.HIDCore(), device_state, index); 83
84 if constexpr (std::is_constructible_v<T, Core::System&, Core::IrSensor::DeviceFormat&,
85 std::size_t>) {
86 processors[index] = std::make_unique<T>(system, device_state, index);
87 } else {
88 processors[index] = std::make_unique<T>(system.HIDCore(), device_state, index);
89 }
84 } 90 }
85 91
86 template <typename T> 92 template <typename T>
diff --git a/src/core/hle/service/hid/irsensor/image_transfer_processor.cpp b/src/core/hle/service/hid/irsensor/image_transfer_processor.cpp
index 98f0c579d..bc896a1e3 100644
--- a/src/core/hle/service/hid/irsensor/image_transfer_processor.cpp
+++ b/src/core/hle/service/hid/irsensor/image_transfer_processor.cpp
@@ -1,16 +1,18 @@
1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project 1// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-3.0-or-later 2// SPDX-License-Identifier: GPL-3.0-or-later
3 3
4#include "core/core.h"
4#include "core/hid/emulated_controller.h" 5#include "core/hid/emulated_controller.h"
5#include "core/hid/hid_core.h" 6#include "core/hid/hid_core.h"
6#include "core/hle/service/hid/irsensor/image_transfer_processor.h" 7#include "core/hle/service/hid/irsensor/image_transfer_processor.h"
8#include "core/memory.h"
7 9
8namespace Service::IRS { 10namespace Service::IRS {
9ImageTransferProcessor::ImageTransferProcessor(Core::HID::HIDCore& hid_core_, 11ImageTransferProcessor::ImageTransferProcessor(Core::System& system_,
10 Core::IrSensor::DeviceFormat& device_format, 12 Core::IrSensor::DeviceFormat& device_format,
11 std::size_t npad_index) 13 std::size_t npad_index)
12 : device{device_format} { 14 : device{device_format}, system{system_} {
13 npad_device = hid_core_.GetEmulatedControllerByIndex(npad_index); 15 npad_device = system.HIDCore().GetEmulatedControllerByIndex(npad_index);
14 16
15 Core::HID::ControllerUpdateCallback engine_callback{ 17 Core::HID::ControllerUpdateCallback engine_callback{
16 .on_change = [this](Core::HID::ControllerTriggerType type) { OnControllerUpdate(type); }, 18 .on_change = [this](Core::HID::ControllerTriggerType type) { OnControllerUpdate(type); },
@@ -43,7 +45,7 @@ void ImageTransferProcessor::OnControllerUpdate(Core::HID::ControllerTriggerType
43 if (type != Core::HID::ControllerTriggerType::IrSensor) { 45 if (type != Core::HID::ControllerTriggerType::IrSensor) {
44 return; 46 return;
45 } 47 }
46 if (!is_transfer_memory_set) { 48 if (transfer_memory == 0) {
47 return; 49 return;
48 } 50 }
49 51
@@ -56,14 +58,16 @@ void ImageTransferProcessor::OnControllerUpdate(Core::HID::ControllerTriggerType
56 if (camera_data.format != current_config.origin_format) { 58 if (camera_data.format != current_config.origin_format) {
57 LOG_WARNING(Service_IRS, "Wrong Input format {} expected {}", camera_data.format, 59 LOG_WARNING(Service_IRS, "Wrong Input format {} expected {}", camera_data.format,
58 current_config.origin_format); 60 current_config.origin_format);
59 memset(transfer_memory, 0, GetDataSize(current_config.trimming_format)); 61 system.Memory().ZeroBlock(*system.ApplicationProcess(), transfer_memory,
62 GetDataSize(current_config.trimming_format));
60 return; 63 return;
61 } 64 }
62 65
63 if (current_config.origin_format > current_config.trimming_format) { 66 if (current_config.origin_format > current_config.trimming_format) {
64 LOG_WARNING(Service_IRS, "Origin format {} is smaller than trimming format {}", 67 LOG_WARNING(Service_IRS, "Origin format {} is smaller than trimming format {}",
65 current_config.origin_format, current_config.trimming_format); 68 current_config.origin_format, current_config.trimming_format);
66 memset(transfer_memory, 0, GetDataSize(current_config.trimming_format)); 69 system.Memory().ZeroBlock(*system.ApplicationProcess(), transfer_memory,
70 GetDataSize(current_config.trimming_format));
67 return; 71 return;
68 } 72 }
69 73
@@ -80,7 +84,8 @@ void ImageTransferProcessor::OnControllerUpdate(Core::HID::ControllerTriggerType
80 "Trimming area ({}, {}, {}, {}) is outside of origin area ({}, {})", 84 "Trimming area ({}, {}, {}, {}) is outside of origin area ({}, {})",
81 current_config.trimming_start_x, current_config.trimming_start_y, 85 current_config.trimming_start_x, current_config.trimming_start_y,
82 trimming_width, trimming_height, origin_width, origin_height); 86 trimming_width, trimming_height, origin_width, origin_height);
83 memset(transfer_memory, 0, GetDataSize(current_config.trimming_format)); 87 system.Memory().ZeroBlock(*system.ApplicationProcess(), transfer_memory,
88 GetDataSize(current_config.trimming_format));
84 return; 89 return;
85 } 90 }
86 91
@@ -94,7 +99,8 @@ void ImageTransferProcessor::OnControllerUpdate(Core::HID::ControllerTriggerType
94 } 99 }
95 } 100 }
96 101
97 memcpy(transfer_memory, window_data.data(), GetDataSize(current_config.trimming_format)); 102 system.Memory().WriteBlock(transfer_memory, window_data.data(),
103 GetDataSize(current_config.trimming_format));
98 104
99 if (!IsProcessorActive()) { 105 if (!IsProcessorActive()) {
100 StartProcessor(); 106 StartProcessor();
@@ -134,8 +140,7 @@ void ImageTransferProcessor::SetConfig(
134 npad_device->SetCameraFormat(current_config.origin_format); 140 npad_device->SetCameraFormat(current_config.origin_format);
135} 141}
136 142
137void ImageTransferProcessor::SetTransferMemoryPointer(u8* t_mem) { 143void ImageTransferProcessor::SetTransferMemoryAddress(VAddr t_mem) {
138 is_transfer_memory_set = true;
139 transfer_memory = t_mem; 144 transfer_memory = t_mem;
140} 145}
141 146
@@ -143,7 +148,7 @@ Core::IrSensor::ImageTransferProcessorState ImageTransferProcessor::GetState(
143 std::vector<u8>& data) const { 148 std::vector<u8>& data) const {
144 const auto size = GetDataSize(current_config.trimming_format); 149 const auto size = GetDataSize(current_config.trimming_format);
145 data.resize(size); 150 data.resize(size);
146 memcpy(data.data(), transfer_memory, size); 151 system.Memory().ReadBlock(transfer_memory, data.data(), size);
147 return processor_state; 152 return processor_state;
148} 153}
149 154
diff --git a/src/core/hle/service/hid/irsensor/image_transfer_processor.h b/src/core/hle/service/hid/irsensor/image_transfer_processor.h
index 393df492d..7cfe04c8c 100644
--- a/src/core/hle/service/hid/irsensor/image_transfer_processor.h
+++ b/src/core/hle/service/hid/irsensor/image_transfer_processor.h
@@ -7,6 +7,10 @@
7#include "core/hid/irs_types.h" 7#include "core/hid/irs_types.h"
8#include "core/hle/service/hid/irsensor/processor_base.h" 8#include "core/hle/service/hid/irsensor/processor_base.h"
9 9
10namespace Core {
11class System;
12}
13
10namespace Core::HID { 14namespace Core::HID {
11class EmulatedController; 15class EmulatedController;
12} // namespace Core::HID 16} // namespace Core::HID
@@ -14,7 +18,7 @@ class EmulatedController;
14namespace Service::IRS { 18namespace Service::IRS {
15class ImageTransferProcessor final : public ProcessorBase { 19class ImageTransferProcessor final : public ProcessorBase {
16public: 20public:
17 explicit ImageTransferProcessor(Core::HID::HIDCore& hid_core_, 21 explicit ImageTransferProcessor(Core::System& system_,
18 Core::IrSensor::DeviceFormat& device_format, 22 Core::IrSensor::DeviceFormat& device_format,
19 std::size_t npad_index); 23 std::size_t npad_index);
20 ~ImageTransferProcessor() override; 24 ~ImageTransferProcessor() override;
@@ -33,7 +37,7 @@ public:
33 void SetConfig(Core::IrSensor::PackedImageTransferProcessorExConfig config); 37 void SetConfig(Core::IrSensor::PackedImageTransferProcessorExConfig config);
34 38
35 // Transfer memory where the image data will be stored 39 // Transfer memory where the image data will be stored
36 void SetTransferMemoryPointer(u8* t_mem); 40 void SetTransferMemoryAddress(VAddr t_mem);
37 41
38 Core::IrSensor::ImageTransferProcessorState GetState(std::vector<u8>& data) const; 42 Core::IrSensor::ImageTransferProcessorState GetState(std::vector<u8>& data) const;
39 43
@@ -67,7 +71,7 @@ private:
67 Core::HID::EmulatedController* npad_device; 71 Core::HID::EmulatedController* npad_device;
68 int callback_key{}; 72 int callback_key{};
69 73
70 u8* transfer_memory = nullptr; 74 Core::System& system;
71 bool is_transfer_memory_set = false; 75 VAddr transfer_memory{};
72}; 76};
73} // namespace Service::IRS 77} // namespace Service::IRS