Merge pull request #474 from keyboardio/hardware/ergodox/optimisations

ErgoDox optimisations
pull/477/head
Jesse Vincent 6 years ago committed by GitHub
commit c6a7acd1ce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -97,13 +97,13 @@ void __attribute__((optimize(3))) ErgoDox::readMatrix() {
scanner_.reattachExpanderOnError(); scanner_.reattachExpanderOnError();
for (uint8_t row = 0; row < ROWS / 2; row++) { for (uint8_t row = 0; row < ROWS / 2; row++) {
scanner_.selectRow(row); scanner_.selectExtenderRow(row);
scanner_.selectRow(row + ROWS / 2); scanner_.toggleATMegaRow(row);
readMatrixRow(row); readMatrixRow(row);
readMatrixRow(row + ROWS / 2); readMatrixRow(row + ROWS / 2);
scanner_.unselectRows(); scanner_.toggleATMegaRow(row);
} }
} }

@ -27,6 +27,7 @@
#include "kaleidoscope/hardware/ez/ErgoDox/ErgoDoxScanner.h" #include "kaleidoscope/hardware/ez/ErgoDox/ErgoDoxScanner.h"
#include <avr/wdt.h> #include <avr/wdt.h>
#include "kaleidoscope/hardware/avr/pins_and_ports.h"
#include "kaleidoscope/hardware/ez/ErgoDox/i2cmaster.h" #include "kaleidoscope/hardware/ez/ErgoDox/i2cmaster.h"
#define I2C_ADDR 0b0100000 #define I2C_ADDR 0b0100000
@ -85,23 +86,24 @@ out:
return status; return status;
} }
void
ErgoDoxScanner::initCols() {
DDRF &= ~(1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 1 | 1 << 0);
PORTF |= (1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 1 | 1 << 0);
}
void void
ErgoDoxScanner::begin() { ErgoDoxScanner::begin() {
expander_error_ = initExpander(); expander_error_ = initExpander();
unselectRows(); // Init columns
initCols(); DDRF &= ~(1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 1 | 1 << 0);
PORTF |= (1 << 7 | 1 << 6 | 1 << 5 | 1 << 4 | 1 << 1 | 1 << 0);
// Init rows
DDRB |= (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3);
PORTB |= (1 << 0 | 1 << 1 | 1 << 2 | 1 << 3);
DDRD |= (1 << 2 | 1 << 3);
PORTD |= (1 << 2 | 1 << 3);
DDRC |= (1 << 6);
PORTC |= (1 << 6);
} }
void __attribute__((optimize(3))) void __attribute__((optimize(3))) ErgoDoxScanner::selectExtenderRow(int row) {
ErgoDoxScanner::selectRow(int row) {
if (row < 7) {
if (!expander_error_) { if (!expander_error_) {
expander_error_ = i2c_start(I2C_ADDR_WRITE); expander_error_ = i2c_start(I2C_ADDR_WRITE);
if (expander_error_) if (expander_error_)
@ -115,48 +117,11 @@ ErgoDoxScanner::selectRow(int row) {
out: out:
i2c_stop(); i2c_stop();
} }
} else {
switch (row) {
case 7:
DDRB |= (1 << 0);
PORTB &= ~(1 << 0);
break;
case 8:
DDRB |= (1 << 1);
PORTB &= ~(1 << 1);
break;
case 9:
DDRB |= (1 << 2);
PORTB &= ~(1 << 2);
break;
case 10:
DDRB |= (1 << 3);
PORTB &= ~(1 << 3);
break;
case 11:
DDRD |= (1 << 2);
PORTD &= ~(1 << 3);
break;
case 12:
DDRD |= (1 << 3);
PORTD &= ~(1 << 3);
break;
case 13:
DDRC |= (1 << 6);
PORTC &= ~(1 << 6);
break;
}
}
} }
void __attribute__((optimize(3))) void __attribute__((optimize(3))) ErgoDoxScanner::toggleATMegaRow(int row) {
ErgoDoxScanner::unselectRows() { static uint8_t row_pins[] = { PIN_B0, PIN_B1, PIN_B2, PIN_B3, PIN_D2, PIN_D3, PIN_C6 };
DDRB &= ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3); OUTPUT_TOGGLE(row_pins[row]);
PORTB &= ~(1 << 0 | 1 << 1 | 1 << 2 | 1 << 3);
DDRD &= ~(1 << 2 | 1 << 3);
PORTD &= ~(1 << 2 | 1 << 3);
DDRC &= ~(1 << 6);
PORTC &= ~(1 << 6);
} }
uint8_t __attribute__((optimize(3))) uint8_t __attribute__((optimize(3)))

@ -38,9 +38,8 @@ class ErgoDoxScanner {
ErgoDoxScanner() {} ErgoDoxScanner() {}
void begin(); void begin();
void initCols(); void toggleATMegaRow(int row);
void selectRow(int row); void selectExtenderRow(int row);
void unselectRows();
uint8_t readCols(int row); uint8_t readCols(int row);
void reattachExpanderOnError(); void reattachExpanderOnError();

Loading…
Cancel
Save