#include "split_util.h" #include "matrix.h" #include "keyboard.h" #include "config.h" #include "timer.h" #include "split_flags.h" #include "transport.h" #include "quantum.h" #ifdef EE_HANDS # include "eeprom.h" # include "eeconfig.h" #endif volatile bool isLeftHand = true; __attribute__((weak)) bool is_keyboard_left(void) { #ifdef 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); #else #ifdef EE_HANDS return eeprom_read_byte(EECONFIG_HANDEDNESS); #else #ifdef MASTER_RIGHT return !is_keyboard_master(); #else return is_keyboard_master(); #endif #endif #endif } 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) { USBCON |= (1 << OTGPADE); // enables VBUS pad wait_us(5); usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS } return (usbstate == MASTER); #else return true; #endif } static void keyboard_master_setup(void) { #if defined(USE_I2C) #ifdef SSD1306OLED matrix_master_OLED_init (); #endif #endif transport_master_init(); // For master the Backlight info needs to be sent on startup // Otherwise the salve won't start with the proper info until an update BACKLIT_DIRTY = true; } 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(); if (is_keyboard_master()) { keyboard_master_setup(); } else { keyboard_slave_setup(); } }