Update to xealousbrown. (#8215)
* Update to xealousbrown. 5-13ms Latency decrease, 4x scan rate improvement. (CUSTOM_MATRIX = lite) is a really great feature! * Updated Readme.md, added an extra speedhack. * More optimizations * Update keyboards/handwired/xealousbrown/rules.mk * Update keyboards/handwired/xealousbrown/rules.mkgc_switch
parent
92a50a386a
commit
837ffd0006
@ -0,0 +1,112 @@ |
|||||||
|
/*
|
||||||
|
Copyright 2019 Alex Ong |
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify |
||||||
|
it under the terms of the GNU General Public License as published by |
||||||
|
the Free Software Foundation, either version 2 of the License, or |
||||||
|
(at your option) any later version. |
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, |
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||||
|
GNU General Public License for more details. |
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License |
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ |
||||||
|
#include <stdint.h> |
||||||
|
#include <stdbool.h> |
||||||
|
#include "wait.h" |
||||||
|
#include "util.h" |
||||||
|
#include "matrix.h" |
||||||
|
#include "debounce.h" |
||||||
|
#include "quantum.h" |
||||||
|
|
||||||
|
/* matrix state(1:on, 0:off) */ |
||||||
|
extern matrix_row_t raw_matrix[MATRIX_ROWS]; // raw values
|
||||||
|
extern matrix_row_t matrix[MATRIX_ROWS]; // debounced values
|
||||||
|
|
||||||
|
// matrix code
|
||||||
|
// super fast read_cols code.
|
||||||
|
static matrix_row_t read_cols(void) { |
||||||
|
return (PINC & (1 << 6) ? 0 : (1UL << 0)) | |
||||||
|
(PIND & (1 << 7) ? 0 : (1UL << 1)) | |
||||||
|
(PINE & (1 << 6) ? 0 : (1UL << 2)) | |
||||||
|
(PINB & (1 << 4) ? 0 : (1UL << 3)) | |
||||||
|
(PINB & (1 << 5) ? 0 : (1UL << 4)) | |
||||||
|
(PINB & (1 << 6) ? 0 : (1UL << 5)) | |
||||||
|
(PINB & (1 << 2) ? 0 : (1UL << 6)) | |
||||||
|
(PINB & (1 << 3) ? 0 : (1UL << 7)) | |
||||||
|
(PINB & (1 << 1) ? 0 : (1UL << 8)) | |
||||||
|
(PINF & (1 << 7) ? 0 : (1UL << 9)) | |
||||||
|
(PINF & (1 << 6) ? 0 : (1UL << 10)) | |
||||||
|
(PINF & (1 << 5) ? 0 : (1UL << 11)) | |
||||||
|
(PINF & (1 << 4) ? 0 : (1UL << 12)); |
||||||
|
} |
||||||
|
|
||||||
|
static void unselect_rows(void) { |
||||||
|
DDRD &= ~0b00011111; |
||||||
|
PORTD &= ~0b00011111; |
||||||
|
} |
||||||
|
|
||||||
|
static void select_row(uint8_t row) { |
||||||
|
switch (row) { |
||||||
|
case 0: |
||||||
|
DDRD |= (1 << 3); |
||||||
|
PORTD &= ~(1 << 3); |
||||||
|
break; |
||||||
|
case 1: |
||||||
|
DDRD |= (1 << 2); |
||||||
|
PORTD &= ~(1 << 2); |
||||||
|
break; |
||||||
|
case 2: |
||||||
|
DDRD |= (1 << 1); |
||||||
|
PORTD &= ~(1 << 1); |
||||||
|
break; |
||||||
|
case 3: |
||||||
|
DDRD |= (1 << 0); |
||||||
|
PORTD &= ~(1 << 0); |
||||||
|
break; |
||||||
|
case 4: |
||||||
|
DDRD |= (1 << 4); |
||||||
|
PORTD &= ~(1 << 4); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static void init_pins(void) { |
||||||
|
DDRC &= ~(1 << 6); |
||||||
|
PORTC |= (1 << 6); |
||||||
|
DDRD &= ~(1 << 7); |
||||||
|
PORTD |= (1 << 7); |
||||||
|
DDRE &= ~(1 << 6); |
||||||
|
PORTE |= (1 << 6); |
||||||
|
DDRB &= ~(1 << 4 | 1 << 5 | 1 << 6 | 1 << 2 | 1 << 3 | 1 << 1); |
||||||
|
PORTB |= (1 << 4 | 1 << 5 | 1 << 6 | 1 << 2 | 1 << 3 | 1 << 1); |
||||||
|
DDRF &= ~(1 << 7 | 1 << 6 | 1 << 5 | 1 << 4); |
||||||
|
PORTF |= (1 << 7 | 1 << 6 | 1 << 5 | 1 << 4); |
||||||
|
} |
||||||
|
|
||||||
|
// Only need to init the pins. Debounce / raw matrix are initialized already for us.
|
||||||
|
void matrix_init_custom(void) { |
||||||
|
// initialize key pins
|
||||||
|
init_pins(); |
||||||
|
} |
||||||
|
|
||||||
|
// Only need to scan the result into current_matrix, and return changed.
|
||||||
|
uint8_t matrix_scan_custom(matrix_row_t current_matrix[]) { |
||||||
|
bool changed = false; |
||||||
|
|
||||||
|
// Set row, read cols
|
||||||
|
for (uint8_t current_row = 0; current_row < MATRIX_ROWS; current_row++) { |
||||||
|
select_row(current_row); |
||||||
|
asm volatile("nop"); |
||||||
|
asm volatile("nop"); |
||||||
|
matrix_row_t cols = read_cols(); |
||||||
|
changed |= (current_matrix[current_row] != cols); |
||||||
|
current_matrix[current_row] = cols; |
||||||
|
unselect_rows(); |
||||||
|
} |
||||||
|
|
||||||
|
return changed; |
||||||
|
} |
Loading…
Reference in new issue