~ruther/qmk_firmware

b94f6cb116f1628f6d14ff3b1365bcbae6792dea — Joel Challis 5 years ago 0f0c73f
Port SPLIT_USB_DETECT to crkbd (#7195)

2 files changed, 63 insertions(+), 24 deletions(-)

M keyboards/crkbd/rev1/matrix.c
M keyboards/crkbd/rev1/split_util.c
M keyboards/crkbd/rev1/matrix.c => keyboards/crkbd/rev1/matrix.c +2 -3
@@ 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();

M keyboards/crkbd/rev1/split_util.c => keyboards/crkbd/rev1/split_util.c +61 -21
@@ 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();
}