diff options
| author | 2024-02-07 16:43:28 -0600 | |
|---|---|---|
| committer | 2024-02-07 18:07:32 -0600 | |
| commit | b4d88a7bb406c033c3cd5c6bca6ce913fac1bcdd (patch) | |
| tree | 1e1dd7aa5bc3f544316c744cf1f28f508becb6a9 /src/hid_core/hidbus | |
| parent | Merge pull request #12883 from FernandoS27/memory_manager_mem (diff) | |
| download | yuzu-b4d88a7bb406c033c3cd5c6bca6ce913fac1bcdd.tar.gz yuzu-b4d88a7bb406c033c3cd5c6bca6ce913fac1bcdd.tar.xz yuzu-b4d88a7bb406c033c3cd5c6bca6ce913fac1bcdd.zip | |
service: hid: Migrate hidbus to new interface
Diffstat (limited to 'src/hid_core/hidbus')
| -rw-r--r-- | src/hid_core/hidbus/hidbus_base.h | 2 | ||||
| -rw-r--r-- | src/hid_core/hidbus/ringcon.cpp | 77 | ||||
| -rw-r--r-- | src/hid_core/hidbus/ringcon.h | 26 | ||||
| -rw-r--r-- | src/hid_core/hidbus/starlink.cpp | 2 | ||||
| -rw-r--r-- | src/hid_core/hidbus/starlink.h | 2 | ||||
| -rw-r--r-- | src/hid_core/hidbus/stubbed.cpp | 2 | ||||
| -rw-r--r-- | src/hid_core/hidbus/stubbed.h | 2 |
7 files changed, 56 insertions, 57 deletions
diff --git a/src/hid_core/hidbus/hidbus_base.h b/src/hid_core/hidbus/hidbus_base.h index ec41684e1..c948606e4 100644 --- a/src/hid_core/hidbus/hidbus_base.h +++ b/src/hid_core/hidbus/hidbus_base.h | |||
| @@ -160,7 +160,7 @@ public: | |||
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | // Returns a reply from a command | 162 | // Returns a reply from a command |
| 163 | virtual std::vector<u8> GetReply() const { | 163 | virtual u64 GetReply(std::span<u8> out_data) const { |
| 164 | return {}; | 164 | return {}; |
| 165 | } | 165 | } |
| 166 | 166 | ||
diff --git a/src/hid_core/hidbus/ringcon.cpp b/src/hid_core/hidbus/ringcon.cpp index cedf25c16..4f5eaa505 100644 --- a/src/hid_core/hidbus/ringcon.cpp +++ b/src/hid_core/hidbus/ringcon.cpp | |||
| @@ -90,32 +90,32 @@ u8 RingController::GetDeviceId() const { | |||
| 90 | return device_id; | 90 | return device_id; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | std::vector<u8> RingController::GetReply() const { | 93 | u64 RingController::GetReply(std::span<u8> out_data) const { |
| 94 | const RingConCommands current_command = command; | 94 | const RingConCommands current_command = command; |
| 95 | 95 | ||
| 96 | switch (current_command) { | 96 | switch (current_command) { |
| 97 | case RingConCommands::GetFirmwareVersion: | 97 | case RingConCommands::GetFirmwareVersion: |
| 98 | return GetFirmwareVersionReply(); | 98 | return GetFirmwareVersionReply(out_data); |
| 99 | case RingConCommands::ReadId: | 99 | case RingConCommands::ReadId: |
| 100 | return GetReadIdReply(); | 100 | return GetReadIdReply(out_data); |
| 101 | case RingConCommands::c20105: | 101 | case RingConCommands::c20105: |
| 102 | return GetC020105Reply(); | 102 | return GetC020105Reply(out_data); |
| 103 | case RingConCommands::ReadUnkCal: | 103 | case RingConCommands::ReadUnkCal: |
| 104 | return GetReadUnkCalReply(); | 104 | return GetReadUnkCalReply(out_data); |
| 105 | case RingConCommands::ReadFactoryCal: | 105 | case RingConCommands::ReadFactoryCal: |
| 106 | return GetReadFactoryCalReply(); | 106 | return GetReadFactoryCalReply(out_data); |
| 107 | case RingConCommands::ReadUserCal: | 107 | case RingConCommands::ReadUserCal: |
| 108 | return GetReadUserCalReply(); | 108 | return GetReadUserCalReply(out_data); |
| 109 | case RingConCommands::ReadRepCount: | 109 | case RingConCommands::ReadRepCount: |
| 110 | return GetReadRepCountReply(); | 110 | return GetReadRepCountReply(out_data); |
| 111 | case RingConCommands::ReadTotalPushCount: | 111 | case RingConCommands::ReadTotalPushCount: |
| 112 | return GetReadTotalPushCountReply(); | 112 | return GetReadTotalPushCountReply(out_data); |
| 113 | case RingConCommands::ResetRepCount: | 113 | case RingConCommands::ResetRepCount: |
| 114 | return GetResetRepCountReply(); | 114 | return GetResetRepCountReply(out_data); |
| 115 | case RingConCommands::SaveCalData: | 115 | case RingConCommands::SaveCalData: |
| 116 | return GetSaveDataReply(); | 116 | return GetSaveDataReply(out_data); |
| 117 | default: | 117 | default: |
| 118 | return GetErrorReply(); | 118 | return GetErrorReply(out_data); |
| 119 | } | 119 | } |
| 120 | } | 120 | } |
| 121 | 121 | ||
| @@ -163,16 +163,16 @@ bool RingController::SetCommand(std::span<const u8> data) { | |||
| 163 | } | 163 | } |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | std::vector<u8> RingController::GetFirmwareVersionReply() const { | 166 | u64 RingController::GetFirmwareVersionReply(std::span<u8> out_data) const { |
| 167 | const FirmwareVersionReply reply{ | 167 | const FirmwareVersionReply reply{ |
| 168 | .status = DataValid::Valid, | 168 | .status = DataValid::Valid, |
| 169 | .firmware = version, | 169 | .firmware = version, |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | return GetDataVector(reply); | 172 | return GetData(reply, out_data); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | std::vector<u8> RingController::GetReadIdReply() const { | 175 | u64 RingController::GetReadIdReply(std::span<u8> out_data) const { |
| 176 | // The values are hardcoded from a real joycon | 176 | // The values are hardcoded from a real joycon |
| 177 | const ReadIdReply reply{ | 177 | const ReadIdReply reply{ |
| 178 | .status = DataValid::Valid, | 178 | .status = DataValid::Valid, |
| @@ -184,83 +184,83 @@ std::vector<u8> RingController::GetReadIdReply() const { | |||
| 184 | .id_h_x4 = 8245, | 184 | .id_h_x4 = 8245, |
| 185 | }; | 185 | }; |
| 186 | 186 | ||
| 187 | return GetDataVector(reply); | 187 | return GetData(reply, out_data); |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | std::vector<u8> RingController::GetC020105Reply() const { | 190 | u64 RingController::GetC020105Reply(std::span<u8> out_data) const { |
| 191 | const Cmd020105Reply reply{ | 191 | const Cmd020105Reply reply{ |
| 192 | .status = DataValid::Valid, | 192 | .status = DataValid::Valid, |
| 193 | .data = 1, | 193 | .data = 1, |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | return GetDataVector(reply); | 196 | return GetData(reply, out_data); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | std::vector<u8> RingController::GetReadUnkCalReply() const { | 199 | u64 RingController::GetReadUnkCalReply(std::span<u8> out_data) const { |
| 200 | const ReadUnkCalReply reply{ | 200 | const ReadUnkCalReply reply{ |
| 201 | .status = DataValid::Valid, | 201 | .status = DataValid::Valid, |
| 202 | .data = 0, | 202 | .data = 0, |
| 203 | }; | 203 | }; |
| 204 | 204 | ||
| 205 | return GetDataVector(reply); | 205 | return GetData(reply, out_data); |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | std::vector<u8> RingController::GetReadFactoryCalReply() const { | 208 | u64 RingController::GetReadFactoryCalReply(std::span<u8> out_data) const { |
| 209 | const ReadFactoryCalReply reply{ | 209 | const ReadFactoryCalReply reply{ |
| 210 | .status = DataValid::Valid, | 210 | .status = DataValid::Valid, |
| 211 | .calibration = factory_calibration, | 211 | .calibration = factory_calibration, |
| 212 | }; | 212 | }; |
| 213 | 213 | ||
| 214 | return GetDataVector(reply); | 214 | return GetData(reply, out_data); |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | std::vector<u8> RingController::GetReadUserCalReply() const { | 217 | u64 RingController::GetReadUserCalReply(std::span<u8> out_data) const { |
| 218 | const ReadUserCalReply reply{ | 218 | const ReadUserCalReply reply{ |
| 219 | .status = DataValid::Valid, | 219 | .status = DataValid::Valid, |
| 220 | .calibration = user_calibration, | 220 | .calibration = user_calibration, |
| 221 | }; | 221 | }; |
| 222 | 222 | ||
| 223 | return GetDataVector(reply); | 223 | return GetData(reply, out_data); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | std::vector<u8> RingController::GetReadRepCountReply() const { | 226 | u64 RingController::GetReadRepCountReply(std::span<u8> out_data) const { |
| 227 | const GetThreeByteReply reply{ | 227 | const GetThreeByteReply reply{ |
| 228 | .status = DataValid::Valid, | 228 | .status = DataValid::Valid, |
| 229 | .data = {total_rep_count, 0, 0}, | 229 | .data = {total_rep_count, 0, 0}, |
| 230 | .crc = GetCrcValue({total_rep_count, 0, 0, 0}), | 230 | .crc = GetCrcValue({total_rep_count, 0, 0, 0}), |
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | return GetDataVector(reply); | 233 | return GetData(reply, out_data); |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | std::vector<u8> RingController::GetReadTotalPushCountReply() const { | 236 | u64 RingController::GetReadTotalPushCountReply(std::span<u8> out_data) const { |
| 237 | const GetThreeByteReply reply{ | 237 | const GetThreeByteReply reply{ |
| 238 | .status = DataValid::Valid, | 238 | .status = DataValid::Valid, |
| 239 | .data = {total_push_count, 0, 0}, | 239 | .data = {total_push_count, 0, 0}, |
| 240 | .crc = GetCrcValue({total_push_count, 0, 0, 0}), | 240 | .crc = GetCrcValue({total_push_count, 0, 0, 0}), |
| 241 | }; | 241 | }; |
| 242 | 242 | ||
| 243 | return GetDataVector(reply); | 243 | return GetData(reply, out_data); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | std::vector<u8> RingController::GetResetRepCountReply() const { | 246 | u64 RingController::GetResetRepCountReply(std::span<u8> out_data) const { |
| 247 | return GetReadRepCountReply(); | 247 | return GetReadRepCountReply(out_data); |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | std::vector<u8> RingController::GetSaveDataReply() const { | 250 | u64 RingController::GetSaveDataReply(std::span<u8> out_data) const { |
| 251 | const StatusReply reply{ | 251 | const StatusReply reply{ |
| 252 | .status = DataValid::Valid, | 252 | .status = DataValid::Valid, |
| 253 | }; | 253 | }; |
| 254 | 254 | ||
| 255 | return GetDataVector(reply); | 255 | return GetData(reply, out_data); |
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | std::vector<u8> RingController::GetErrorReply() const { | 258 | u64 RingController::GetErrorReply(std::span<u8> out_data) const { |
| 259 | const ErrorReply reply{ | 259 | const ErrorReply reply{ |
| 260 | .status = DataValid::BadCRC, | 260 | .status = DataValid::BadCRC, |
| 261 | }; | 261 | }; |
| 262 | 262 | ||
| 263 | return GetDataVector(reply); | 263 | return GetData(reply, out_data); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | u8 RingController::GetCrcValue(const std::vector<u8>& data) const { | 266 | u8 RingController::GetCrcValue(const std::vector<u8>& data) const { |
| @@ -281,12 +281,11 @@ u8 RingController::GetCrcValue(const std::vector<u8>& data) const { | |||
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | template <typename T> | 283 | template <typename T> |
| 284 | std::vector<u8> RingController::GetDataVector(const T& reply) const { | 284 | u64 RingController::GetData(const T& reply, std::span<u8> out_data) const { |
| 285 | static_assert(std::is_trivially_copyable_v<T>); | 285 | static_assert(std::is_trivially_copyable_v<T>); |
| 286 | std::vector<u8> data; | 286 | const auto data_size = static_cast<u64>(std::min(sizeof(reply), out_data.size())); |
| 287 | data.resize(sizeof(reply)); | 287 | std::memcpy(out_data.data(), &reply, data_size); |
| 288 | std::memcpy(data.data(), &reply, sizeof(reply)); | 288 | return data_size; |
| 289 | return data; | ||
| 290 | } | 289 | } |
| 291 | 290 | ||
| 292 | } // namespace Service::HID | 291 | } // namespace Service::HID |
diff --git a/src/hid_core/hidbus/ringcon.h b/src/hid_core/hidbus/ringcon.h index 0953e8100..a48eeed45 100644 --- a/src/hid_core/hidbus/ringcon.h +++ b/src/hid_core/hidbus/ringcon.h | |||
| @@ -34,7 +34,7 @@ public: | |||
| 34 | bool SetCommand(std::span<const u8> data) override; | 34 | bool SetCommand(std::span<const u8> data) override; |
| 35 | 35 | ||
| 36 | // Returns a reply from a command | 36 | // Returns a reply from a command |
| 37 | std::vector<u8> GetReply() const override; | 37 | u64 GetReply(std::span<u8> data) const override; |
| 38 | 38 | ||
| 39 | private: | 39 | private: |
| 40 | // These values are obtained from a real ring controller | 40 | // These values are obtained from a real ring controller |
| @@ -184,44 +184,44 @@ private: | |||
| 184 | RingConData GetSensorValue() const; | 184 | RingConData GetSensorValue() const; |
| 185 | 185 | ||
| 186 | // Returns 8 byte reply with firmware version | 186 | // Returns 8 byte reply with firmware version |
| 187 | std::vector<u8> GetFirmwareVersionReply() const; | 187 | u64 GetFirmwareVersionReply(std::span<u8> out_data) const; |
| 188 | 188 | ||
| 189 | // Returns 16 byte reply with ID values | 189 | // Returns 16 byte reply with ID values |
| 190 | std::vector<u8> GetReadIdReply() const; | 190 | u64 GetReadIdReply(std::span<u8> out_data) const; |
| 191 | 191 | ||
| 192 | // (STUBBED) Returns 8 byte reply | 192 | // (STUBBED) Returns 8 byte reply |
| 193 | std::vector<u8> GetC020105Reply() const; | 193 | u64 GetC020105Reply(std::span<u8> out_data) const; |
| 194 | 194 | ||
| 195 | // (STUBBED) Returns 8 byte empty reply | 195 | // (STUBBED) Returns 8 byte empty reply |
| 196 | std::vector<u8> GetReadUnkCalReply() const; | 196 | u64 GetReadUnkCalReply(std::span<u8> out_data) const; |
| 197 | 197 | ||
| 198 | // Returns 20 byte reply with factory calibration values | 198 | // Returns 20 byte reply with factory calibration values |
| 199 | std::vector<u8> GetReadFactoryCalReply() const; | 199 | u64 GetReadFactoryCalReply(std::span<u8> out_data) const; |
| 200 | 200 | ||
| 201 | // Returns 20 byte reply with user calibration values | 201 | // Returns 20 byte reply with user calibration values |
| 202 | std::vector<u8> GetReadUserCalReply() const; | 202 | u64 GetReadUserCalReply(std::span<u8> out_data) const; |
| 203 | 203 | ||
| 204 | // Returns 8 byte reply | 204 | // Returns 8 byte reply |
| 205 | std::vector<u8> GetReadRepCountReply() const; | 205 | u64 GetReadRepCountReply(std::span<u8> out_data) const; |
| 206 | 206 | ||
| 207 | // Returns 8 byte reply | 207 | // Returns 8 byte reply |
| 208 | std::vector<u8> GetReadTotalPushCountReply() const; | 208 | u64 GetReadTotalPushCountReply(std::span<u8> out_data) const; |
| 209 | 209 | ||
| 210 | // Returns 8 byte reply | 210 | // Returns 8 byte reply |
| 211 | std::vector<u8> GetResetRepCountReply() const; | 211 | u64 GetResetRepCountReply(std::span<u8> out_data) const; |
| 212 | 212 | ||
| 213 | // Returns 4 byte save data reply | 213 | // Returns 4 byte save data reply |
| 214 | std::vector<u8> GetSaveDataReply() const; | 214 | u64 GetSaveDataReply(std::span<u8> out_data) const; |
| 215 | 215 | ||
| 216 | // Returns 8 byte error reply | 216 | // Returns 8 byte error reply |
| 217 | std::vector<u8> GetErrorReply() const; | 217 | u64 GetErrorReply(std::span<u8> out_data) const; |
| 218 | 218 | ||
| 219 | // Returns 8 bit redundancy check from provided data | 219 | // Returns 8 bit redundancy check from provided data |
| 220 | u8 GetCrcValue(const std::vector<u8>& data) const; | 220 | u8 GetCrcValue(const std::vector<u8>& data) const; |
| 221 | 221 | ||
| 222 | // Converts structs to an u8 vector equivalent | 222 | // Converts structs to an u8 vector equivalent |
| 223 | template <typename T> | 223 | template <typename T> |
| 224 | std::vector<u8> GetDataVector(const T& reply) const; | 224 | u64 GetData(const T& reply, std::span<u8> out_data) const; |
| 225 | 225 | ||
| 226 | RingConCommands command{RingConCommands::Error}; | 226 | RingConCommands command{RingConCommands::Error}; |
| 227 | 227 | ||
diff --git a/src/hid_core/hidbus/starlink.cpp b/src/hid_core/hidbus/starlink.cpp index 31b263aa1..1c4df1d8c 100644 --- a/src/hid_core/hidbus/starlink.cpp +++ b/src/hid_core/hidbus/starlink.cpp | |||
| @@ -38,7 +38,7 @@ u8 Starlink::GetDeviceId() const { | |||
| 38 | return DEVICE_ID; | 38 | return DEVICE_ID; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | std::vector<u8> Starlink::GetReply() const { | 41 | u64 Starlink::GetReply(std::span<u8> out_data) const { |
| 42 | return {}; | 42 | return {}; |
| 43 | } | 43 | } |
| 44 | 44 | ||
diff --git a/src/hid_core/hidbus/starlink.h b/src/hid_core/hidbus/starlink.h index ee37763b4..695b69748 100644 --- a/src/hid_core/hidbus/starlink.h +++ b/src/hid_core/hidbus/starlink.h | |||
| @@ -31,7 +31,7 @@ public: | |||
| 31 | bool SetCommand(std::span<const u8> data) override; | 31 | bool SetCommand(std::span<const u8> data) override; |
| 32 | 32 | ||
| 33 | // Returns a reply from a command | 33 | // Returns a reply from a command |
| 34 | std::vector<u8> GetReply() const override; | 34 | u64 GetReply(std::span<u8> out_data) const override; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | } // namespace Service::HID | 37 | } // namespace Service::HID |
diff --git a/src/hid_core/hidbus/stubbed.cpp b/src/hid_core/hidbus/stubbed.cpp index f16051aa9..658922a4f 100644 --- a/src/hid_core/hidbus/stubbed.cpp +++ b/src/hid_core/hidbus/stubbed.cpp | |||
| @@ -38,7 +38,7 @@ u8 HidbusStubbed::GetDeviceId() const { | |||
| 38 | return DEVICE_ID; | 38 | return DEVICE_ID; |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | std::vector<u8> HidbusStubbed::GetReply() const { | 41 | u64 HidbusStubbed::GetReply(std::span<u8> out_data) const { |
| 42 | return {}; | 42 | return {}; |
| 43 | } | 43 | } |
| 44 | 44 | ||
diff --git a/src/hid_core/hidbus/stubbed.h b/src/hid_core/hidbus/stubbed.h index 7a711cea0..f05280b3a 100644 --- a/src/hid_core/hidbus/stubbed.h +++ b/src/hid_core/hidbus/stubbed.h | |||
| @@ -31,7 +31,7 @@ public: | |||
| 31 | bool SetCommand(std::span<const u8> data) override; | 31 | bool SetCommand(std::span<const u8> data) override; |
| 32 | 32 | ||
| 33 | // Returns a reply from a command | 33 | // Returns a reply from a command |
| 34 | std::vector<u8> GetReply() const override; | 34 | u64 GetReply(std::span<u8> out_data) const override; |
| 35 | }; | 35 | }; |
| 36 | 36 | ||
| 37 | } // namespace Service::HID | 37 | } // namespace Service::HID |