diff options
| -rw-r--r-- | keyboards/crkbd/rev1/matrix.c | 5 | ||||
| -rw-r--r-- | keyboards/crkbd/rev1/split_util.c | 82 | 
2 files changed, 63 insertions, 24 deletions
| diff --git a/keyboards/crkbd/rev1/matrix.c b/keyboards/crkbd/rev1/matrix.c index dd93506db1..9d86879d6c 100644 --- a/keyboards/crkbd/rev1/matrix.c +++ b/keyboards/crkbd/rev1/matrix.c @@ -133,9 +133,8 @@ void rx_led_off(void)  void matrix_init(void)  { -    debug_enable = true; -    debug_matrix = true; -    debug_mouse = true; +    split_keyboard_setup(); +      // initialize row and col      unselect_rows();      init_cols(); diff --git a/keyboards/crkbd/rev1/split_util.c b/keyboards/crkbd/rev1/split_util.c index e1ff8b4379..c0d44af294 100644 --- a/keyboards/crkbd/rev1/split_util.c +++ b/keyboards/crkbd/rev1/split_util.c @@ -7,6 +7,11 @@  #include "split_util.h"  #include "matrix.h"  #include "keyboard.h" +#include "wait.h" + +#ifdef EE_HANDS +#    include "eeconfig.h" +#endif  #ifdef USE_MATRIX_I2C  #  include "i2c.h" @@ -14,19 +19,59 @@  #  include "split_scomm.h"  #endif +#ifndef SPLIT_USB_TIMEOUT +#    define SPLIT_USB_TIMEOUT 2500 +#endif +  volatile bool isLeftHand = true; -static void setup_handedness(void) { -  #ifdef EE_HANDS -    isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); -  #else -    // I2C_MASTER_RIGHT is deprecated, use MASTER_RIGHT instead, since this works for both serial and i2c -    #if defined(I2C_MASTER_RIGHT) || defined(MASTER_RIGHT) -      isLeftHand = !has_usb(); -    #else -      isLeftHand = has_usb(); -    #endif -  #endif +bool waitForUsb(void) { +    for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / 100); i++) { +        // This will return true of a USB connection has been established +        if (UDADDR & _BV(ADDEN)) { +            return true; +        } +        wait_ms(100); +    } + +    // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow +    (USBCON &= ~(_BV(USBE) | _BV(OTGPADE))); + +    return false; +} + +__attribute__((weak)) bool is_keyboard_left(void) { +#if defined(SPLIT_HAND_PIN) +    // Test pin SPLIT_HAND_PIN for High/Low, if low it's right hand +    setPinInput(SPLIT_HAND_PIN); +    return readPin(SPLIT_HAND_PIN); +#elif defined(EE_HANDS) +    return eeconfig_read_handedness(); +#elif defined(MASTER_RIGHT) +    return !is_keyboard_master(); +#endif + +    return is_keyboard_master(); +} + +__attribute__((weak)) bool is_keyboard_master(void) { +    static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN; + +    // only check once, as this is called often +    if (usbstate == UNKNOWN) { +#if defined(SPLIT_USB_DETECT) +        usbstate = waitForUsb() ? MASTER : SLAVE; +#elif defined(__AVR__) +        USBCON |= (1 << OTGPADE);  // enables VBUS pad +        wait_us(5); + +        usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE;  // checks state of VBUS +#else +        usbstate = MASTER; +#endif +    } + +    return (usbstate == MASTER);  }  static void keyboard_master_setup(void) { @@ -47,14 +92,9 @@ static void keyboard_slave_setup(void) {  #endif  } -bool has_usb(void) { -   USBCON |= (1 << OTGPADE); //enables VBUS pad -   _delay_us(5); -   return (USBSTA & (1<<VBUS));  //checks state of VBUS -} - +// this code runs before the usb and keyboard is initialized  void split_keyboard_setup(void) { -   setup_handedness(); +    isLeftHand = is_keyboard_left();     if (has_usb()) {        keyboard_master_setup(); @@ -64,7 +104,7 @@ void split_keyboard_setup(void) {     sei();  } -// this code runs before the usb and keyboard is initialized -void matrix_setup(void) { -    split_keyboard_setup(); +// backwards compat +bool has_usb(void) { +   return is_keyboard_master();  } | 
