diff options
author | Takeshi ISHII <2170248+mtei@users.noreply.github.com> | 2022-03-04 05:23:49 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-03 20:23:49 +0000 |
commit | 4a66bdf29443607ae01c1a6c87b657f89d3a1769 (patch) | |
tree | e23d707f8ec8cc07eae3d1554fc88cf79648f4d1 /keyboards/helix/rev2/custom/split_util.c | |
parent | ae2c77c8272a3b90c75dc2750a0f13a9cd629953 (diff) |
Fix helix/rev2 not working properly when using split_common. (#16512)
When helix/rev2 was using split_common, it didn't work properly and I couldn't type on the right hand side.
The cause is that the following code, added in 0.16.0 to `quantum/keyboard.c`, does not include `quantum/split_common/split_util.h` but instead includes `keyboards/helix/rev2/split_util.h`. Therefore, `split_pre_init()/split_post_init()` in `quantum/split_common/split_util.c` was not called.
```c
#ifdef SPLIT_KEYBOARD
# include "split_util.h"
#endif
```
Diffstat (limited to 'keyboards/helix/rev2/custom/split_util.c')
-rw-r--r-- | keyboards/helix/rev2/custom/split_util.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/keyboards/helix/rev2/custom/split_util.c b/keyboards/helix/rev2/custom/split_util.c new file mode 100644 index 0000000000..ab40315487 --- /dev/null +++ b/keyboards/helix/rev2/custom/split_util.c @@ -0,0 +1,109 @@ +#include <avr/io.h> +#include <avr/wdt.h> +#include <avr/power.h> +#include <avr/interrupt.h> +#include <util/delay.h> +#include <avr/eeprom.h> +#include "split_util.h" +#include "matrix.h" +#include "keyboard.h" +#include "wait.h" + +#ifdef USE_MATRIX_I2C +# include "i2c.h" +#else +# include "split_scomm.h" +#endif + +#ifdef EE_HANDS +# include "eeconfig.h" +#endif + +#ifndef SPLIT_USB_TIMEOUT +# define SPLIT_USB_TIMEOUT 2000 +#endif + +#ifndef SPLIT_USB_TIMEOUT_POLL +# define SPLIT_USB_TIMEOUT_POLL 10 +#endif + +volatile bool isLeftHand = true; + +bool waitForUsb(void) { + for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) { + // This will return true if a USB connection has been established + if (UDADDR & _BV(ADDEN)) { + return true; + } + wait_ms(SPLIT_USB_TIMEOUT_POLL); + } + + // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow + (USBCON &= ~(_BV(USBE) | _BV(OTGPADE))); + + return false; +} + + +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_helix_master(); +#endif + + return is_helix_master(); +} + +bool is_helix_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) { + +#ifdef USE_MATRIX_I2C + i2c_master_init(); +#else + serial_master_init(); +#endif +} + +static void keyboard_slave_setup(void) { + +#ifdef USE_MATRIX_I2C + i2c_slave_init(SLAVE_I2C_ADDRESS); +#else + serial_slave_init(); +#endif +} + +void split_keyboard_setup(void) { + isLeftHand = is_keyboard_left(); + + if (is_helix_master()) { + keyboard_master_setup(); + } else { + keyboard_slave_setup(); + } + sei(); +} |