X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=converter%2Fxt_usb%2Fmatrix.c;h=1123b11f24d9e4ff93d82bfabeae88e28afba33e;hb=527bdbbcbddc51b22c4fb210889998d550544189;hp=4218e39bb367066c9e6ac24f4f85e90a0c0c315d;hpb=3def1c3065a3b1f85a99cc7336f41f486d9ec67d;p=max%2Ftmk_keyboard.git diff --git a/converter/xt_usb/matrix.c b/converter/xt_usb/matrix.c index 4218e39b..1123b11f 100644 --- a/converter/xt_usb/matrix.c +++ b/converter/xt_usb/matrix.c @@ -28,33 +28,11 @@ along with this program. If not, see . static void matrix_make(uint8_t code); static void matrix_break(uint8_t code); -static void matrix_clear(void); -#ifdef MATRIX_HAS_GHOST -static bool matrix_has_ghost_in_row(uint8_t row); -#endif static uint8_t matrix[MATRIX_ROWS]; #define ROW(code) (code>>3) #define COL(code) (code&0x07) -// matrix positions for exceptional keys -#define PRINT_SCREEN (0x7C) -#define PAUSE (0x7D) - -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) { @@ -67,80 +45,53 @@ void matrix_init(void) return; } -static uint8_t move_codes(uint8_t code) { +// convert E0-escaped codes into unused area +static uint8_t move_e0code(uint8_t code) { switch(code) { - case 0x10: - code += 0x5E; - break; - case 0x19: - code += 0x41; - break; - case 0x1C: - case 0x1D: - code += 0x38; - break; - case 0x20: - case 0x21: - case 0x22: - case 0x24: - code += 0x40; - break; - case 0x2E: - case 0x30: - case 0x32: - code += 0x44; - break; - case 0x35: - case 0x38: - code += 0x21; - break; - case 0x47: - case 0x48: - case 0x49: - case 0x4B: - case 0x4D: - case 0x4F: - case 0x50: - case 0x51: - case 0x52: - case 0x53: - code += 0x28; - break; + // Original IBM XT keyboard doesn't use E0-codes probably + // Some XT compatilble keyobards need these keys? + // http://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/translate.pdf + // https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/scancode.doc + case 0x37: return 0x54; // Print Screen + case 0x46: return 0x55; // Ctrl + Pause + case 0x1C: return 0x6F; // Keypad Enter + case 0x35: return 0x7F; // Keypad / + case 0x5B: return 0x5A; // Left GUI + case 0x5C: return 0x5B; // Right GUI + case 0x5D: return 0x5C; // Application + case 0x5E: return 0x5D; // Power(not used) + case 0x5F: return 0x5E; // Sleep(not used) + case 0x63: return 0x5F; // Wake (not used) + case 0x48: return 0x60; // Up + case 0x4B: return 0x61; // Left + case 0x50: return 0x62; // Down + case 0x4D: return 0x63; // Right + case 0x52: return 0x71; // Insert + case 0x53: return 0x72; // Delete + case 0x47: return 0x74; // Home + case 0x4F: return 0x75; // End + case 0x49: return 0x77; // Home + case 0x51: return 0x78; // End + case 0x1D: return 0x7A; // Right Ctrl + case 0x38: return 0x7C; // Right Alt } - return code; + return 0x00; } uint8_t matrix_scan(void) { - - // scan code reading states static enum { INIT, E0, - E0_2A, - E0_2A_E0, - E0_B7, - E0_B7_E0, - - // print screen + // Pause: E1 1D 45, E1 9D C5 E1, E1_1D, - E1_1D_45, - E1_1D_45_E1, - E1_1D_45_E1_9D, - // pause + E1_9D, } state = INIT; - - is_modified = false; - - // 'pseudo break code' hack - if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) { - matrix_break(PAUSE); - } - uint8_t code = xt_host_recv(); - if (code) xprintf("%X\r\n", code); + if (!code) return 0; + dprintf("%02X ", code); switch (state) { case INIT: switch (code) { @@ -150,219 +101,82 @@ uint8_t matrix_scan(void) case 0xE1: state = E1; break; - case 0x00: - break; - default: // normal key make - if (code < 0x80) { - xprintf("make: %X\r\n", code); + default: + if (code < 0x80) matrix_make(code); - } else if (code > 0x80 && code < 0xFF) { - xprintf("break %X\r\n", code); - matrix_break(code - 0x80); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at INIT: %02X\n", code); - } - state = INIT; - } - break; - case E0: // E0-Prefixed - switch (code) { //move these codes to unused places on the matrix - case 0x2A: - state = E0_2A; - break; - case 0xB7: - state = E0_B7; - break; - case 0x00: - state = INIT; + else + matrix_break(code & 0x7F); break; - default: - if (code < 0x80) { - matrix_make(move_codes(code)); - } else if (code > 0x80 && code < 0xFF) { - matrix_break(move_codes(code - 0x80)); - } else { - matrix_clear(); - clear_keyboard(); - xprintf("unexpected scan code at E0: %02X\n", code); - } - state = INIT; } break; - case E0_2A: + case E0: switch (code) { - case 0xE0: - state = E0_2A_E0; - break; - default: + case 0x2A: + case 0xAA: + case 0x36: + case 0xB6: + //ignore fake shift state = INIT; - } - break; - case E0_2A_E0: - switch (code) { - case 0x37: - matrix_make(PRINT_SCREEN); break; default: + if (code < 0x80) + matrix_make(move_e0code(code)); + else + matrix_break(move_e0code(code & 0x7F)); state = INIT; - } - break; - case E0_B7: - switch (code) { - case 0xE0: - state = E0_B7; break; - default: - state = INIT; } break; - case E0_B7_E0: - switch (code) { - case 0xAA: - matrix_break(PRINT_SCREEN); - break; - default: - state = INIT; - } - break; case E1: switch (code) { case 0x1D: state = E1_1D; break; + case 0x9D: + state = E1_9D; + break; default: state = INIT; + break; } break; case E1_1D: switch (code) { case 0x45: - state = E1_1D_45; + matrix_make(0x55); break; default: state = INIT; - } - break; - case E1_1D_45: - switch (code) { - case 0xE1: - state = E1_1D_45_E1; break; - default: - state = INIT; } break; - case E1_1D_45_E1: + case E1_9D: switch (code) { - case 0x9D: - state = E1_1D_45_E1_9D; + case 0x45: + matrix_break(0x55); break; default: state = INIT; - } - break; - case E1_1D_45_E1_9D: - switch (code) { - case 0xC5: - matrix_make(PAUSE); break; - default: - state = INIT; } break; default: state = INIT; } - - // TODO: request RESEND when error occurs? -/* - if (PS2_IS_FAILED(ps2_error)) { - uint8_t ret = ps2_host_send(PS2_RESEND); - xprintf("Resend: %02X\n", ret); - } -*/ 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<