diff options
Diffstat (limited to 'quantum/split_common/split_util.c')
-rw-r--r-- | quantum/split_common/split_util.c | 152 |
1 files changed, 47 insertions, 105 deletions
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index e41b6f6386..5095cb8fdc 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c @@ -4,142 +4,84 @@ #include "config.h" #include "timer.h" #include "split_flags.h" +#include "transport.h" #include "quantum.h" #ifdef EE_HANDS # include "tmk_core/common/eeprom.h" -#endif - -#ifdef BACKLIGHT_ENABLE -# include "backlight.h" -#endif - -#if defined(USE_I2C) || defined(EH) -# include "i2c.h" +# include "eeconfig.h" #endif volatile bool isLeftHand = true; -volatile uint8_t setTries = 0; - -static void setup_handedness(void) { +__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); - isLeftHand = readPin(SPLIT_HAND_PIN); + return readPin(SPLIT_HAND_PIN); #else #ifdef EE_HANDS - isLeftHand = eeprom_read_byte(EECONFIG_HANDEDNESS); + return eeprom_read_byte(EECONFIG_HANDEDNESS); #else #ifdef MASTER_RIGHT - isLeftHand = !has_usb(); + return !is_keyboard_master(); #else - isLeftHand = has_usb(); + return is_keyboard_master(); #endif #endif #endif } -static void keyboard_master_setup(void) { -#if defined(USE_I2C) || defined(EH) - i2c_master_init(); - #ifdef SSD1306OLED - matrix_master_OLED_init (); - #endif -#else - serial_master_init(); -#endif +bool is_keyboard_master(void) +{ +#ifdef __AVR__ + static enum { UNKNOWN, MASTER, SLAVE } usbstate = UNKNOWN; - // 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; -} + // only check once, as this is called often + if (usbstate == UNKNOWN) + { + USBCON |= (1 << OTGPADE); // enables VBUS pad + wait_us(5); -static void keyboard_slave_setup(void) { - timer_init(); -#if defined(USE_I2C) || defined(EH) - i2c_slave_init(SLAVE_I2C_ADDRESS); + usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS + } + + return (usbstate == MASTER); #else - serial_slave_init(); + return true; #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(); +static void keyboard_master_setup(void) { +#if defined(USE_I2C) || defined(EH) + #ifdef SSD1306OLED + matrix_master_OLED_init (); + #endif +#endif + transport_master_init(); - if (has_usb()) { - keyboard_master_setup(); - } else { - keyboard_slave_setup(); - } - sei(); + // 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; } -void keyboard_slave_loop(void) { - matrix_init(); - - //Init RGB - #ifdef RGBLIGHT_ENABLE - rgblight_init(); - #endif - - while (1) { - // Matrix Slave Scan - matrix_slave_scan(); - - // Read Backlight Info - #ifdef BACKLIGHT_ENABLE - #ifdef USE_I2C - if (BACKLIT_DIRTY) { - backlight_set(i2c_slave_buffer[I2C_BACKLIT_START]); - BACKLIT_DIRTY = false; - } - #else // USE_SERIAL - backlight_set(serial_m2s_buffer.backlight_level); - #endif - #endif - // Read RGB Info - #ifdef RGBLIGHT_ENABLE - #ifdef USE_I2C - if (RGB_DIRTY) { - // Disable interupts (RGB data is big) - cli(); - // Create new DWORD for RGB data - uint32_t dword; - - // Fill the new DWORD with the data that was sent over - uint8_t *dword_dat = (uint8_t *)(&dword); - for (int i = 0; i < 4; i++) { - dword_dat[i] = i2c_slave_buffer[I2C_RGB_START+i]; - } - - // Update the RGB now with the new data and set RGB_DIRTY to false - rgblight_update_dword(dword); - RGB_DIRTY = false; - // Re-enable interupts now that RGB is set - sei(); - } - #else // USE_SERIAL - #ifdef RGBLIGHT_SPLIT - // Add serial implementation for RGB here - #endif - #endif - #endif - } +static void keyboard_slave_setup(void) +{ + transport_slave_init(); } // this code runs before the usb and keyboard is initialized -void matrix_setup(void) { - split_keyboard_setup(); - - if (!has_usb()) { - //rgblight_init(); - keyboard_slave_loop(); - } +void matrix_setup(void) +{ + isLeftHand = is_keyboard_left(); + + if (is_keyboard_master()) + { + keyboard_master_setup(); + } + else + { + keyboard_slave_setup(); + } } |