From a1de5983df716a0ed4e9e66b4360e121030a6c20 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 10 Nov 2019 20:19:23 -0700 Subject: [PATCH] Improvements for ps2 support --- src/board/system76/galp3-c/kbc.c | 73 +++++++++++++++++++++++++---- src/board/system76/galp3-c/keymap.c | 2 + 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/src/board/system76/galp3-c/kbc.c b/src/board/system76/galp3-c/kbc.c index 8f82e34..900ee8a 100644 --- a/src/board/system76/galp3-c/kbc.c +++ b/src/board/system76/galp3-c/kbc.c @@ -14,14 +14,20 @@ void kbc_init(void) { // System flag static bool kbc_system = false; +// Enable first port - TODO +static bool kbc_first = false; +// Enable second port - TODO +static bool kbc_second = false; // Translate from scancode set 2 to scancode set 1 // for basically no good reason static bool kbc_translate = true; bool kbc_scancode(struct Kbc * kbc, uint16_t key, bool pressed) { + if (!kbc_first) return true; if (kbc_translate) { key = keymap_translate(key); } + if (!key) return true; switch (key & 0xFF00) { case K_E0: printf(" E0\n"); @@ -50,6 +56,9 @@ enum KbcState { KBC_STATE_SET_LEDS, KBC_STATE_SCANCODE, KBC_STATE_WRITE_PORT, + KBC_STATE_FIRST_PORT_OUTPUT, + KBC_STATE_SECOND_PORT_OUTPUT, + KBC_STATE_SECOND_PORT_INPUT, }; void kbc_event(struct Kbc * kbc) { @@ -70,6 +79,12 @@ void kbc_event(struct Kbc * kbc) { if (kbc_system) { config |= (1 << 2); } + if (!kbc_first) { + config |= (1 << 4); + } + if (!kbc_second) { + config |= (1 << 5); + } if (kbc_translate) { config |= (1 << 6); } @@ -81,9 +96,16 @@ void kbc_event(struct Kbc * kbc) { break; case 0xA7: printf(" disable second port\n"); + kbc_second = false; break; case 0xA8: printf(" enable second port\n"); + kbc_second = true; + break; + case 0xA9: + printf(" test second port\n"); + // TODO: communicate with touchpad? + kbc_keyboard(kbc, 0x00, KBC_TIMEOUT); break; case 0xAA: printf(" test controller\n"); @@ -97,14 +119,28 @@ void kbc_event(struct Kbc * kbc) { break; case 0xAD: printf(" disable first port\n"); + kbc_first = false; break; case 0xAE: printf(" enable first port\n"); + kbc_first = true; break; case 0xD1: printf(" write port byte\n"); state = KBC_STATE_WRITE_PORT; break; + case 0xD2: + printf(" write first port output\n"); + state = KBC_STATE_FIRST_PORT_OUTPUT; + break; + case 0xD3: + printf(" write second port output\n"); + state = KBC_STATE_SECOND_PORT_OUTPUT; + break; + case 0xD4: + printf(" write second port input\n"); + state = KBC_STATE_SECOND_PORT_INPUT; + break; } } else { printf("kbc data: %02X\n", data); @@ -128,6 +164,14 @@ void kbc_event(struct Kbc * kbc) { state = KBC_STATE_SCANCODE; kbc_keyboard(kbc, 0xFA, KBC_TIMEOUT); break; + case 0xF2: + printf(" identify keyboard\n"); + if (kbc_keyboard(kbc, 0xFA, KBC_TIMEOUT)) { + if (kbc_keyboard(kbc, 0xAB, KBC_TIMEOUT)) { + kbc_keyboard(kbc, 0x83, KBC_TIMEOUT); + } + } + break; case 0xF4: printf(" enable scanning\n"); kbscan_enabled = true; @@ -161,16 +205,10 @@ void kbc_event(struct Kbc * kbc) { } else { control &= ~(1 << 1); } - if (data & (1 << 2)) { - kbc_system = true; - } else { - kbc_system = false; - } - if (data & (1 << 6)) { - kbc_translate = true; - } else { - kbc_translate = false; - } + kbc_system = (bool)(data & (1 << 2)); + kbc_first = (bool)(!(data & (1 << 4))); + kbc_second = (bool)(!(data & (1 << 5))); + kbc_translate = (bool)(data & (1 << 6)); *kbc->control = control; break; case KBC_STATE_SET_LEDS: @@ -192,6 +230,21 @@ void kbc_event(struct Kbc * kbc) { printf(" write port byte\n"); state = KBC_STATE_NORMAL; break; + case KBC_STATE_FIRST_PORT_OUTPUT: + printf(" write first port output\n"); + state = KBC_STATE_NORMAL; + kbc_keyboard(kbc, data, KBC_TIMEOUT); + break; + case KBC_STATE_SECOND_PORT_OUTPUT: + printf(" write second port output\n"); + state = KBC_STATE_NORMAL; + kbc_mouse(kbc, data, KBC_TIMEOUT); + break; + case KBC_STATE_SECOND_PORT_INPUT: + printf(" write second port input\n"); + state = KBC_STATE_NORMAL; + // TODO: mouse commands (write to touchpad?) + break; } } } diff --git a/src/board/system76/galp3-c/keymap.c b/src/board/system76/galp3-c/keymap.c index c512857..0507317 100644 --- a/src/board/system76/galp3-c/keymap.c +++ b/src/board/system76/galp3-c/keymap.c @@ -174,6 +174,8 @@ uint16_t keymap(int output, int input, int layer) { } // This is terrible, from http://www.vetra.com/scancodes.html +// TODO: redo by applying transform at lower level as recommended by: +// https://www.win.tue.nl/~aeb/linux/kbd/scancodes-10.html#ss10.3 uint16_t keymap_translate(uint16_t key) { switch (key) { // Function keys