/* Copyright 2017 Jun Wako 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 . */ /* * scan matrix */ #include #include #include #include "print.h" #include "debug.h" #include "util.h" #include "timer.h" #include "matrix.h" #include #include "suspend.h" #include "lufa.h" #include "led.h" #include "fc660c.h" static uint32_t matrix_last_modified = 0; // matrix state buffer(1:on, 0:off) static matrix_row_t *matrix; static matrix_row_t *matrix_prev; static matrix_row_t _matrix0[MATRIX_ROWS]; static matrix_row_t _matrix1[MATRIX_ROWS]; void matrix_init(void) { #if 1 debug_enable = true; debug_keyboard = true; debug_matrix = true; #endif KEY_INIT(); // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00; for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00; matrix = _matrix0; matrix_prev = _matrix1; } uint8_t matrix_scan(void) { matrix_row_t *tmp; tmp = matrix_prev; matrix_prev = matrix; matrix = tmp; uint8_t row, col; for (col = 0; col < MATRIX_COLS; col++) { SET_COL(col); for (row = 0; row < MATRIX_ROWS; row++) { //KEY_SELECT(row, col); SET_ROW(row); _delay_us(2); // Not sure this is needed. This just emulates HHKB controller's behaviour. if (matrix_prev[row] & (1< 20/(1000000/TIMER_RAW_FREQ)) { matrix[row] = matrix_prev[row]; } _delay_us(5); KEY_HYS_OFF(); KEY_UNABLE(); // NOTE: KEY_STATE keep its state in 20us after KEY_ENABLE. // This takes 25us or more to make sure KEY_STATE returns to idle state. _delay_us(75); } if (matrix[row] ^ matrix_prev[row]) { matrix_last_modified = timer_read32(); } } return 1; } inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } void led_set(uint8_t usb_led) { if (usb_led & (1<