X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;ds=sidebyside;f=converter%2Fterminal_usb%2Fmatrix.c;h=5d03e547576dd62ab5645506eb8a9a120406d5d0;hb=fb248461b8ebe3a8a68aba69f53cac7534218cf9;hp=a6eff8c1ece026fb3dcd71e7a3bcd87dfe090e54;hpb=62d1ebb91c7b381ce3d88aad9ee0b03bea9fce26;p=max%2Ftmk_keyboard.git diff --git a/converter/terminal_usb/matrix.c b/converter/terminal_usb/matrix.c index a6eff8c1..5d03e547 100644 --- a/converter/terminal_usb/matrix.c +++ b/converter/terminal_usb/matrix.c @@ -28,9 +28,6 @@ along with this program. If not, see . static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif /* @@ -49,37 +46,15 @@ static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) (code>>3) #define COL(code) (code&0x07) -static bool is_modified = false; - - -inline -uint8_t matrix_rows(void) -{ - return MATRIX_ROWS; -} - -inline -uint8_t matrix_cols(void) -{ - return MATRIX_COLS; -} void matrix_init(void) { - print_enable = true; debug_enable = true; //debug_matrix = true; //debug_keyboard = true; //debug_mouse = false; ps2_host_init(); - // Make and Break code without Typematic - while (ps2_host_send(0xF8) != 0xFA) { - debug("send F8: failed\n"); - _delay_ms(500); - } - debug("send F8: OK\n"); - // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; @@ -92,127 +67,103 @@ uint8_t matrix_scan(void) // scan code reading states static enum { - INIT, + RESET, + RESET_RESPONSE, + KBD_ID0, + KBD_ID1, + CONFIG, + READY, F0, - } state = INIT; - - - is_modified = false; + } state = RESET; uint8_t code; - while ((code = ps2_host_recv())) { - debug_hex(code); - switch (state) { - case INIT: - switch (code) { - case 0xF0: - state = F0; - debug(" "); - break; - default: // normal key make - if (code < 0x88) { - matrix_make(code); - } else { - debug("unexpected scan code at INIT: "); debug_hex(code); debug("\n"); - } - state = INIT; - debug("\n"); - } - break; - case F0: // Break code - switch (code) { - default: + if ((code = ps2_host_recv())) { + debug("r"); debug_hex(code); debug(" "); + } + + switch (state) { + case RESET: + debug("wFF "); + if (ps2_host_send(0xFF) == 0xFA) { + debug("[ack]\nRESET_RESPONSE: "); + state = RESET_RESPONSE; + } + break; + case RESET_RESPONSE: + if (code == 0xAA) { + debug("[ok]\nKBD_ID: "); + state = KBD_ID0; + } else if (code) { + debug("err\nRESET: "); + state = RESET; + } + break; + // after reset receive keyboad ID(2 bytes) + case KBD_ID0: + if (code) { + state = KBD_ID1; + } + break; + case KBD_ID1: + if (code) { + debug("\nCONFIG: "); + state = CONFIG; + } + break; + case CONFIG: + debug("wF8 "); + if (ps2_host_send(0xF8) == 0xFA) { + debug("[ack]\nREADY\n"); + state = READY; + } + break; + case READY: + switch (code) { + case 0x00: + break; + case 0xF0: + state = F0; + debug(" "); + break; + default: // normal key make + if (code < 0x88) { + matrix_make(code); + } else { + debug("unexpected scan code at READY: "); debug_hex(code); debug("\n"); + } + state = READY; + debug("\n"); + } + break; + case F0: // Break code + switch (code) { + case 0x00: + break; + default: if (code < 0x88) { matrix_break(code); } else { debug("unexpected scan code at F0: "); debug_hex(code); debug("\n"); } - state = INIT; + state = READY; debug("\n"); - } - break; - } + } + break; } return 1; } -bool matrix_is_modified(void) -{ - return is_modified; -} - -inline -bool matrix_has_ghost(void) -{ -#ifdef MATRIX_HAS_GHOST - for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - if (matrix_has_ghost_in_row(i)) - return true; - } -#endif - return false; -} - -inline -bool matrix_is_on(uint8_t row, uint8_t col) -{ - return (matrix[row] & (1<