X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=converter%2Fxt_usb%2Fmatrix.c;h=f6784573b385e519755a085b3fe3b3563b1c5767;hb=06e3f8485612e5f7e46711530a63312c5f62a80b;hp=51742dd27b9d39a2b57002cad08ae6c1a7f6fc5a;hpb=74019c8e417dbfac0b925effa1b29769d04bd8d5;p=max%2Ftmk_keyboard.git diff --git a/converter/xt_usb/matrix.c b/converter/xt_usb/matrix.c index 51742dd2..f6784573 100644 --- a/converter/xt_usb/matrix.c +++ b/converter/xt_usb/matrix.c @@ -33,10 +33,6 @@ 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) - void matrix_init(void) { @@ -49,77 +45,54 @@ 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 has these keys + case 0x37: return 0x54; // Print Screen + case 0x46: return 0x55; // Ctrl + Pause + case 0x1C: return 0x6F; // Keypad Enter + case 0x35: return 0x7F; // Keypad / + + // Any XT keyobard with 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 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; - - // 'pseudo break code' hack - if (matrix_is_on(ROW(PAUSE), COL(PAUSE))) { - matrix_break(PAUSE); - } - uint8_t code = xt_host_recv(); + if (!code) return 0; + dprintf("%02X ", code); switch (state) { case INIT: switch (code) { @@ -129,87 +102,64 @@ uint8_t matrix_scan(void) case 0xE1: state = E1; break; - default: // normal key make - if (code < 0x80 && code != 0x00) { - xprintf("make: %X\r\n", code); + default: + if (code < 0x80) matrix_make(code); - } else if (code > 0x80 && code < 0xFF && code != 0x00) { - xprintf("break %X\r\n", code); - matrix_break(code - 0x80); - } - state = INIT; + else + matrix_break(code & 0x7F); + break; } break; - case E0: // E0-Prefixed - switch (code) { //move these codes to unused places on the matrix + case E0: + switch (code) { case 0x2A: - state = E0_2A; - break; - case 0xB7: - state = E0_B7; + case 0xAA: + case 0x36: + case 0xB6: + //ignore fake shift + state = INIT; break; default: - if (code < 0x80 && code != 0x00) { - matrix_make(move_codes(code)); - } else if (code > 0x80 && code < 0xFF && code != 0x00) { - matrix_break(move_codes(code - 0x80)); - } + if (code < 0x80) + matrix_make(move_e0code(code)); + else + matrix_break(move_e0code(code & 0x7F)); state = INIT; + break; } break; - case E0_2A: - if(code == 0xE0) - state = E0_2A_E0; - else - state = INIT; - break; - case E0_2A_E0: - if(code == 0x37) - matrix_make(PRINT_SCREEN); - else - state = INIT; - break; - case E0_B7: - if(code == 0xE0) - state = E0_B7; - else - state = INIT; - break; - case E0_B7_E0: - if(code == 0xAA) - matrix_break(PRINT_SCREEN); - else - state = INIT; - break; case E1: - if (code == 0x1D) - state = E1_1D; - else - state = INIT; + switch (code) { + case 0x1D: + state = E1_1D; + break; + case 0x9D: + state = E1_9D; + break; + default: + state = INIT; + break; + } break; case E1_1D: - if(code == 0x45) - state = E1_1D_45; - else - state = INIT; - break; - case E1_1D_45: - if(code == 0xE1) - state = E1_1D_45_E1; - else - state = INIT; - break; - case E1_1D_45_E1: - if(code == 0x9D) - state = E1_1D_45_E1_9D; - else - state = INIT; + switch (code) { + case 0x45: + matrix_make(0x55); + break; + default: + state = INIT; + break; + } break; - case E1_1D_45_E1_9D: - if(code == 0xC5) - matrix_make(PAUSE); - else - state = INIT; + case E1_9D: + switch (code) { + case 0x45: + matrix_break(0x55); + break; + default: + state = INIT; + break; + } break; default: state = INIT; @@ -243,3 +193,72 @@ void matrix_clear(void) { for (uint8_t i=0; i < MATRIX_ROWS; i++) matrix[i] = 0x00; } + +/* +XT Scancodes +============ +- 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 + +01-53: Normal codes used in original XT keyboard +54-7F: Not used in original XT keyboard + + 0 1 2 3 4 5 6 7 8 9 A B C D E F + 50 - - - - * * x x x x * * * o o o + 60 * * * * x x x x x x x x x x x * + 70 x * * x * * x * * x * x * x x * + +-: codes existed in original XT keyboard +*: E0-escaped codes converted into unused code area(internal use in TMK) +x: Non-espcaped codes(not used in real keyboards probably, for CodeSet2-CodeSet1 translation purpose) +o: reserved + +Usage in TMK: + + 00 (reserved) DO NOT USE + 54 PrintScr* + 55 Pause* + 56 Euro2 + 57 F11 + 58 F12 + 59 Keypad = + 5A LGUI* + 5B RGUI* + 5C APP* + 5D (reserved) + 5E (reserved) + 5F (reserved) + 60 cursor* + 61 cursor* + 62 cursor* + 63 cursor* + 64 F13 + 65 F14 + 66 F15 + 67 F16 + 68 F17 + 69 F18 + 6A F19 + 6B F20 + 6C F21 + 6D F22 + 6E F23 + 6F Keypad Enter* + 70 KANA + 71 nav* + 72 nav* + 73 RO + 74 nav* + 75 nav* + 76 F24 + 77 nav* + 78 nav* + 79 HENKAN + 7A RCTL* + 7B MUHENKAN + 7C RALT* + 7D JPY + 7E Keypad , + 7F Keypad / * + +*/