mirror of
https://github.com/afska/gba-link-connection.git
synced 2026-04-24 23:47:51 -05:00
Switching communication modes in a single operation
This commit is contained in:
parent
2c57b34b3b
commit
5a9e54dd59
|
|
@ -60,8 +60,6 @@
|
|||
#define LINK_CABLE_BIT_IRQ 14
|
||||
#define LINK_CABLE_BIT_GENERAL_PURPOSE_LOW 14
|
||||
#define LINK_CABLE_BIT_GENERAL_PURPOSE_HIGH 15
|
||||
#define LINK_CABLE_SET_HIGH(REG, BIT) REG |= 1 << BIT
|
||||
#define LINK_CABLE_SET_LOW(REG, BIT) REG &= ~(1 << BIT)
|
||||
#define LINK_CABLE_BARRIER asm volatile("" ::: "memory")
|
||||
|
||||
static volatile char LINK_CABLE_VERSION[] = "LinkCable/v6.0.0";
|
||||
|
|
@ -387,19 +385,13 @@ class LinkCable {
|
|||
|
||||
void stop() {
|
||||
stopTimer();
|
||||
|
||||
LINK_CABLE_SET_LOW(REG_RCNT, LINK_CABLE_BIT_GENERAL_PURPOSE_LOW);
|
||||
LINK_CABLE_SET_HIGH(REG_RCNT, LINK_CABLE_BIT_GENERAL_PURPOSE_HIGH);
|
||||
setGeneralPurposeMode();
|
||||
}
|
||||
|
||||
void start() {
|
||||
startTimer();
|
||||
|
||||
LINK_CABLE_SET_LOW(REG_RCNT, LINK_CABLE_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_SIOCNT = config.baudRate;
|
||||
REG_SIOMLT_SEND = 0;
|
||||
setBitHigh(LINK_CABLE_BIT_MULTIPLAYER);
|
||||
setBitHigh(LINK_CABLE_BIT_IRQ);
|
||||
setMultiPlayMode();
|
||||
setInterruptsOn();
|
||||
}
|
||||
|
||||
void stopTimer() {
|
||||
|
|
@ -443,9 +435,23 @@ class LinkCable {
|
|||
_state.timeouts[playerId] = LINK_CABLE_REMOTE_TIMEOUT_OFFLINE;
|
||||
}
|
||||
|
||||
void setInterruptsOn() { setBitHigh(LINK_CABLE_BIT_IRQ); }
|
||||
|
||||
void setMultiPlayMode() {
|
||||
REG_RCNT = REG_RCNT & ~(1 << LINK_CABLE_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_SIOCNT = (1 << LINK_CABLE_BIT_MULTIPLAYER);
|
||||
REG_SIOCNT |= config.baudRate;
|
||||
REG_SIOMLT_SEND = 0;
|
||||
}
|
||||
|
||||
void setGeneralPurposeMode() {
|
||||
REG_RCNT = (REG_RCNT & ~(1 << LINK_CABLE_BIT_GENERAL_PURPOSE_LOW)) |
|
||||
(1 << LINK_CABLE_BIT_GENERAL_PURPOSE_HIGH);
|
||||
}
|
||||
|
||||
bool isBitHigh(u8 bit) { return (REG_SIOCNT >> bit) & 1; }
|
||||
void setBitHigh(u8 bit) { LINK_CABLE_SET_HIGH(REG_SIOCNT, bit); }
|
||||
void setBitLow(u8 bit) { LINK_CABLE_SET_LOW(REG_SIOCNT, bit); }
|
||||
void setBitHigh(u8 bit) { REG_SIOCNT |= 1 << bit; }
|
||||
void setBitLow(u8 bit) { REG_SIOCNT &= ~(1 << bit); }
|
||||
};
|
||||
|
||||
extern LinkCable* linkCable;
|
||||
|
|
|
|||
|
|
@ -48,8 +48,6 @@
|
|||
#define LINK_CABLE_MULTIBOOT_BIT_MULTIPLAYER 13
|
||||
#define LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_LOW 14
|
||||
#define LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_HIGH 15
|
||||
#define LINK_CABLE_MULTIBOOT_SET_HIGH(REG, BIT) REG |= 1 << BIT
|
||||
#define LINK_CABLE_MULTIBOOT_SET_LOW(REG, BIT) REG &= ~(1 << BIT)
|
||||
#define LINK_CABLE_MULTIBOOT_TRY(CALL) \
|
||||
do { \
|
||||
partialResult = CALL; \
|
||||
|
|
@ -125,7 +123,7 @@ class LinkCableMultiboot {
|
|||
|
||||
template <typename F>
|
||||
PartialResult detectClients(MultiBootParam& multiBootParameters, F cancel) {
|
||||
setMultiplayerMode();
|
||||
setMultiPlayMode();
|
||||
|
||||
for (u32 t = 0; t < LINK_CABLE_MULTIBOOT_DETECTION_TRIES; t++) {
|
||||
auto responses = exchange(LINK_CABLE_MULTIBOOT_HANDSHAKE, cancel);
|
||||
|
|
@ -284,19 +282,17 @@ class LinkCableMultiboot {
|
|||
return responses;
|
||||
}
|
||||
|
||||
void setMultiplayerMode() {
|
||||
LINK_CABLE_MULTIBOOT_SET_LOW(REG_RCNT,
|
||||
LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_HIGH);
|
||||
|
||||
REG_SIOCNT = LINK_CABLE_MULTIBOOT_SIOCNT_MAX_BAUD_RATE;
|
||||
setBitHigh(LINK_CABLE_MULTIBOOT_BIT_MULTIPLAYER);
|
||||
void setMultiPlayMode() {
|
||||
REG_RCNT = REG_RCNT & ~(1 << LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_SIOCNT = (1 << LINK_CABLE_MULTIBOOT_BIT_MULTIPLAYER);
|
||||
REG_SIOCNT |= LINK_CABLE_MULTIBOOT_SIOCNT_MAX_BAUD_RATE;
|
||||
REG_SIOMLT_SEND = 0;
|
||||
}
|
||||
|
||||
void setGeneralPurposeMode() {
|
||||
LINK_CABLE_MULTIBOOT_SET_LOW(REG_RCNT,
|
||||
LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_LOW);
|
||||
LINK_CABLE_MULTIBOOT_SET_HIGH(
|
||||
REG_RCNT, LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_RCNT =
|
||||
(REG_RCNT & ~(1 << LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_LOW)) |
|
||||
(1 << LINK_CABLE_MULTIBOOT_BIT_GENERAL_PURPOSE_HIGH);
|
||||
}
|
||||
|
||||
void wait(u32 verticalLines) {
|
||||
|
|
@ -312,8 +308,8 @@ class LinkCableMultiboot {
|
|||
}
|
||||
|
||||
bool isBitHigh(u8 bit) { return (REG_SIOCNT >> bit) & 1; }
|
||||
void setBitHigh(u8 bit) { LINK_CABLE_MULTIBOOT_SET_HIGH(REG_SIOCNT, bit); }
|
||||
void setBitLow(u8 bit) { LINK_CABLE_MULTIBOOT_SET_LOW(REG_SIOCNT, bit); }
|
||||
void setBitHigh(u8 bit) { REG_SIOCNT |= 1 << bit; }
|
||||
void setBitLow(u8 bit) { REG_SIOCNT &= ~(1 << bit); }
|
||||
};
|
||||
|
||||
extern LinkCableMultiboot* linkCableMultiboot;
|
||||
|
|
|
|||
|
|
@ -31,11 +31,9 @@
|
|||
#define LINK_GPIO_GET(REG, BIT) ((REG >> BIT) & 1)
|
||||
#define LINK_GPIO_SET(REG, BIT, DATA) \
|
||||
if (DATA) \
|
||||
LINK_GPIO_SET_HIGH(REG, BIT); \
|
||||
REG |= 1 << BIT; \
|
||||
else \
|
||||
LINK_GPIO_SET_LOW(REG, BIT);
|
||||
#define LINK_GPIO_SET_HIGH(REG, BIT) REG |= 1 << BIT
|
||||
#define LINK_GPIO_SET_LOW(REG, BIT) REG &= ~(1 << BIT)
|
||||
REG &= ~(1 << BIT);
|
||||
|
||||
static volatile char LINK_GPIO_VERSION[] = "LinkGPIO/v6.0.0";
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@
|
|||
#include <tonc_core.h>
|
||||
|
||||
#define LINK_SPI_NO_DATA 0xffffffff
|
||||
#define LINK_SPI_SIOCNT_NORMAL 0
|
||||
#define LINK_SPI_BIT_CLOCK 0
|
||||
#define LINK_SPI_BIT_CLOCK_SPEED 1
|
||||
#define LINK_SPI_BIT_SI 2
|
||||
|
|
@ -49,8 +48,6 @@
|
|||
#define LINK_SPI_BIT_IRQ 14
|
||||
#define LINK_SPI_BIT_GENERAL_PURPOSE_LOW 14
|
||||
#define LINK_SPI_BIT_GENERAL_PURPOSE_HIGH 15
|
||||
#define LINK_SPI_SET_HIGH(REG, BIT) REG |= 1 << BIT
|
||||
#define LINK_SPI_SET_LOW(REG, BIT) REG &= ~(1 << BIT)
|
||||
|
||||
static volatile char LINK_SPI_VERSION[] = "LinkSPI/v6.0.0";
|
||||
|
||||
|
|
@ -67,9 +64,7 @@ class LinkSPI {
|
|||
this->asyncState = IDLE;
|
||||
this->asyncData = 0;
|
||||
|
||||
setNormalMode();
|
||||
set32BitPackets();
|
||||
setInterruptsOff();
|
||||
setNormalMode32Bit();
|
||||
disableTransfer();
|
||||
|
||||
if (mode == SLAVE)
|
||||
|
|
@ -88,8 +83,6 @@ class LinkSPI {
|
|||
|
||||
void deactivate() {
|
||||
isEnabled = false;
|
||||
stopTransfer();
|
||||
disableTransfer();
|
||||
setGeneralPurposeMode();
|
||||
|
||||
mode = SLAVE;
|
||||
|
|
@ -194,14 +187,14 @@ class LinkSPI {
|
|||
u32 asyncData = 0;
|
||||
volatile bool isEnabled = false;
|
||||
|
||||
void setNormalMode() {
|
||||
LINK_SPI_SET_LOW(REG_RCNT, LINK_SPI_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_SIOCNT = LINK_SPI_SIOCNT_NORMAL;
|
||||
void setNormalMode32Bit() {
|
||||
REG_RCNT = REG_RCNT & ~(1 << LINK_SPI_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_SIOCNT = 1 << LINK_SPI_BIT_LENGTH;
|
||||
}
|
||||
|
||||
void setGeneralPurposeMode() {
|
||||
LINK_SPI_SET_LOW(REG_RCNT, LINK_SPI_BIT_GENERAL_PURPOSE_LOW);
|
||||
LINK_SPI_SET_HIGH(REG_RCNT, LINK_SPI_BIT_GENERAL_PURPOSE_HIGH);
|
||||
REG_RCNT = (REG_RCNT & ~(1 << LINK_SPI_BIT_GENERAL_PURPOSE_LOW)) |
|
||||
(1 << LINK_SPI_BIT_GENERAL_PURPOSE_HIGH);
|
||||
}
|
||||
|
||||
void setData(u32 data) { REG_SIODATA32 = data; }
|
||||
|
|
@ -214,7 +207,6 @@ class LinkSPI {
|
|||
bool isReady() { return !isBitHigh(LINK_SPI_BIT_START); }
|
||||
bool isSlaveReady() { return !_isSIHigh(); }
|
||||
|
||||
void set32BitPackets() { setBitHigh(LINK_SPI_BIT_LENGTH); }
|
||||
void setMasterMode() { setBitHigh(LINK_SPI_BIT_CLOCK); }
|
||||
void setSlaveMode() { setBitLow(LINK_SPI_BIT_CLOCK); }
|
||||
void set256KbpsSpeed() { setBitLow(LINK_SPI_BIT_CLOCK_SPEED); }
|
||||
|
|
@ -224,8 +216,8 @@ class LinkSPI {
|
|||
|
||||
bool isMaster() { return mode != SLAVE; }
|
||||
bool isBitHigh(u8 bit) { return (REG_SIOCNT >> bit) & 1; }
|
||||
void setBitHigh(u8 bit) { LINK_SPI_SET_HIGH(REG_SIOCNT, bit); }
|
||||
void setBitLow(u8 bit) { LINK_SPI_SET_LOW(REG_SIOCNT, bit); }
|
||||
void setBitHigh(u8 bit) { REG_SIOCNT |= 1 << bit; }
|
||||
void setBitLow(u8 bit) { REG_SIOCNT &= ~(1 << bit); }
|
||||
};
|
||||
|
||||
extern LinkSPI* linkSPI;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user