summary refs log tree commit diff
path: root/quantum
diff options
context:
space:
mode:
authorJoel Challis <git@zvecr.com>2019-10-12 04:25:43 +0100
committerDanny <nooges@users.noreply.github.com>2019-10-11 23:25:43 -0400
commit76378d74f522f53eebc05907d44c839455a0336b (patch)
treebeb899f965a3f20f1627b21972031bae3aa2bc27 /quantum
parent64c075ed2c2e2ddb2da9321bf17ed911d758a9b2 (diff)
ARM split - detect USB to select master/slave (#6424)
* Initial split refactor to allow usb master detection

* Add split USB detect docs

* Add SPLIT_USB_DETECT demo mode limitation

* fix rebase issues

* clang-format
Diffstat (limited to 'quantum')
-rw-r--r--quantum/split_common/matrix.c4
-rw-r--r--quantum/split_common/split_util.c33
-rw-r--r--quantum/split_common/split_util.h1
3 files changed, 29 insertions, 9 deletions
diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c
index 313f7830b6..7176d0cc4f 100644
--- a/quantum/split_common/matrix.c
+++ b/quantum/split_common/matrix.c
@@ -246,9 +246,7 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col)
 #endif
 
 void matrix_init(void) {
-    debug_enable = true;
-    debug_matrix = true;
-    debug_mouse  = true;
+    keyboard_split_setup();
 
     // Set pinout for right half if pinout for that half is defined
     if (!isLeftHand) {
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c
index d16a989770..8983861bcc 100644
--- a/quantum/split_common/split_util.c
+++ b/quantum/split_common/split_util.c
@@ -14,8 +14,27 @@
 #    include "rgblight.h"
 #endif
 
+#ifndef SPLIT_USB_TIMEOUT
+#    define SPLIT_USB_TIMEOUT 2500
+#endif
+
 volatile bool isLeftHand = true;
 
+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 defined(__AVR__)
+        if (UDADDR & _BV(ADDEN)) {
+#else
+        if (usbGetDriverStateI(&USBD1) == USB_ACTIVE) {
+#endif
+            return true;
+        }
+        wait_ms(100);
+    }
+    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
@@ -31,21 +50,23 @@ __attribute__((weak)) bool is_keyboard_left(void) {
 }
 
 __attribute__((weak)) bool is_keyboard_master(void) {
-#ifdef __AVR__
     static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
 
     // only check once, as this is called often
     if (usbstate == UNKNOWN) {
+#if defined(SPLIT_USB_DETECT) || defined(PROTOCOL_CHIBIOS)
+        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);
-#else
-    return true;
-#endif
 }
 
 static void keyboard_master_setup(void) {
@@ -59,8 +80,8 @@ static void keyboard_master_setup(void) {
 
 static void keyboard_slave_setup(void) { transport_slave_init(); }
 
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void) {
+// this code runs before the keyboard is fully initialized
+void keyboard_split_setup(void) {
     isLeftHand = is_keyboard_left();
 
 #if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h
index f41c77605b..5d9c523400 100644
--- a/quantum/split_common/split_util.h
+++ b/quantum/split_common/split_util.h
@@ -8,3 +8,4 @@
 extern volatile bool isLeftHand;
 
 void matrix_master_OLED_init(void);
+void keyboard_split_setup(void);