Switching communication modes in a single operation

This commit is contained in:
Rodrigo Alfonso 2023-11-19 04:25:56 -03:00
parent 2c57b34b3b
commit 5a9e54dd59
4 changed files with 40 additions and 48 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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";

View File

@ -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;