]> git.donarmstrong.com Git - qmk_firmware.git/commitdiff
Port SPLIT_USB_DETECT to helix/rev2 (#7385)
authorEric Bunton <stormbard@users.noreply.github.com>
Sat, 7 Dec 2019 12:17:13 +0000 (07:17 -0500)
committerJoel Challis <git@zvecr.com>
Sat, 7 Dec 2019 12:17:13 +0000 (12:17 +0000)
* Port SPLIT_USB_DETECT to helix/rev2

* Remove debug toggles.

* Rename is_keyboard_master to has_usb in split_util

keyboards/helix/rev2/matrix.c
keyboards/helix/rev2/split_util.c

index 322959dbbb1a1957a47b23d672e44c33166c4fce..70a6cb0a5e0097203415196a84c7e728b2682a07 100644 (file)
@@ -95,9 +95,8 @@ uint8_t matrix_cols(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..89df43e2773a147113f37cb5fd2ba28734b99716 100644 (file)
@@ -7,6 +7,7 @@
 #include "split_util.h"
 #include "matrix.h"
 #include "keyboard.h"
+#include "wait.h"
 
 #ifdef USE_MATRIX_I2C
 #  include "i2c.h"
 #  include "split_scomm.h"
 #endif
 
+#ifdef EE_HANDS
+#    include "eeconfig.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 !has_usb();
+#endif
+
+    return has_usb();
+}
+
+__attribute__((weak)) bool has_usb(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 +93,8 @@ 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
-}
-
 void split_keyboard_setup(void) {
-   setup_handedness();
+   isLeftHand = is_keyboard_left();
 
    if (has_usb()) {
       keyboard_master_setup();
@@ -64,7 +104,3 @@ void split_keyboard_setup(void) {
    sei();
 }
 
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void) {
-    split_keyboard_setup();
-}