summaryrefslogtreecommitdiff
path: root/src/input_common/helpers
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/helpers')
-rw-r--r--src/input_common/helpers/joycon_protocol/common_protocol.cpp7
-rw-r--r--src/input_common/helpers/joycon_protocol/common_protocol.h2
-rw-r--r--src/input_common/helpers/joycon_protocol/joycon_types.h8
-rw-r--r--src/input_common/helpers/joycon_protocol/nfc.cpp34
-rw-r--r--src/input_common/helpers/joycon_protocol/nfc.h6
5 files changed, 34 insertions, 23 deletions
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.cpp b/src/input_common/helpers/joycon_protocol/common_protocol.cpp
index 2b42a4555..077d72cd0 100644
--- a/src/input_common/helpers/joycon_protocol/common_protocol.cpp
+++ b/src/input_common/helpers/joycon_protocol/common_protocol.cpp
@@ -236,13 +236,13 @@ DriverResult JoyconCommonProtocol::GetMCUDataResponse(ReportMode report_mode,
236 return DriverResult::Success; 236 return DriverResult::Success;
237} 237}
238 238
239DriverResult JoyconCommonProtocol::SendMCUData(ReportMode report_mode, SubCommand sc, 239DriverResult JoyconCommonProtocol::SendMCUData(ReportMode report_mode, MCUSubCommand sc,
240 std::span<const u8> buffer, 240 std::span<const u8> buffer,
241 MCUCommandResponse& output) { 241 MCUCommandResponse& output) {
242 SubCommandPacket packet{ 242 SubCommandPacket packet{
243 .output_report = OutputReport::MCU_DATA, 243 .output_report = OutputReport::MCU_DATA,
244 .packet_counter = GetCounter(), 244 .packet_counter = GetCounter(),
245 .sub_command = sc, 245 .mcu_sub_command = sc,
246 .command_data = {}, 246 .command_data = {},
247 }; 247 };
248 248
@@ -269,8 +269,7 @@ DriverResult JoyconCommonProtocol::WaitSetMCUMode(ReportMode report_mode, MCUMod
269 std::size_t tries{}; 269 std::size_t tries{};
270 270
271 do { 271 do {
272 const std::vector<u8> mcu_data{static_cast<u8>(MCUMode::Standby)}; 272 const auto result = SendMCUData(report_mode, MCUSubCommand::SetDeviceMode, {}, output);
273 const auto result = SendMCUData(report_mode, SubCommand::STATE, mcu_data, output);
274 273
275 if (result != DriverResult::Success) { 274 if (result != DriverResult::Success) {
276 return result; 275 return result;
diff --git a/src/input_common/helpers/joycon_protocol/common_protocol.h b/src/input_common/helpers/joycon_protocol/common_protocol.h
index 62cae739a..411ec018a 100644
--- a/src/input_common/helpers/joycon_protocol/common_protocol.h
+++ b/src/input_common/helpers/joycon_protocol/common_protocol.h
@@ -156,7 +156,7 @@ public:
156 * @param buffer data to be send 156 * @param buffer data to be send
157 * @returns output buffer containing the response 157 * @returns output buffer containing the response
158 */ 158 */
159 DriverResult SendMCUData(ReportMode report_mode, SubCommand sc, std::span<const u8> buffer, 159 DriverResult SendMCUData(ReportMode report_mode, MCUSubCommand sc, std::span<const u8> buffer,
160 MCUCommandResponse& output); 160 MCUCommandResponse& output);
161 161
162 /** 162 /**
diff --git a/src/input_common/helpers/joycon_protocol/joycon_types.h b/src/input_common/helpers/joycon_protocol/joycon_types.h
index dcac0e422..1c8d294b0 100644
--- a/src/input_common/helpers/joycon_protocol/joycon_types.h
+++ b/src/input_common/helpers/joycon_protocol/joycon_types.h
@@ -394,6 +394,7 @@ enum class DriverResult {
394 InvalidHandle, 394 InvalidHandle,
395 NotSupported, 395 NotSupported,
396 Disabled, 396 Disabled,
397 Delayed,
397 Unknown, 398 Unknown,
398}; 399};
399 400
@@ -575,7 +576,6 @@ struct NFCPollingCommandData {
575static_assert(sizeof(NFCPollingCommandData) == 0x05, "NFCPollingCommandData is an invalid size"); 576static_assert(sizeof(NFCPollingCommandData) == 0x05, "NFCPollingCommandData is an invalid size");
576 577
577struct NFCRequestState { 578struct NFCRequestState {
578 MCUSubCommand sub_command;
579 NFCReadCommand command_argument; 579 NFCReadCommand command_argument;
580 u8 packet_id; 580 u8 packet_id;
581 INSERT_PADDING_BYTES(0x1); 581 INSERT_PADDING_BYTES(0x1);
@@ -587,6 +587,7 @@ struct NFCRequestState {
587 NFCPollingCommandData nfc_polling; 587 NFCPollingCommandData nfc_polling;
588 }; 588 };
589 u8 crc; 589 u8 crc;
590 INSERT_PADDING_BYTES(0x1);
590}; 591};
591static_assert(sizeof(NFCRequestState) == 0x26, "NFCRequestState is an invalid size"); 592static_assert(sizeof(NFCRequestState) == 0x26, "NFCRequestState is an invalid size");
592 593
@@ -659,7 +660,10 @@ struct SubCommandPacket {
659 OutputReport output_report; 660 OutputReport output_report;
660 u8 packet_counter; 661 u8 packet_counter;
661 INSERT_PADDING_BYTES(0x8); // This contains vibration data 662 INSERT_PADDING_BYTES(0x8); // This contains vibration data
662 SubCommand sub_command; 663 union {
664 SubCommand sub_command;
665 MCUSubCommand mcu_sub_command;
666 };
663 std::array<u8, 0x26> command_data; 667 std::array<u8, 0x26> command_data;
664}; 668};
665static_assert(sizeof(SubCommandPacket) == 0x31, "SubCommandPacket is an invalid size"); 669static_assert(sizeof(SubCommandPacket) == 0x31, "SubCommandPacket is an invalid size");
diff --git a/src/input_common/helpers/joycon_protocol/nfc.cpp b/src/input_common/helpers/joycon_protocol/nfc.cpp
index eeba82986..14818ae33 100644
--- a/src/input_common/helpers/joycon_protocol/nfc.cpp
+++ b/src/input_common/helpers/joycon_protocol/nfc.cpp
@@ -72,6 +72,11 @@ DriverResult NfcProtocol::StartNFCPollingMode() {
72} 72}
73 73
74DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) { 74DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) {
75 if (update_counter++ < AMIIBO_UPDATE_DELAY) {
76 return DriverResult::Delayed;
77 }
78 update_counter = 0;
79
75 LOG_DEBUG(Input, "Start NFC pooling Mode"); 80 LOG_DEBUG(Input, "Start NFC pooling Mode");
76 ScopedSetBlocking sb(this); 81 ScopedSetBlocking sb(this);
77 DriverResult result{DriverResult::Success}; 82 DriverResult result{DriverResult::Success};
@@ -87,7 +92,7 @@ DriverResult NfcProtocol::ScanAmiibo(std::vector<u8>& data) {
87 result = WaitUntilNfcIsReady(); 92 result = WaitUntilNfcIsReady();
88 } 93 }
89 if (result == DriverResult::Success) { 94 if (result == DriverResult::Success) {
90 result = StartPolling(tag_data); 95 result = StartPolling(tag_data, 7);
91 } 96 }
92 if (result == DriverResult::Success) { 97 if (result == DriverResult::Success) {
93 result = GetAmiiboData(data); 98 result = GetAmiiboData(data);
@@ -129,9 +134,8 @@ DriverResult NfcProtocol::WaitUntilNfcIsReady() {
129 return DriverResult::Success; 134 return DriverResult::Success;
130} 135}
131 136
132DriverResult NfcProtocol::StartPolling(TagFoundData& data) { 137DriverResult NfcProtocol::StartPolling(TagFoundData& data, std::size_t timeout_limit) {
133 LOG_DEBUG(Input, "Start Polling for tag"); 138 LOG_DEBUG(Input, "Start Polling for tag");
134 constexpr std::size_t timeout_limit = 7;
135 MCUCommandResponse output{}; 139 MCUCommandResponse output{};
136 std::size_t tries = 0; 140 std::size_t tries = 0;
137 141
@@ -278,7 +282,6 @@ DriverResult NfcProtocol::GetAmiiboData(std::vector<u8>& ntag_data) {
278 282
279DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) { 283DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) {
280 NFCRequestState request{ 284 NFCRequestState request{
281 .sub_command = MCUSubCommand::ReadDeviceMode,
282 .command_argument = NFCReadCommand::StartPolling, 285 .command_argument = NFCReadCommand::StartPolling,
283 .packet_id = 0x0, 286 .packet_id = 0x0,
284 .packet_flag = MCUPacketFlag::LastCommandPacket, 287 .packet_flag = MCUPacketFlag::LastCommandPacket,
@@ -296,13 +299,13 @@ DriverResult NfcProtocol::SendStartPollingRequest(MCUCommandResponse& output) {
296 299
297 std::array<u8, sizeof(NFCRequestState)> request_data{}; 300 std::array<u8, sizeof(NFCRequestState)> request_data{};
298 memcpy(request_data.data(), &request, sizeof(NFCRequestState)); 301 memcpy(request_data.data(), &request, sizeof(NFCRequestState));
299 request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); 302 request_data[36] = CalculateMCU_CRC8(request_data.data(), 36);
300 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); 303 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data,
304 output);
301} 305}
302 306
303DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) { 307DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) {
304 NFCRequestState request{ 308 NFCRequestState request{
305 .sub_command = MCUSubCommand::ReadDeviceMode,
306 .command_argument = NFCReadCommand::StopPolling, 309 .command_argument = NFCReadCommand::StopPolling,
307 .packet_id = 0x0, 310 .packet_id = 0x0,
308 .packet_flag = MCUPacketFlag::LastCommandPacket, 311 .packet_flag = MCUPacketFlag::LastCommandPacket,
@@ -313,13 +316,13 @@ DriverResult NfcProtocol::SendStopPollingRequest(MCUCommandResponse& output) {
313 316
314 std::array<u8, sizeof(NFCRequestState)> request_data{}; 317 std::array<u8, sizeof(NFCRequestState)> request_data{};
315 memcpy(request_data.data(), &request, sizeof(NFCRequestState)); 318 memcpy(request_data.data(), &request, sizeof(NFCRequestState));
316 request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); 319 request_data[36] = CalculateMCU_CRC8(request_data.data(), 36);
317 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); 320 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data,
321 output);
318} 322}
319 323
320DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& output) { 324DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& output) {
321 NFCRequestState request{ 325 NFCRequestState request{
322 .sub_command = MCUSubCommand::ReadDeviceMode,
323 .command_argument = NFCReadCommand::StartWaitingRecieve, 326 .command_argument = NFCReadCommand::StartWaitingRecieve,
324 .packet_id = 0x0, 327 .packet_id = 0x0,
325 .packet_flag = MCUPacketFlag::LastCommandPacket, 328 .packet_flag = MCUPacketFlag::LastCommandPacket,
@@ -330,13 +333,13 @@ DriverResult NfcProtocol::SendStartWaitingRecieveRequest(MCUCommandResponse& out
330 333
331 std::vector<u8> request_data(sizeof(NFCRequestState)); 334 std::vector<u8> request_data(sizeof(NFCRequestState));
332 memcpy(request_data.data(), &request, sizeof(NFCRequestState)); 335 memcpy(request_data.data(), &request, sizeof(NFCRequestState));
333 request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); 336 request_data[36] = CalculateMCU_CRC8(request_data.data(), 36);
334 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); 337 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data,
338 output);
335} 339}
336 340
337DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCPages ntag_pages) { 341DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCPages ntag_pages) {
338 NFCRequestState request{ 342 NFCRequestState request{
339 .sub_command = MCUSubCommand::ReadDeviceMode,
340 .command_argument = NFCReadCommand::Ntag, 343 .command_argument = NFCReadCommand::Ntag,
341 .packet_id = 0x0, 344 .packet_id = 0x0,
342 .packet_flag = MCUPacketFlag::LastCommandPacket, 345 .packet_flag = MCUPacketFlag::LastCommandPacket,
@@ -355,8 +358,9 @@ DriverResult NfcProtocol::SendReadAmiiboRequest(MCUCommandResponse& output, NFCP
355 358
356 std::array<u8, sizeof(NFCRequestState)> request_data{}; 359 std::array<u8, sizeof(NFCRequestState)> request_data{};
357 memcpy(request_data.data(), &request, sizeof(NFCRequestState)); 360 memcpy(request_data.data(), &request, sizeof(NFCRequestState));
358 request_data[37] = CalculateMCU_CRC8(request_data.data() + 1, 36); 361 request_data[36] = CalculateMCU_CRC8(request_data.data(), 36);
359 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, SubCommand::STATE, request_data, output); 362 return SendMCUData(ReportMode::NFC_IR_MODE_60HZ, MCUSubCommand::ReadDeviceMode, request_data,
363 output);
360} 364}
361 365
362NFCReadBlockCommand NfcProtocol::GetReadBlockCommand(NFCPages pages) const { 366NFCReadBlockCommand NfcProtocol::GetReadBlockCommand(NFCPages pages) const {
diff --git a/src/input_common/helpers/joycon_protocol/nfc.h b/src/input_common/helpers/joycon_protocol/nfc.h
index 11e263e07..4cb992d1d 100644
--- a/src/input_common/helpers/joycon_protocol/nfc.h
+++ b/src/input_common/helpers/joycon_protocol/nfc.h
@@ -32,6 +32,9 @@ public:
32 bool IsEnabled() const; 32 bool IsEnabled() const;
33 33
34private: 34private:
35 // Number of times the function will be delayed until it outputs valid data
36 static constexpr std::size_t AMIIBO_UPDATE_DELAY = 15;
37
35 struct TagFoundData { 38 struct TagFoundData {
36 u8 type; 39 u8 type;
37 std::vector<u8> uuid; 40 std::vector<u8> uuid;
@@ -39,7 +42,7 @@ private:
39 42
40 DriverResult WaitUntilNfcIsReady(); 43 DriverResult WaitUntilNfcIsReady();
41 44
42 DriverResult StartPolling(TagFoundData& data); 45 DriverResult StartPolling(TagFoundData& data, std::size_t timeout_limit = 1);
43 46
44 DriverResult ReadTag(const TagFoundData& data); 47 DriverResult ReadTag(const TagFoundData& data);
45 48
@@ -56,6 +59,7 @@ private:
56 NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const; 59 NFCReadBlockCommand GetReadBlockCommand(NFCPages pages) const;
57 60
58 bool is_enabled{}; 61 bool is_enabled{};
62 std::size_t update_counter{};
59}; 63};
60 64
61} // namespace InputCommon::Joycon 65} // namespace InputCommon::Joycon