]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Port SPLIT_USB_DETECT to crkbd (#7195)
authorJoel Challis <git@zvecr.com>
Sat, 16 Nov 2019 00:07:21 +0000 (00:07 +0000)
committerGitHub <noreply@github.com>
Sat, 16 Nov 2019 00:07:21 +0000 (00:07 +0000)
keyboards/crkbd/rev1/matrix.c
keyboards/crkbd/rev1/split_util.c

index dd93506db1d287e277e554a5649cb029ff0781c0..9d86879d6c80b07e835574ab993c33367d903a74 100644 (file)
@@ -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();
index e1ff8b4379dc6a7af3b24d65cfb2e968f50946d4..c0d44af29433c7abc38c7c353f308075ec9d3915 100644 (file)
@@ -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"
 #  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();
 }