summaryrefslogtreecommitdiff
path: root/quantum/split_common/split_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'quantum/split_common/split_util.c')
-rw-r--r--quantum/split_common/split_util.c119
1 files changed, 67 insertions, 52 deletions
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c
index 09a307b8ed..5c548de059 100644
--- a/quantum/split_common/split_util.c
+++ b/quantum/split_common/split_util.c
@@ -7,86 +7,101 @@
#include "quantum.h"
#ifdef EE_HANDS
-# include "tmk_core/common/eeprom.h"
-# include "eeconfig.h"
+# include "eeconfig.h"
#endif
#if defined(RGBLIGHT_ENABLE) && defined(RGBLED_SPLIT)
-#include "rgblight.h"
+# include "rgblight.h"
+#endif
+
+#ifndef SPLIT_USB_TIMEOUT
+# define SPLIT_USB_TIMEOUT 2500
#endif
volatile bool isLeftHand = true;
-__attribute__((weak))
-bool is_keyboard_left(void) {
- #if defined(SPLIT_HAND_PIN)
+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);
+ }
+
+#if defined(__AVR__)
+ // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow
+ (USBCON &= ~(_BV(USBE) | _BV(OTGPADE)));
+#endif
+
+ 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 eeprom_read_byte(EECONFIG_HANDEDNESS);
- #elif defined(MASTER_RIGHT)
+#elif defined(EE_HANDS)
+ return eeconfig_read_handedness();
+#elif defined(MASTER_RIGHT)
return !is_keyboard_master();
- #endif
+#endif
- return is_keyboard_master();
+ return is_keyboard_master();
}
-bool is_keyboard_master(void)
-{
-#ifdef __AVR__
- static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN;
+__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)
- {
- USBCON |= (1 << OTGPADE); // enables VBUS pad
- wait_us(5);
+ // 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
- }
-
- return (usbstate == MASTER);
+ usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS
#else
- return true;
+ usbstate = MASTER;
#endif
+ }
+
+ return (usbstate == MASTER);
}
static void keyboard_master_setup(void) {
#if defined(USE_I2C) || defined(EH)
- #ifdef SSD1306OLED
- matrix_master_OLED_init ();
- #endif
+# ifdef SSD1306OLED
+ matrix_master_OLED_init();
+# endif
#endif
- transport_master_init();
+ transport_master_init();
}
-static void keyboard_slave_setup(void)
-{
- transport_slave_init();
-}
+static void keyboard_slave_setup(void) { transport_slave_init(); }
-// this code runs before the usb and keyboard is initialized
-void matrix_setup(void)
-{
- isLeftHand = is_keyboard_left();
+// 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)
- uint8_t num_rgb_leds_split[2] = RGBLED_SPLIT;
- if (isLeftHand) {
- rgblight_set_clipping_range(0, num_rgb_leds_split[0]);
- }
- else {
- rgblight_set_clipping_range(num_rgb_leds_split[0], num_rgb_leds_split[1]);
- }
+ uint8_t num_rgb_leds_split[2] = RGBLED_SPLIT;
+ if (isLeftHand) {
+ rgblight_set_clipping_range(0, num_rgb_leds_split[0]);
+ } else {
+ rgblight_set_clipping_range(num_rgb_leds_split[0], num_rgb_leds_split[1]);
+ }
#endif
- if (is_keyboard_master())
- {
- keyboard_master_setup();
- }
- else
- {
- keyboard_slave_setup();
- }
+ if (is_keyboard_master()) {
+ keyboard_master_setup();
+ } else {
+ keyboard_slave_setup();
+ }
}