Port SPLIT_USB_DETECT to crkbd (#7195)
This commit is contained in:
		
							parent
							
								
									0f0c73f14a
								
							
						
					
					
						commit
						b94f6cb116
					
				
					 2 changed files with 63 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -133,9 +133,8 @@ void rx_led_off(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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,6 +7,11 @@
 | 
			
		|||
#include "split_util.h"
 | 
			
		||||
#include "matrix.h"
 | 
			
		||||
#include "keyboard.h"
 | 
			
		||||
#include "wait.h"
 | 
			
		||||
 | 
			
		||||
#ifdef EE_HANDS
 | 
			
		||||
#    include "eeconfig.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef USE_MATRIX_I2C
 | 
			
		||||
#  include "i2c.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -14,19 +19,59 @@
 | 
			
		|||
#  include "split_scomm.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 !is_keyboard_master();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    return is_keyboard_master();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__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) {
 | 
			
		||||
#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 +92,9 @@ 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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// this code runs before the usb and keyboard is initialized
 | 
			
		||||
void split_keyboard_setup(void) {
 | 
			
		||||
   setup_handedness();
 | 
			
		||||
    isLeftHand = is_keyboard_left();
 | 
			
		||||
 | 
			
		||||
   if (has_usb()) {
 | 
			
		||||
      keyboard_master_setup();
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +104,7 @@ void split_keyboard_setup(void) {
 | 
			
		|||
   sei();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// this code runs before the usb and keyboard is initialized
 | 
			
		||||
void matrix_setup(void) {
 | 
			
		||||
    split_keyboard_setup();
 | 
			
		||||
// backwards compat
 | 
			
		||||
bool has_usb(void) {
 | 
			
		||||
   return is_keyboard_master();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue