diff options
Diffstat (limited to 'quantum/split_common')
| -rw-r--r-- | quantum/split_common/matrix.c | 3 | ||||
| -rw-r--r-- | quantum/split_common/split_util.c | 70 | ||||
| -rw-r--r-- | quantum/split_common/transport.c | 45 | 
3 files changed, 66 insertions, 52 deletions
| diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index d6636b886a..f8de17809d 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c @@ -43,6 +43,7 @@ extern matrix_row_t matrix[MATRIX_ROWS];      // debounced values  uint8_t thisHand, thatHand;  // user-defined overridable functions +__attribute__((weak)) void matrix_slave_scan_kb(void) { matrix_slave_scan_user(); }  __attribute__((weak)) void matrix_slave_scan_user(void) {}  static inline void setPinOutput_writeLow(pin_t pin) { @@ -284,7 +285,7 @@ bool matrix_post_scan(void) {      } else {          transport_slave(matrix + thatHand, matrix + thisHand); -        matrix_slave_scan_user(); +        matrix_slave_scan_kb();      }      return changed; diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index 2ae44e6e15..9e75e19ce0 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -1,3 +1,18 @@ +/* Copyright 2021 QMK + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program.  If not, see <http://www.gnu.org/licenses/>. + */  #include "split_util.h"  #include "matrix.h"  #include "keyboard.h" @@ -6,14 +21,7 @@  #include "transport.h"  #include "quantum.h"  #include "wait.h" - -#ifdef PROTOCOL_LUFA -#    include <LUFA/Drivers/USB/USB.h> -#endif - -#ifdef PROTOCOL_VUSB -#    include <usbdrv/usbdrv.h> -#endif +#include "usb_util.h"  #ifdef EE_HANDS  #    include "eeconfig.h" @@ -31,56 +39,21 @@  #    define SPLIT_USB_TIMEOUT_POLL 10  #endif -#ifdef PROTOCOL_CHIBIOS -#    define SPLIT_USB_DETECT  // Force this on for now -#endif -  volatile bool isLeftHand = true;  #if defined(SPLIT_USB_DETECT) -#    if defined(PROTOCOL_LUFA) -static inline bool usbHasActiveConnection(void) { return USB_Device_IsAddressSet(); } -static inline void usbDisable(void) { -    USB_Disable(); -    USB_DeviceState = DEVICE_STATE_Unattached; -} -#    elif defined(PROTOCOL_CHIBIOS) -static inline bool usbHasActiveConnection(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; } -static inline void usbDisable(void) { usbStop(&USBD1); } -#    elif defined(PROTOCOL_VUSB) -static inline bool usbHasActiveConnection(void) { -    usbPoll(); -    return usbConfiguration; -} -static inline void usbDisable(void) { usbDeviceDisconnect(); } -#    else -static inline bool usbHasActiveConnection(void) { return true; } -static inline void usbDisable(void) {} -#    endif - -bool usbIsActive(void) { +static bool usbIsActive(void) {      for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) {          // This will return true if a USB connection has been established -        if (usbHasActiveConnection()) { +        if (usb_connected_state()) {              return true;          }          wait_ms(SPLIT_USB_TIMEOUT_POLL);      } - -    // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow -    usbDisable(); -      return false;  } -#elif defined(PROTOCOL_LUFA) && defined(OTGPADE) -static inline bool usbIsActive(void) { -    USB_OTGPAD_On();  // enables VBUS pad -    wait_us(5); - -    return USB_VBUS_GetStatus();  // checks state of VBUS -}  #else -static inline bool usbIsActive(void) { return true; } +static inline bool usbIsActive(void) { return usb_vbus_state(); }  #endif  #ifdef SPLIT_HAND_MATRIX_GRID @@ -126,6 +99,11 @@ __attribute__((weak)) bool is_keyboard_master(void) {      // only check once, as this is called often      if (usbstate == UNKNOWN) {          usbstate = usbIsActive() ? MASTER : SLAVE; + +        // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow +        if (usbstate == SLAVE) { +            usb_disable(); +        }      }      return (usbstate == MASTER); diff --git a/quantum/split_common/transport.c b/quantum/split_common/transport.c index 61b61ea08c..27a1c0d3a4 100644 --- a/quantum/split_common/transport.c +++ b/quantum/split_common/transport.c @@ -22,6 +22,10 @@ static pin_t encoders_pad[] = ENCODERS_PAD_A;  #    define NUMBER_OF_ENCODERS (sizeof(encoders_pad) / sizeof(pin_t))  #endif +#if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +#    include "rgb_matrix.h" +#endif +  #if defined(USE_I2C)  #    include "i2c_master.h" @@ -54,6 +58,10 @@ typedef struct _I2C_slave_buffer_t {  #    ifdef WPM_ENABLE      uint8_t current_wpm;  #    endif +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    rgb_config_t rgb_matrix; +    bool         rgb_suspend_state; +#    endif  } I2C_slave_buffer_t;  static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_reg; @@ -68,6 +76,8 @@ static I2C_slave_buffer_t *const i2c_buffer = (I2C_slave_buffer_t *)i2c_slave_re  #    define I2C_RGB_START offsetof(I2C_slave_buffer_t, rgblight_sync)  #    define I2C_ENCODER_START offsetof(I2C_slave_buffer_t, encoder_state)  #    define I2C_WPM_START offsetof(I2C_slave_buffer_t, current_wpm) +#    define I2C_RGB_MATRIX_START offsetof(I2C_slave_buffer_t, rgb_matrix) +#    define I2C_RGB_SUSPEND_START offsetof(I2C_slave_buffer_t, rgb_suspend_state)  #    define TIMEOUT 100 @@ -141,6 +151,11 @@ bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[])  #        endif  #    endif +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_MATRIX_START, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix), TIMEOUT); +    i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_RGB_SUSPEND_START, (void *)g_suspend_state, sizeof(i2c_buffer->rgb_suspend_state), TIMEOUT); +#    endif +  #    ifndef DISABLE_SYNC_TIMER      i2c_buffer->sync_timer = sync_timer_read32() + SYNC_TIMER_OFFSET;      i2c_writeReg(SLAVE_I2C_ADDRESS, I2C_SYNC_TIME_START, (void *)&i2c_buffer->sync_timer, sizeof(i2c_buffer->sync_timer), TIMEOUT); @@ -186,6 +201,11 @@ void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[])      set_oneshot_mods(i2c_buffer->oneshot_mods);  #        endif  #    endif + +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    memcpy((void *)i2c_buffer->rgb_matrix, (void *)rgb_matrix_config, sizeof(i2c_buffer->rgb_matrix)); +    memcpy((void *)i2c_buffer->rgb_suspend_state, (void *)g_suspend_state, sizeof(i2c_buffer->rgb_suspend_state)); +#    endif  }  void transport_master_init(void) { i2c_init(); } @@ -226,6 +246,10 @@ typedef struct _Serial_m2s_buffer_t {  #    ifdef WPM_ENABLE      uint8_t      current_wpm;  #    endif +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    rgb_config_t rgb_matrix; +    bool         rgb_suspend_state; +#    endif  } Serial_m2s_buffer_t;  #    if defined(RGBLIGHT_ENABLE) && defined(RGBLIGHT_SPLIT) @@ -333,18 +357,24 @@ bool transport_master(matrix_row_t master_matrix[], matrix_row_t slave_matrix[])  #    ifdef WPM_ENABLE      // Write wpm to slave -    serial_m2s_buffer.current_wpm  = get_current_wpm(); +    serial_m2s_buffer.current_wpm       = get_current_wpm();  #    endif  #    ifdef SPLIT_MODS_ENABLE -    serial_m2s_buffer.real_mods    = get_mods(); -    serial_m2s_buffer.weak_mods    = get_weak_mods(); +    serial_m2s_buffer.real_mods         = get_mods(); +    serial_m2s_buffer.weak_mods         = get_weak_mods();  #        ifndef NO_ACTION_ONESHOT -    serial_m2s_buffer.oneshot_mods = get_oneshot_mods(); +    serial_m2s_buffer.oneshot_mods      = get_oneshot_mods();  #        endif  #    endif + +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    serial_m2s_buffer.rgb_matrix        = rgb_matrix_config; +    serial_m2s_buffer.rgb_suspend_state = g_suspend_state; +#    endif +  #    ifndef DISABLE_SYNC_TIMER -    serial_m2s_buffer.sync_timer   = sync_timer_read32() + SYNC_TIMER_OFFSET; +    serial_m2s_buffer.sync_timer        = sync_timer_read32() + SYNC_TIMER_OFFSET;  #    endif      return true;  } @@ -381,6 +411,11 @@ void transport_slave(matrix_row_t master_matrix[], matrix_row_t slave_matrix[])      set_oneshot_mods(serial_m2s_buffer.oneshot_mods);  #        endif  #    endif + +#    if defined(RGB_MATRIX_ENABLE) && defined(RGB_MATRIX_SPLIT) +    rgb_matrix_config = serial_m2s_buffer.rgb_matrix; +    g_suspend_state   = serial_m2s_buffer.rgb_suspend_state; +#    endif  }  #endif | 
