X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=keyboard%2Fhhkb%2Fmatrix.c;h=14fae0b82cca7b77da2ee111e100c507ed36bab7;hb=85534a747fe457f53bf68f590d7a4eaf6a6c2415;hp=01473d1ec79e1c908237061ad758453075071a3b;hpb=bc5ee91d14547124fd138c09b0c3623e4eefe757;p=max%2Ftmk_keyboard.git diff --git a/keyboard/hhkb/matrix.c b/keyboard/hhkb/matrix.c index 01473d1e..14fae0b8 100644 --- a/keyboard/hhkb/matrix.c +++ b/keyboard/hhkb/matrix.c @@ -20,27 +20,21 @@ along with this program. If not, see . */ #include #include -#include -#include #include +#include "print.h" #include "debug.h" #include "util.h" #include "timer.h" #include "matrix.h" +#include "hhkb_avr.h" +#include +#include "suspend.h" +#include "lufa.h" -// Timer resolution check -#if (1000000/TIMER_RAW_FREQ > 20) -# error "Timer resolution(>20us) is not enough for HHKB matrix scan tweak on V-USB." -#endif - -#if (MATRIX_COLS > 16) -# error "MATRIX_COLS must not exceed 16" -#endif -#if (MATRIX_ROWS > 255) -# error "MATRIX_ROWS must not exceed 255" -#endif - +// matrix power saving +#define MATRIX_POWER_SAVE 10000 +static uint32_t matrix_last_modified = 0; // matrix state buffer(1:on, 0:off) static matrix_row_t *matrix; @@ -49,78 +43,6 @@ static matrix_row_t _matrix0[MATRIX_ROWS]; static matrix_row_t _matrix1[MATRIX_ROWS]; -// Matrix I/O ports -// -// row: HC4051[A,B,C] selects scan row0-7 -// col: LS145[A,B,C,D] selects scan col0-7 and enable(D) -// key: on: 0/off: 1 -// prev: unknown: output previous key state(negated)? - -#if defined(__AVR_AT90USB1286__) -// Ports for Teensy++ -// row: PB0-2 -// col: PB3-5,6 -// key: PE6(pull-uped) -// prev: PE7 -#define KEY_INIT() do { \ - DDRB |= 0x7F; \ - DDRE |= (1<<7); \ - DDRE &= ~(1<<6); \ - PORTE |= (1<<6); \ -} while (0) -#define KEY_SELECT(ROW, COL) (PORTB = (PORTB & 0xC0) | \ - (((COL) & 0x07)<<3) | \ - ((ROW) & 0x07)) -#define KEY_ENABLE() (PORTB &= ~(1<<6)) -#define KEY_UNABLE() (PORTB |= (1<<6)) -#define KEY_STATE() (PINE & (1<<6)) -#define KEY_PREV_ON() (PORTE |= (1<<7)) -#define KEY_PREV_OFF() (PORTE &= ~(1<<7)) -#define KEY_POWER_ON() -#define KEY_POWER_OFF() - -#elif defined(__AVR_ATmega328P__) -// Ports for V-USB -// key: PB0(pull-uped) -// prev: PB1 -// row: PB2-4 -// col: PC0-2,3 -// power: PB5(Low:on/Hi-z:off) -#define KEY_INIT() do { \ - DDRB |= 0x3E; \ - DDRB &= ~(1<<0); \ - PORTB |= 1<<0; \ - DDRC |= 0x0F; \ - KEY_UNABLE(); \ - KEY_PREV_OFF(); \ -} while (0) -#define KEY_SELECT(ROW, COL) do { \ - PORTB = (PORTB & 0xE3) | ((ROW) & 0x07)<<2; \ - PORTC = (PORTC & 0xF8) | ((COL) & 0x07); \ -} while (0) -#define KEY_ENABLE() (PORTC &= ~(1<<3)) -#define KEY_UNABLE() (PORTC |= (1<<3)) -#define KEY_STATE() (PINB & (1<<0)) -#define KEY_PREV_ON() (PORTB |= (1<<1)) -#define KEY_PREV_OFF() (PORTB &= ~(1<<1)) -// Power supply switching -#define KEY_POWER_ON() do { \ - KEY_INIT(); \ - PORTB &= ~(1<<5); \ - _delay_ms(1); \ -} while (0) -#define KEY_POWER_OFF() do { \ - DDRB &= ~0x3F; \ - PORTB &= ~0x3F; \ - DDRC &= ~0x0F; \ - PORTC &= ~0x0F; \ -} while (0) - -#else -# error "define code for matrix scan" -#endif - - inline uint8_t matrix_rows(void) { @@ -135,6 +57,11 @@ uint8_t matrix_cols(void) void matrix_init(void) { +#ifdef DEBUG + debug_enable = true; + debug_keyboard = true; +#endif + KEY_INIT(); // initialize matrix state: all keys off @@ -152,17 +79,18 @@ uint8_t matrix_scan(void) matrix_prev = matrix; matrix = tmp; - KEY_POWER_ON(); + // power on + if (!KEY_POWER_STATE()) KEY_POWER_ON(); for (uint8_t row = 0; row < MATRIX_ROWS; row++) { for (uint8_t col = 0; col < MATRIX_COLS; col++) { KEY_SELECT(row, col); - _delay_us(40); + _delay_us(5); // Not sure this is needed. This just emulates HHKB controller's behaviour. if (matrix_prev[row] & (1< MATRIX_POWER_SAVE) { + KEY_POWER_OFF(); + suspend_power_down(); } - KEY_POWER_OFF(); return 1; } @@ -219,45 +175,22 @@ bool matrix_is_on(uint8_t row, uint8_t col) } inline -#if (MATRIX_COLS <= 8) -uint8_t matrix_get_row(uint8_t row) -#else -uint16_t matrix_get_row(uint8_t row) -#endif +matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } -void matrix_debug(void) +void matrix_print(void) { - if (!debug_matrix) - return; - -#if (MATRIX_COLS <= 8) - debug("\nr/c 01234567\n"); -#else - debug("\nr/c 0123456789ABCDEF\n"); -#endif + print("\nr/c 01234567\n"); for (uint8_t row = 0; row < matrix_rows(); row++) { - debug_hex(row); debug(": "); -#if (MATRIX_COLS <= 8) - debug_bin_reverse(matrix_get_row(row)); -#else - debug_bin_reverse16(matrix_get_row(row)); -#endif - debug("\n"); + xprintf("%02X: %08b\n", row, bitrev(matrix_get_row(row))); } } -uint8_t matrix_key_count(void) -{ - uint8_t count = 0; - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { -#if (MATRIX_COLS <= 8) - count += bitpop(matrix[i]); -#else - count += bitpop16(matrix[i]); -#endif - } - return count; +void matrix_power_up(void) { + KEY_POWER_ON(); +} +void matrix_power_down(void) { + KEY_POWER_OFF(); }