summaryrefslogtreecommitdiff
path: root/quantum/split_common/transport.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/split_common/transport.c')
-rw-r--r--quantum/split_common/transport.c272
1 files changed, 135 insertions, 137 deletions
diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c
index b32d48eb88..3c783dc568 100644
--- a/quantum/split_common/transport.c
+++ b/quantum/split_common/transport.c
@@ -8,99 +8,100 @@
#define ROWS_PER_HAND (MATRIX_ROWS / 2)
#ifdef RGBLIGHT_ENABLE
-# include "rgblight.h"
+# include "rgblight.h"
#endif
#ifdef BACKLIGHT_ENABLE
-# include "backlight.h"
+# include "backlight.h"
#endif
#ifdef ENCODER_ENABLE
-# include "encoder.h"
+# include "encoder.h"
+static pin_t encoders_pad[] = ENCODERS_PAD_A;
+# define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t))
#endif
#if defined(USE_I2C) || defined(EH)
-# include "i2c_master.h"
-# include "i2c_slave.h"
+# include "i2c_master.h"
+# include "i2c_slave.h"
typedef struct _I2C_slave_buffer_t {
matrix_row_t smatrix[ROWS_PER_HAND];
uint8_t backlight_level;
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
rgblight_syncinfo_t rgblight_sync;
-#endif
-#ifdef ENCODER_ENABLE
+# endif
+# ifdef ENCODER_ENABLE
uint8_t encoder_state[NUMBER_OF_ENCODERS];
-#endif
+# endif
} I2C_slave_buffer_t;
-static I2C_slave_buffer_t * const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg;
+static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg;
-# define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level)
-# define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)
-# define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix)
-# define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state)
+# define I2C_BACKLIGHT_START offsetof(I2C_slave_buffer_t, backlight_level)
+# define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)
+# define I2C_KEYMAP_START offsetof(I2C_slave_buffer_t, smatrix)
+# define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state)
-# define TIMEOUT 100
+# define TIMEOUT 100
-# ifndef SLAVE_I2C_ADDRESS
-# define SLAVE_I2C_ADDRESS 0x32
-# endif
+# ifndef SLAVE_I2C_ADDRESS
+# define SLAVE_I2C_ADDRESS 0x32
+# endif
// Get rows from other half over i2c
bool transport_master(matrix_row_t matrix[]) {
- i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);
-
- // write backlight info
-# ifdef BACKLIGHT_ENABLE
- uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0;
- if (level != i2c_buffer->backlight_level) {
- if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) {
- i2c_buffer->backlight_level = level;
+ i2c_readReg(SLAVE_I2C_ADDRESS, I2C_KEYMAP_START, (void *)matrix, sizeof(i2c_buffer->smatrix), TIMEOUT);
+
+ // write backlight info
+# ifdef BACKLIGHT_ENABLE
+ uint8_t level = is_backlight_enabled() ? get_backlight_level() : 0;
+ if (level != i2c_buffer->backlight_level) {
+ if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_BACKLIGHT_START, (void *)&level, sizeof(level), TIMEOUT) >= 0) {
+ i2c_buffer->backlight_level = level;
+ }
}
- }
-# endif
-
-# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- if (rgblight_get_change_flags()) {
- rgblight_syncinfo_t rgblight_sync;
- rgblight_get_syncinfo(&rgblight_sync);
- if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START,
- (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) {
- rgblight_clear_change_flags();
+# endif
+
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+ if (rgblight_get_change_flags()) {
+ rgblight_syncinfo_t rgblight_sync;
+ rgblight_get_syncinfo(&rgblight_sync);
+ if (i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_START, (void *)&rgblight_sync, sizeof(rgblight_sync), TIMEOUT) >= 0) {
+ rgblight_clear_change_flags();
+ }
}
- }
-# endif
+# endif
-# ifdef ENCODER_ENABLE
- i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT);
- encoder_update_raw(i2c_buffer->encoder_state);
-# endif
+# ifdef ENCODER_ENABLE
+ i2c_readReg(SLAVE_I2C_ADDRESS, I2C_ENCODER_START, (void *)i2c_buffer->encoder_state, sizeof(i2c_buffer->encoder_state), TIMEOUT);
+ encoder_update_raw(i2c_buffer->encoder_state);
+# endif
- return true;
+ return true;
}
void transport_slave(matrix_row_t matrix[]) {
- // Copy matrix to I2C buffer
- memcpy((void*)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix));
+ // Copy matrix to I2C buffer
+ memcpy((void *)i2c_buffer->smatrix, (void *)matrix, sizeof(i2c_buffer->smatrix));
// Read Backlight Info
-# ifdef BACKLIGHT_ENABLE
- backlight_set(i2c_buffer->backlight_level);
-# endif
-
-# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- // Update the RGB with the new data
- if (i2c_buffer->rgblight_sync.status.change_flags != 0) {
- rgblight_update_sync(&i2c_buffer->rgblight_sync, false);
- i2c_buffer->rgblight_sync.status.change_flags = 0;
- }
-# endif
-
-# ifdef ENCODER_ENABLE
- encoder_state_raw(i2c_buffer->encoder_state);
-# endif
+# ifdef BACKLIGHT_ENABLE
+ backlight_set(i2c_buffer->backlight_level);
+# endif
+
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+ // Update the RGB with the new data
+ if (i2c_buffer->rgblight_sync.status.change_flags != 0) {
+ rgblight_update_sync(&i2c_buffer->rgblight_sync, false);
+ i2c_buffer->rgblight_sync.status.change_flags = 0;
+ }
+# endif
+
+# ifdef ENCODER_ENABLE
+ encoder_state_raw(i2c_buffer->encoder_state);
+# endif
}
void transport_master_init(void) { i2c_init(); }
@@ -109,25 +110,25 @@ void transport_slave_init(void) { i2c_slave_init(SLAVE_I2C_ADDRESS); }
#else // USE_SERIAL
-# include "serial.h"
+# include "serial.h"
typedef struct _Serial_s2m_buffer_t {
- // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack
- matrix_row_t smatrix[ROWS_PER_HAND];
+ // TODO: if MATRIX_COLS > 8 change to uint8_t packed_matrix[] for pack/unpack
+ matrix_row_t smatrix[ROWS_PER_HAND];
-# ifdef ENCODER_ENABLE
- uint8_t encoder_state[NUMBER_OF_ENCODERS];
-# endif
+# ifdef ENCODER_ENABLE
+ uint8_t encoder_state[NUMBER_OF_ENCODERS];
+# endif
} Serial_s2m_buffer_t;
typedef struct _Serial_m2s_buffer_t {
-# ifdef BACKLIGHT_ENABLE
- uint8_t backlight_level;
-# endif
+# ifdef BACKLIGHT_ENABLE
+ uint8_t backlight_level;
+# endif
} Serial_m2s_buffer_t;
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
// When MCUs on both sides drive their respective RGB LED chains,
// it is necessary to synchronize, so it is necessary to communicate RGB
// information. In that case, define RGBLIGHT_SPLIT with info on the number
@@ -142,7 +143,7 @@ typedef struct _Serial_rgblight_t {
volatile Serial_rgblight_t serial_rgblight = {};
uint8_t volatile status_rgblight = 0;
-#endif
+# endif
volatile Serial_s2m_buffer_t serial_s2m_buffer = {};
volatile Serial_m2s_buffer_t serial_m2s_buffer = {};
@@ -150,102 +151,99 @@ uint8_t volatile status0 = 0;
enum serial_transaction_id {
GET_SLAVE_MATRIX = 0,
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
PUT_RGBLIGHT,
-#endif
+# endif
};
SSTD_t transactions[] = {
- [GET_SLAVE_MATRIX] = {
- (uint8_t *)&status0,
- sizeof(serial_m2s_buffer),
- (uint8_t *)&serial_m2s_buffer,
- sizeof(serial_s2m_buffer),
- (uint8_t *)&serial_s2m_buffer,
- },
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
- [PUT_RGBLIGHT] = {
- (uint8_t *)&status_rgblight,
- sizeof(serial_rgblight),
- (uint8_t *)&serial_rgblight,
- 0, NULL // no slave to master transfer
- },
-#endif
+ [GET_SLAVE_MATRIX] =
+ {
+ (uint8_t *)&status0,
+ sizeof(serial_m2s_buffer),
+ (uint8_t *)&serial_m2s_buffer,
+ sizeof(serial_s2m_buffer),
+ (uint8_t *)&serial_s2m_buffer,
+ },
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+ [PUT_RGBLIGHT] =
+ {
+ (uint8_t *)&status_rgblight, sizeof(serial_rgblight), (uint8_t *)&serial_rgblight, 0, NULL // no slave to master transfer
+ },
+# endif
};
void transport_master_init(void) { soft_serial_initiator_init(transactions, TID_LIMIT(transactions)); }
void transport_slave_init(void) { soft_serial_target_init(transactions, TID_LIMIT(transactions)); }
-#if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
+# if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT)
// rgblight synchronization information communication.
void transport_rgblight_master(void) {
- if (rgblight_get_change_flags()) {
- rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync);
- if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) {
- rgblight_clear_change_flags();
+ if (rgblight_get_change_flags()) {
+ rgblight_get_syncinfo((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync);
+ if (soft_serial_transaction(PUT_RGBLIGHT) == TRANSACTION_END) {
+ rgblight_clear_change_flags();
+ }
}
- }
}
void transport_rgblight_slave(void) {
- if (status_rgblight == TRANSACTION_ACCEPTED) {
- rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync,
- false);
- status_rgblight = TRANSACTION_END;
- }
+ if (status_rgblight == TRANSACTION_ACCEPTED) {
+ rgblight_update_sync((rgblight_syncinfo_t *)&serial_rgblight.rgblight_sync, false);
+ status_rgblight = TRANSACTION_END;
+ }
}
-#else
-#define transport_rgblight_master()
-#define transport_rgblight_slave()
-#endif
+# else
+# define transport_rgblight_master()
+# define transport_rgblight_slave()
+# endif
bool transport_master(matrix_row_t matrix[]) {
-#ifndef SERIAL_USE_MULTI_TRANSACTION
- if (soft_serial_transaction() != TRANSACTION_END) {
- return false;
- }
-#else
- transport_rgblight_master();
- if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) {
- return false;
- }
-#endif
+# ifndef SERIAL_USE_MULTI_TRANSACTION
+ if (soft_serial_transaction() != TRANSACTION_END) {
+ return false;
+ }
+# else
+ transport_rgblight_master();
+ if (soft_serial_transaction(GET_SLAVE_MATRIX) != TRANSACTION_END) {
+ return false;
+ }
+# endif
- // TODO: if MATRIX_COLS > 8 change to unpack()
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- matrix[i] = serial_s2m_buffer.smatrix[i];
- }
+ // TODO: if MATRIX_COLS > 8 change to unpack()
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ matrix[i] = serial_s2m_buffer.smatrix[i];
+ }
-# ifdef BACKLIGHT_ENABLE
- // Write backlight level for slave to read
- serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0;
-# endif
+# ifdef BACKLIGHT_ENABLE
+ // Write backlight level for slave to read
+ serial_m2s_buffer.backlight_level = is_backlight_enabled() ? get_backlight_level() : 0;
+# endif
-# ifdef ENCODER_ENABLE
- encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state);
-# endif
+# ifdef ENCODER_ENABLE
+ encoder_update_raw((uint8_t *)serial_s2m_buffer.encoder_state);
+# endif
- return true;
+ return true;
}
void transport_slave(matrix_row_t matrix[]) {
- transport_rgblight_slave();
- // TODO: if MATRIX_COLS > 8 change to pack()
- for (int i = 0; i < ROWS_PER_HAND; ++i) {
- serial_s2m_buffer.smatrix[i] = matrix[i];
- }
-# ifdef BACKLIGHT_ENABLE
- backlight_set(serial_m2s_buffer.backlight_level);
-# endif
-
-# ifdef ENCODER_ENABLE
- encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state);
-# endif
+ transport_rgblight_slave();
+ // TODO: if MATRIX_COLS > 8 change to pack()
+ for (int i = 0; i < ROWS_PER_HAND; ++i) {
+ serial_s2m_buffer.smatrix[i] = matrix[i];
+ }
+# ifdef BACKLIGHT_ENABLE
+ backlight_set(serial_m2s_buffer.backlight_level);
+# endif
+# ifdef ENCODER_ENABLE
+ encoder_state_raw((uint8_t *)serial_s2m_buffer.encoder_state);
+# endif
}
#endif