~ruther/qmk_firmware

f6111d49bbfeb90fdb86c4595ba339590b364da7 — Joel Challis 5 years ago 891d28a
Split - Avoid race condition during matrix_init_quantum (#8235)

* Avoid race condition during matrix_init_quantum

* spelling is hard
M quantum/split_common/matrix.c => quantum/split_common/matrix.c +3 -1
@@ 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) {


@@ 231,6 231,8 @@ void matrix_init(void) {
    debounce_init(ROWS_PER_HAND);

    matrix_init_quantum();

    split_post_init();
}

void matrix_post_scan(void) {

M quantum/split_common/split_util.c => quantum/split_common/split_util.c +14 -15
@@ 81,19 81,8 @@ __attribute__((weak)) bool is_keyboard_master(void) {
    return (usbstate == MASTER);
}

static void keyboard_master_setup(void) {
#if defined(USE_I2C)
#    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)


@@ 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();
    }
}

M quantum/split_common/split_util.h => quantum/split_common/split_util.h +2 -1
@@ 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);