FIX: Making reception more reliable. Tested against the official thing

This commit is contained in:
Rodrigo Alfonso
2025-02-17 18:51:35 -03:00
parent f2cbf9906d
commit 6e93e8650f

View File

@@ -79,10 +79,9 @@ class LinkCard {
static constexpr int EREADER_SIO_END = 0xF3F3;
static constexpr int EREADER_CANCEL = 0xF7F7;
static constexpr int CMD_LINKCARD_RESET = 0;
static constexpr int SLAVE_HIGH_WAIT = 228;
static constexpr int SLAVE_LOW_WAIT = 5;
static constexpr int MODE_SWITCH_WAIT = 228;
static constexpr int DEACTIVATION_WAIT = 50;
static constexpr int PRE_TRANSFER_WAIT = 2;
static constexpr int PRE_TRANSFER_WAIT = 2 + 1;
public:
enum class SendResult {
@@ -184,7 +183,7 @@ class LinkCard {
linkRawCable.activate();
auto guard = Link::ScopeGuard([&]() { disableMulti(); });
Link::wait(SLAVE_HIGH_WAIT);
Link::wait(MODE_SWITCH_WAIT);
if (cancel())
return SendResult::CANCELED;
@@ -205,7 +204,7 @@ class LinkCard {
linkSPI.activate(LinkSPI::Mode::MASTER_256KBPS);
auto guard = Link::ScopeGuard([&]() { disableNormal(); });
Link::wait(SLAVE_HIGH_WAIT);
Link::wait(MODE_SWITCH_WAIT);
if (cancel())
return SendResult::CANCELED;
@@ -229,7 +228,7 @@ class LinkCard {
linkRawCable.activate();
auto guard = Link::ScopeGuard([&]() { disableMulti(); });
Link::wait(SLAVE_HIGH_WAIT);
Link::wait(MODE_SWITCH_WAIT);
if (cancel())
return SendResult::CANCELED;
@@ -268,8 +267,6 @@ class LinkCard {
if (!transferMultiAndExpect(HANDSHAKE_RECV_3, HANDSHAKE_RECV_3, cancel))
return ReceiveResult::CANCELED;
Link::wait(SLAVE_HIGH_WAIT);
// card request
if (!transferMultiAndExpect(GAME_REQUEST, HANDSHAKE_RECV_3, cancel))
return ReceiveResult::CANCELED;
@@ -291,9 +288,8 @@ class LinkCard {
}
// start signal
if (transferMulti(GAME_RECEIVE_READY, cancel) != EREADER_SEND_READY)
return ReceiveResult::UNEXPECTED_FAILURE;
Link::wait(SLAVE_HIGH_WAIT);
if (!transferMultiAndExpect(GAME_RECEIVE_READY, EREADER_SEND_READY, cancel))
return ReceiveResult::CANCELED;
if (!transferMultiAndExpect(GAME_RECEIVE_READY, EREADER_SEND_START, cancel))
return ReceiveResult::CANCELED;
@@ -307,16 +303,13 @@ class LinkCard {
card[i] = Link::lsB16(block);
card[i + 1] = Link::msB16(block);
checksum += block;
Link::wait(SLAVE_LOW_WAIT);
}
// checksum
if (transferMulti(GAME_RECEIVE_READY, cancel) != Link::lsB32(checksum))
return ReceiveResult::BAD_CHECKSUM;
Link::wait(SLAVE_LOW_WAIT);
if (transferMulti(GAME_RECEIVE_READY, cancel) != Link::msB32(checksum))
return ReceiveResult::BAD_CHECKSUM;
Link::wait(SLAVE_LOW_WAIT);
// end
if (transferMulti(GAME_RECEIVE_READY, cancel) != EREADER_SEND_END)