diff options
Diffstat (limited to 'quantum/split_common')
| -rw-r--r-- | quantum/split_common/matrix.c | 41 | ||||
| -rw-r--r-- | quantum/split_common/split_util.c | 65 |
2 files changed, 69 insertions, 37 deletions
diff --git a/quantum/split_common/matrix.c b/quantum/split_common/matrix.c index 95ee2433a..5bad9db08 100644 --- a/quantum/split_common/matrix.c +++ b/quantum/split_common/matrix.c | |||
| @@ -61,17 +61,22 @@ static void init_pins(void) { | |||
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | 63 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { |
| 64 | matrix_row_t last_row_value = current_matrix[current_row]; | 64 | // Start with a clear matrix row |
| 65 | current_matrix[current_row] = 0; | 65 | matrix_row_t current_row_value = 0; |
| 66 | 66 | ||
| 67 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { | 67 | for (uint8_t col_index = 0; col_index < MATRIX_COLS; col_index++) { |
| 68 | pin_t pin = direct_pins[current_row][col_index]; | 68 | pin_t pin = direct_pins[current_row][col_index]; |
| 69 | if (pin != NO_PIN) { | 69 | if (pin != NO_PIN) { |
| 70 | current_matrix[current_row] |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index); | 70 | current_row_value |= readPin(pin) ? 0 : (MATRIX_ROW_SHIFTER << col_index); |
| 71 | } | 71 | } |
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | return (last_row_value != current_matrix[current_row]); | 74 | // If the row has changed, store the row and return the changed flag. |
| 75 | if (current_matrix[current_row] != current_row_value) { | ||
| 76 | current_matrix[current_row] = current_row_value; | ||
| 77 | return true; | ||
| 78 | } | ||
| 79 | return false; | ||
| 75 | } | 80 | } |
| 76 | 81 | ||
| 77 | #elif defined(DIODE_DIRECTION) | 82 | #elif defined(DIODE_DIRECTION) |
| @@ -98,11 +103,8 @@ static void init_pins(void) { | |||
| 98 | } | 103 | } |
| 99 | 104 | ||
| 100 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { | 105 | static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) { |
| 101 | // Store last value of row prior to reading | 106 | // Start with a clear matrix row |
| 102 | matrix_row_t last_row_value = current_matrix[current_row]; | 107 | matrix_row_t current_row_value = 0; |
| 103 | |||
| 104 | // Clear data in matrix row | ||
| 105 | current_matrix[current_row] = 0; | ||
| 106 | 108 | ||
| 107 | // Select row and wait for row selecton to stabilize | 109 | // Select row and wait for row selecton to stabilize |
| 108 | select_row(current_row); | 110 | select_row(current_row); |
| @@ -114,13 +116,18 @@ static bool read_cols_on_row(matrix_row_t current_matrix[], uint8_t current_row) | |||
| 114 | uint8_t pin_state = readPin(col_pins[col_index]); | 116 | uint8_t pin_state = readPin(col_pins[col_index]); |
| 115 | 117 | ||
| 116 | // Populate the matrix row with the state of the col pin | 118 | // Populate the matrix row with the state of the col pin |
| 117 | current_matrix[current_row] |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); | 119 | current_row_value |= pin_state ? 0 : (MATRIX_ROW_SHIFTER << col_index); |
| 118 | } | 120 | } |
| 119 | 121 | ||
| 120 | // Unselect row | 122 | // Unselect row |
| 121 | unselect_row(current_row); | 123 | unselect_row(current_row); |
| 122 | 124 | ||
| 123 | return (last_row_value != current_matrix[current_row]); | 125 | // If the row has changed, store the row and return the changed flag. |
| 126 | if (current_matrix[current_row] != current_row_value) { | ||
| 127 | current_matrix[current_row] = current_row_value; | ||
| 128 | return true; | ||
| 129 | } | ||
| 130 | return false; | ||
| 124 | } | 131 | } |
| 125 | 132 | ||
| 126 | # elif (DIODE_DIRECTION == ROW2COL) | 133 | # elif (DIODE_DIRECTION == ROW2COL) |
| @@ -155,20 +162,22 @@ static bool read_rows_on_col(matrix_row_t current_matrix[], uint8_t current_col) | |||
| 155 | // For each row... | 162 | // For each row... |
| 156 | for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { | 163 | for (uint8_t row_index = 0; row_index < ROWS_PER_HAND; row_index++) { |
| 157 | // Store last value of row prior to reading | 164 | // Store last value of row prior to reading |
| 158 | matrix_row_t last_row_value = current_matrix[row_index]; | 165 | matrix_row_t last_row_value = current_matrix[row_index]; |
| 166 | matrix_row_t current_row_value = last_row_value; | ||
| 159 | 167 | ||
| 160 | // Check row pin state | 168 | // Check row pin state |
| 161 | if (readPin(row_pins[row_index]) == 0) { | 169 | if (readPin(row_pins[row_index]) == 0) { |
| 162 | // Pin LO, set col bit | 170 | // Pin LO, set col bit |
| 163 | current_matrix[row_index] |= (MATRIX_ROW_SHIFTER << current_col); | 171 | current_row_value |= (MATRIX_ROW_SHIFTER << current_col); |
| 164 | } else { | 172 | } else { |
| 165 | // Pin HI, clear col bit | 173 | // Pin HI, clear col bit |
| 166 | current_matrix[row_index] &= ~(MATRIX_ROW_SHIFTER << current_col); | 174 | current_row_value &= ~(MATRIX_ROW_SHIFTER << current_col); |
| 167 | } | 175 | } |
| 168 | 176 | ||
| 169 | // Determine if the matrix changed state | 177 | // Determine if the matrix changed state |
| 170 | if ((last_row_value != current_matrix[row_index]) && !(matrix_changed)) { | 178 | if ((last_row_value != current_row_value)) { |
| 171 | matrix_changed = true; | 179 | matrix_changed |= true; |
| 180 | current_matrix[row_index] = current_row_value; | ||
| 172 | } | 181 | } |
| 173 | } | 182 | } |
| 174 | 183 | ||
diff --git a/quantum/split_common/split_util.c b/quantum/split_common/split_util.c index fb6a3b85a..dfd06f5f9 100644 --- a/quantum/split_common/split_util.c +++ b/quantum/split_common/split_util.c | |||
| @@ -6,6 +6,14 @@ | |||
| 6 | #include "transport.h" | 6 | #include "transport.h" |
| 7 | #include "quantum.h" | 7 | #include "quantum.h" |
| 8 | 8 | ||
| 9 | #ifdef PROTOCOL_LUFA | ||
| 10 | # include <LUFA/Drivers/USB/USB.h> | ||
| 11 | #endif | ||
| 12 | |||
| 13 | #ifdef PROTOCOL_VUSB | ||
| 14 | # include "usbdrv.h" | ||
| 15 | #endif | ||
| 16 | |||
| 9 | #ifdef EE_HANDS | 17 | #ifdef EE_HANDS |
| 10 | # include "eeconfig.h" | 18 | # include "eeconfig.h" |
| 11 | #endif | 19 | #endif |
| @@ -22,30 +30,54 @@ | |||
| 22 | # define SPLIT_USB_TIMEOUT_POLL 10 | 30 | # define SPLIT_USB_TIMEOUT_POLL 10 |
| 23 | #endif | 31 | #endif |
| 24 | 32 | ||
| 33 | #ifdef PROTOCOL_CHIBIOS | ||
| 34 | # define SPLIT_USB_DETECT // Force this on for now | ||
| 35 | #endif | ||
| 36 | |||
| 25 | volatile bool isLeftHand = true; | 37 | volatile bool isLeftHand = true; |
| 26 | 38 | ||
| 27 | bool waitForUsb(void) { | 39 | #if defined(SPLIT_USB_DETECT) |
| 40 | # if defined(PROTOCOL_LUFA) | ||
| 41 | static inline bool usbHasActiveConnection(void) { return USB_Device_IsAddressSet(); } | ||
| 42 | static inline void usbDisable(void) { USB_Disable(); } | ||
| 43 | # elif defined(PROTOCOL_CHIBIOS) | ||
| 44 | static inline bool usbHasActiveConnection(void) { return usbGetDriverStateI(&USBD1) == USB_ACTIVE; } | ||
| 45 | static inline void usbDisable(void) { usbStop(&USBD1); } | ||
| 46 | # elif defined(PROTOCOL_VUSB) | ||
| 47 | static inline bool usbHasActiveConnection(void) { | ||
| 48 | usbPoll(); | ||
| 49 | return usbConfiguration; | ||
| 50 | } | ||
| 51 | static inline void usbDisable(void) { usbDeviceDisconnect(); } | ||
| 52 | # else | ||
| 53 | static inline bool usbHasActiveConnection(void) { return true; } | ||
| 54 | static inline void usbDisable(void) {} | ||
| 55 | # endif | ||
| 56 | |||
| 57 | bool usbIsActive(void) { | ||
| 28 | for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) { | 58 | for (uint8_t i = 0; i < (SPLIT_USB_TIMEOUT / SPLIT_USB_TIMEOUT_POLL); i++) { |
| 29 | // This will return true if a USB connection has been established | 59 | // This will return true if a USB connection has been established |
| 30 | #if defined(__AVR__) | 60 | if (usbHasActiveConnection()) { |
| 31 | if (UDADDR & _BV(ADDEN)) { | ||
| 32 | #else | ||
| 33 | if (usbGetDriverStateI(&USBD1) == USB_ACTIVE) { | ||
| 34 | #endif | ||
| 35 | return true; | 61 | return true; |
| 36 | } | 62 | } |
| 37 | wait_ms(SPLIT_USB_TIMEOUT_POLL); | 63 | wait_ms(SPLIT_USB_TIMEOUT_POLL); |
| 38 | } | 64 | } |
| 39 | 65 | ||
| 40 | // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow | 66 | // Avoid NO_USB_STARTUP_CHECK - Disable USB as the previous checks seem to enable it somehow |
| 41 | #if defined(__AVR__) | 67 | usbDisable(); |
| 42 | (USBCON &= ~(_BV(USBE) | _BV(OTGPADE))); | ||
| 43 | #else | ||
| 44 | usbStop(&USBD1); | ||
| 45 | #endif | ||
| 46 | 68 | ||
| 47 | return false; | 69 | return false; |
| 48 | } | 70 | } |
| 71 | #elif defined(PROTOCOL_LUFA) | ||
| 72 | static inline bool usbIsActive(void) { | ||
| 73 | USB_OTGPAD_On(); // enables VBUS pad | ||
| 74 | wait_us(5); | ||
| 75 | |||
| 76 | return USB_VBUS_GetStatus(); // checks state of VBUS | ||
| 77 | } | ||
| 78 | #else | ||
| 79 | static inline bool usbIsActive(void) { return true; } | ||
| 80 | #endif | ||
| 49 | 81 | ||
| 50 | __attribute__((weak)) bool is_keyboard_left(void) { | 82 | __attribute__((weak)) bool is_keyboard_left(void) { |
| 51 | #if defined(SPLIT_HAND_PIN) | 83 | #if defined(SPLIT_HAND_PIN) |
| @@ -66,16 +98,7 @@ __attribute__((weak)) bool is_keyboard_master(void) { | |||
| 66 | 98 | ||
| 67 | // only check once, as this is called often | 99 | // only check once, as this is called often |
| 68 | if (usbstate == UNKNOWN) { | 100 | if (usbstate == UNKNOWN) { |
| 69 | #if defined(SPLIT_USB_DETECT) || defined(PROTOCOL_CHIBIOS) | 101 | usbstate = usbIsActive() ? MASTER : SLAVE; |
| 70 | usbstate = waitForUsb() ? MASTER : SLAVE; | ||
| 71 | #elif defined(__AVR__) | ||
| 72 | USBCON |= (1 << OTGPADE); // enables VBUS pad | ||
| 73 | wait_us(5); | ||
| 74 | |||
| 75 | usbstate = (USBSTA & (1 << VBUS)) ? MASTER : SLAVE; // checks state of VBUS | ||
| 76 | #else | ||
| 77 | usbstate = MASTER; | ||
| 78 | #endif | ||
| 79 | } | 102 | } |
| 80 | 103 | ||
| 81 | return (usbstate == MASTER); | 104 | return (usbstate == MASTER); |
