X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=keyboard%2Fhhkb%2Fmatrix.c;h=08721fc505943d331406015d27fb81c51fe01549;hb=bb955a819af89e74843743e268aa7b4ceb06cc4e;hp=b0af4baa5214089a16597bb1c2b18d78d7c15086;hpb=60134830506043be0c6d9d5ab37cf65dad3cc85f;p=max%2Ftmk_keyboard.git diff --git a/keyboard/hhkb/matrix.c b/keyboard/hhkb/matrix.c index b0af4baa..08721fc5 100644 --- a/keyboard/hhkb/matrix.c +++ b/keyboard/hhkb/matrix.c @@ -27,8 +27,15 @@ along with this program. If not, see . #include "timer.h" #include "matrix.h" #include "hhkb_avr.h" +#include +#include "suspend.h" +#include "lufa.h" +// 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; static matrix_row_t *matrix_prev; @@ -36,18 +43,6 @@ static matrix_row_t _matrix0[MATRIX_ROWS]; static matrix_row_t _matrix1[MATRIX_ROWS]; -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} - void matrix_init(void) { #ifdef DEBUG @@ -72,7 +67,8 @@ 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); @@ -124,32 +120,25 @@ uint8_t matrix_scan(void) // 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. +#ifdef HHKB_JP + // Looks like JP needs faster scan due to its twice larger matrix + // or it can drop keys in fast key typing + _delay_us(30); +#else _delay_us(75); +#endif } + if (matrix[row] ^ matrix_prev[row]) matrix_last_modified = timer_read32(); } - KEY_POWER_OFF(); - return 1; -} - -bool matrix_is_modified(void) -{ - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix[i] != matrix_prev[i]) - return true; + // power off + if (KEY_POWER_STATE() && + (USB_DeviceState == DEVICE_STATE_Suspended || + USB_DeviceState == DEVICE_STATE_Unattached ) && + timer_elapsed32(matrix_last_modified) > MATRIX_POWER_SAVE) { + KEY_POWER_OFF(); + suspend_power_down(); } - return false; -} - -inline -bool matrix_has_ghost(void) -{ - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<