Skip to content

Commit

Permalink
Split - Avoid race condition during matrix_init_quantum (qmk#8235)
Browse files Browse the repository at this point in the history
* Avoid race condition during matrix_init_quantum

* spelling is hard
  • Loading branch information
zvecr authored and drashna committed Mar 26, 2020
1 parent ebb243a commit 28f45b8
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 17 deletions.
4 changes: 3 additions & 1 deletion quantum/split_common/matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
#endif

void matrix_init(void) {
keyboard_split_setup();
split_pre_init();

// Set pinout for right half if pinout for that half is defined
if (!isLeftHand) {
Expand Down Expand Up @@ -231,6 +231,8 @@ void matrix_init(void) {
debounce_init(ROWS_PER_HAND);

matrix_init_quantum();

split_post_init();
}

void matrix_post_scan(void) {
Expand Down
29 changes: 14 additions & 15 deletions quantum/split_common/split_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,19 +81,8 @@ __attribute__((weak)) bool is_keyboard_master(void) {
return (usbstate == MASTER);
}

static void keyboard_master_setup(void) {
#if defined(USE_I2C) || defined(EH)
# ifdef SSD1306OLED
matrix_master_OLED_init();
# endif
#endif
transport_master_init();
}

static void keyboard_slave_setup(void) { transport_slave_init(); }

// this code runs before the keyboard is fully initialized
void keyboard_split_setup(void) {
void split_pre_init(void) {
isLeftHand = is_keyboard_left();

#if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
Expand All @@ -106,8 +95,18 @@ void keyboard_split_setup(void) {
#endif

if (is_keyboard_master()) {
keyboard_master_setup();
} else {
keyboard_slave_setup();
#if defined(USE_I2C) && defined(SSD1306OLED)
matrix_master_OLED_init();
#endif
transport_master_init();
}
}

// this code runs after the keyboard is fully initialized
// - avoids race condition during matrix_init_quantum where slave can start
// receiving before the init process has completed
void split_post_init(void) {
if (!is_keyboard_master()) {
transport_slave_init();
}
}
3 changes: 2 additions & 1 deletion quantum/split_common/split_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
extern volatile bool isLeftHand;

void matrix_master_OLED_init(void);
void keyboard_split_setup(void);
void split_pre_init(void);
void split_post_init(void);

0 comments on commit 28f45b8

Please sign in to comment.